tech官小西

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 --urlhermes 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」
  • 引导脚本从这个共享面重建完整状态

技能图谱集成

这个架构由个人技能仓库中的三个技能支撑:

  1. skill-creation-guide(Phase 5B):创建/编辑个人技能后,同步到 git 仓库
  2. hermes-install-skill-with-manifest-sync:安装第三方技能后,添加到 manifest
  3. 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 --encryptage 加密静态密钥。
  • Manifest 分离:manifest 记录技能,不记录密钥。引导脚本触发安装,不搬运密钥。
  • 绝不要把 API key 提交到 git:2026 年这应该显而易见,但 Claude Code 的 settings.json 是反复出现的陷阱。

Manifest 方案在这里有天然优势:manifest 设计上就是无密钥的。它记录 URL 和仓库引用,不记录凭证。引导脚本运行 hermes skills install,从公开 URL 拉取技能 —— 不涉及密钥。

2026 年的现状

当前的格局:

  1. 没有任何 AI Agent 生态有令人满意的内置同步方案。 VS Code 的 Settings Sync 最接近「已解决」,但它是 IDE 范围的。在 AI Agent 中,Copilot 的服务端方案是体验最无缝的,但它用控制权换便利。

  2. 社区正在独立收敛到规范仓库 + 符号链接。 至少五个独立项目为 Claude Code 实现了这个模式。收敛信号很强 —— 这很可能是文件系统工具的正确模式。碎片化在实现上,不在架构上。

  3. 真正的缺口是跨工具 + 跨机器的交集。 各工具处理跨机器很差,单机器处理跨工具很差。没有工具同时做好两者,这才是运行 3+ Agent × 3+ 机器用户面临的真正问题。

  4. Manifest 驱动同步是务实的折中。 它把最小共享面(「这个技能从哪来的?」)与机器本地状态(信任级别、更新时间戳、校验和)分离。兼容 git,不需要符号链接的脆弱性,天然避免密钥泄露。

  5. 声明式方案(Nix/home-manager)是终局,但 2026 年对主流 AI Agent 用户来说,采用曲线太陡。随着 Agent 工具成熟和 Nix 打包改进,这很可能成为标准答案 —— 但我们还需要 3-5 年。

给工具开发者的建议

如果你在构建 AI Agent 工具并想支持多机工作流,基于本次分析,我的建议是:

  1. 分离内置、安装和个人的配置到不同目录,有清晰的优先级规则。Hermes 的三层模型是不错的参考。

  2. 提供 manifest 文件,记录所有第三方安装 —— URL、时间戳、内容哈希、信任级别。让这个文件成为同步面。

  3. 提供引导命令,如 hermes skills sync --manifest <path>,读取 manifest 并重装缺失技能。确保幂等。

  4. 绝不同步凭证。 在配置中引用环境变量,不写明文 key。你的 manifest 应该可以安全提交到公开仓库。

  5. 设计为 git 原生工作流。 如果用户可以 git clone && ./bootstrap.sh 就准备好 Agent,你就解决了 80% 的问题。

AI Agent 生态仍然处于它的「dotfiles 时代」—— 标准出现之前,每个用户自己发明同步策略的时期。VS Code 的 Settings Sync 花了数年才成熟为今天的样子。希望 Agent 生态能更快到达那里,因为上下文碎片化对 Agent 的代价远高于编辑器:编辑器没有了你的快捷键设置是烦人,Agent 没有了你积攒的技能是失忆。