修复 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 中提交了以下核心修复方案:
- 对齐官方逻辑:修改
get_claude_mcp_path(),当存在覆盖目录时,直接返回dir.join(".claude.json"),让写入位置老老实实地回到目录内部。 - 优雅的升级迁移 (Migration):我没有直接删掉旧的错误函数,而是将它重命名为
derive_legacy_sibling_mcp_path并限制为内部使用(pub(crate)化)。它现在只作为一个“历史遗迹定位器”,配合我升级的ensure_mcp_override_migrated()函数,自动把老用户留在错误位置的配置无缝搬迁到新位置,且不会覆盖现有文件。
🧪 严谨交付:让测试替代码说话
代码改完了,但我深知没写测试的代码就是耍流氓。为了确保这个核心同步路径以后不再被乱改,我追加了两个重量级的集成测试:
toggle_claude_mcp_writes_into_override_diroverride_migrates_legacy_sibling_file_to_inside_dir
这两个测试跑通了正向写入和历史迁移的全部断言。随着终端里 cargo test --test mcp_commands 跑出的 16/16 passed 绿灯,以及 cargo clippy 的零新增警告,我知道,这波稳了。
🎉 写在最后
当我在 GitHub 上点击绿色的 "Create pull request" 按钮时,那种亲自为每天使用的工具打补丁的成就感,是平时写业务代码很难比拟的。
开源并不是远在天边的大神专属。只要你在日常开发中多了一份“刨根问底”的好奇心,哪怕是从修复一个路径拼接问题开始,你也能成为驱动世界前进的一小部分力量。
期待这篇 PR 顺利 Merge,我的极客打怪升级之旅,未完待续!