配置自动模式
告诉自动模式分类器你的组织信任哪些仓库、存储桶和域名:用 permissions.ask 加人工检查点、autoMode.environment、覆盖 block/allow 规则,以及 claude auto-mode 子命令和被拒操作的处理。
自动模式让 Claude Code 在没有常规权限提示的情况下运行:工具调用会经过一个分类器,阻止任何不可逆、有破坏性或指向你环境之外的操作。deny 规则和显式 ask 规则在分类器之前评估,仍然会阻止或提示。用 autoMode 设置块告诉分类器你的组织信任什么。本页是配置参考;怎么开关自动模式见「权限模式」页。自动模式对所有用户在每个提供商上都可用,如果 Claude Code 报告它对你的账号不可用,查看官方要求说明。
默认情况下,分类器只信任工作目录和当前仓库配置的远程。推送到你公司的源码托管组织、写入团队云存储桶这类操作会被阻止,直到你把它们加进 autoMode.environment。
常见边界
自动模式默认允许推送到你所在仓库的任何分支(包括默认分支)和创建 PR;名字表明是部署或发布目标的非默认分支(如 production、release、gh-pages)不在该默认之内,由分类器判断。
加入人工检查点
最直接的机制是 permissions.ask。限定内容的 ask 规则在分类器之前评估,即使在自动模式下也总会强制弹出权限提示,因为显式 ask 规则就是你表明想被提示的意图:
{
"permissions": {
"ask": ["Bash(git push *)", "Bash(gh pr create *)"]
}
}这些规则匹配以 git push 或 gh pr create 开头的命令;Claude 以别的写法(如 git -C <dir> push)写出的推送不会匹配,因此不被检查点拦住。需要检查完整命令文本的检查点,加一个 PreToolUse hook。
按边界需要多硬来选机制:
| 边界 | 机制 | 自动模式下的行为 |
|---|---|---|
| 动作前提示 | permissions.ask | 对匹配内容限定规则的命令总是提示,分类器不能自动批准 |
| 绝不运行该动作 | permissions.deny | 在咨询分类器之前就阻止,分类器和用户意图都无法覆盖 |
| 本会话的一次性边界 | 在对话里说明,如「我审阅之前别推送」 | 分类器会阻止匹配的动作,但如果上下文压缩移除了说明边界的消息,该边界可能丢失;要持久保证用 ask 或 deny 规则 |
分类器从哪里读配置
分类器读取与 Claude 自己加载的相同的 CLAUDE.md 内容,所以项目 CLAUDE.md 里的「绝不 force push」会同时引导 Claude 和分类器。项目约定和行为规则先从这里入手。
跨项目的规则(受信基础设施、组织范围的 deny 规则)用 autoMode 设置块,分类器从以下范围读取:
| 范围 | 文件 | 用于 |
|---|---|---|
| 单个开发者 | ~/.claude/settings.json | 个人受信基础设施 |
| 整个组织 | 托管设置 | 分发给所有开发者的受信基础设施 |
--settings 标志或 Agent SDK | 内联 JSON | 自动化的按次覆盖 |
分类器不会从项目的 .claude/settings.json 或 .claude/settings.local.json 读取 autoMode,因为这两个文件在仓库目录里,被检入的仓库或构建步骤否则可以注入自己的 allow 规则。各范围的条目会合并;开发者可以用个人条目扩展 environment、allow、soft_deny 和 hard_deny,但不能移除托管设置提供的条目。分类器是权限系统之后的第二道关;必须无论如何都不运行的动作,用托管设置里的 permissions.deny。
定义受信基础设施
对多数组织,autoMode.environment 是唯一需要设置的字段。它告诉分类器哪些仓库、存储桶和域名受信,分类器据此判断什么是「外部」,所以没列出的目的地都是潜在的外泄目标。claude auto-mode defaults 会打印三类环境条目:
- 上下文槽位:描述组织、技术栈和安全姿态(组织、Claude Code 的主要用途、云提供商、仓库可见性、内部共享/代码片段托管、组织专用 CLI、密钥管理、CI/CD 部署目标、网络姿态、主机隔离、受保护的部署命名空间/环境、数据保留/降密)
- 信任槽位:分类器视为边界之内的东西:受信仓库、源码托管、受信内部域名、受信云存储桶、关键内部服务、内部包注册表;仓库和源码托管条目默认是工作仓库及其配置的远程
- 敏感度槽位:保护性规则视为高风险的东西:敏感数据位置与受众、敏感远程目标、受保护的 IaC 范围;每个默认是宽泛的启发式(如把名字带
prod或production的主机或命名空间视为敏感远程目标)
在默认条目旁边加自己的条目,数组里写字面字符串 "$defaults",默认条目会被展开到该位置:
{
"autoMode": {
"environment": [
"$defaults",
"Source control: github.example.com/acme-corp and all repos under it",
"Trusted cloud buckets: s3://acme-build-artifacts, gs://acme-ml-datasets",
"Trusted internal domains: *.corp.example.com, api.internal.example.com",
"Key internal services: Jenkins at ci.example.com, Artifactory at artifacts.example.com"
]
}
}保存后运行 claude auto-mode config 确认生效规则包含了你的条目。条目是自然语言,不是正则或工具模式,像向新工程师描述基础设施那样写。建议的推进顺序:先用默认值,加上源码托管组织和关键内部服务(解决最常见的误报,如推送到自己的仓库),再加受信域名和云存储桶,其余在遇到拦截时再补。
用 /auto-mode-setup 生成环境条目
/auto-mode-setup 让 Claude Code 根据你的项目和最近的会话起草 autoMode.environment 条目(有时也包括规则条目),接受后写入 ~/.claude/settings.json。需要 Pro、Max 或 Team 套餐,不能在云端会话里运行。它读取:项目的 CLAUDE.md、README.md、配置文件和 git 远程;你的 autoMode 和 permissions.allow 设置;最近会话里 Claude 运行的命令中的主机、存储桶和命令名(不读你的消息);另有两项需要你确认的可选扫描(shell 历史里每条命令的首词,以及主目录下仓库的远程主机和名称)。草稿只能整体接受或丢弃,之后手动编辑 ~/.claude/settings.json 调整单条。保存后它还会提供移除被自动模式忽略的 permissions.allow 规则(如 Bash(*))。
自动模式多次拦截而你还没有任何 autoMode.environment 条目时,会弹出「Teach auto mode about your environment?」对话框,提供运行它。想关掉提示但保留命令,选 Don't show again;想两者都关,在 ~/.claude/settings.json 里加:
{ "skillOverrides": { "auto-mode-setup": "off" } }覆盖 block 和 allow 规则
另有三个字段可以替换分类器内置的规则列表,每个都是自然语言描述的数组:
autoMode.hard_deny:无条件的安全边界autoMode.soft_deny:用户意图可以清除的破坏性动作autoMode.allow:soft block 规则的例外
分类器内部的优先级分四层:hard_deny 无条件阻止(用户意图和 allow 例外都不适用);soft_deny 其次阻止(用户意图和 allow 例外可以覆盖);allow 覆盖匹配的 soft_deny 作为例外;显式用户意图覆盖剩下的 soft 阻止,如果用户的消息直接且具体地描述了 Claude 即将执行的那个精确动作,即使有 soft_deny 匹配分类器也放行。笼统的请求不算显式意图:「清理一下仓库」不等于授权 force push,但「force-push 这个分支」是。想放宽,在分类器反复标记一个默认例外没覆盖的常规模式时加 allow;想收紧,对默认漏掉的、你环境特有的破坏性风险加 soft_deny,必须绝不越过的安全边界加 hard_deny。
{
"autoMode": {
"environment": ["$defaults", "Source control: github.example.com/acme-corp and all repos under it"],
"allow": [
"$defaults",
"Deploying to the staging namespace is allowed: staging is isolated from production and resets nightly"
],
"soft_deny": [
"$defaults",
"Never modify files under infra/terraform/prod/: production infrastructure changes go through the review workflow"
],
"hard_deny": ["$defaults", "Never send repository contents to third-party code-review APIs"]
}
}危险:设置
environment、allow、soft_deny或hard_deny中任何一个而不带"$defaults",会替换该段的整个默认列表。例如soft_deny不带它会丢掉所有内置 soft 规则(包括 force push、curl | bash、生产部署和自动模式绕过),hard_deny会丢掉内置的数据外泄规则。每段独立评估,只设environment不影响另外三个默认列表。只有想完全接管列表时才省略它,并先运行claude auto-mode defaults打印内置规则,复制进设置文件,逐条按你的流程和风险承受度审阅。
在 /permissions 的 Auto mode 标签页(v2.1.246 起)可以不打开设置文件查看和编辑分类器规则和 environment 条目;来自托管设置或 --settings 的条目只读,所有修改都保存到 ~/.claude/settings.json。
让所有 shell 命令都经过分类器
默认情况下,像 Bash(npm test) 这样窄的 Bash 和 PowerShell allow 规则在自动模式下仍有效,在分类器运行之前解析;只有授予任意代码执行的宽规则(如 Bash(*))被挂起。把 autoMode.classifyAllShell 设为 true 会在自动模式激活期间挂起所有 Bash 和 PowerShell allow 规则,让分类器评估每条 shell 命令(关键路径的删除除外)。代价是延迟:原本 allow 规则会即时批准的命令现在要等分类器决定,且每条 shell 命令都算一次分类器调用。该设置只在自动模式激活时生效。
{ "autoMode": { "classifyAllShell": true } }检查默认值和生效配置
claude auto-mode 子命令用来检查、校验和重置:
claude auto-mode defaults # 打印内置的 environment、allow、soft_deny、hard_deny 规则(JSON)
claude auto-mode config # 打印分类器实际使用的规则:设置了的用你的,否则用默认
claude auto-mode critique # 对你自定义的规则做 AI 评审,标出含糊、冗余或易误报的条目
claude auto-mode reset # 从用户设置文件移除 autoMode 段,回到默认(加 --yes 跳过确认)defaults 可以加 --label '<规则名开头>' 只读某条规则的完整措辞(不区分大小写的前缀匹配)。reset 只改 ~/.claude/settings.json,托管设置或 --settings 里的 autoMode 规则仍然有效。
审阅被拒的操作
打开 /permissions 并选 Recently denied 标签页,Claude Code 记录了每次拒绝;对被拒动作按 r 标记重试,退出对话框时 Claude Code 会告诉模型可以重试该工具调用。要看分类器拦了什么,在对话里找到对应的工具调用(折叠成 Ran 3 shell commands 这样的摘要行时,按 Ctrl+O 打开转录查看器展开)。输入框附近的通知形如 bash denied by auto mode · [Data Exfiltration] · /permissions,方括号里是匹配的规则名,用 claude auto-mode defaults --label 读它的完整措辞。
修复被拒操作:
- Claude 在整个任务里都需要的目的地(包注册表、内部域名、仓库主机):加进
autoMode.environment - 你想从此不经审查就运行的命令:加
allow规则 - 你确实打算做的一次性动作:在下一条消息里表明意图,让 Claude 重试
对同一目的地反复被拒,通常说明分类器缺上下文:把该目的地加进 autoMode.environment,或运行 /auto-mode-setup,然后用 claude auto-mode config 确认变更已生效。如果拒绝文本报告的是分类器本身的问题(如模型暂时不可用),说明 Claude Code 在分类器没有最终判定的情况下阻止了调用,见官方错误页。