1
0

修复 cc-switch 底层路径“幽灵” Bug

2026-05-21
2026-05-22
PR
修复 cc-switch 底层路径“幽灵” Bug

📅 记录时间: 2026-05-21
🔄 当前状态: 🚧 提交 PR,等待 Review
🔗 关联归档: Issue #3023 | PR #3024

终于,我也在开源世界的代码库里留下了自己的足迹!

作为一个极其依赖 AI 辅助编程的开发者,我每天都会在终端里高频使用 Claude Code 以及各种 MCP(Model Context Protocol)插件。在这个过程中,cc-switch 成了我不可或缺的配置中转站。但在最近的使用中,我却一脚踩进了一个极其隐蔽的底层 Bug 里。

这不仅是我第一次在 GitHub 官方仓库提 Issue (#3023),更是我第一次完整地包揽了从根因排查、Rust 源码修复到集成测试覆盖的全套 PR 流程。今天就来复盘一下这次极其爽快的 Debug 之旅。

👻 诡异的现象:永远抓不到的“幽灵配置”

事情的起因很简单:我试图在 cc-switch 里为 Claude Code 挂载一个名为 serper 的本地搜索 MCP。

表面上看,一切正常。在 cc-switch 的 UI 面板里点击启用,底层的 SQLite 数据库也确实把 enabled_claude 更新为了 1。但是,当我满怀期待地重启 Claude Code 并敲下 /mcp 时,列表里空空如也。无论在 UI 里怎么反复横跳开关,Claude Code 就是死活不认。

为了弄清真相,我直接深入文件系统进行查证,结果发现了一个非常离谱的“幽灵文件”现场: 磁盘上竟然同时出现了两个 .claude.json。当设置了 claudeConfigDir 后,cc-switch 把配置写到了覆盖目录的同级位置,而 Claude Code 实际读取的却是覆盖目录的内部。

这就好比我把快递寄到了你家隔壁,你自然永远收不到。

🕵️‍♂️ 深入 Rust 源码:定位病灶

既然是开源项目,那就直接扒源码!我顺藤摸瓜找进了后端的 Rust 代码,很快锁定了罪魁祸首:src-tauri/src/config.rs 中的 derive_mcp_path_from_override 函数。

它的拼接逻辑有一个致命的想当然:

Rust

fn derive_mcp_path_from_override(dir: &Path) -> Option<PathBuf> {
    // ...省略部分逻辑...
    Some(parent.join(format!("{file_name}.json"))) 
}

这段代码错误地假设了 .claude 目录永远和 .claude.json 文件是平级的。这个假设在默认的 Home 目录下确实成立,但在我们使用了 CLAUDE_CONFIG_DIR 进行环境变量重定向的高级模式下,彻底与 Claude Code 的真实读取路径脱节了。

🛠️ 操刀修复:不仅要治标,还要顾及历史包袱

定位到问题后,修复方案很快就在脑海里成型了。但作为一个合格的后端开发者,我知道不能简单粗暴地改一行代码就跑路,我还必须处理历史遗留数据。

我在 PR 中提交了以下核心修复方案:

  1. 对齐官方逻辑:修改 get_claude_mcp_path(),当存在覆盖目录时,直接返回 dir.join(".claude.json"),让写入位置老老实实地回到目录内部。
  2. 优雅的升级迁移 (Migration):我没有直接删掉旧的错误函数,而是将它重命名为 derive_legacy_sibling_mcp_path 并限制为内部使用(pub(crate) 化)。它现在只作为一个“历史遗迹定位器”,配合我升级的 ensure_mcp_override_migrated() 函数,自动把老用户留在错误位置的配置无缝搬迁到新位置,且不会覆盖现有文件。

🧪 严谨交付:让测试替代码说话

代码改完了,但我深知没写测试的代码就是耍流氓。为了确保这个核心同步路径以后不再被乱改,我追加了两个重量级的集成测试:

  • toggle_claude_mcp_writes_into_override_dir
  • override_migrates_legacy_sibling_file_to_inside_dir

这两个测试跑通了正向写入和历史迁移的全部断言。随着终端里 cargo test --test mcp_commands 跑出的 16/16 passed 绿灯,以及 cargo clippy 的零新增警告,我知道,这波稳了。

🎉 写在最后

当我在 GitHub 上点击绿色的 "Create pull request" 按钮时,那种亲自为每天使用的工具打补丁的成就感,是平时写业务代码很难比拟的。

开源并不是远在天边的大神专属。只要你在日常开发中多了一份“刨根问底”的好奇心,哪怕是从修复一个路径拼接问题开始,你也能成为驱动世界前进的一小部分力量。

期待这篇 PR 顺利 Merge,我的极客打怪升级之旅,未完待续!

评论