RepoDaily · 2026-08-19 · Infrastructure / Runtime

ai-memory:给编程智能体装上长期记忆,中途从 Claude Code 换到 Codex 也不丢上下文

#4 Infrastructure / Runtime Rust +730 akitaonrails/ai-memory 打开仓库

Rust 编写的 MCP 服务:通过生命周期钩子捕获编程会话、落盘前脱敏凭据,并在 Claude Code、Codex、Cursor 等 CLI 之间自动交接上下文。自托管,MIT 协议。

项目类型Infrastructure / Runtime
最适合在同一批目录里来回切换 Claude Code、Codex、Cursor、Gemini CLI、OpenCode 等编程智能体 CLI,希望会话记忆落在自己磁盘上的开发者。
风险等级中低:工程纪律严格,但官方声明的威胁模型只覆盖单租户,v1 未提供静态加密,原生 Windows 仍是实验性。
评估时间约一小时:构建或下载二进制,给两个智能体装好钩子,完整跑一次跨 CLI 交接。

核心问题: 在 Claude Code 里中途退出,再用 Codex 打开同一目录,能不能不用重新解释架构?

92/100

RepoDaily 采用评分

RepoDaily 将该项目的采用分评为 92/100(强):分数来自文章来源、安装路径、生产风险、差异化、许可证清晰度以及 AI/Agent 适配度。

基于 RepoDaily 来源和采用说明的方向性评分,不是基准测试。风险: 中
100证据质量

包含 6 个来源、覆盖 4 类来源;如有 RepoDaily 独有模块,会进一步提高证据分。

100可安装/可试用性

检测到 7 个工作流步骤、5 个下一步动作,以及 6 个命令/安装信号。

66维护可信度

趋势热度为 +730 stars;如内容中有 release、issue 或维护信号,会提高维护可信度。

96生产准备度

采纳风险标记为 medium,并包含 8 条安全说明与 4 条跳过条件。

100差异化

3 个机会视角、4 个替代方案,以及 4 个类型化模块支撑差异化判断。

68许可证清晰度

文章中包含许可证来源或许可证表述。

90Agent / AI 适配度

文章正文和元数据中检测到 9 个 AI/Agent 相关信号。

项目概览

akitaonrails/ai-memory 是一个 Rust 项目,回答的是如今同时用多个 CLI 的开发者都会遇到的问题:在 Claude Code 里退出、再到同一目录打开 Codex,上下文怎么办?README 的表述很直接——不用重新解释架构、失败的尝试和悬而未决的问题。它的做法是给每个受支持的智能体安装 MCP 配置加生命周期钩子,把会话捕获到本地(SQLite 数据库加 Markdown wiki 文件),再把交接内容喂给下一个启动的智能体。

支持矩阵才是真正的卖点。Claude Code、Codex、Command Code、Devin CLI、OpenCode、Cursor、Gemini CLI、Oh My Pi/OMP 和 Pi 各有针对性集成:Claude Code 可通过本地 stdio 桥启用按会话的自动作用域隔离(`install-mcp --session-aware`);Devin CLI 的钩子挂在 `PostCompaction` 事件上,经 `hookSpecificOutput.additionalContext` 注入交接;Pi 会生成一个带 HTTP MCP 桥的 TypeScript 扩展;Crush 只走托管模式(`ai-memory run crush`)。Linux 是首要的 Docker/服务器目标,发布 `linux/amd64` 和 `linux/arm64` 镜像,Arch/AUR 包附带系统级和用户级 systemd 单元;macOS 两种架构都有原生压缩包;原生 Windows 是实验性,发布带 `ai-memory.exe` 的 `ai-memory-windows-x86_64.zip`。

底子上的工程纪律更像基础设施厂商而非智能体周边工具:Rust 1.95 固定在 `rust-toolchain.toml`;每个 PR 前要过四道关卡(`cargo fmt --all -- --check`、`cargo clippy --workspace --all-targets -- -D warnings`、`cargo test --workspace`、`cargo deny check`);面向用户的改动必须在同一 PR 里写 `## [Unreleased]` 下的 CHANGELOG 条目,缺失即阻塞;所有 SQLite 写入都经过单一 writer actor(`WriterHandle`);文件写入只走 tmp + rename + fsync 的原子路径。SQLite 经 rusqlite 的 `bundled` 特性打包、libgit2 经 git2 的 `vendored-libgit2` vendor,构建只需标准 C 工具链。

1.28.1 于 2026-08-18 发布——比本次趋势快照早一天——修复了传递依赖的 DoS 漏洞(h2 0.4.14 → 0.4.16,RUSTSEC-2026-0258;h2 位于服务器所用 axum/hyper 栈之下,`--transport http` 部署可被触达),并给内置脱敏器新增了七种凭据形态。窗口期内 730 星、2026-08-19 排名第 4,项目靠一个具体承诺加上看得见的维护卫生冲上趋势。

