惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
J
Java Code Geeks
雷峰网
雷峰网
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
云风的 BLOG
云风的 BLOG
V
Visual Studio Blog
V
Vulnerabilities – Threatpost
S
Securelist
The Hacker News
The Hacker News
The Register - Security
The Register - Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Help Net Security
Help Net Security
G
Google Developers Blog
Hugging Face - Blog
Hugging Face - Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
M
MIT News - Artificial intelligence
AI
AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The GitHub Blog
The GitHub Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Schneier on Security
Schneier on Security
N
Netflix TechBlog - Medium
T
The Blog of Author Tim Ferriss
Google DeepMind News
Google DeepMind News
Hacker News - Newest:
Hacker News - Newest: "LLM"
H
Hacker News: Front Page
博客园 - 司徒正美
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
B
Blog
Microsoft Azure Blog
Microsoft Azure Blog
大猫的无限游戏
大猫的无限游戏
Security Latest
Security Latest
Engineering at Meta
Engineering at Meta
N
News and Events Feed by Topic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Threat Research - Cisco Blogs
U
Unit 42
V
V2EX
V2EX - 技术
V2EX - 技术
L
LINUX DO - 最新话题
aimingoo的专栏
aimingoo的专栏
Microsoft Security Blog
Microsoft Security Blog
Recorded Future
Recorded Future
P
Privacy & Cybersecurity Law Blog
美团技术团队
小众软件
小众软件
F
Fortinet All Blogs

AI Slop

2030 年的 DDR5 会降价嘛?别做梦回 2025,那是回不去的“廉价幻觉” - V2EX V2EX › 登录 大模型中转站风险提示——警惕“小作坊”式服务 - V2EX 我对 Token 的一些理解:它不是“越多越好”,而是“刚刚好” - V2EX AI 算力大模型优逆讨论 - V2EX 「原生 IP」到底在比对什么:WHOIS、BGP、geofeed 和定位库打架时信谁? - V2EX Codex Plus 会员额度减配后要掐着用 token 了 V2EX › 登录 V2EX › 登录 V2EX › 登录 V2EX › 登录 V2EX › 登录 V2EX › 登录 V2EX › 登录 V2EX V2EX › 登录 V2EX › 登录 V2EX › 登录 V2EX › 登录
CC Switch 的血泪教训:切一次提供商, 300 多行 Claude Code 配置消失了 - V2EX
dilightme · 2026-06-15 · via AI Slop

你的 AI Agent 配置正在被 CC Switch 悄悄吃掉——不止 Claude Code ,是所有。

🔥 每次切换 API 提供商,你精心调教的所有 Agent 配置就各少一块。而你浑然不知。


一个真实故事

上周六晚上 11:47 ,上海某 AI 创业公司的全栈工程师刚完成一组 MCP Server 的配置。他花了一个下午,把 Filesystem 、GitHub 、Postgres 、Slack 和 Brave Search 五个 MCP Server 全部接入了 Claude Code 。

settings.json 已经长到快 300 行。他深吸一口气,在终端敲下:

> 帮我查一下数据库里上周的订单量,和 GitHub 上最近的 commits 对比一下

Claude Code 读到了数据库。读到了 GitHub 。读到了文件系统。全部打通了。

他兴奋地截了个图发到团队群。然后顺手用 CC Switch 切了个 API 提供商。

Claude Code 又启动了。但是——数据库访问失败了。GitHub 也读不了。五个 MCP Server 全部瘫痪。

他把昨晚的配置 commit 翻出来 diff 。一模一样。mcpServers 明明就写在文件里。他重启了 Claude Code 。又重启了电脑。他开始怀疑是不是 Claude Code 新版本改了 MCP 协议的 JSON Schema 。

凌晨一点半,他打开了 ~/.cc-switch/cc-switch.db。看见了 common_config_claude 这个 key 。


它到底干了什么

CC Switch 的设计是这样的:

你点击"切换提供商"
        │
        ▼
┌──────────────────────┐
│ 从 SQLite 读取模板    │  ← 这份模板是你第一次安装时存的快照
│ common_config_claude │
└──────┬───────────────┘
       │
       ▼
┌──────────────────────┐
│ 注入新提供商的 env     │
│ (API key, base URL)  │
└──────┬───────────────┘
       │
       ▼
