Claude Code Write 权限规则与 cc-switch 模板的坑
背景¶
本机通过中转站调用 API,存在 Anthropic 格式和 OpenAI 格式两种配置,平时用 cc-switch 切换模型配置。某天终端启动 claude 时冒出一堆 Permission rule 错误,而且每次用 cc-switch 切换模型后都会重新出现。
现象¶
Permission allow rule (../../../../../../.claude/settings.json): Write(src/**) is not matched by file permission checks — only Edit(path) rules are. Use Edit(src/**) instead (Edit rules cover all file-editing tools).
Permission deny rule (../../../../../../.claude/settings.json): Write(**/.env*) is not matched by file permission checks — only Edit(path) rules are. Use Edit(**/.env*) instead (Edit rules cover all file-editing tools).
...
一开始以为和“Anthropic 格式 / OpenAI 格式”切换有关,实际排障后发现这组报错与 API 格式完全无关。
原因一:Claude Code 新版权限规则语法¶
新版 Claude Code 的文件编辑权限规则只认 Edit(path),旧版写法 Write(path) 不再匹配。配置文件里所有用于文件编辑的 allow/deny 规则都需要写成 Edit(...),否则启动时会逐条提示并忽略这些规则。
原因二:cc-switch 每次切换都会覆盖配置文件¶
只修改 ~/.claude/settings.json 并不能永久解决:cc-switch 切换模型配置时,会用自己数据库里保存的模板整体重写 ~/.claude/settings.json。
模板存放在:
~/.cc-switch/cc-switch.db
表:settings
键:common_config_claude
这个模板里仍然写着 Write(...),所以改完 settings.json 后一旦再用 cc-switch 切换,旧规则又会被写回来。
修复步骤¶
1. 修复当前生效的配置文件¶
把 ~/.claude/settings.json 中所有 "Write( 替换为 "Edit(:
sed -i '' 's/"Write(/"Edit(/g' ~/.claude/settings.json
2. 修复 cc-switch 的模板(关键步骤)¶
直接更新 cc-switch 数据库中的 common_config_claude:
sqlite3 ~/.cc-switch/cc-switch.db "UPDATE settings SET value = replace(value, '\"Write(', '\"Edit(') WHERE key = 'common_config_claude';"
如果 cc-switch 正在运行,先完全退出再重新打开,确保它从数据库读取新模板。之后再用 cc-switch 切换模型,生成出来的 settings.json 就会是 Edit(...)。
3. 验证¶
# 应无输出,表示没有残留 Write 规则
rg -n '"Write\(' ~/.claude/settings.json
# 校验 JSON 合法
python3 -m json.tool ~/.claude/settings.json > /dev/null && echo OK
额外提醒:API 格式问题¶
Claude Code 本身只直接支持 Anthropic Messages API(/v1/messages)。
- 中转站同时提供两种格式时,
ANTHROPIC_BASE_URL应指向 Anthropic 兼容地址(通常是https://中转站/v1),不要指向 OpenAI 的/v1/chat/completions。 - 如果某个中转站只有 OpenAI 格式,不要在 Claude Code 里直接切换,用本地转换代理(例如
claude-code-router)给 Claude Code 提供固定的 Anthropic 格式端点,上游切换只改代理配置。
经验总结¶
- 排障先看报错原文:
Write规则报错和 API 格式无关,不要被表面现象带偏。 - 配置被管理工具接管时,要找到配置的“源头”:cc-switch 这类工具会用自己数据库里的模板覆盖目标配置文件,只改结果文件会被反复还原。
- 修复后要验证两处:目标配置文件 + 工具模板,并重启管理工具让新模板生效。