解决什么问题

  • 换一个编程 CLI,积累下来的心智模型就没了:架构、走过的弯路、悬而未决的问题都得重讲一遍。
  • Claude Code 和 Codex 的上下文压缩会在会话进行中就把原始聊天记录抹掉。
  • 智能体写进持久记忆的任何内容都可能带着比对话活得还久的有效凭据。
  • 每家供应商暴露的钩子和配置面都不一样,记忆捕获必须逐个智能体适配。
  • 云端记忆产品把你的代码上下文放在别人的基础设施上。

工作原理

  1. 按智能体安装:MCP 配置加生命周期钩子;Claude Code 上 `install-mcp --session-aware` 可通过本地 stdio 桥启用按会话的自动作用域隔离。
  2. 钩子捕获生命周期事件并强制执行捕获排除:在最近的 `.ai-memory.toml` 里配置 `[capture] ignore_paths`,把私有路径下的文件工具事件挡在 spool 之外;`--check-capture` 可本地校验。
  3. 会话结束时钩子写入交接记录;下一个受支持智能体的 session-start 钩子在你的第一条提示之前自动取走。手工创建的交接是项目级的,优先级高于自动交接。
  4. Claude Code 或 Codex 压缩上下文时,`PreCompact` 钩子写出新的 `sessions/<id>.md` 摘要,原始聊天记录被压缩后仍可用 `memory_recent` 找回。
  5. 智能体主动查询:`memory_query` 在编译后的 wiki 页面上做 FTS5 加实体/图/向量的 RRF 融合,再做来源权威排序和原始观察回退;`memory_explore` 返回“给我补补课”式的叙述摘要。
  6. 内置脱敏器按 `BUILTIN_PATTERN_STRS` 在客户端就把凭据形态替换成 `[REDACTED]`,早于内容进入本地 spool 或网络。
  7. 服务端所有 SQLite 写入走单一 writer actor(`WriterHandle`);CLI 永远只是运行中服务器的瘦 HTTP 客户端,绝不直接打开数据库或 wiki 目录。

接入面:逐个智能体看什么能用

  • Claude Code — MCP 配置 + 生命周期钩子;`install-mcp --session-aware` 经本地 stdio 桥启用按会话自动作用域隔离;`Stop` 上的助手回合捕获是双重自愿(`--capture-assistant` 加服务端 `capture_assistant` 开关),默认关闭。
  • Codex — MCP + 钩子,但没有自动的会话结束钩子:需要最终摘要或交接时运行 `ai-memory finalize-session`。
  • Command Code — MCP 配置在 `~/.commandcode/mcp.json`,四个稳定钩子事件在 `~/.commandcode/settings.json`;`Stop` 只是回合边界,要用 `ai-memory finalize-session --agent command-code` 收尾;`ai-memory run command-code` 增加 v3 原生会话恢复和可见事件导入。
  • Devin CLI — 钩子用 `PostCompaction` 事件,经 `hookSpecificOutput.additionalContext` 注入交接;因 Devin 不暴露子智能体事件而将其省略。
  • OpenCode、Cursor、Gemini CLI — MCP 配置 + 生命周期钩子;OpenCode 用远程 MCP 加生成的 TypeScript 插件,插件强制执行捕获排除。
  • Pi 与 Oh My Pi — 生成扩展(Pi 为 `~/.pi/agent/extensions/ai-memory.ts`;OMP 为原生 `.omp` MCP 配置加 TypeScript 扩展)强制执行捕获排除。
  • Crush — 仅托管:`ai-memory run crush` 恢复其项目本地会话数据库,经临时的受支持全局上下文文件提供可移植上下文;不提供钩子安装器。
  • 只有 MCP 没有钩子面的智能体 — 退出前让它调用 `memory_handoff_begin`,下一个有钩子的智能体仍会自动消费这条交接。

命令面:真正要记住的那些动词

  • `install-mcp` / `install-hooks` — 按智能体配置;未发布的 #411 修复后,`--agent pi` 与 `--agent omp` 变体会尊重 `PI_CODING_AGENT_DIR`,此前扩展被装到智能体根本不加载的位置,安装报成功但捕获静默失效。
  • `finalize-session` — 给没有真正会话结束钩子的智能体(Codex、Command Code)手动收尾。
  • `run <agent>` — 自愿开启的托管工作流;`run command-code` 与 `run crush` 恢复供应商会话状态。
  • `--check-capture` — 在任何内容被 spool 或发送前本地校验捕获排除标记。
  • `serve --bind 0.0.0.0:…` — 非回环暴露;没有 `AI_MEMORY_AUTH_TOKEN` 时服务器直接拒绝服务,`--allow-insecure-no-auth` 是文档明示的危险覆盖项。
  • `generate-auth-token` — 为非回环部署生成每个请求都校验的 bearer token。
  • MCP 工具 — `memory_query`、`memory_explore`、`memory_recent`,以及 `memory_handoff_begin` / `memory_handoff_accept` / `memory_handoff_cancel`,支持项目级 `shared: true` 和仅 root 可用的 `any_owner: true`。

