印迹
一个本地MCP服务器,为AI编码代理提供跨会话的持久语义记忆。
安装
curl -sL https://raw.githubusercontent.com/jsflax/Engram/main/scripts/install.sh | bash这将下载预构建的二进制文件,注册MCP服务器,并配置Claude代码——需要几秒钟的时间。
要改为从源代码构建,请执行以下操作:
git clone https://github.com/jsflax/Engram.git
cd Engram
./scripts/install.sh --from-source启动一个新的Claude Code会话——内存工具立即可用。
Engram展示台
swift run -c release EngramVisualizer为什么不是MEMORY.md?
Claude Code通过以下方式内置内存 MEMORY.md 文件夹。以下是Engram更好的原因:
| MEMORY.md | 英文 | |
|---|---|---|
| 检索 | 将整个文件转储到系统提示符中 | 语义向量搜索——只显示相关内存 |
| 容量 | 截断200行 | 无限制-存储数千条,检索最佳匹配项 |
| 搜索 | 基于位置(文件顶部=先看到) | 混合FTS5+向量相似性(最相关=先看到的) |
| 跨项目 | 每个项目文件,不共享 | 项目范围+全局范围——首选项无处不在 |
| 维护 | 仅附加过时的文本 | update, merge, forget,自动过期记忆,冲突检测 |
| 结构 | 扁平文本,无关系 | 知识图谱——用键入的边连接记忆,在回忆中遍历 |
| 连续性 | 无会话意识 | 情景记忆、任务检查点、集群+整合 |
| 隐私 | 纯文本文件 | 本地SQLite+设备上嵌入(MiniLM-L6)。什么都不会离开你的机器 |
一条线: MEMORY.md是200行过时的平面文本。Engram是一个矢量数据库,可以缩放、语义搜索和自我维护。
工具
核心
| 工具 | 说明 |
|---|---|
remember | 用语义嵌入存储记忆。冲突检测块接近重复项(force: true 以覆盖)。可选的 importance: 1-5 |
recall | 混合FTS5+矢量搜索,带有项目增强、强化评分(频率+重要性+新近度)、时间过滤器(since/before),以及可选的图遍历(depth: 1-3) |
forget | 按ID、主题或项目删除。级联边缘清理 |
update | 按ID或相似性编辑——完全替换, append, prepend, find+replace,或仅元数据(topic, source, expires_in_days, importance) |
merge | 将多个记忆合并为一个。清理源边缘 |
stats | 数据库概述,包括每个项目和每个主题的细分 |
list_topics | 列出所有有计数的主题 |
timeline | 按天/周/月分组的按时间顺序排列的内存视图,带有项目、主题和时间过滤器 |
知识图谱
| 工具 | 说明 |
|---|---|
connect | 在记忆之间创造一条有向的边界(relates_to, contradicts, supersedes, derived_from, part_of, summarized_by) |
disconnect | 按边ID或按(from、to)对删除边 |
graph | 查看内存的邻域——显示给定深度的连接 |
任务连续性
| 工具 | 说明 |
|---|---|
checkpoint | 保存正在进行的工作状态(计划、进度、上下文)以进行跨会话恢复 |
resume | 加载任务检查点并将其标记为活动 |
list_tasks | 列出按项目和/或状态(活动、暂停、已完成)筛选的任务 |
情节记忆
| 工具 | 说明 |
|---|---|
begin_episode | 启动一个命名会话集。自动关闭任何活动剧集 |
end_episode | 以可选摘要结束一集 |
recall_episode | 按时间顺序回放一集的记忆 |
list_episodes | 按项目和/或状态筛选的剧集列表 |
组织与集群
| 工具 | 说明 |
|---|---|
organize | 批量重新设置主题记忆,创建中心记忆,并通过以下方式链接成员 part_of 边缘 |
detect_communities | 在知识图上进行标签传播以发现自然记忆组 |
find_clusters | 通过余弦距离发现语义相似的记忆组 |
consolidate | 从集群中创建摘要内存,用以下方式降低原始内存的优先级 summarized_by 边缘 |
Engram展示台
使用SwiftUI构建的内存数据库的交互式力导向图可视化。将其指向特定的数据库 CLAUDE_MEMORY_DB=~/path/to/memory.sqlite swift run -c release EngramVisualizer.
特征:
- 具有项目彩色节点和项目间排斥的力导向图布局
- 浮动PiP面板--拖动以分离、从角调整大小、捕捉屏幕边缘
- FTS5支持的前缀匹配搜索——突出显示匹配项,淡化其余部分
- 具有颜色编码关系的边缘类型过滤(part_of、矛盾、取代等)
- 带有播放按钮的时间滑块,用于设置图形随时间增长的动画
- 统计覆盖中的项目筛选切换
- 语义集群外壳绘制为半透明的项目彩色区域
- 带有实时内存更新和点击导航的活动日志
- 点击导航的小地图
- 带有打字机效果的细节面板,用于选定的记忆
- 将具有即时局部排斥、平移、缩放功能的节点拖动到光标(滚轮+捏合)
- 键盘快捷键:Esc(取消选择)、Tab(循环连接)、Cmd+F(搜索)、+/-(缩放)、Cmd+Shift+E(导出PNG)
卸载
curl -sL https://raw.githubusercontent.com/jsflax/Engram/main/scripts/uninstall.sh | bash删除二进制和MCP注册。数据库保存在 ~/.claude/memory.sqlite (如果需要,请手动删除)。
运作原理
- 嵌入模型: 释义-MiniLM-L6-v2 通过CoreML在本地运行。384维向量。
- 运输:stdio MCP——服务器从每个Claude Code会话开始,加载嵌入模型一次,在会话期间保持活动状态。
- 混合搜索:Recall将FTS5全文搜索(任何匹配的词都符合条件)与向量余弦相似性相结合。仅当嵌入模型不可用时,才回退到FTS5。
- 界定范围:记忆
project和topic领域。项目是一个软排名信号——相同的项目和全局记忆排名更高,但如果语义相关,跨项目的结果仍然会浮出水面。 - 知识图谱:用键入的定向边连接记忆。召回与
depth > 0通过BFS跟踪边以获得连通知识。忘记/合并时自动清理边缘。 - 强化评分:回忆排名将余弦相似性与三个强化信号混合在一起-- 频率 (按日志缩放的访问计数,最多可提高15%), 重要性 (明确1-5级,最高提升20%),以及 新近性 (从上次访问开始呈指数衰减,最高可提高10%)。余弦相似性仍然占主导地位;在势均力敌的比赛中加强微调排序。
- 冲突检测:
remember检查是否存在近似重复项(余弦距离\0),并将其与summarized_by边缘。organize通过自动创建集线器批量重新设置内存主题。 - 跨项目链接:
remember自动检测内容中提及的其他项目名称并创建relates_to这些项目中心记忆的边缘。 - 钩子:可选
memory-hooksClaude Code挂钩集成的二进制文件——在每条消息之前自动注入召回的上下文(advise),在检测到重要工作时阻止会话结束以获取见解(stop),并在内存操作累积时触发维护。
配置
| 环境变量 | 默认值 | 描述 |
|---|---|---|
CLAUDE_MEMORY_DB | ~/.claude/memory.sqlite | 数据库路径 |
CLAUDE_MEMORY_MODEL | 捆绑MiniLM-L6 | 自定义嵌入模型路径 |
需求
- macOS(用于嵌入的CoreML)
- Swift 6.2+
- 克劳德代码CLI
