Claude Code 配置速查表

最常用的键、规则、模板和坑。

⚠️ 严格 JSON

settings.json严格 JSON// 注释和尾逗号都是语法错误,会导致该文件被整个跳过,启动时报 Settings Error。


一、放到哪

层级路径进 git
用户级~/.claude/settings.json(Windows:%USERPROFILE%\.claude\
项目共享<项目>/.claude/settings.json
项目本地<项目>/.claude/settings.local.json
企业强制见下IT 下发

优先级(高 → 低):企业 managed → 命令行 --settingssettings.local.json → 项目 settings.json → 用户 settings.json

企业 managed 路径

平台路径
WindowsC:\Program Files\ClaudeCode\managed-settings.json
Windows 注册表HKLM\SOFTWARE\Policies\ClaudeCodeSettings 值(REG_SZ/REG_EXPAND_SZ
macOS/Library/Application Support/ClaudeCode/managed-settings.json
Linux / WSL/etc/claude-code/managed-settings.json
旧的 C:\ProgramData\ClaudeCode\managed-settings.json 已不再读取
同目录可放 managed-settings.d/*.json 分片,按文件名字母序合并。
claude config list      # 看当前生效值
claude doctor           # 报出配置错误

二、最常用键

{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "model": "sonnet",
  "fallbackModel": "haiku",
  "permissions": {
    "allow": ["Bash(npm run test:*)", "Bash(git status)", "Read(./src/**)"],
    "ask": ["Bash(git push:*)"],
    "deny": ["Read(./.env)", "Read(./.env.*)", "Read(./secrets/**)", "Bash(curl:*)"],
    "defaultMode": "acceptEdits",
    "additionalDirectories": ["../shared-libs"]
  },
  "env": { "NODE_ENV": "development" },
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh",
    "padding": 0
  },
  "cleanupPeriodDays": 30,
  "alwaysThinkingEnabled": true,
  "spinnerTipsEnabled": false,
  "outputStyle": "Explanatory",
  "enableAllProjectMcpServers": false,
  "enabledMcpjsonServers": [],
  "disabledMcpjsonServers": [],
  "disableAllHooks": false
}
说明
model / fallbackModel主模型 / 降级模型(--modelANTHROPIC_MODEL 会覆盖它)
permissionsdefaultModeadditionalDirectories 都在这一层里面,不是顶层
env注入每个会话的环境变量;与 shell 同名时设置文件赢
hooks第五节
statusLine自定义状态栏
apiKeyHelper输出 API key 的脚本,适合密钥轮换
cleanupPeriodDays会话记录保留天数,默认 30
attributioncommit/PR 里的归属信息(attribution.commit / .pr / .sessionUrl
disableAllHooks一键关掉所有 hooks;注意它同时会关掉自定义 statusLine 和 @ 补全
autoUpdatesChannel发布通道:"latest"(默认)或 "stable"(不是 autoUpdates,那个键不存在)
outputStyle输出风格,首字母大写Default/Proactive/Concise/Explanatory/Learning

三、权限

求值顺序

deny  >  ask  >  allow

先看 deny,再看 ask,最后看 allow;第一个命中的决定结果,规则宽窄不影响顺序。宽泛的 deny 会压过更窄的 allow。

常用写法

{
  "permissions": {
    "allow": [
      "Bash(npm run test:*)",
      "Bash(git diff:*)",
      "Read(./src/**)",
      "Read(./**/*.md)",
      "WebFetch(domain:docs.claude.com)",
      "WebSearch",
      "mcp__github__get_issue",
      "mcp__puppeteer__*"
    ],
    "ask": ["Bash(git push:*)", "Bash(npm publish:*)"],
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)",
      "Read(//etc/passwd)",
      "Bash(curl:*)",
      "Bash(rm -rf:*)"
    ]
  }
}

路径写法(Read / Edit)

