基于 CC Switch v4.0.16 的前端改造: 去掉 Rust/Tauri 后端,改成「前端 + 本地 Node 服务」的便携工具,在浏览器里运行。 品牌、图标和界面已经改成「寒霜注入工具」,只保留本机提示词注入和网关注入。
当前界面为:左侧应用列表(提示词工作台)+ 提示词注入(本机文件 / 网关注入)+ Seep 工具 + 使用教程 + 设置(通用 / 关于)。 所有页面的数据都来自真实本地服务或浏览器本地存储,不包含演示数据。
侧栏只保留需要的入口,其余页面代码仍在,想恢复时改 src/lib/navigation.ts 里的
VISIBLE_GLOBAL_PAGES / VISIBLE_SETTINGS_SECTIONS:
- 全局页显示「提示词注入」「Seep 工具」「使用教程」;提示词注入默认打开「网关注入」,另一个页签是「本机文件」。
- MCP、Skills、应用(工具安装)、提示词、会话、授权中心、用量统计的入口已隐藏; 这些页面依赖原版 Rust 后端,不再提供。
- 设置只保留「通用」「关于」:通用页的语言、主题、侧栏应用开关都保存在浏览器本地, 不依赖后端;应用配置、路由、网络、数据的入口已隐藏。
- 左下角保留「设置」入口,以及「满血中转站」「加入 TG 群」「加入 QQ 群」三个外链。
- 品牌改为「寒霜注入工具」:侧栏、关于页、浏览器标题、托盘标题和图标都已换掉。
pnpm install
pnpm dev # http://localhost:5190
pnpm build # 打包到 dist/
pnpm typecheck # 类型检查国内装依赖:如果系统设了 HTTP_PROXY 代理,
pnpm install走 npmmirror 会很慢甚至卡住, 临时去掉代理再装:env -u HTTP_PROXY -u HTTPS_PROXY pnpm install
点侧栏任意 Agent(Claude Code、Codex、Gemini…)进入的不再是供应商列表,而是该应用的提示词工作台:
- 每个应用有自己的提示词文件(Claude →
~/.claude/CLAUDE.md、Codex →~/.codex/AGENTS.md、 Gemini →~/.gemini/GEMINI.md、OpenCode →~/.config/opencode/AGENTS.md、Hermes →~/.hermes/SOUL.md等)。 - 「添加提示词」→ 填名称、描述、内容 → 保存在提示词库
~/.cc-switch/prompt-library.json;勾选「保存后立即启用」会直接写入目标文件。 - 「切换到此提示词」→ 先把目标文件当前内容备份到
~/.cc-switch/backups/prompt-library/, 再把提示词写进目标文件;和切换供应商一样,一个应用同一时间只有一条提示词生效。 - 「停用」→ 还原到本应用第一次切换之前的状态。
- 「导入当前文件」→ 把目标文件里已有的内容收进提示词库。
- 供应商、直连 / 路由 / 聚合、额度这些 API 连接界面不再渲染(原代码保留在
App.tsx里,方便以后取回)。
Codex 应用页顶部有「提示词 / 全局资产」两个页签。全局资产默认只显示 4 个注入后生效的位置:
全局指令 AGENTS.md [状态] [编辑]
系统提示 system-prompt.md [状态] [编辑]
记忆 MEMORY.md [状态] [整体替换] [编辑]
规则 rules/(默认展开) 7 个规则文件,含 default.rules 工具调用白名单
工具调用与权限 sandbox_mode / approval_policy / 已注册钩子
[整体替换规则] [hooks.json] [config.toml]
下面一行「更多工具文件」默认折叠,展开后才显示技能、自定义命令、指令集、记忆的 自动维护文件等。日常只需要看上面这些。
状态徽章直接告诉你是否生效:生效(绿)、待接入 / 条件生效(黄)、未生效(灰)。
判定规则:AGENTS.md 非空才生效;system-prompt.md 取决于 model_instructions_file;
MEMORY.md 由 memories 功能读取;rules/* 只有 VCO / hooks 运行时才生效。
完整文件清单(扫描 ~/.codex 的 60 个文件、8 个分组)在「更多工具文件」里:
| 分组 | 内容 |
|---|---|
| 主提示词 | AGENTS.md、system-prompt.md |
| config.toml | model_instructions_file、developer_instructions、compact_prompt、experimental_compact_prompt_file、project_doc_max_bytes 的当前值 |
| 记忆 | memories/MEMORY.md、raw_memories.md、memory_summary.md、rollout_summaries/、extensions/ |
| 指令集 | instructions/*.md(gpt-contract、persona、unrestricted 等) |
| 规则 | rules/default.rules、rules/common/*、rules/typescript/* |
| 钩子与注入 | hooks.json + hooks/*.py/.js/.sh(SessionStart、UserPromptSubmit 等) |
| 自定义命令 | prompts/*.md(斜杠命令模板) |
| 技能 | skills/*/SKILL.md |
保存前自动备份到 ~/.cc-switch/backups/codex-assets/,编辑器里可以直接还原这个文件最近 3 次备份。
路径有白名单校验,只能访问 Codex Home 下这些目录。
整体替换:记忆和规则分组右上角有「整体替换」按钮。勾选要覆盖的文件(默认只勾主文件:
memories/MEMORY.md 或 rules/default.rules),粘贴完整内容,一次写入所有勾选文件。
每个文件写入前都会单独备份。规则文件要保留 prefix_rule(...) 语法。
生效状态:每个文件都有状态徽章,顶部有统计和筛选(全部 / 生效 / 条件生效·待接入 / 未生效 / 自动维护)。
| 徽章 | 含义 | 判定方式 |
|---|---|---|
| 生效(绿) | Codex 会读取 | AGENTS.md 非空;hooks.json 及其引用的脚本;prompts/*、skills/*、MEMORY.md、extensions/ |
| 待接入(黄) | 需要配置才能生效 | system-prompt.md:config.toml 的 model_instructions_file 没指向它 |
| 条件生效(黄) | 需要外部组件 | rules/*:只有 VCO / hooks 运行时读取才生效 |
| 未生效(灰) | 当前不会被读取 | AGENTS.md 为空;instructions/*(原生不读);hooks/ 里没被 hooks.json 引用的脚本 |
| 自动维护 | Codex 自己生成 | raw_memories.md、memory_summary.md、rollout_summaries/* |
| 配置 | 配置文件本身 | config.toml |
每个应用的主页面(提示词工作台)顶部都有一条「人物卡」:
- 开关点一下就把选中的卡启用 / 停用,不用再进「提示词注入」页。
- 新建人物卡时点「保存并开启」,保存后自动选中并启用这张卡。
- 卡是全局的:换应用、换连接会自动沿用,不用重新开启。
- 右侧下拉可以换卡,底部「管理」直接跳到「提示词注入 → 网关注入」的完整管理页。
「提示词注入」页默认打开「网关注入」页签,「本机文件」排在第二位。
后端数据仍在 ~/.cc-switch/prompt-cards.json;完整管理页里可以看到注入后的 system 预览。
Codex 的请求可以真正经过人物卡代理:
- 侧栏 →「提示词注入」→ 网关注入 →「Codex 注入代理」→「接入 Codex」。
- 它会把
~/.codex/config.toml里当前 provider 的base_url改成http://localhost:5190/v1;原地址记在~/.cc-switch/card-proxy.json, 修改前备份到~/.cc-switch/backups/card-proxy/。 - 之后 Codex 的
/v1/responses请求会先到本工具,当前人物卡按 append / override 写进instructions,再转发到原来的上游。 - 页面会显示最近一次注入的
instructions末尾,可以确认卡标记; 完整元数据日志在~/.cc-switch/card-proxy.log。 - 「恢复原地址」会把
base_url改回接入前的值。保持pnpm dev运行, 停掉后 Codex 会连不上。
代理支持 Responses(instructions)、OpenAI Chat(messages)、Anthropic(system)
三种请求体;目前只给 Codex 做了一键接入,其他客户端后续再加。
侧栏 →「提示词注入」。除了应用页的单一主提示词文件,这里还能操作 Codex 的另外两个位置。
| 目标 | 实际写入 |
|---|---|
| 全局指令 AGENTS.md | ~/.codex/AGENTS.md |
| 系统提示替换 | ~/.codex/system-prompt.md,并把 ~/.codex/config.toml 的 model_instructions_file 指向它 |
| 记忆 MEMORY.md | ~/.codex/memories/MEMORY.md |
用法:
- 在卡片里粘贴提示词,点「注入并覆盖」(或「追加到末尾」)。
- 每次写入前自动备份到
~/.cc-switch/backups/inject/codex/,状态记在~/.cc-switch/inject-state.json。 - 「停用并还原」回到本工具第一次注入之前的状态;「备份历史」里可以还原任意一次。
- AGENTS.md / 记忆对新会话生效;替换系统提示后重启 Codex 生效。
后端在 server/injectApiPlugin.ts(Vite 中间件),只在 pnpm dev / pnpm preview
下运行。纯静态打开 dist/ 时页面会提示连不上本地后端。
侧栏 →「Seep 工具」把 Seep-Reverse-Lab
的 23 个 MCP 工具接进界面。Seep 不复制进本仓库,而是以独立的 Python stdio 进程运行
(Tool/mcp/seep_mcp_server.py)。
- 工具调用:页面会拉起 Python MCP Server,读
tools/list,按每个工具的inputSchema自动生成参数表单;点「调用工具」直接执行并显示结果。 - 接入 MCP:把
seep条目写进各客户端自己的 MCP 配置,客户端重启后 Agent 就能 调用同一批工具。支持 Claude Code(~/.claude.json)、Codex / Grok Build (config.toml的[mcp_servers.seep])、Gemini(~/.gemini/settings.json)、 OpenCode(opencode.json的mcp.seep)、Pi(~/.pi/agent/mcp.json)、 MiniMax Code(~/.minimax/mcp.json)。Hermes 使用 YAML,暂不自动写入。 - 备份:所有配置写入前备份到
~/.cc-switch/backups/seep-mcp/;TOML 用标记块 插入,尽量保留原有注释和其他 MCP 条目。 - 换目录:页面顶部填 Seep 仓库路径,点「重新连接」,会记到
~/.cc-switch/seep-config.json。环境变量SEEP_ROOT/SEEP_PYTHON可覆盖默认值。 - 依赖:本机 Python 3.10+ 和
pip install "mcp>=1.20,<1.29";Seep 目录里的 Radare2 / JADX / Apktool 由 Seep 自带。
后端在 server/seepPlugin.ts(Vite 中间件),只在 pnpm dev / pnpm preview 下可用。
接口:/api/seep/overview、/api/seep/root、/api/seep/call、/api/seep/targets、
/api/seep/register。
整合分两层:
- 客户端 MCP(推荐):上面「接入 MCP」把 seep 写进 Claude Code / Codex 等客户端, Agent 自己调用工具,走各客户端原生的 MCP 工具循环。
- 界面直调:「工具调用」页签由本工具的 Node 桥直接向 Python MCP Server 发
tools/call,适合手动验证工具和参数。 - 如果想让网关转发时替模型执行工具(tool_use 循环在代理里),还需要在 Rust 代理的请求改写环中实现 MCP 客户端;当前浏览器版只做到上面两层。
Seep-Reverse-Lab 使用 GPL-3.0。这里以独立进程方式调用、不复制其源码;如果对外分发 Seep 本体,需要同时遵守 GPL-3.0(提供源码与许可)。这些工具只应在已授权的目标上使用。
- 提示词库 / 文件注入 / 人物卡 / Codex 资产:由
server/里的 Vite 中间件直接读写本机文件, 数据落在~/.cc-switch/(提示词库、备份)和对应 Agent 的全局提示词文件。 - Seep 工具:
server/seepPlugin.ts通过 Python 桥调用本机的 Seep MCP Server。 - 通用设置:语言、主题、侧栏应用显示保存在浏览器
localStorage, 不经过任何后端,也不会上传。 - 原版依赖 Rust 后端的供应商、用量、会话、MCP、Skills、应用安装页面已从界面移除, 相关代码保留但不再渲染;仓库中不包含 mock/演示数据。
在原版基础上改了品牌、精简了入口,并加了提示词注入:
- 品牌改为「寒霜注入工具」,图标换成
src/assets/icons/hanshuang-logo.png - 供应商 / 授权中心 / 用量统计 / 会话 / MCP / Skills / 应用等依赖 Rust 后端的入口不再渲染
- 删除了
src/mock/演示后端;通用设置改为浏览器本地设置 - 新增
server/injectApiPlugin.ts、src/lib/injectApi.ts、src/components/inject/ - 新增
server/promptCardsPlugin.ts、src/lib/promptCardsApi.ts,以及主界面的src/components/inject/RoleCardStrip.tsx - 新增
server/seepPlugin.ts、src/lib/seepApi.ts、src/components/seep/, 把 Seep-Reverse-Lab 的 MCP 工具接到「Seep 工具」页 - 侧栏新增「提示词注入」,导航类型
src/lib/navigation.ts加inject package.json:去掉 Tauri 命令行和测试相关的包,dev直接起 Vite,端口 5190- 删掉了
src/里的单元测试文件(*.test.ts(x))
如果以后要重新打包成 Tauri 桌面程序,需要把 server/ 里的 Vite 中间件逻辑
搬进 Rust 后端(src-tauri/src/prompt_files.rs 已有现成的文件读写能力),
并重新接入设置等页面依赖的 Tauri 命令。
原版代码 MIT 许可,Copyright (c) 2025 Jason Young,许可原文见 LICENSE-cc-switch,发布时保留这个文件。
MIT 只授权代码,不授权品牌:对外发布时不要用「CC Switch」名称和它的 logo;
src/icons/ 里的各家 logo 是各公司的商标。
prompts/ 目录附带 6 份可直接导入的寒霜提示词模板:
使用方式:提示词工作台 → 添加提示词 → 把文件内容粘贴进去 → 勾选「保存后立即启用」→ 保存。
也可以扫码加入 QQ 群,反馈问题或交流用法。
