HomeBase — 跨代理桌面控制中心
把 Claude Code、Codex、Gemini CLI、OpenClaw 四个 AI 代理的配置统一到一处。Tauri + Rust + React 实现的桌面控制中心,一次定义、四处同步。
终于不用一个一个手改四份配置文件了。下次能不能也共享一下我的对话历史?
摘要
HomeBase 是一台机器上同时使用 Claude Code、Codex、Gemini CLI、OpenClaw 四个 AI 代理时的"统一控制中心"。
四个代理功能高度重叠,但配置文件各自为政(JSON / TOML 混用)、密钥需要分别注入、能力库格式互不通用。每加一个 MCP 服务器、每旋转一次 API key,都要重复操作四遍。
我用 Tauri 2 + Rust + React 做了一层共享配置 + 同步引擎:所有共享内容只写在 ~/.homebase/shared/,由后台 reconcile 引擎同步到四个代理各自的官方配置文件。目前已落地五个共享维度:上下文、MCP 服务器、Skills、Secrets(运行时询问)、版本检测。
1. 背景
1.1 现状
我同时长期使用四款本机 AI 代理:
| 代理 | 启动命令 | 配置目录 |
|---|---|---|
| Claude Code | claude |
~/.claude/ |
| Codex CLI | codex |
~/.codex/ |
| Gemini CLI | gemini |
~/.gemini/ |
| OpenClaw | openclaw |
~/.openclaw/ |
它们做的事相互高度重叠——都是"能跑工具的命令行 LLM 助手"。但谁也没替代谁,因为各自有擅长的模型、生态和插件协议。
1.2 问题
我把这种局面称为 N×M 配置雪崩:N 个代理 × M 种配置维度 = N×M 个独立维护点。
| 维度 | Claude Code | Codex | Gemini CLI | OpenClaw |
|---|---|---|---|---|
| MCP 服务器 | settings.json | config.toml | settings.json | settings.json |
| 系统提示 | CLAUDE.md | AGENTS.md | GEMINI.md | CLAW.md |
| API 密钥 | apiKeyHelper | auth.command | env 注入 | env 注入 |
| Skills | 支持 | 不支持 | 不支持 | 支持 |
实测:每周大约 1.5 小时花在"同步四份配置"上。更糟糕的是密钥——同一个 GitHub token 复制进四处 env,任何一处泄漏等于全泄漏。
1.3 目标
一句话:配置只写一次,密钥只解密一次,代理各取所需。
2. 设计概览
2.1 三条核心原则
- 真源单一。所有共享配置只有一个出处,即
~/.homebase/shared/。 - 不重写既有工具。SOPS、git、agent-env 等成熟 CLI 直接 wrap,不重新实现。
- 隔离用户自加内容。同步引擎只动
homebase-前缀的条目,用户手动添加的 server 一字不动。
2.2 系统结构
2.3 部署形态:四个独立 binary
| Binary | 用途 | 启动模式 |
|---|---|---|
homebase |
主桌面应用 | 用户双击 |
homebase-reveal |
SOPS 单 key 查询助手 | Claude / Codex 拉起 · stdout 回传 |
homebase-mcp-image |
Studio 生图 MCP server | Claude / OpenClaw 作 MCP 子进程拉起 |
homebase-mcp-secrets |
密钥运行时询问 MCP server | 四代理作 MCP 子进程拉起 |
四个 binary 共享同一份 Cargo workspace,用 [[bin]] 联合声明。每个进程只承担一项职责,权限边界清晰;关闭主应用不影响 helper 工作。
2.4 技术栈
| 层 | 选型 | 理由 |
|---|---|---|
| 桌面壳 | Tauri 2 | 单 .exe ~5MB · capabilities 限权限 · Rust 后端原生跑 SOPS / git |
| 前端 | React 19 + TypeScript + TailwindCSS | 组件化 · 复用 GDNbit 设计 token |
| 数据 | SQLite (rusqlite) | 单文件 · 无独立服务进程 |
| 密钥 | SOPS + age | 已有体系延续 · 解密结果仅驻内存 |
| 异步 | tokio + react-query | Rust 端 spawn 子进程 · 前端 cache & invalidate |
3. 核心模块
3.1 共享上下文
~/.homebase/shared/context.toml 写本机环境(hostname / project root / 时区)+ 用户偏好(语言 / GitHub 用户名)+ 占位变量(如 {{ NOW }} 在启动时被替换为当前时间)。
代理启动时,HomeBase 通过启动参数 --system "..." 把上下文注入系统提示——而不是在每个工具的提示文件里写死。改 context.toml 后下次启动立刻生效,无需手动重启同步流程。
3.2 共享 MCP 池
真源 ~/.homebase/shared/mcp-pool.json:一份服务器全集 + 4×N 分配矩阵。前端是复选框表格(行 = server / 列 = agent):
| server | claude | codex | gemini | openclaw |
|---|---|---|---|---|
| github | ✔ | ✔ | ||
| firecrawl | ✔ | ✔ | ||
| figma | ✔ | ✔ | ||
| homebase-secrets | ✔ | ✔ | ✔ | ✔ |
写盘后同步引擎对每个代理依次执行四步:
- 读取 · 加载该代理的官方配置文件
- 保留 · 跳过所有非
homebase-前缀条目,用户原配置不动 - 写回 · 按矩阵把属于该代理的条目重写到
homebase-段 - 上报 · 返回 ✓ 应用 / ⚠ 跳过 / ✗ 失败 三态
序列化按代理配置格式分流:
| 格式 | 代理 | 库 | 关键能力 |
|---|---|---|---|
| JSON | Claude / Gemini / OpenClaw | serde_json |
严格结构 |
| TOML | Codex | toml_edit |
保留注释 / 原排序 / in-place 编辑 |
3.3 共享 Skills
Skills 是 Anthropic 提出的能力库规范——一段可复用的指令组合(带 frontmatter 的 SKILL.md + 主文档)。
~/.homebase/shared/skills/<id>/SKILL.md 是真源。同步引擎把 skills 目录复制到支持 Skills 的代理(Claude / OpenClaw)。Codex 与 Gemini CLI 暂不支持 Skills,前端会明确提示哪些代理可用。
3.4 共享 Secrets · 运行时询问
整个系统中最关键的设计。
问题:代理在执行任务时偶尔需要密钥(如 git push 需要 GITHUB_TOKEN)。直接把 token 注入 env 风险大——代理可能在 stdout 或日志里把它带出来。
方案:四个代理不持有任何密钥;每次需要时通过 MCP 反向询问 HomeBase。完整流程如下:
安全保证按防御层分布:
| 防御层 | 措施 | 关键实现 |
|---|---|---|
| 网络 | IPC 仅监听 127.0.0.1 | OS 随机端口 + 64-char hex token 鉴权 |
| 内存 | SecureString 包装 |
Drop 时 zeroize 把内存归零 |
| 持久化 | 解密结果不落盘 | 不入 SQLite / 日志 / 设置文件 |
| 剪贴板 | 30 秒自动清空 | tokio::time::sleep + 清空操作 |
| 进程 | Tauri 2 capabilities | shell 命令白名单 |
3.5 版本检测
每个代理的安装方式不同(npm 全局 / 独立 exe / WSL)。HomeBase 启动时拉 npm registry 的 latest 版本号与本地版本对比,结果缓存 1 小时。standalone 安装(非 npm 渠道)走 fallback 检测策略。
4. 工程要点
4.1 toml_edit · 保留用户注释
Codex 的 config.toml 经常带用户写的中文注释(解释某个 server 干嘛用)。serde_toml 反序列化再序列化会吞掉注释。toml_edit 提供 edit-in-place API,能保留注释、原排序、空行结构。
4.2 流式任务池
Studio 生文、Wiki 入库、GDNbit 发布都是"长任务 + 流式输出"场景。每个 feature 维护独立的任务池,状态隔离,可独立中止,各自有事件 emit 通道:
4.3 SecureString · 内存零化
SOPS 解密结果用此类型包装。即使主进程 panic core dump,token 也不会以明文形式写到磁盘。
4.4 进度文件 · 跨进程轮询
mcp-image binary 是独立进程,前端 Studio 要看它的生图进度。设计:每个 mcp-image 进程在 ~/.homebase/img-progress/<pid>.json 写状态(preparing → sending → waiting → decoding → saving → done),前端轮询此文件。完成或错误后 binary 自删文件。

