让 Claude Code、Codex 等多个 Agent 共用一份记忆
把 Claude Code、Codex 和其他运行时接到同一个 Lore 项目,让它们读写同一份记忆。
Claude Code 和 Codex 互相看不见对方的会话。你在 Claude Code 里纠正过的一条规矩,一小时后在同一个仓库打开 Codex,它还是不知道。把同一段话抄进 CLAUDE.md 和 AGENTS.md,只是多了两份会慢慢分叉的文件。要的是一份记忆图,这台机器上的每个运行时都去读、都去写。
Lore 把这份图放在服务端。一个项目就是一块记忆空间:自己的节点、召回、令牌和设置。Claude Code、Codex 以及其他支持的运行时指向同一个项目,它们就共用这些记忆。另一个代码库用另一个项目,两边就不会混在一起。
这篇按 Loremem 云服务来写。自托管是同一套模型,只是地址不同。服务要跑在自己机器上的话,看用 Docker 安装。
一个项目、一枚令牌、所有运行时
打开 https://app.loremem.com/login,用 GitHub 或 Google 登录。第一次登录会建一个个人组织和一个默认项目。这些 Agent 就该共用这一份的话,留在这个项目里。某个产品的记忆不该跟另一个混在一起时,另建一个项目。控制台顶部的组织和项目切换器显示你当前在哪。
打开 Install,令牌备注填 laptop,点 Create token。一枚令牌只属于一个项目。用这枚令牌的每个 Agent,读写的都是这个项目的记忆图。
在这些 Agent 运行的机器上,只装你真正有的通道。下面这条同时接上 Claude Code 和 Codex:
npx @loremem/cli install --base-url https://api.loremem.com --api-token lm_your_token --channels claudecode,codex通道名是 claudecode、codex、pi、openclaw、hermes、opencode、zcode、dsh,其中 DeepSeek Harness 对应 dsh。不加 --channels 时,安装程序会把检测得到的运行时都接上。某个运行时的命令不在 PATH 里,会被记成跳过,也不会给它写配置。Hermes 是例外:它没有命令,插件要你自己链进 Hermes,步骤在 Hermes。DeepSeek Harness 只要 dsh 命令在 PATH 上、或 ~/.dsh 已经存在,就算检测到;插件放在 ~/.lore/dsh/,条目写进 ~/.dsh/cordis.patch.yml 的托管块。
安装程序把服务器地址和令牌存一次,写在 ~/.lore/config.json(权限 0600)。每个运行时再拿到自己的文件:
| 运行时 | 写了什么 |
|---|---|
| Claude Code | ~/.lore/claudecode/ 里的插件,以 lore@lore 安装。连接信息在 ~/.claude/settings.json 的 env 块。 |
| Codex | ~/.lore/codex/ 和 Codex 插件缓存里的插件,以及 config.toml 里的 lore MCP 服务。 |
| OpenCode | ~/.config/opencode/plugins/lore-memory.js,以及原生的 lore_* 工具。不写 MCP 条目。 |
| Pi | ~/.lore/pi/ 里的扩展,从 ~/.pi/agent/extensions/lore 链过去。 |
| DeepSeek Harness | ~/.lore/dsh/ 里的插件和 MCP 桥,外加 ~/.dsh/cordis.patch.yml 里的托管块,用来加载 lore 生命周期插件和 MCP 服务。 |
Codex 的路径跟着 CODEX_HOME,默认是 ~/.codex。设了令牌时,Codex 的 lore MCP 条目是这样:
[mcp_servers.lore]
url = "https://api.loremem.com/api/mcp?client_type=codex"
http_headers = { Authorization = "Bearer lm_your_token" }服务不需要令牌时就没有这一行 header。config.toml 不要给别人读。安装程序写入时权限是 0600。
接上的运行时都要重启。Claude Code 和 Codex 在进程启动时加载钩子和 MCP 配置。Pi 里运行 /reload,或者重启 Pi。DeepSeek Harness 在会话开始时加载 ~/.dsh/cordis.patch.yml。然后跑 npx @loremem/cli status,接上的每个通道都应是 installed。
--api-token 会把令牌留在 shell 历史里。第二台机器可以用同一枚令牌,更稳妥的做法是每台机器各建一枚、各写备注,这样一台笔记本撤销时不影响另一台。撤销在 Tokens 页。
同一条事实,谁开着谁就能读到
记忆写一次,从你当时开着的那个 Agent 写。让它先搜索,已有节点讲的就是这件事就更新:
把这个决定存进 Lore 的 project://checkout_api/webhooks。先搜索已有节点,已经有节点讲这件事就更新它。优先级 1。disclosure:改 checkout-api 的退款或支付 webhook 时。glossary:refund webhook、idempotency key、stripe。正文:退款 webhook 按 event.id 做幂等,测试必须把同一条事件重放两次,并断言只产生一行退款。父节点 project://checkout_api 必须先在,而且自己要有正文、disclosure 和 glossary。Agent 用 lore_create_node 建子节点,或者用 lore_update_node 改已有节点。没传的字段保持原样。
打开另一个运行时,新开一个会话,发一条用到这些词的提示,比如「checkout_api 的退款 webhook 该怎么测」。它的上下文里应有一块 <recall>:
<recall session_id="sess_8f3c" query_id="q_41" phase="prompt">
0.82 | project://checkout_api/webhooks
</recall>一行是分数和 URI。低于展示阈值的候选不会出现,只留得分最高的几条。自托管的 Lore 还会在 URI 后面印出对上的词。
这一行是线索。Agent 用 lore_get_node 打开它,带上标签里的 session_id 和 query_id,然后才把正文当成事实。工具名按运行时不同。Claude Code 会加前缀,搜索是 mcp__plugin_lore_lore__lore_search。OpenCode 和 Pi 直接注册 lore_search。Codex 和 DeepSeek Harness 的工具名来自 lore 这台 MCP 服务,形如 mcp__lore__*。参数是同一套。
会话开始时,每个接上的运行时都会收到同样的三个 boot 节点:core://agent、core://soul、preferences://user。第四个按运行时分开。Claude Code 加载 core://agent/claudecode,Codex 加载 core://agent/codex,DeepSeek Harness 加载 core://agent/dsh。共用的规则放进 core://agent。某个运行时特有的地方,比如一个钩子或工具前缀,放进它自己的节点。每个接入都会带上自己的 client_type,召回分析也用它把用量按运行时分开。
Lore 连不上时,插件什么都不返回,Agent 在没有记忆的情况下继续。一次没召回到,不是这条提示失败了。
什么不会跨过项目边界
共用是按项目,不是按账号。一枚令牌读不到另一个项目的记忆图。两个代码库不该看见对方的决定时,用第二个项目,并在做那个项目的机器上安装那一枚令牌。
技能是另一条边界。Loremem 云服务可以把技能提供给每个接上的运行时。开源服务没有技能,所以那里不会出现 lore_skill_* 工具。
接上 Lore 之后,还有几件事仍然是本地的:
- Claude Code 的自动记忆是另一套。如果那里只想留 Lore,在
~/.claude/settings.json里把autoMemoryEnabled设为false。 - 只跑
codex mcp add的手动接法只注册工具,不装钩子。那样的 Codex 没有启动记忆,也没有<recall>块。两样都要的话,用安装程序。 - 启动记忆和召回只注入上面列出的这些运行时。通用 MCP 客户端接在
/api/mcp?client_type=mcp,有工具,没有注入,要自己调用lore_boot。
不要把 API key、令牌或连接串放进这份共用的记忆图。接上的每个 Agent 都能读到任何一个写进去的内容,备份也会留着旧版本。
以后再加一个运行时,用那个通道把安装程序再跑一次。npx @loremem/cli update --channels claudecode,codex 用来更新已经装过的。每个运行时的文件和完整通道列表在接入 Agent。