Mythicator在每个repo维护统一记忆文件并同步到CLAUDE.md、AGENTS.md、GEMINI.md、.cursorrules,解决多AI工具上下文割裂问题。
我在 Claude Code、Codex 和 Gemini CLI 之间切换,具体用哪个取决于当天的工作内容。它们各自都很出色,但彼此之间毫无感知——上一个工具知道的事,下一个工具一无所知。
比如我会告诉 Claude Code:"我们用 Postgres 而不是 SQLite,因为需要多 worker 并发写入,别再推荐 SQLite 了。"它会记住,因为它会读 CLAUDE.md。但切换到同一个仓库的 Codex,它又会推荐 SQLite。再推荐一次。因为我告诉 Claude Code 的任何信息,从来没有进入 Codex 读取的上下文里。
这种事乘上每一次"我们试过 X,不行,别再提了"的对话,你就开始每周都要跟三个工具解释同样的三件事。用不了多久就烦了。
Mythicator 是一个同名 CLI 工具。它只做一件事:为每个仓库维护一份记忆文件,然后把它同步到每个 AI 工具已经读取的上下文文件中。
mythicator init
mythicator add "Chose Postgres over SQLite" --type decision --reason "needs concurrent writes from multiple workers"
mythicator sync
sync 命令把同样的记忆内容写入 CLAUDE.md、AGENTS.md、GEMINI.md 和 .cursorrules——用标记块包裹起来,这样就永远不会触及我在这些文件里手动写过的任何内容。只要更新一次记忆,每个工具都能拿到。
规范数据存在 .agent-memory/memory.json 里,提交到仓库里。它不花哨——只是决策、被拒绝的方案、bug、约定、笔记,每条都可以带可选的原因和标签。没有向量搜索、没有 embeddings、没有托管服务。就是一个 JSON 文件加一个同步步骤。
已经有一些不错的"AI 记忆"工具了——Mem0、Zep 之流。我做之前看过它们。它们面向的是需要在运行时建立长期记忆的 Agent 开发人员,要在一大堆事实里做相似性搜索。这跟我的需求不一样。
我不需要语义搜索。我需要的是"我日常切换的四个工具对同一个仓库的五个决策意见一致。"问题小得多,方案也傻得多——一个扁平文件加一条 sync 命令。
最复杂的不是记忆存储——那就是一个带 id 计数器的 JSON 文件。最复杂的是同步逻辑不能把我手动编辑过的文件弄坏。
如果 sync 每次都整体覆盖 AGENTS.md,那就会把我手动写在那里的任何内容都删掉。所以生成的内容块夹在两个标记之间:
<!-- AGENT-MEMORY:START (auto-generated by mythicator, do not edit) -->
...
<!-- AGENT-MEMORY:END -->
Sync 只碰这两个标记之间的内容。跑十次,得到同样的输出十次。如果某个文件只有 START 标记而没有 END 标记(半损坏状态),它会跳过那个文件并发出警告,而不是去猜测并可能把它搞坏。
是小细节,但这就是"人们信任到愿意自动运行"和"跑一次就被坑,然后删掉"两类工具的差别。
我不会假装这一切都是手工敲的。我用 Codex 根据一份相当详细的规格说明写出了实现,然后自己逐行检查了 storage.ts 和sync.ts——专门检查了我之前被 AI 生成代码坑过的两个问题:删除条目后的 id 碰撞,以及标记替换逻辑是脆弱的正则还是有办法在重复运行时存活下来。第一版有个真实的 bug(id 基于数组长度,删除再添加就坏了)。我发现后,让它改成持久计数器来修复,自己验证过才信任它。
也有必要坦白说:Codex 测试用的沙箱访问不了真实的 npm registry,所以它自己宣称的"测试通过"是建立在依赖 shim 上的。我没有轻信——克隆到自己的 Ubuntu 笔记本上,真正跑了 npm install,直到在全新构建上完整跑通了 init → add → sync → list → remove → sync-again 全流程,才认为它是可用的。
这是个小的、能用的 v1。Node.js + TypeScript,只有一个运行时依赖(commander),MIT 许可。如果你也在同一个代码库上切换 AI 编程工具,而且厌倦了反复解释同样的事,它或许能帮你省点口水。
Repo: github.com/Jeffrin-dev/Mythicator
我没打算做下一个 Mem0。只是不想每周都跟 Codex 说一遍 SQLite 的事。