┌──────────────────────────────────┐
│ 用这份拼装好的 JSON               │
│ 全量覆盖 ~/.claude/settings.json │  ← 💣 一切不在模板里的配置:没了
└──────────────────────────────────┘

注意那个「全量覆盖」。不是 merge 。不是 patch 。是 rm 然后 write

模板 = 天花板。任何模板之外的配置,在下次切换时原地消失。


打开 ~/.cc-switch/cc-switch.db,你会看到:

SELECT key FROM settings WHERE key LIKE 'common_config_%';

返回结果让人后背发凉:

common_config_claude      → 全量覆盖 ~/.claude/settings.json
common_config_codex       → 全量覆盖 ~/.codex/config.toml
common_config_opencode    → 全量覆盖 ~/.config/opencode/config.json
common_config_openclaw    → 全量覆盖 ~/.openclaw/openclaw.json

CC Switch 管理的每一个 Agent ,都有一份独立的模板。每一份模板都是全量覆盖的逻辑。切一次提供商,五个 Agent 的配置同时被各自的模板覆盖。

这不是一个 bug 。这是一个设计模式。它的破坏范围是你安装的所有 Agent 。

我们来看一个真实的数据库快照对比:

Agent 模板行数 实际配置行数 切换一次丢失
Claude Code ~30 行 ~50 行 marketplace 、statusLine 、allowedTools
Codex 110 行 373 行 263 行——4 个 marketplace 、model 设置、plugin_hooks 、context window
OpenCode ~2 行 未知 可能几乎全部
OpenClaw ~15 行 未知 workspace 、model defaults 、gateway 配置

Codex 用户尤其惨烈。你花了几周调出来的 373 行配置——包括 model_context_window = 1000000model_reasoning_effort = "xhigh"、四个社区 marketplace 、plugin_hooks = true——切一次提供商,回到 110 行的远古版本。Codex 不会报错。它只是突然变得行为诡异。你以为是 prompt 的问题。你不是一个人。


四个足够让人血压升高的场景

场景一:插件配置蒸发

你花了一个下午装了 8 个 Claude Code 插件,每个都调了参数。settings.json 长到 200 行。CC Switch 的模板里只有 4 个老插件。

切换一次提供商 → 4 个新插件配置消失。Claude Code 不报错——它只是静默地不再加载那些插件。你下次敲自定义命令时发现没反应,以为是 prompt 写错了,调试一个小时,最后发现插件根本没启用。

场景二:MCP Server 集体阵亡

就是你刚才读到的那个真实案例。MCP Server 是 Claude Code 最强大的功能——它让 Claude Code 能直接操作你的文件系统、读 GitHub 、查数据库、调用外部 API 。

配置 MCP Server 是体力活:每个 Server 的 JSON schema 不同,参数名称五花八门,有的需要 API key ,有的需要本地路径绝对引用,有的需要 Node 版本匹配。五个 Server 配完,半天没了。

切一次提供商。全部消失。Claude Code 不会提示"配置已变更"——它只是突然变得很笨。你问它"帮我看看数据库",它说我没有数据库连接。你以为是它理解不了你的意图,实际上你的 mcpServers 键已经被 CC Switch 的模板覆盖成了一年前的空对象。

场景三:团队配置滚回远古版本

你维护着一个团队共用的 Claude Code 配置模板。三个月里,团队成员陆续加了 12 个 marketplace 、6 个自定义 hook 、3 个 MCP server 。settings.json 现在是一个精心打磨的产物。

新同事第一次用 CC Switch 切提供商——模板是他三个月前第一次安装时的快照。

整个团队的三个月配置积累,一键回滚。

场景四:Codex 的 263 行无声蒸发

这是最容易被忽视的。CC Switch 也会管理 Codex 的提供商切换。它的 Codex 模板存了 110 行——第一次安装时的快照。但你实际用了 Codex 几周后,~/.codex/config.toml 已经长到 373 行。

这些多出来的 263 行包括:

  • model_context_window = 1000000——你花了一个小时试出来的最优值
  • model_reasoning_effort = "xhigh"——你专门查了文档才找到的参数
  • plugin_hooks = true——没有这个,Codex 的插件 hook 完全不生效
  • 四个社区 marketplace——Shortcuts Playground 、Compass 、Role-Specific Plugins 、Universal Plugins

