每个 Coding Agent 都有一个致命问题

你让 Claude Code 或 Cursor 帮你修了一个 Bug,它修好了,你也保存了代码。关掉终端,第二天再打开,它完全不记得昨天修了什么、为什么这么改、哪几个文件被影响到了。

不是 Agent 笨,是它根本没有持久记忆。每次会话都是第一次见面。

现有的解决方案要么是 Claude Code 专用的 remember.md 文件(Agent 得自己写自己读,还经常忘),要么是 claude-mem 这种需要 ChromaDB + Node.js + Python + 额外进程的方案(装完发现比问题本身还复杂)。

Engram(读作 /ˈen.ɡræm/,神经科学里的"记忆痕迹")换了个思路:一个 Go 二进制,零依赖,SQLite + FTS5,20 个 MCP 工具,给你的任意 Coding Agent 装上跨会话记忆。

它到底是什么

Engram 不是一个 Coding Agent,它是一个记忆系统,通过 MCP 协议暴露给任何支持 MCP 的 Agent。

核心数据:

一句话总结:给你的 Coding Agent 一个跨会话的"大脑",它不再每次重启都失忆。

为什么比 claude-mem 更值得买关注

Engram 的 README 里专门有一页和 claude-mem 做对比。这两个项目解决的是同一个问题,但设计哲学完全不同:

