前言¶
在 DeepSeek Harness(DSH)里跑智能体时,会话上下文会随轮次增长,但跨会话、跨任务的信息往往没有固定落点。全局记忆省事,却容易把 A 项目的约定和 B 项目的部署细节混在一起。若希望「记的东西跟着当前工作目录走、边界清楚、必要时还能进版本库」,需要一套由智能体读写、路径受控的本地存储。下面介绍社区插件 dsh-bundle-memory(记忆管理),维护者为 OraSkyC,分类为「记忆」。
这是什么¶
dsh-bundle-memory 是一个 DSH 插件:给智能体一个跟着工作区走的记忆库。开启后,记忆默认落在当前工作目录的 ./memory/;根目录有自动维护的 MEMORY.md 索引,需要分类时按需建子目录,不需要分类时可直接写在根目录。
插件向 Host 注册四个工具:memory_save、memory_recall、memory_search、memory_forget。索引与条目均为 Markdown(.md),无 npm 运行时依赖,仅使用 Node 内建模块。
- 目录页:https://www.skillhub.cn/plugins/OraSkyC/dsh-bundle-memory
- 源码:https://github.com/OraSkyC/dsh-bundle-memory
- 许可证:MIT(package.json 版本 1.0.1)
目录长什么样¶
记忆根目录相对会话工作目录解析(见下文「工作区边界」)。典型布局如下:
<你的工作目录>/
└── memory/ ← 记忆根目录(可配置)
├── MEMORY.md ← 索引,插件自动生成
├── 用户偏好用-pnpm.md ← 未分类,直接写在根目录
├── 部署注意事项.md
└── 项目约定/ ← 按需建子目录
└── 提交信息用中文.md
memory_recall 不带参数时返回的就是索引内容;其中会列出工作区路径、记忆根目录、条数,并按分类分组链接到各 .md 文件。
四个工具¶
| 工具 | 作用 |
|---|---|
memory_save |
存一条记忆。必填 title、content;category 可选(如 项目约定 或 people/work,最多 3 级),省略则写在根目录。同名默认报错,不静默覆盖;覆盖需显式传 overwrite: true。 |
memory_recall |
无参数 → 返回索引;带 name → 读某一条。name 可为相对路径(如 项目约定/提交信息用中文.md)或唯一后缀(如 提交信息用中文);匹配多条会报错并列出候选,不猜测。 |
memory_search |
对全部记忆做全文检索(标题、标签、正文,大小写不敏感),返回匹配路径与摘录。 |
memory_forget |
删除单条记忆。只接受单个 .md 文件,不删目录,也不操作 ./memory/ 之外的路径。 |
本版本不会把索引自动注入会话上下文;智能体需主动调用 memory_recall 或 memory_search。可在项目 AGENTS.md 中约定「开工前先 memory_recall 看索引」。
为什么是「跟着工作区走」¶
记忆根目录相对于会话工作目录(exec.agent.session.header.cwd)计算,因此:
- 在 A 项目写入的内容,在 B 项目会话中不可见,避免项目间串味;
- 记忆与代码同仓时,可按需提交到版本库;换机器 clone 后仍在;
- 若希望集中存放,可将配置项
root设为相对路径(如notes/mem),仍相对工作目录。
这与「全局记忆」是两种取向:本插件选择工作区边界清晰的后者。
安装与启用¶
DSH 要求:web 或任何带 Host tools 服务的 profile;Node >= 22.19.0。插件依赖 Host 的 tools 与 webServer(Cordis patch 中 inject = ['tools', 'webServer'])。
设置 → 插件 → 添加插件,填入:
https://github.com/OraSkyC/dsh-bundle-memory
或命令行:
dsh plugin --profile desktop add https://github.com/OraSkyC/dsh-bundle-memory
安装完成后重启 DSH。
设置¶
路径:设置 → 插件 → 记忆管理。界面改动立即生效,无需重启。
部署默认值写在 cordis.patch.yml(修改后需重启 DSH)。用户覆盖落在 %USERPROFILE%\.dsh\state\dsh-bundle-memory\settings.json 的稀疏层;「恢复默认」即删除对应键并回落部署默认值。
| 键 | 默认 | 说明 |
|---|---|---|
enabled |
true |
为 false 时不注册记忆工具,设置面板仍可打开。 |
root |
memory |
记忆根目录,相对会话工作目录,最多 3 级。 |
indexFile |
MEMORY.md |
索引文件名,位于记忆根目录下。 |
autoIndex |
true |
每次保存或删除后自动重建索引。 |
maxEntryBytes |
262144 |
单条记忆正文上限(1024–4194304 字节)。 |
searchMaxResults |
20 |
memory_search 默认返回条数(1–100)。 |
典型用法¶
- 安装并重启 DSH 后,在目标项目目录开启会话;智能体调用
memory_recall(无参数)查看MEMORY.md投影出的索引。 - 写入约定或偏好:调用
memory_save,例如带category: 项目约定存「提交信息用中文」,或省略category在根目录写「用户偏好用 pnpm」。 - 记得有事但不知路径:调用
memory_search按关键词检索。 - 读取单条:调用
memory_recall,name传相对路径或唯一后缀。 - 作废一条:调用
memory_forget,仅针对单个.md文件。
若误改 memory/MEMORY.md,可删除该文件,下次保存或删除记忆时会重建;或无参调用 memory_recall 触发重建。手工往索引里追加的内容会在下次重建时消失——应新增 .md 或用 memory_save。
是否将 ./memory/ 纳入 Git 由项目的 .gitignore 决定;插件不强制。
设计要点(使用时的预期)¶
索引是投影:MEMORY.md 由磁盘上的 .md 扫描 front matter 后重新生成,不维护独立「账本」,因此索引与文件内容不会长期不一致;代价是不要手工编辑索引期望永久保留。
条目格式:每条为带 YAML front matter 的 Markdown(仅 key: value 行,无完整 YAML 解析器)。无 front matter 时标题回落到文件名。不支持二进制或附件,只认 .md。
路径防护:对智能体传入的 name / category 做片段校验、层级限制、解析后再次确认仍在记忆根目录内;删除仅允许 .md 文件。README 说明上述逻辑有宿主侧测试覆盖。
工作目录来源:工具实现使用 exec.agent.session.header.cwd ?? process.cwd();会话 header 中的 cwd 才是工作区,而非 DSH 安装目录的 process.cwd()。
适用场景与注意¶
适合需要在单个仓库或工作目录内持久化约定、偏好、部署注意事项,并由智能体通过工具读写、全文搜索的场景。不适合当作通用附件库或跨工作区统一知识库(除非自行用配置与流程约束)。
DSH 生态理念是「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。安装插件前建议阅读源码与 MIT 许可证;插件在 DSH 进程权限下运行,写入路径虽有多层校验,仍应对仓库内敏感信息自行把关。