"写文件 + 轮询" 比 IPC 简单,进程崩溃也不会留 garbage。
5. 现状与展望
5.1 已完成(截至 2026-05-07)
| 阶段 | 主要产出 |
|---|---|
| 13.1 — 13.6 | 五代理状态检测 / 一键启动 / Add Wizard |
| Phase B | 模型 tab 重构 · OpenRouter / Anthropic / Custom |
| Phase C | Wiki ↔ GDNbit 发布闭环 |
| Phase D2.2 | Studio · 空白对话 + Claude CLI + 生图链路 |
| Phase G | LLM key 启动注入 · apiKeyHelper / auth.command / wrapper |
| P0 + S1—S5 | 五个共享维度全部落地 |
5.2 边界与未做
刻意不做的清单和做了的清单一样重要:
- 不做云端账户。这是个人本机工具,零网络出口(除 LLM API)
- 不做插件市场。Extension / Skill 走文件系统约定,不做第三方分发
- 不重写 SOPS / agent-env / git。这些 CLI 已稳定,用 adapter 层 wrap 即可
- 不重写 Obsidian。Knowledge tab 只读、只索引
5.3 下一步
- Phase 14:Knowledge tab 改为 "Obsidian 入口",URI 协议跳转
- Phase 15:Skills 共享层进阶 · CLI 工具
hb skills install - Phase 17:AI 静默处理 · Inbox raw 后台整理
参考资料
- Anthropic · Claude Code 文档
- Model Context Protocol 规范
- Tauri 2 · Capabilities
- SOPS · Mozilla
- age · 文件加密
- zeroize crate
体验交互原型:点上方按钮,原型用 mock 数据演示 4×N MCP 分配矩阵 + Consent 弹窗 · 无需安装。
源码:项目处理本机密钥与系统配置,当前为私有项目(不开源)。本文档基于公开架构与设计文档撰写。