跳转至

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 格式端点,上游切换只改代理配置。

经验总结

  1. 排障先看报错原文:Write 规则报错和 API 格式无关,不要被表面现象带偏。
  2. 配置被管理工具接管时,要找到配置的“源头”:cc-switch 这类工具会用自己数据库里的模板覆盖目标配置文件,只改结果文件会被反复还原。
  3. 修复后要验证两处:目标配置文件 + 工具模板,并重启管理工具让新模板生效。