命令字典
Slash 命令、CLI 子命令、Hook 事件、启动参数的字典与演进史。
Slash 命令、CLI 子命令、Hook 事件、启动参数的字典与演进史。
打印内置自动模式分类器规则
claude auto-mode defaultsclaude auto-mode defaults > rules.jsonclaude auto-mode defaults 是 Claude Code CLI 内置的一个只读诊断子命令,功能是将 auto mode 分类器的内置规则集以 JSON 格式打印到标准输出。输出包含四个数组字段:environment(受信基础设施描述)、allow(放行例外)、soft_deny(可被用户意图覆盖的软拦截规则)、hard_deny(无条件硬拦截规则)。
它是 claude auto-mode 子命令族中三条命令之一:
| 子命令 | 作用 |
|---|---|
claude auto-mode defaults | 打印内置规则集(不含个人/组织设置) |
claude auto-mode config | 打印有效规则集(将你的 settings 合并展开后的结果) |
claude auto-mode critique | 用 AI 对你写的自定义规则进行审查,标出歧义、冗余或易误触发项 |
平台/订阅限制:在 Anthropic API 上直接可用。在 Amazon Bedrock、Google Vertex AI、Microsoft Foundry 上同样支持,但官方文档要求先设置环境变量 CLAUDE_CODE_ENABLE_AUTO_MODE(并非"不支持")。Team / Enterprise 由管理员在控制台侧管理。
版本里程碑:本指南早期曾标注
$defaults(v2.1.118)、hard_deny(v2.1.136)的引入版本,但这些版本号缺乏官方 changelog 佐证(hard_deny仅见于第三方博客),已移除以免误导。具体字段在你当前版本是否可用,请以claude auto-mode defaults实际输出为准。
claude auto-mode defaults
输出 JSON 到 stdout,包含四个字段的内置规则数组。
claude auto-mode defaults > rules.json
将输出写入 rules.json,之后可手工编辑——删除或修改内置规则——再将结果粘贴回 settings 文件,替换 "$defaults" 哨兵。这是唯一安全地「移除或改写某条内置规则」的方式。
# 先看内置规则
claude auto-mode defaults
# 再看合并后的有效配置($defaults 已展开)
claude auto-mode config
两者 diff 可让你确认自定义 settings 是否正确被合并进去。
# 1. 把内置规则导出
claude auto-mode defaults > ~/.claude/auto-mode-defaults.json
# 2. 编辑,剔除不需要的规则
$EDITOR ~/.claude/auto-mode-defaults.json
# 3. 用编辑后的内容替换 settings.json 中对应字段的 "$defaults"
# (手工粘贴到 ~/.claude/settings.json 的 autoMode.soft_deny 等字段)
# 4. 验证有效配置
claude auto-mode config
# 5. 审查自定义规则质量
claude auto-mode critique
| 作用域 | 文件路径 | 说明 |
|---|---|---|
| 个人全局 | ~/.claude/settings.json | 个人受信基础设施 |
| 单项目个人 | .claude/settings.local.json | 项目级特定配置,建议加入 .gitignore |
| 组织统一下发 | Managed Settings(控制台) | 对所有开发者生效,不可被个人覆盖 |
| 单次调用 | --settings <file> 或 Agent SDK 内联 JSON | 自动化流水线专用 |
注意:分类器不会读取项目共享设置
.claude/settings.json里的autoMode字段,防止 repo 自行注入允许规则。
autoMode settings 结构{
"autoMode": {
"environment": [
"$defaults",
"Organization: Acme Corp. Primary use: software development",
"Source control: github.com/acme-corp and all repos under it",
"Trusted cloud buckets: s3://acme-build-artifacts",
"Trusted internal domains: *.corp.example.com"
],
"allow": [
"$defaults",
"Deploying to the staging namespace is allowed: isolated, resets nightly",
"Writing to s3://acme-scratch/ is allowed: 7-day ephemeral lifecycle"
],
"soft_deny": [
"$defaults",
"Never run database migrations outside the migrations CLI",
"Never modify files under infra/terraform/prod/"
],
"hard_deny": [
"$defaults",
"Never send repository contents to third-party code-review APIs"
]
}
}
$defaults 哨兵在任意数组中写入字符串 "$defaults",内置规则就会在该位置展开合并。这样你的自定义条目既可放在默认规则前面(更高优先级上下文),也可放在后面,并且能随版本升级自动继承新增内置规则。
autoMode.classifyAllShell(v2.1.193 新增)默认情况下,auto mode 分类器只对疑似任意代码执行的 Bash/PowerShell 命令做语义分类(其余命令走更轻的快速路径)。v2.1.193 起新增布尔设置 autoMode.classifyAllShell:置为 true 后,所有 Bash/PowerShell 命令都会被送进分类器评估,而不再仅限于任意代码执行模式。适用于希望把每一条 shell 命令都纳入 soft_deny/hard_deny/allow 自然语言规则判定的高安全场景,代价是更多命令要过一次分类器(略增延迟与误报面)。
{
"autoMode": {
"classifyAllShell": true
}
}
来源:Claude Code changelog v2.1.193 —— "Added
autoMode.classifyAllShellsetting to route all Bash/PowerShell commands through the auto-mode classifier instead of only arbitrary-code-execution patterns"。该设置较新,官方 auto-mode-config 文档页尚未收录,以 changelog 与实际 settings schema 为准。
同版(v2.1.193)还把拒绝原因写入了 transcript、拒绝 toast 和
/permissions的最近拒绝列表,排查"为什么这条被拦"时可直接在这三处看到具体理由。
分类器同时读取 CLAUDE.md 中的文本。例如在项目 CLAUDE.md 中写 never force push(普通英文指令),这条约束会同时作用于 Claude 和分类器。项目行为约定放 CLAUDE.md,跨项目的基础设施信任规则放 autoMode.environment。
| 约束 | 说明 |
|---|---|
| 只读输出 | defaults 子命令只打印,不修改任何文件 |
| 云平台需启用 | Bedrock / Vertex / Foundry 上需先设 CLAUDE_CODE_ENABLE_AUTO_MODE |
省略 $defaults 即全覆盖 | 任一字段不写 "$defaults" 将丢弃所有内置规则 |
| 分类器输入受限 | 分类器不接收 Claude 的文本输出和工具执行结果(据 SmartScope),以降低被注入风险 |
| fail-closed 设计 | 分类器不可用时默认拒绝,不会降级为放行 |
| 连续拒绝阈值 | maxConsecutive=3:连续 3 次拒绝后回退到人工审批;maxTotal=20:累计 20 次拒绝后在 headless 模式下中止会话(据 gist) |
| 规则为自然语言 | 规则是散文描述,不是 regex 或 glob 模式 |
| 项目 settings.json 被忽略 | repo 内 .claude/settings.json 的 autoMode 不被分类器读取 |
| 命令 / 机制 | 作用层 | 可被 allow 覆盖? | 可被用户意图覆盖? | 规则格式 |
|---|---|---|---|---|
permissions.deny | 分类器之前,在权限系统层 | 否 | 否 | tool 模式字符串 |
autoMode.hard_deny | 分类器内,最高层 | 否 | 否 | 散文字符串 |
autoMode.soft_deny | 分类器内 | 是(被 allow 覆盖) | 是(明确意图可覆盖) | 散文字符串 |
autoMode.allow | 分类器内,例外层 | — | — | 散文字符串 |
| CLAUDE.md 指令 | 分类器 + Claude 本身 | 视具体内容 | 视具体内容 | 自然语言 |
关键区别:
permissions.deny是确定性的工具模式拦截,在分类器调用前生效;hard_deny是 NLP 驱动的语义拦截,在分类器内运行。两者互补,不互斥。
初次接入 auto mode 前的安全审查:运行 claude auto-mode defaults > rules.json,浏览内置的 hard_deny 和 soft_deny 列表,确认你能接受这些规则再启用 auto mode。
定制化替换某条内置规则:某条内置 soft_deny 规则在你的团队流程里是误报(例如内部部署到 staging 被错误拦截),先 defaults > rules.json,删掉那条规则,把剩余内容粘贴到 settings 中,代替 "$defaults"。
组织 Managed Settings 基线制定:安全团队拉出内置规则,逐条结合合规要求注释评审,将修改后的版本写入 Managed Settings 下发全员,形成可版本控制的安全基线。
升级版本后规则 diff:升级 Claude Code 后重新运行 claude auto-mode defaults,与上次存档对比,了解新版本增删了哪些内置规则,评估是否影响现有 pipeline。
调试重复拒绝问题:某条操作反复被 auto mode 拦截,先跑 claude auto-mode config 看有效规则,再跑 defaults 确认拦截来自内置规则还是自定义规则,针对性修改 allow 或 environment。
忘写 $defaults 导致丢失所有内置规则
只要你在 settings 里写了 "soft_deny": ["自定义规则"] 而没有 "$defaults",内置的 force-push 拦截、curl | bash 拦截、生产部署拦截全部失效。正确写法是 ["$defaults", "自定义规则"]。
把 autoMode 写到项目共享 settings 里
.claude/settings.json(进入 git 的那个)里的 autoMode 字段会被分类器完全忽略。想做项目级配置必须用 .claude/settings.local.json(gitignored)或 Managed Settings。
误以为自然语言规则是精确匹配
soft_deny / allow 的条目是给分类器 LLM 读的散文描述,不是 glob 或 regex。写得太笼统(比如 "block all writes")会产生大量误报,建议附上业务理由("…because production infra changes must go through the review workflow")。
hard_deny 是较新引入的字段
hard_deny 在早期 auto mode 版本中不存在(早期仅 environment、allow、soft_deny 三个字段)。其确切引入版本无官方 changelog 佐证,使用前请用 claude auto-mode defaults 确认当前版本是否输出该字段。
以为 claude auto-mode defaults 和 claude auto-mode config 输出相同
defaults 只显示内置规则(无个人/组织设置影响);config 是合并展开后的有效规则,$defaults 已被真实列表替换。调试时必须用 config,而非 defaults。
claude auto-mode defaults 本身是只读命令,无需关闭。
若要禁用 auto mode:
据 SmartScope,组织级管理员可在 Managed Settings 中用字符串值禁用 auto mode 入口:
// Managed Settings
{
"disableAutoMode": "disable"
}
注:个人配置中用布尔
true禁用的写法无可靠来源佐证,已移除;以官方文档 / 实际 settings schema 为准。
若只想对当次会话不使用 auto mode,在会话中按 Shift+Tab 循环切换权限模式(normal → accept edits → plan → auto),切走即可。