架构解读:让被捕获数据保持可信的不变量

  • 存储是 SQLite 加 Markdown wiki,按 `(workspace_id, project_id)` 命名空间隔离;A 项目的清除操作删不掉 B 项目的文件,V38 触发器拒绝不匹配的 workspace/project 实体和跨项目的实体/页面链接。
  • 所有 SQLite 写入经过单一 writer actor(`WriterHandle`)——一致性的唯一咽喉。
  • 配置只在启动时读一次;`Config::load` 之外禁止调用 `std::env::var`。
  • 文件写入只允许原子方式:tmp + rename + fsync,绝不就地写。
  • CLI 从不打开 SQLite 文件或 wiki 目录,永远只是运行中服务器的瘦 HTTP 客户端。
  • 构建自包含:SQLite 经 rusqlite `bundled` 打包,libgit2 经 git2 `vendored-libgit2` vendor,Rust 1.95 固定在 `rust-toolchain.toml`——除标准 C 工具链外无需系统库。
  • 开发按里程碑推进,不留死代码和半成品;桩必须带 `// M<n> TODO` 模块注释标记。

试用路径:一小时内得出结论

  • 0–15 分钟:`git clone`、`cargo build --workspace`、`cargo test --workspace`(Rust 1.95),或拉取已发布的 Docker 镜像(`linux/amd64`、`linux/arm64`)或 macOS 压缩包;Apple Silicon 上官方推荐原生二进制。
  • 15–30 分钟:在同一个工作目录里给两个智能体——文档示例是 Claude Code 和 Codex——装好 MCP 配置和生命周期钩子。
  • 30–45 分钟:在 Claude Code 里做 15 分钟真实工作,`/exit`,再在同一目录启动 Codex,确认 SessionStart 钩子在你的第一条提示之前取到了交接。
  • 45–60 分钟:触发一次压缩并用 `memory_recent` 找回摘要;问一句“catch me up”看 `memory_explore` 的回答;给私有路径加 `[capture] ignore_paths` 并用 `--check-capture` 验证。

谁适合关注

适合关注

  • 在同一批仓库里于 Claude Code、Codex、Cursor、Gemini CLI 或 OpenCode 之间来回切换的个人开发者和小团队。
  • 希望记忆存在自己磁盘上(SQLite 加 Markdown wiki,单一数据目录)而不是供应商云端的用户。
  • 愿意跑小型 Rust 服务、或使用已发布 Docker 镜像与 Arch/AUR 包附带 systemd 单元的家庭实验室运维者。
  • Linux 和 macOS 用户,以及 WSL2 内的 Windows 用户(原生 Windows 为实验性)。

可以先跳过

  • 多租户部署:SECURITY.md 明确声明 ai-memory 是单租户工作站/家庭实验室服务,所有认证用户同属一个信任域,可读取相同的项目记忆。
  • v1 阶段需要静态加密的场景——目前没有,唯一防护是文件系统权限。
  • 想要通用提示词/输出 DLP 过滤器的组织——捕获排除明确不是干这个的。
  • WSL2 之外的 Windows 原生环境,考虑到实验性标签与 PowerShell/Git Bash 兼容兜底。

风险与注意事项

中

