← 返回文章列表

用 Git 给多个 AI Agent 同步一个会成长的大脑

一个很具体的痛点

我同时在好几台机器上跑 AI 编码助手:MacBook 上是 Claude,服务器上是 Codex,还有几台 Linux 跑着 Gemini 和 Hermes。每一个都很聪明,但它们彼此失忆。

我在 Mac 上跟 Claude 确认过的事——比如"项目名从 DualViewX 改成 Duovid"“我的权威邮箱是哪个”——换到服务器上的 Codex,又要从头解释一遍。Agent 越多,重复解释的税越重。

我想要的不是更聪明的单个 Agent,而是让所有 Agent 共享同一个会成长的大脑。

为什么是 Git,而不是数据库或 MCP server

第一反应当然是搭个服务:一个数据库、一个记忆 API,所有 Agent 读写它。但我很快否决了:

  • 多一个服务就多一个要运维、要在线、会挂的东西;
  • 记忆的本质是文本 + 版本演化,这恰好是 Git 最擅长的;
  • 我需要审计记忆的来源——"这条结论是哪次会话、哪个 commit 写进去的?"Git history 天然就是答案。

所以 nestwork 的核心决定是:记忆就是一个 Git 仓库里的一堆 Markdown 文件。没有插件,没有常驻服务。每个 Agent 会话开始时 git pull --rebase,结束时把自己这次学到的东西 commit + push。

分层:谁能写什么

把所有记忆塞进一个文件会很快失控,所以分层,并且写权限严格隔离:

queen/        # 全局行为规则与策略,人类维护,Agent 只读
shared/       # 跨 Agent 的稳定事实(用户身份、技术栈、协作偏好)
agents/<host>/<id>/   # 单个 Agent 实例的私有记忆,只有它自己能写
projects/<name>.md    # 项目快照 + 协作状态
workflow/     # 跨项目可移植的方法论

关键约束只有几条,但都是硬的:

  • 一个 Agent 只能写自己的 agents/<host>/<id>/ 目录;
  • queen/ 永远人类说了算,Agent 不许碰;
  • shared/ 平时对 Agent 只读,只有在显式"蒸馏"流程里才被合并更新。

这套隔离让冲突几乎不可能发生:每个目录只有一个写者。即使两台机器同时 push,改的也是不同文件。

优先级链:冲突时听谁的

光有分层不够,还得规定冲突时的优先级。nestwork 用一条单向链:

queen/agent-rules.md  >  queen/strategy.md  >  shared/memory.md
   >  agents/*/*/memory.md  >  projects/*.md  >  workflow/*.md

当两层指令打架时,不做"折中合并"——而是选高优先级那条,丢掉低的。折中是 Agent 最容易犯的错:它会试图同时满足两个矛盾的要求,结果两个都没做好。明确的优先级链把这个决定从"运行时即兴发挥"变成"协议层确定"。

一个反直觉的坑:高频文件会把主分支撑爆

上线两周后我发现仓库膨胀到 177MB——某些 Agent 把高频变动的 history.jsonl(每次会话都重写、还压缩不友好)也提交进了 main。411 个 commit,主分支体积失控。

解决方案是给这类高频产物开单独的孤儿分支(orphan branch),分支名里嵌入 host 和 agent-id:

  • 每次快照是一个无父提交,force-push 覆盖上一次;
  • 分支永远只有一个 commit,远端对象数稳定在"当前快照大小";
  • 因为分支名唯一,单写者,force-push 天然无冲突。

教训写进协议:高频、压缩不友好的产物,默认放孤儿分支,不进 main。人类手写的低频记忆才留在主线。

它解决的真正问题

nestwork 表面是个同步工具,内核其实是一套协议:怎么分层、谁能写、冲突听谁的、什么该记什么该忘。工具可以换,协议是资产。

现在换任何一台机器上的任何 Agent,它 pull 完就知道:我是谁、在做什么项目、上次卡在哪、哪些决定已经拍板不要再问。失忆税降到接近零。

项目开源在 github.com/songth1ef/nestwork。如果你也在多机器、多 Agent 之间反复解释同一件事,也许值得一试。