内容
<div align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="assets/logo-dark.png">
<img src="assets/logo.png" alt="记忆术" width="300">
</picture>
# 记忆术
**您的代理会忘记。`nem` 不会。**
记忆术以类似于 git 版本控制代码的方式管理代理上下文。命令是 `nem`。
[](https://goreportcard.com/report/github.com/Dieg0Code/nem)
[](https://github.com/Dieg0Code/nem/actions)
[](https://codecov.io/gh/Dieg0Code/nem)
[](https://pkg.go.dev/github.com/Dieg0Code/nem)
[](LICENSE)
[](https://github.com/Dieg0Code/nem/releases)
</div>
---
> **记忆术** · /nɪˈmɒnɪks/ · *名词* — 一种 **编码** 信息的系统,使其易于 **回忆**,通过将新的复杂数据与稳定的、熟悉的模式联系起来,这些模式是思维已经牢记的。源自希腊语 *mnēmōn*(“谨慎”),在 **Mnemosyne** 之后,记忆女神。
这就是整个想法。原始对话是复杂、易逝的数据;大型语言模型(LLM)在压缩其上下文窗口时会将其丢弃——推理、解决的边缘情况、决策,都消失了。**记忆术** 将该上下文编码为稳定的、可回忆的结构:**不可变提交**,**可导航索引树** 和 **持久事实** —— 以便任何代理都可以使用您使用的相同命令将其带回。
由于 Claude Code、Codex 和 **Google Antigravity** 都读写相同的存储库,因此它们停止作为具有独立记忆的独立助手,而是表现为一个具有统一记忆的思维。单个二进制文件,嵌入式 SQLite,纯 Go 编写(无 cgo),离线支持。
## 没人提到的部分
**您知道您的代理的整个历史已经存储在您的磁盘上吗?**
Claude Code、Codex 和 Antigravity 将 **每次会话写入您的本地磁盘** —— 明文文件,在您的机器上,实时写入。那是原始材料:推理、死胡同、您共同做出的决策。但它是惰性的。代理无法在下次调用它,您也无法搜索它;它只是堆积并过期。
**nem 读取这些本地日志** (`nem ingest`) 并将它们转换为版本控制的、可导航的记忆 —— 可供您和代理回忆。无需收集新数据,不会离开您的机器。它本来就属于您;nem 只需使其可用。
## 安装
```powershell
# Windows (Scoop)
scoop bucket add Dieg0Code https://github.com/Dieg0Code/scoop-bucket
scoop install nem
```
```bash
# macOS / Linux (Homebrew)
brew install Dieg0Code/homebrew-tap/nem
# 或使用 Go
go install github.com/Dieg0Code/nem/cmd/nem@latest
```
## 代理如何使用它
`nem init` 在 Claude Code、Codex 和 Antigravity 中安装技能,并拉取现有的会话。代理在会话开始时 **回忆**,并在会话结束时 **持久化** 其解决的内容 —— 无需人工干预:
```bash
nem outline # 地图:事实 + 项目 → 聊天 → 提交 → 总结
nem search "<terms>" --format llm # 混合搜索(BM25 + 语义)
nem read <hash> --format llm # 冻结的快照,干净利落,供代理使用
nem commit -m "关于 X 的决策" # 持久化已解决的决策(不可变)
nem fact add "<您是谁 / 您如何工作>" # 持久化事实,始终被回忆
```
代理导航树,读取重要的内容,并写入自己的提交和事实。您只需控制一件事:`nem sync`(共享)属于您。
## 命令
| | |
|---|---|
| `nem init` / `ingest` | 设置 `~/.nem`;拉取 Codex、Claude Code 和 Antigravity 会话 |
| `nem status` / `log` | 活动会话;提交历史 |
| `nem add` / `commit` | 阶段消息;冻结为不可变的快照 |
| `nem fact` | 持久化事实 + 有截止日期的提醒( `--due` )—— 在每个会话的顶部显示 |
| `nem outline` / `timeline` | 导航索引树;查看决策如何演变 |
| `nem search` / `read` | 混合检索(关键词/语义);深入内容 |
| `nem annotate` | 重写节点的摘要(固定;索引时保留) |
| `nem index` | (重新)构建树 — 增量,仅计算新的内容 |
| `nem sync` / `clone` | 推送/拉取到 git 远程,**在推送前删除密钥** |
| `nem doctor` | 检查/安装可选的专业依赖 |
## 工作原理
- **两种记忆** —— *情景记忆*(提交:对话中发生了什么,通过相关性检索)和 *语义记忆*(事实:关于用户的持久真相,在每个 `outline` 的顶部加载,搜索永远不会猜测)。
- **不可变提交** —— 提交复制其范围的 *文本*(快照),而不是指针。您保存的内容永远不会改变。
- **可导航索引** —— PageIndex 风格的树(项目 → 聊天 → 提交)带有摘要,代理在深入之前会推理这些摘要。代理是重新排序器。
- **混合搜索** —— 消息 + 节点上的 BM25(SQLite FTS5),与 **RRF** 融合,具有近期提升和可选的语义嵌入。进程内且自包含:**词干提取**(形态变体匹配)和 **相关性反馈**(共现扩展)通过无需外部模型的召回率提升。
- **可变摘要层** —— `nem annotate` 允许代理管理提交的描述和查找方式,而不更改不可变的内容。
## 可选:语义层
更丰富的 LLM 摘要和嵌入是可选的,运行在本地(Ollama)或通过 OpenAI 兼容的 API —— nem 的核心功能保持嵌入免费且纯 Go 编写。
```bash
nem config set embed.backend ollama # 打开语义层
nem doctor --fix # 安装 Ollama + 拉取模型
nem index # 构建摘要 + 嵌入
```
MCP:`nem mcp` 为支持 MCP 的代理暴露与键入工具相同的功能
(`nem_outline`、`nem_search`、`nem_read`、`nem_annotate`,...)。
## 安全
密钥抹除仅在 `nem sync` 时运行 —— 这是内容离开您机器的唯一边界。API 密钥、令牌、连接字符串、`Authorization` 头和敏感环境变量在推送之前被屏蔽,并被报告:
```
$ nem sync
导出 12 个提交
抹除 7 个密钥:5 个 huggingface-token,2 个 env-secret
与远程同步
```
## 开发
```bash
go test ./...
go vet ./...
```
`-race` 需要 cgo;在 Windows 上,请从 PowerShell(Git Bash DLL-shadows mingw)运行。
## 许可证
[MIT](LICENSE)