代码库纪律严得少见——CHANGELOG 阻塞门禁、四道 CI 检查、写明的跨切面不变量、7 天响应/30 天修复的安全 SLA——但声明的威胁模型止步于单租户,v1 没有静态加密,捕获正确性依赖各供应商的钩子契约,#411 已经造成过“安装报成功、捕获静默失效”的情况。

  • 单租户信任模型:任何认证用户都能读取相同的项目记忆,不存在多租户边界。
  • v1 没有静态加密,且已有安装不会被自动迁移到新文件享有的 0700/0600 权限默认值。
  • 钩子契约的脆弱性:#411 表明设置了 `PI_CODING_AGENT_DIR` 时,安装可能报成功而捕获静默失效。
  • 原生 Windows 仍是实验性;WSL2 才是受支持路径。
  • 非回环部署要求运维者自律——bearer token、TLS 反向代理、Web UI 的 `AI_MEMORY_AUTH__SECURE_COOKIE`——容器内 fail-closed 检查会降级为警告,实际可达性由宿主侧 `-p` 发布规格决定。
  • 报告通道:GitHub 私有安全公告,7 天内响应,目标 30 天内出补丁,并在 changelog 中致谢。
  • 脱敏器:`BUILTIN_PATTERN_STRS` 在客户端运行,早于摘录进入本地 spool 或网络;1.28.1 新增七种形态——GitHub `gho_`/`ghu_`/`ghs_`/`ghr_`、按 20 字符格式锚定以免误杀 `ASIAPACIFICREGION` 的 AWS `ASIA…`、Stripe `rk_live_`、Google `1//…` OAuth 刷新令牌、Meta `EAA…`、Telegram bot token、撤销前不过期的 GoHighLevel `pit-…`。
  • 1.28.1(2026-08-18)将 h2 从 0.4.14 升到 0.4.16,修复 RUSTSEC-2026-0258 无限空 DATA 帧 DoS,`--transport http` 部署可被触达。
  • 服务器在无认证的非回环 HTTP 上直接拒绝服务;`--allow-insecure-no-auth` 是明示的危险覆盖;容器内该检查只警告,安全发布形式是 `-p 127.0.0.1:49374:49374`。
  • `AI_MEMORY_ALLOWED_HOSTS`(默认 `127.0.0.1`、`localhost`)对陌生 Host 头返回 403——防 DNS 重绑定,但不能替代 token。
  • 入站 HTTP 请求体上限 10 MB。
  • 认证阶梯:静态 root bearer token、只做归因永不给管理权限的数据库用户 token(第一个数据库用户出现后 `/admin/*` 全部仅 root 可用)、可选 OIDC 钩子边缘 token。
  • 新文件的 Unix 权限:数据目录 0700,配置、SQLite、托管片段和备份文件 0600,不受 umask 影响;Windows 依赖文件系统 ACL。

替代方案比较

方案适用场景代价
mem0
你想要面向大量 LLM 应用的 API 优先记忆层,而非专门的编程 CLI 钩子集成。开源核心加付费云版本。
Letta(MemGPT)
你在构建自己的智能体,想要带服务器 API 的智能体原生持久记忆。开源。
供应商原生会话记忆(Claude Code 项目文件、Cursor memories)
你只待在一家供应商的 CLI 里,从不跨供应商交接。随产品附带。
手写 Markdown 交接笔记(CLAUDE.md / AGENTS.md)
你不想要任何基础设施,愿意手工维护笔记。免费但全靠手动,没有捕获、脱敏和压缩恢复。

这个趋势说明了什么

hardened 多租户外壳

SECURITY.md 把 ai-memory 限定在单一信任域;由反向代理强制租户隔离、再为每个租户配独立数据目录,理论上可以把它搬上共享基础设施,但源资料包里没有任何现成实现。

先重读 SECURITY.md 的威胁模型,再在 issue 里搜“多租户”,确认没有现成支持再动手。

把脱敏引擎抽成独立 crate

内置凭据模式清单——包括避免误杀 `ASIAPACIFICREGION` 的 20 字符 AWS 锚定——足够通用,任何会 spool 智能体转录文本的工具都能复用。

查 `BUILTIN_PATTERN_STRS` 是否已发布为独立 crate;如果没有,这就是缺口。

只有 MCP 的供应商今天就能接入

文档已定义无钩子路径:只有 MCP、没有生命周期钩子的智能体在退出前调用 `memory_handoff_begin`,下一个有钩子的智能体会自动消费这条交接。

挑一个 MCP-only 客户端,调用 `memory_handoff_begin`,再确认某个有钩子的智能体在会话开始时取到了交接。

下一步建议

在真实目录里跑一次 Claude Code → Codex 交接

核心承诺用你已有的两个 CLI、在你已有的机器上,一小时内就能验证。

  1. 用 Rust 1.95 从源码构建(`cargo build --workspace`),或使用 `linux/amd64`、`linux/arm64` 的已发布 Docker 镜像。
  2. 在同一个仓库里给 Claude Code 和 Codex 安装 MCP 配置与生命周期钩子。
  3. 在 Claude Code 里做 15 分钟真实工作,然后 `/exit`。
  4. 在同一目录启动 Codex,验证 SessionStart 钩子在你的第一条提示之前取到了交接。
  5. 用 `ai-memory finalize-session` 收尾——Codex 没有自动会话结束钩子——然后让 `memory_explore` 给你补补课。

RepoDaily 判断

ai-memory 是少见的“README 承诺少于工程实力”的热门项目:固定工具链、阻塞式 CHANGELOG 门禁、单写入者的 SQLite 存储、客户端凭据脱敏、由 V38 触发器强制的按项目隔离,以及一份直言“不防什么”的威胁模型。跨供应商交接是把你吸引过来的功能;脱敏器和写明的认证阶梯才是把智能体转录存到自己磁盘上变得站得住脚的原因。把它当作它自我声明的单租户服务来用——留在回环之内,或者放在 token 加 TLS 反向代理之后——如果你需要多租户或 v1 的静态加密,现阶段先绕开。

信息来源