跳转到内容

切换供应商后 settings.json 插件与 hooks 丢失

Quick fix

这是 cc-switch 的全量快照覆盖设计:把需要保留的字段放进“共享配置片段 / 通用配置”,并勾选“写入通用配置”。

报错原文
切换模型时, 会重写settings.json的Key, 但是有时候会丢失settings.json的其他Key, 写入时应该和原本settings.json中Key合并, 并且合并时应该实时获取原始配置.

cc-switch 切换供应商时并不是只合并或替换 env / 模型相关字段,而是把目标供应商在数据库中保存的完整 settings.json 快照整体写回 ~/.claude/settings.json。因此插件配置、enabledPlugins、hooks、includeCoAuthoredBy 等字段如果只存在于当前 live 文件里,而没有进入共享配置片段 / 通用配置,切换到另一个供应商时就可能被覆盖或看起来“随机丢失”。维护者说明这是有意设计,因为字段级 merge 曾带来嵌套数组、用户删除字段与未设置字段难以区分、多层合并冲突等边界问题。

该 cluster 中还混有其他相关现象:部分用户报告“切换失败,请检查配置”,维护者提到常见原因包括配置格式不正确或 cc-switch 对 settings.json 没有写入权限;另有用户提到开启代理接管时通用配置可能未能正确写回,维护者称已在 v3.12.2 修复;还有用户反馈切换后对话不保留,维护者解释这是 Claude Code / Codex 客户端在 env 变化后重新初始化会话,cc-switch 不删除会话。

  1. 打开 cc-switch 的“编辑供应商 / Edit Provider”,进入“共享配置面板 / Shared Config Panel”。

  2. 点击“从当前供应商提取 / Extract from Current Provider”,把 enabledPlugins、hooks、statusLine、includeCoAuthoredBy 等需要跨供应商保留的字段提取到共享配置片段 / 通用配置中。

    ~/.claude/settings.json
    # 将需要保留的字段放入 cc-switch 的通用配置 / 共享配置片段,例如:
    {
    "enabledPlugins": {
    "frontend-design@claude-plugins-official": true,
    "superpowers@claude-plugins-official": true,
    "code-review@claude-plugins-official": true,
    "typescript-lsp@claude-plugins-official": true,
    "gopls-lsp@claude-plugins-official": true,
    "pyright-lsp@claude-plugins-official": true
    },
    "includeCoAuthoredBy": false
    }
  3. 确认每个需要保留这些字段的供应商都勾选了“写入通用配置 / Write Shared Config”。新供应商默认勾选,已有供应商可能需要手动启用。

  4. 如果切换时提示“切换失败,请检查配置”,检查配置 JSON 格式是否正确,以及当前用户是否对 cc-switch 配置目录和 Claude Code / Codex 配置目录中的 settings.json 有写入权限;必要时以管理员模式启动 cc-switch 测试。

  5. 如果使用代理接管且发现通用配置没有正确写回,升级到 v3.12.2 或更新版本后重试。

ToolClaude Code
Version未知
PlatformsmacOSWindowsLinux
为什么 cc-switch 不能只替换模型相关字段,而要覆盖整个 settings.json?
维护者说明这是有意设计。每个供应商保存的是完整 settings.json 快照,切换时整体写回。之前尝试字段级替换 / merge 时出现很多边界问题,例如嵌套数组、无法区分“用户主动删除字段”和“用户从未设置字段”、多层合并冲突等,所以改为全量快照加共享配置片段的方式。
插件配置、hooks、includeCoAuthoredBy 应该放在哪里?
放在 cc-switch 的“通用配置 / 共享配置片段”中。可以在编辑供应商时使用“从当前供应商提取”,然后确保相关供应商勾选“写入通用配置”。
为什么 hooks 是“有时候”丢失,不是每次切换都丢失?
因为切换前 cc-switch 会把当前 live 文件回填到当前激活供应商,所以你在当前供应商下修改的字段可能暂时保留;但切换到另一个没有这些字段的供应商时,目标供应商快照会覆盖 live 文件,字段就会消失。
切换后 Claude Code / Codex 对话不保留,是 cc-switch 删除了会话吗?
不是。维护者说明 cc-switch 只改写供应商 env,不写删会话。对话不保留是客户端在 env 变化后重新初始化会话。原对话仍在 ~/.claude/projects/<cwd>/,可以用 claude --resume 接续。
提示“切换失败,请检查配置”怎么办?
先检查配置 JSON 格式是否正确,再检查当前用户对 settings.json 以及相关配置目录是否有写入权限。维护者提到曾定位到用户没有文件写入权限导致切换失败,可以尝试右键 cc-switch 图标以管理员模式启动。
修改配置目录后,为什么 settings.json 仍然写入默认目录?
有维护者回复称相关功能写入的不是 settings.json,而是 ~/.claude.json。如果你看到默认目录中的文件被更新,需要先确认被修改的是哪个配置文件。

这是一个非官方社区 wiki,与 cc-switch 作者及项目本身无隶属关系。内容整理自项目公开的 GitHub issues。本站不分发任何软件。