写法含义
//path文件系统绝对路径(两个斜杠)
~/path家目录
/path相对该 settings 文件所属层级(项目设置 → 主工作目录;用户设置 → ~/.claude/
path./path相对当前工作目录

Windows 路径先归一化为 POSIX:C:\Users\alice/c/Users/alice,所以写 //c/**/.env

defaultMode 取值

default(CLI 里叫 manual)、acceptEditsplanautodontAskbypassPermissions

autobypassPermissions 不从项目或本地 settings 生效(v2.1.257 起)。要设就设在用户级或 managed,或用 --permission-mode
禁用它们:"disableBypassPermissionsMode": "disable""disableAutoMode": "disable"(都在 permissions 下,取值都是字符串 "disable")。

要点

  • Bash 是前缀匹配Bash(npm run test:*):* 必须写(等价 Bash(npm run test *))。
  • Bash(ls*) 会连 lsof 一起匹配;要精确就写 Bash(ls *)
  • 复合命令按 && || ; | 拆分,规则要逐个子命令都命中。
  • MCP 规则是 mcp__<server>__<tool>支持 mcp__puppeteer__* 这种通配;但带括号的 mcp__x__y(...) 会被跳过
  • Write / MultiEdit / NotebookEdit 上的路径规则会被接受但永不生效,要用 Edit(...)
  • Bash 作为 deny 会把 Bash 工具整个从上下文移除(省 token 但也失去能力);Bash(rm *) 只拦截。
  • 会话内改:/permissions;单次注入:claude --allowedTools "..." --disallowedTools "..."

四、环境变量(常设)

# 端点 / 认证
ANTHROPIC_BASE_URL          # 网关或代理端点
ANTHROPIC_AUTH_TOKEN        # 自定义 Authorization 头
ANTHROPIC_API_KEY

# 模型
ANTHROPIC_MODEL             # 覆盖 settings 里的 model
ANTHROPIC_DEFAULT_HAIKU_MODEL   # 后台小模型
CLAUDE_CODE_SUBAGENT_MODEL

# 代理
HTTPS_PROXY / HTTP_PROXY / NO_PROXY    # 不支持 SOCKS
                                       # 小写变体也有效

# 超时 / 上限
API_TIMEOUT_MS=600000
BASH_DEFAULT_TIMEOUT_MS=120000
BASH_MAX_TIMEOUT_MS=600000
BASH_MAX_OUTPUT_LENGTH=30000
MCP_TIMEOUT / MCP_TOOL_TIMEOUT

# 隐私 / 遥测
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1
DISABLE_TELEMETRY=1
DISABLE_ERROR_REPORTING=1

# 脚本里读(运行时注入)
CLAUDECODE                  # 在 CC 子进程中为 1
CLAUDE_PROJECT_DIR          # 项目根绝对路径
ANTHROPIC_SMALL_FAST_MODEL 已废弃 → 用 ANTHROPIC_DEFAULT_HAIKU_MODEL
这些是「非空即开启」的开关,设成 0 仍然算开启,要关必须 unset 或设为空串。

五、Hook 最小可用

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/guard.sh",
            "timeout": 60
          }
        ]
      }
    ]
  }
}
事件(常用)时机
PreToolUse工具调用前,可拦截/改写
PostToolUse工具调用成功后
UserPromptSubmit用户提交 prompt 后
SessionStart / SessionEnd会话开始 / 结束
Stop / SubagentStop主 agent / 子代理结束
PreCompact / PostCompact上下文压缩前 / 后

(实际事件远多于此,约 30+ 个;/hooks 可查当前版本全集。)

退出码

含义
0成功。stdout 仅在 UserPromptSubmit / SessionStart 等少数事件上注入为上下文
2阻断。stderr 回喂给 Claude
其他不阻断exit 1 不会拦住任何东西
要强制策略必须用 exit 2

拦截式输出(配合 exit 0):

{
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "permissionDecision": "deny",
    "permissionDecisionReason": "禁止 rm -rf"
  }
}
command 里用 ${CLAUDE_PROJECT_DIR} 拼绝对路径(hook 的 cwd 不保证是项目根);脚本记得 chmod +x;调试 claude --debug hooks

六、MCP 最小

<项目>/.mcp.json(进 git):

{
  "mcpServers": {
    "filesystem": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "./data"]
    },
    "tavily": {
      "type": "http",
      "url": "https://mcp.tavily.com/mcp/",
      "headers": { "Authorization": "Bearer ${TAVILY_API_KEY}" }
    }
  }
}
  • typestdio / http / sse / wsurl 但没 type 会被当成 stdio(配置错误)。
  • 支持 ${VAR}${VAR:-default}${VAR} 未定义 → 该 server 加载失败。
  • 整个 server 超时可设 "timeout": 600000(毫秒,低于 1000 会被忽略)。
claude mcp add --transport http <name> <url>
claude mcp add-json <name> '{"type":"stdio","command":"npx","args":["-y","pkg"]}'
claude mcp list / get <name> / remove <name>
.mcp.json 描述的是会被执行的任意命令。克隆陌生仓库先审再信任。

七、常见坑

正解
JSON 里写了注释settings.json 严格 JSON,注释是语法错误
defaultMode 放顶层必须在 permissions 里面
additionalDirectories 放顶层同上
项目里设 defaultMode: "auto" 不生效auto/bypassPermissions 只在用户级或 managed 生效
autoUpdates 不生效键不存在,用 autoUpdatesChannel
includeCoAuthoredBy 没反应已废弃,用 attribution
outputStyle 设了不生效值要首字母大写,写 "default" 不对;且改动后需重开会话
disableAutoModetrue 不生效值是字符串 "disable",不是布尔
MCP 规则写 mcp__x__y(*) 无效带括号的 MCP 规则会被跳过;用 mcp__x__*
Write(...) 权限规则没用Write/MultiEdit 的路径规则永不生效,改用 Edit(...)
hook exit 1 拦不住只有 exit 2 阻断
hook 找不到脚本${CLAUDE_PROJECT_DIR} 拼绝对路径
子代理不被自动委派description 要写清「何时用我」
想用 .claudeignore不存在。用权限 deny 规则排除读取
改了 model 但没变model 只在会话启动时读一次,要重开会话

配置随版本演进较快,以 claude doctorclaude config list/help 的实际输出为准。

评论已关闭