维度Engramclaude-mem
语言Go(单二进制,零依赖)TypeScript + Python
Agent 支持所有 MCP Agent(Claude Code、Cursor、Windsurf…)Claude Code 专用(用插件钩子)
搜索SQLite FTS5(内置,零配置)ChromaDB 向量数据库(需额外进程)
存储什么Agent 主动保存的结构化摘要原始工具调用 + AI 压缩
压缩方式Agent 自己决定写什么,不需要额外 API separate Claude API 调用压缩
进程一个二进制(或没有——MCP stdio 就行)worker 进程 + ChromaDB 两个服务
数据库单个 ~/.engram/engram.dbSQLite + ChromaDB 两个存储
Web UI终端 TUI(engram tuilocalhost:37777 网页
LicenseMITAGPL-3.0
冲突检测内置,支持 LLM 语义判冲突
云同步内置,跨机器同步 + 冲突处理

核心区别在于一个哲学问题:记忆该由 Agent 决定,还是由系统自动捕获后压缩?

claude-mem 的做法是捕获所有工具调用,然后用 AI 压缩。好处是不用你操心,坏处是额外 API 调用、额外延迟、额外成本,而且原始调用会污染搜索结果直到被压缩。

Engram 的做法是信任 Agent——它已经完成了任务,已经理解了上下文,让它自己决定什么值得记住:mem_save("Fixed N+1 query in user list — added eager loading", type="bugfix")。简单、干净、零额外成本。

20 个 MCP 工具,分为 5 个能力域

Engram 通过 MCP 暴露了 20 个工具,不是堆数量,而是覆盖了记忆系统的完整生命周期:

保存与更新(4 个)

搜索与检索(4 个)

会话生命周期(3 个)

冲突检测(2 个)

这个能力是 Engram 独有的。当你保存"用 Postgres 做用户库"和"把用户库换成 MongoDB"两条记忆时,Engram 会用 FTS5 找到 lexically related 的候选,然后用你现有的 Agent 的 LLM 做语义判断——免费,因为你已经在用那个 LLM 了。

实用工具(7 个)

真正有意思的设计:3 层渐进式检索

Engram 的核心设计是渐进式披露(Progressive Disclosure)——不要一次把全部记忆塞给 Agent,而是让它自己决定挖多深:

第 1 层:mem_search "auth middleware"
→ 返回紧凑的结果摘要(约 100 tokens 每条)

第 2 层:mem_timeline observation_id=42
→ 查看那条记忆在什么会话背景下产生

第 3 层:mem_get_observation id=42
→ 获取完整内容(不截断)

这样 Agent 可以用最少的 token 先判断"这条记忆相不相关",再决定要不要深入。比直接把所有历史 dump 进上下文省得多。

Topic Key 设计:让 evolving 的决策不产生噪音

Engram 有个很聪明的设计叫 topic_key。默认情况下,每次 mem_save 创建一条新记录。但如果你传了 topic_key,相同 project + scope + topic_key 的保存会变成 upsert——更新现有记录,revision_count++,不会创建重复条目。

比如架构决策:topic_key: "architecture/auth-model",每次 Auth 方案调整都更新同一条记忆,保留完整演进历史。

而 bugfix 这种一次性事件就不需要 topic_key,每次保存就是独立记录。

topic_key 的格式约定是 family/specific-description,全部小写 kebab-case——这是为了让 SQLite FTS5 的分词器能正确 tokenize。

怎么接入

安装非常简单,一个二进制搞定:

# macOS / Linux
brew install gentleman-programming/tap/engram

# 或者从源码
git clone https://github.com/Gentleman-Programming/engram.git
cd engram && go build ./cmd/engram

然后给你的 Agent 装插件(以 Claude Code 为例):

claude plugin marketplace add Gentleman-Programming/engram
claude plugin install engram

支持的所有 Agent 一行搞定:

Agent安装命令
Claude Codeclaude plugin marketplace add Gentleman-Programming/engram && claude plugin install engram
Cursor / Windsurf / VS Codeengram setup cursor / engram setup windsurf
OpenCodeengram setup opencode
Codexengram setup codex
Gemini CLIengram setup gemini-cli
Kiro / Kilo Code / Piengram setup kiro / engram setup kilocode / engram setup pi

engram setup 会自动写 MCP 配置和 Memory Protocol 到你的 Agent 配置文件里,重启 Agent 即可。

对于不用插件的 Agent,也可以直接启动 MCP server:

# MCP stdio(大多数 Agent 都用这个)
engram mcp

# 或者 HTTP API(给 OpenCode 插件和 Pi 用)
engram serve   # 默认监听 7437 端口

云端同步与冲突检测

Engram 支持可选的云同步(Engram Cloud),同一个项目可以在多台机器上共享记忆,跨机器同步时会检测冲突。

冲突检测有两个阶段:

还有一个 engram tui 终端 UI,可以直接在终端里浏览、搜索、编辑记忆,不用开浏览器。

实际体验的几个坑

和 Context+ 有什么区别?

你可能已经注意到我们写过 Context+。这两个项目经常被人拿来比较,但它们解决的是不同的问题:

维度EngramContext+
解决什么问题Agent 跨会话失忆Agent 看不懂大型代码库
核心能力记忆保存与检索代码语义图谱与搜索
技术栈SQLite + FTS5Tree-sitter AST + 向量嵌入 + 谱聚类
语言Go(单二进制)TypeScript + WASM
适用场景任何 Coding Agent 工作流大型多语言代码库
可以一起用吗完全可以——Engram 管记忆,Context+ 管代码理解,两个 MCP server 同时挂给同一个 Agent

简单说:Engram 让你的 Agent 记住"昨天做了什么",Context+ 让你的 Agent 理解"代码结构是什么"。两个互补,不冲突。

适合谁用

总结

Engram 做的事情其实很简单:让 Coding Agent 在会话之间保留记忆。但它的实现方式比同类方案更优雅——一个 Go 二进制,SQLite FTS5 做搜索,零额外依赖,20 个精心设计的 MCP 工具,支持 10+ 个主流 Agent。

比起 claude-mem 的"全量捕获 + AI 压缩"方案,Engram 选择了"信任 Agent 自己决定什么值得记住"的路径。省掉了额外 API 调用,省掉了 ChromaDB 进程,代码也更简洁。

5,800 Star 不是天上掉下来的——它解决的是 Coding Agent 领域最普遍也最被忽视的问题:Agent 不应该失忆。

项目地址:github.com/Gentleman-Programming/engram