用 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 之间反复解释同一件事,也许值得一试。