dsh-bundle-memory:工作区本地记忆库

前言

在 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 内建模块。

目录长什么样

记忆根目录相对会话工作目录解析(见下文「工作区边界」)。典型布局如下:

<你的工作目录>/
└── 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)。

典型用法

  1. 安装并重启 DSH 后,在目标项目目录开启会话;智能体调用 memory_recall(无参数)查看 MEMORY.md 投影出的索引。
  2. 写入约定或偏好:调用 memory_save,例如带 category: 项目约定 存「提交信息用中文」,或省略 category 在根目录写「用户偏好用 pnpm」。
  3. 记得有事但不知路径:调用 memory_search 按关键词检索。
  4. 读取单条:调用 memory_recall,name 传相对路径或唯一后缀。
  5. 作废一条:调用 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 进程权限下运行,写入路径虽有多层校验,仍应对仓库内敏感信息自行把关。

链接

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