HomeBase — 跨代理桌面控制中心

把 Claude Code、Codex、Gemini CLI、OpenClaw 四个 AI 代理的配置统一到一处。Tauri + Rust + React 实现的桌面控制中心,一次定义、四处同步。

2026/5/7作者: Gdnbit
TauriRustReactAI AgentMCPSOPS桌面应用全栈项目展示JavaScript

终于不用一个一个手改四份配置文件了。下次能不能也共享一下我的对话历史?

摘要

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 三条核心原则

  1. 真源单一。所有共享配置只有一个出处,即 ~/.homebase/shared/
  2. 不重写既有工具。SOPS、git、agent-env 等成熟 CLI 直接 wrap,不重新实现。
  3. 隔离用户自加内容。同步引擎只动 homebase- 前缀的条目,用户手动添加的 server 一字不动。

2.2 系统结构

共享配置目录 ~/.homebase/shared/ · 唯一真源 HomeBase 同步引擎 Tauri 主进程 · Rust 实现 Claude Code ~/.claude/ Codex CLI ~/.codex/ Gemini CLI ~/.gemini/ OpenClaw ~/.openclaw/ 单一真源 → 同步引擎 → 四份官方配置

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

写盘后同步引擎对每个代理依次执行四步:

  1. 读取 · 加载该代理的官方配置文件
  2. 保留 · 跳过所有非 homebase- 前缀条目,用户原配置不动
  3. 写回 · 按矩阵把属于该代理的条目重写到 homebase-
  4. 上报 · 返回 ✓ 应用 / ⚠ 跳过 / ✗ 失败 三态

序列化按代理配置格式分流:

格式 代理 关键能力
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。完整流程如下:

运行时密钥询问 · 七步流程 1 代理执行任务时发现需要密钥 如 git push 需要 GITHUB_TOKEN 2 代理调 MCP 工具反向询问 mcp-secrets/get_secret { name, purpose } 3 连本机 IPC · 仅监听 127.0.0.1 OS 随机端口 + 64-char hex token 鉴权 · 不走外网 4 前端弹出 Consent 弹窗 永久允许 / 仅这次 / 拒绝 · 60 秒倒计时·未响应自动 deny 5 用户决策回写 IPC · 「永久允许」追加 ACL 写入 secrets-acl.json · 同 (代理, 密钥) 下次不再询问 6 SOPS 解密 → SecureString 仅驻内存 zeroize on Drop · 不入 SQLite / 日志 / 设置文件 7 密钥透传给代理 · 任务继续执行 代理本身不持有密钥 · 仅在单次调用窗口内可见 金色块为安全关键节点 · IPC 鉴权 · SOPS 解密 · 内存零化

安全保证按防御层分布:

防御层 措施 关键实现
网络 IPC 仅监听 127.0.0.1 OS 随机端口 + 64-char hex token 鉴权
内存 SecureString 包装 Dropzeroize 把内存归零
持久化 解密结果不落盘 不入 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 自删文件。

进度轮询的六个状态:准备 → 发送 → 等待 → 解码 → 保存 → 完成。每个 mcp-image 进程在自己的 JSON 文件里写状态,前端每秒轮询。

"写文件 + 轮询" 比 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 后台整理

参考资料


体验交互原型:点上方按钮,原型用 mock 数据演示 4×N MCP 分配矩阵 + Consent 弹窗 · 无需安装。

源码:项目处理本机密钥与系统配置,当前为私有项目(不开源)。本文档基于公开架构与设计文档撰写。