AI Agent 技能多机同步难题:八大生态 × 六种方案的深度拆解
你在 MacBook 上打开 Claude Code,它熟悉你的定制技能。你 ssh 到云服务器,运行同样的工具,那些技能消失了。你重装、重配、重教。三台机器 × 五个工具,就是我今天要讨论的问题 —— AI Agent 技能多机同步难题。
这不是理论上的边缘场景。任何认真搞 AI 辅助开发的人,都在多台机器上工作:主力工作站、带 GPU 跑本地模型的 Linux 桌面、隔离实验的云虚拟机、开会出差用的笔记本。AI Agent 越来越像个人工具:它们积攒上下文、学习你的习惯、在几周的交互中沉淀出定制技能。当一半上下文在 B 机器上蒸发,Agent 退化成通用助手。
过去一周,我重新设计了 Hermes Agent 的技能同步架构,并横向调研了整个 AI Agent 生态的处理方式。这篇文章涵盖两者:我构建的具体方案,以及八大主流 Agent 生态的横向对比。
问题拆解
AI Agent 的配置分为三层:
| 层级 | 内容 | 举例 | 同步难度 |
|---|---|---|---|
| 内置层 | 随 Agent 发行版自带的技能 | Hermes 内置清单、Claude Code 默认工具 | 无 —— 随 Agent 更新 |
| 第三方层 | 从 Hub/URL 安装的社区技能 | hermes skills install --url、Claude Code 社区插件 |
困难 —— 文件落在本地 Agent 目录,不在 git 中 |
| 个人层 | 自己编写或 fork 的技能 | 你的博客部署流程、定制化代码审查工具 | 中等 —— 你掌控源文件,可以放入 git |
第三方技能是问题的核心。它们通过 hermes skills install --url https://raw.githubusercontent.com/.../SKILL.md 这样的命令安装,SKILL.md 落入 ~/.hermes/skills/ —— 不在任何 git 仓库中。另一台机器上,Agent 完全没有这个技能曾被安装过的记录。
个人技能理论上更容易:你拥有源文件,可以放入 git 仓库。但实际上,很多人懒得做,技能退化为单机产物。
核心问题:什么架构能保持三层技能在 N 台机器间一致,既不重复文件,又不丧失获取上游更新的能力?
八大生态的同步策略
1. Claude Code(Anthropic)
Claude Code 是「无内置同步、社区方案繁荣」的典型。
配置文件在 ~/.claude/(settings.json、skills、commands、agents)加项目本地的 CLAUDE.md。没有云端账户。在新机器上跑 claude,从零开始。
社区独立收敛到一个模式:规范仓库 + 符号链接。五个独立工具实现了完全相同的思路:
- saddle(49 star):规范配置 → 符号链接到 Claude、Codex、Copilot、Cursor、Gemini、OpenCode
- dotai-cli(4 star):统一
.ai/目录,符号链接到各工具预期路径 - glooit(22 star):跨 Claude、Cursor、Codex、OpenCode、RooCode 同步 rules/commands/skills/MCP
- skrills(61 star):协调 Codex、Copilot、Claude 的技能
- agent-sync(3 star):四工具通用配置同步
符号链接方案确实有效:维护一份真相源,工具在它们期望的位置看到。缺点是脆弱 —— 工具改个预期路径,所有符号链接全断。而且 settings.json 中的 API key 是分享配置仓库时持续存在的安全隐患。
结论:社区用符号链接农场解决了,但没有标准。五个竞品工具做同一件事,是等待整合的信号。
2. Cursor(Anysphere)
Cursor 有 两套独立的同步机制,这既是它的优势也是困惑的来源。
IDE 设置(扩展、快捷键、主题、Profiles)通过 Settings Sync 同步 —— 继承自 VS Code 的成熟系统。用 Microsoft/GitHub 账号登录,Cursor 到处一样。
项目规则(.cursor/rules/*.mdc)没有云端同步。它们是项目文件,预期提交到 git。这是有原则的设计选择 —— 项目规则属于项目,不属于你的个人 Cursor 账户。但意味着无法拥有「跨机器但不入项目仓库的个人项目规则」。
结论:混合模式 —— 云端管 IDE,git 管项目。分工清晰,但对个人第三方技能问题没有答案。
3. GitHub Copilot
Copilot 采取了最激进的架构选择:个人指令根本不在你的文件系统上。它们存储在 GitHub 服务端,在任何机器登录同一个 GitHub 账户即可访问。零本地配置需要同步。
仓库指令(.github/copilot-instructions.md)在仓库中,像任何项目文件一样通过 git 同步。
这很优雅 —— 但有取舍。你无法版本控制个人指令。无法离线编辑。无法用程序生成。而且 Copilot 的终端 CLI 模式和 IDE 扩展有不同的配置路径。
结论:单工具跨机器体验最无缝。但它通过把问题藏在服务器后面来解决,而不是给你控制权。
4. VS Code(基础设施层)
VS Code 的 Settings Sync 是所有开发者工具中最成熟的同步系统。同步七类数据(设置、快捷键、代码片段、任务、UI 状态、扩展、Profiles),处理三方冲突解决,本地保留 30 天备份、远程保留 20 个版本,甚至提供扩展 API(setKeysForSync)让扩展加入同步。
但关键限制:不同步到远程窗口(SSH、容器、WSL)。工作区设置被故意排除 —— 它们属于项目。
这是「内置同步应该长什么样」的黄金标准 —— 但它是 IDE 范围的,不是 Agent 范围的。没有任何 AI Agent 生态达到这个同步成熟度。
结论:最好的同步,错误的范围(IDE 而非 Agent)。
5. OpenCode & Codex CLI
两者都是纯文件系统工具,无云端账户。配置在 ~/.config/opencode/ 和 ~/.codex/。社区跨工具工具(saddle、skrills、glooit)已涵盖它们。无独特同步创新。
Codex 有一个有趣的企业功能 —— codex.yaml 用于组织级治理 —— 但不是个人同步机制。
结论:同 Claude Code:文件驱动,社区用符号链接解决。
6. Aider
极其简单:一个 YAML 文件(~/.aider.conf.yml)加环境变量。无内置同步。轻松被任何 dotfiles 系统管理(chezmoi、yadm、stow)。
结论:简单的优势 —— 当配置是一个 YAML 文件时,同步几乎免费。但工具范围比完整的 Agent 生态窄得多。
7. Windsurf / Cascade
类似 Cursor:IDE 设置通过账户同步,项目规则(.windsurfrules)通过 git。更小的社区和更少的跨工具集成。
结论:同样的混合模型,更不成熟的生态。
8. Hermes Agent
Hermes 设计上就有三层,每层需要不同的同步策略:
- Layer 1(内置):89 个技能随 Hermes 发行版提供。通过
hermes update更新。内置清单(~/.hermes/skills/.bundled_manifest)追踪校验和。 - Layer 2(第三方):通过
hermes skills install --url或hermes skills tap安装的技能。落入~/.hermes/skills/,无内置同步。 - Layer 3(个人):用户编写的技能,通过
external_dirs配置指向 git 仓库。
关键洞察:Layer 2 和 Layer 3 需要根本不同的同步策略,混淆它们是大多数同步失败的根源。
Hermes 方案:Manifest 驱动同步
深入分析后,我为 Hermes 选择了 manifest 驱动架构:
Layer 3:个人技能(git external_dirs)
个人技能存放在专门的 git 仓库(github.com/guancyxx/skills),通过 Hermes 配置中的 skills.external_dirs 挂载。仓库使用 Hermes 原生目录结构(category/skill-name/SKILL.md)。新机器上:
cd ~/.hermes
git clone https://github.com/guancyxx/skills.git personal-skills
# 配置已指向 external_dirs = ~/.hermes/personal-skills
# 重启 Hermes
关键设计规则:与 Layer 1 和 Layer 2 零重叠。如果同一个技能同时存在于 ~/.hermes/skills/ 和个人仓库中,Hermes 会静默选一个,另一个是死重。仓库从 176 个技能清理到 163 个,删除了 15 个内置重复和 1 个 hub 重复。
Layer 2:第三方技能(Manifest + Bootstrap)
这是真正的创新。不同步安装好的技能文件,而是同步一份 manifest,记录每个第三方技能的来源。
Manifest 放在个人技能仓库中,名为 skills-manifest.yaml:
url_installs:
- name: hermes-dojo
url: https://raw.githubusercontent.com/Yonkoo11/hermes-dojo/master/SKILL.md
- name: incident-commander
url: https://raw.githubusercontent.com/Lethe044/.../SKILL.md
- name: prism-3way
url: https://raw.githubusercontent.com/Cranot/.../SKILL.md
# ... 共 10 个
hub_taps:
- repo: tlehman/litprog-skill
path: skills/
tool_setup:
- name: browser-harness
install: uv tool install --editable ~/Developer/browser-harness
- name: opencli-setup
install: npm install -g @jackwener/opencli
引导脚本(scripts/sync-skills.sh)读取 manifest 并在当前机器重装:
#!/bin/bash
# 新机器上,clone 完个人技能仓库后:
cd ~/.hermes/personal-skills
scripts/sync-skills.sh
# 安装全部 10 个第三方技能 + hub taps
# 重启 Hermes
安装新的第三方技能时,工作流是:
# 1. 安装技能
hermes skills install --url https://raw.githubusercontent.com/.../SKILL.md --yes
# 2. 添加到 manifest
# 编辑 skills-manifest.yaml,在 url_installs 下添加:
# - name: <技能名>
# url: <URL>
# 3. 提交推送,其他机器即可感知
cd ~/.hermes/personal-skills
git add skills-manifest.yaml
git commit -m "skill: add <name> to manifest"
git push origin master
另一台机器:
cd ~/.hermes/personal-skills
git pull origin master
scripts/sync-skills.sh
为什么不用符号链接?
Claude Code 生态的模式 —— 规范仓库 + 符号链接 —— 看起来更简单。为什么不直接符号链接 ~/.hermes/skills/ 到一个 git 仓库?
因为 Hermes 的技能解析比 Claude Code 复杂。Hermes 有内置清单、hub lock 文件、信任级别、扫描判定和技能 curator。简单地符号链接替换 skills 目录会破坏 hub/lock 基础设施,丢失 Hermes 依赖的元数据。
Manifest 方案分离状态与同步:
- Hub 元数据(信任级别、内容哈希、安装时间戳)保留在本地
- Manifest 是最小共享面 —— 只有「技能 X 来自 URL Y」
- 引导脚本从这个共享面重建完整状态
技能图谱集成
这个架构由个人技能仓库中的三个技能支撑:
- skill-creation-guide(Phase 5B):创建/编辑个人技能后,同步到 git 仓库
- hermes-install-skill-with-manifest-sync:安装第三方技能后,添加到 manifest
- hermes-sync-personal-skills-from-github:新机器搭建的完整三层参考
每个触发条件有清晰范围:
| 操作 | 加载的技能 |
|---|---|
| 创建/编辑自己的技能 | skill-creation-guide |
| 安装社区技能 | hermes-install-skill-with-manifest-sync |
| 新机器搭建 | hermes-sync-personal-skills-from-github |
| Hermes 更新 | 自动(Layer 1) |
执行结果
实施前:
personal-skills: 176 个 SKILL.md(15 个内置重复、1 个 hub 重复)
skills/: 100 个 SKILL.md(89 内置 + 10 hub + 1 手动重复)
实施后:
personal-skills: 163 个 SKILL.md(零重复)
skills/: 97 个 SKILL.md(89 内置 + 10 hub,零重复)
三层数学上完全互斥。无静默选一,无死重。
六大通用方案
跳出具体工具的视角,更广泛的配置管理领域提供了六种模式:
1. 手动拷贝(基准线)
scp ~/.claude/ new-machine:~/.claude/
优点:零搭建成本。缺点:即刻漂移,无历史,无冲突解决。大多数开发者这么做,直到被坑。
2. Git Dotfiles
裸 git 仓库或 chezmoi/yadm/stow 等管理家目录配置的工具。
chezmoi init --apply https://github.com/user/dotfiles
优势:成熟生态,久经考验,处理密钥(chezmoi 的 age 加密),支持机器特定值的模板。
劣势:文件层面 —— 不理解技能语义。管理字节,不管理意图。如果工具移动配置目录,所有 dotfiles 断裂。
对简单配置的工具(Aider 的单个 YAML 文件)很适配,但对有元数据文件、lock 文件和 manifest 的复杂 Agent 生态吃力。
3. 符号链接农场
结构化目录的规范仓库,符号链接到工具期望的路径。
~/canonical-config/
├── rules/my-rules.mdc → 符号链接到 ~/project/.cursor/rules/my-rules.mdc
├── skills/my-skill.md → 符号链接到 ~/.claude/skills/my-skill.md
└── commands/build.sh → 符号链接到 ~/.claude/commands/build.sh
Claude Code 社区的主流模式(saddle、dotai、glooit)。GNU stow 是经典 Unix 工具,通用化实现了这个模式。
优势:单一真相源,变更即时传播。规范仓库就是一个 git 仓库。
劣势:脆弱 —— 依赖工具路径不变。不处理在配置文件旁写元数据的工具。符号链接让 IDE 和备份工具困惑。规模大时,管理哪个文件去哪个工具的哪个路径,本身就成了一个独立项目。
4. 云端托管配置
个人指令存储在服务端,登录时同步。Copilot 模型。
优势:最好的用户体验 —— 跨机器「就是能用」,无需用户干预。
劣势:厂商锁定,无版本控制,无离线访问,不透明。你不能在修改前 git diff 指令。不能 git blame 查看规则何时添加。云服务宕机,Agent 退回默认。
5. Manifest 驱动引导
「什么从哪装的」的最小共享记录,加一个重建完整环境的脚本。
我为 Hermes 构建的方案。也是 Nix 和 home-manager 背后的概念模型 —— 但用轻量 YAML 和 shell 脚本实现,而非函数式 DSL。
优势:分离状态与同步,最小共享面,可版本控制,支持异构环境(不同机器可以有不同子集)。
劣势:需要纪律 —— 每次安装后必须记得更新 manifest。引导脚本必须幂等,优雅处理部分失败。工具特定元数据(信任级别、内容哈希)在机器间丢失,必须重建。
6. 声明式配置(Nix / home-manager)
完全可重现、确定性的环境生成。
# home-manager 配置
programs.hermes = {
enable = true;
skills = {
personal = [ ./skills/blog-build-deploy ./skills/code-review ];
third-party = [
{ name = "hermes-dojo"; url = "..."; }
];
};
};
优势:终局方案。完全确定、任何机器可重现、原子升级、回滚。如果你已经用 NixOS 或 home-manager,这是显然的选择。
劣势:整个生态中最陡峭的学习曲线。需要买入 Nix 生态。大多数 AI Agent 用户不是 Nix 用户。而且很多 Agent 工具没有打包进 Nix,增加额外成本。
方案对比矩阵
| 方案 | 搭建成本 | 防漂移能力 | 跨工具 | 跨机器 | 密钥安全 |
|---|---|---|---|---|---|
| 手动拷贝 | 零 | 无 | 无 | 手动 | 危险 |
| Git Dotfiles | 低 | 中 | 低 | 好 | 中(chezmoi 可加密) |
| 符号链接农场 | 中 | 好 | 好 | 好 | 危险 |
| 云端托管 | 零 | 好 | 无 | 极好 | 高 |
| Manifest 引导 | 中 | 中 | 好 | 好 | 高(manifest 天然无密钥) |
| 声明式(Nix) | 高 | 极好 | 极好 | 极好 | 极好 |
密钥问题
一个所有方案都必须处理的横切关注点:API 密钥和凭证。
大多数 Agent 工具将 API key 存在配置文件中(settings.json、config.yaml、.env)。同步这些文件就是在同步密钥。解决方案:
- 环境变量:通过
~/.zshrc从密钥管理器加载。配置文件引用环境变量,不写明文 key。 - chezmoi 加密:
chezmoi add --encrypt用age加密静态密钥。 - Manifest 分离:manifest 记录技能,不记录密钥。引导脚本触发安装,不搬运密钥。
- 绝不要把 API key 提交到 git:2026 年这应该显而易见,但 Claude Code 的 settings.json 是反复出现的陷阱。
Manifest 方案在这里有天然优势:manifest 设计上就是无密钥的。它记录 URL 和仓库引用,不记录凭证。引导脚本运行 hermes skills install,从公开 URL 拉取技能 —— 不涉及密钥。
2026 年的现状
当前的格局:
-
没有任何 AI Agent 生态有令人满意的内置同步方案。 VS Code 的 Settings Sync 最接近「已解决」,但它是 IDE 范围的。在 AI Agent 中,Copilot 的服务端方案是体验最无缝的,但它用控制权换便利。
-
社区正在独立收敛到规范仓库 + 符号链接。 至少五个独立项目为 Claude Code 实现了这个模式。收敛信号很强 —— 这很可能是文件系统工具的正确模式。碎片化在实现上,不在架构上。
-
真正的缺口是跨工具 + 跨机器的交集。 各工具处理跨机器很差,单机器处理跨工具很差。没有工具同时做好两者,这才是运行 3+ Agent × 3+ 机器用户面临的真正问题。
-
Manifest 驱动同步是务实的折中。 它把最小共享面(「这个技能从哪来的?」)与机器本地状态(信任级别、更新时间戳、校验和)分离。兼容 git,不需要符号链接的脆弱性,天然避免密钥泄露。
-
声明式方案(Nix/home-manager)是终局,但 2026 年对主流 AI Agent 用户来说,采用曲线太陡。随着 Agent 工具成熟和 Nix 打包改进,这很可能成为标准答案 —— 但我们还需要 3-5 年。
给工具开发者的建议
如果你在构建 AI Agent 工具并想支持多机工作流,基于本次分析,我的建议是:
-
分离内置、安装和个人的配置到不同目录,有清晰的优先级规则。Hermes 的三层模型是不错的参考。
-
提供 manifest 文件,记录所有第三方安装 —— URL、时间戳、内容哈希、信任级别。让这个文件成为同步面。
-
提供引导命令,如
hermes skills sync --manifest <path>,读取 manifest 并重装缺失技能。确保幂等。 -
绝不同步凭证。 在配置中引用环境变量,不写明文 key。你的 manifest 应该可以安全提交到公开仓库。
-
设计为 git 原生工作流。 如果用户可以
git clone && ./bootstrap.sh就准备好 Agent,你就解决了 80% 的问题。
AI Agent 生态仍然处于它的「dotfiles 时代」—— 标准出现之前,每个用户自己发明同步策略的时期。VS Code 的 Settings Sync 花了数年才成熟为今天的样子。希望 Agent 生态能更快到达那里,因为上下文碎片化对 Agent 的代价远高于编辑器:编辑器没有了你的快捷键设置是烦人,Agent 没有了你积攒的技能是失忆。