Repository navigation
v1.0.0 — 记忆管理(首个版本)
首个版本。
这是什么
给智能体一个跟着工作区走的记忆库。开启后,记忆默认存在当前工作目录的 ./memory/ 下,
根目录放一个自动维护的 MEMORY.md 索引;需要分类的按需建子目录,不需要分类的直接写在根目录。
<你的工作目录>/
└── memory/
├── MEMORY.md ← 索引,插件自动生成
├── 用户偏好用-pnpm.md ← 不需要分类的,直接写在根目录
└── 项目约定/ ← 需要分类的,按需建子目录
└── 提交信息用中文.md
记忆跟着工作区走,是因为根目录取自会话的工作目录(exec.agent.session.header.cwd):
在 A 项目记的东西在 B 项目看不到,不会串味;记忆跟着代码走,想提交进版本库也可以。
四个工具
| 工具 | 作用 |
|---|---|
memory_save |
存一条。给 title + content;category 可选(最多 3 级)——省略就直接写在根目录。同名默认报错而非静默覆盖。 |
memory_recall |
不带参数 → 返回索引(先看它);带 name → 读某一条。支持相对路径与唯一后缀匹配,匹配到多条会报错列出候选,不猜。 |
memory_search |
跨全部记忆全文检索(标题/标签/正文,大小写不敏感),带命中摘录。 |
memory_forget |
删一条。只接受单个 .md,永远不删目录。 |
两个值得说的设计
索引是「投影」,不是「账本」。 MEMORY.md 每次都由磁盘上的记忆文件重新生成,
所以不存在「索引和实际内容不一致」这种状态 —— 那是最容易腐坏的东西。
代价是手工写进索引的内容会在下次重建时被覆盖,文件头写明了这点。
每条记忆是 front matter(title/tags/created/updated)+ Markdown 正文,
刻意不引入 YAML 解析器:坏行忽略而不是抛错,没有 front matter 的文件也照样收录。
写入路径四层防护。 智能体给的 name/category 最终会变成文件路径,所以:
- 片段校验 —— 拒绝
..、.、绝对路径、路径分隔符、Windows 非法字符、控制字符、
系统保留名(CON/NUL/COM1…)、以点或空格结尾、超过 64 字符; - 层级限制 ——
category与root最多 3 级; - 拼完再验一次 —— 用
relative()确认结果仍在记忆根目录内; - 删除只接受
.md文件。
四层都有测试覆盖,包括嵌套 .. 的穿越尝试。
安装
设置 → 插件 → 添加插件,填入:
https://github.com/OraSkyC/dsh-bundle-memory
或命令行:
dsh plugin --profile desktop add https://github.com/OraSkyC/dsh-bundle-memory装完重启 DSH。
设置
插件页里有设置卡,改动立即生效、无需重启:
enabled、root、indexFile、autoIndex、maxEntryBytes、searchMaxResults。
这一版没有做的
记忆索引不会自动注入到智能体的上下文 —— 它需要主动调 memory_recall 或
memory_search。建议在项目的 AGENTS.md 里写一句「开工前先 memory_recall 看索引」。
自动注入是可行的后续方向,但需要构造会话消息并插进消息流(agent/pre-step 钩子),
有破坏会话格式的风险,单独做更稳妥。
要求
Node >= 22.19.0 · 无 npm 依赖 · 无构建步骤。
用法与设计细节见 README.md。