切一次提供商。263 行没了。Codex 不会弹窗说"配置已回滚"。它只是突然不懂得怎么用 Shortcuts 了,review 质量也变差了。你以为是 OpenAI 改了模型行为。你开始怀疑 GPT-5.5 是不是被降智了。

直到你打开 ~/.cc-switch/cc-switch.db,看见自己的 110 行模板静静地躺在那里。


为什么这个设计是危险的

你期望的 它实际做的
只改 env 覆盖整个文件
合并配置 替换配置
增量更新 全量覆盖
保留所有自定义 保留模板里有的

CC Switch 的模板机制,本质上是把一个状态管理问题当成了配置生成问题。它假设 settings.json 除了它写入的东西之外没有其他重要内容。这在 2026 年的 AI agent 生态里是完全站不住脚的——Claude Code 的 settings.json 已经是一个会被多个工具(插件安装器、EchoBird 、手动编辑)同时修改的文件。


如何自救

如果你还在用 CC Switch

每次修改任意 Agent 的配置之后,手动反同步。全部 Agent 一键脚本(保存为 sync-cc-switch.sh):

#!/bin/bash
DB="$HOME/.cc-switch/cc-switch.db"

# Claude Code
python3 -c "import json; c=json.load(open("$HOME/.claude/settings.json")); json.dump({k:v for k,v in c.items() if k!="env"}, open("/tmp/ccs.json","w"), separators=(",",":"))"
sqlite3 "$DB" "UPDATE settings SET value = readfile("/tmp/ccs.json") WHERE key="common_config_claude";"

# Codex (TOML)
sqlite3 "$DB" "UPDATE settings SET value = readfile("$HOME/.codex/config.toml") WHERE key="common_config_codex";"

# OpenCode
python3 -c "import json; c=json.load(open("$HOME/.config/opencode/config.json")); json.dump({k:v for k,v in c.items() if k!="env" and k!="model_providers"}, open("/tmp/ccs.json","w"), separators=(",",":"))"
sqlite3 "$DB" "UPDATE settings SET value = readfile("/tmp/ccs.json") WHERE key="common_config_opencode";"

# OpenClaw
python3 -c "import json; c=json.load(open("$HOME/.openclaw/openclaw.json")); json.dump({k:v for k,v in c.items() if k!="env"}, open("/tmp/ccs.json","w"), separators=(",",":"))"
sqlite3 "$DB" "UPDATE settings SET value = readfile("/tmp/ccs.json") WHERE key="common_config_openclaw";"

rm /tmp/ccs.json && echo "✅ All 4 agents synced"

或者单独同步 Claude Code:

python3 -c "
import json
with open('$HOME/.claude/settings.json') as f:
    c = json.load(f)
template = {k:v for k,v in c.items() if k != 'env'}
with open('/tmp/sync.json','w') as f:
    json.dump(template, f, separators=(',',':'))
" && sqlite3 ~/.cc-switch/cc-switch.db \
  "UPDATE settings SET value = readfile('/tmp/sync.json') WHERE key = 'common_config_claude';" && \
  echo "Synced ✅"

长远来看

CC Switch 没有提供「从当前配置导入」的功能,也没有在切换前做 diff 警告。如果你发现自己经常需要跑上面的脚本,那说明你的使用模式已经超出了 CC Switch 的设计假设。

用 EchoBird 切模型——它只动 env,不动别的:

// EchoBird: 只改这个 block
"env": {
    "ANTHROPIC_BASE_URL": "...",
    "ANTHROPIC_AUTH_TOKEN": "..."
}

// CC Switch: 覆盖整个文件
{
    "enabledPlugins": {...},    // ← 从模板
    "extraKnownMarketplaces": {...},  // ← 从模板
    "skipDangerous...": true,   // ← 从模板
    "env": {...}                // ← 从提供商
    // statusLine? 不在模板里 → 💥
}

写在最后

CC Switch 是个好工具——它对「一键切换 API 提供商」这个原始需求的解法很直接。但它的模板机制有一个静默丢失数据的致命缺陷,而它不会给你任何提示。

如果你读了这篇文章之后去检查自己的 settings.json,发现少了点什么——不要怀疑自己。你没记错。你是被覆盖了。