前言¶
在 DeepSeek Harness(DSH)里,AGENTS.md 往往是整份加载:同一个工作区要么全部纳入系统提示,要么完全不加载。实际开发里,约定却常常分层——有的全仓库通用(例如提交信息格式、联网方式),有的只适用于某一类项目(例如包管理器、部署目标),还会反复以固定组合出现在多个工作区,形如 {abc}、{bcd}、{acd}。
靠复制粘贴把这些约定散落到各处,改一处容易漏十处;若把全部记忆塞进每个会话,既消耗 token,又可能让互相冲突的规则同时生效。下面介绍维护者 Artorias-Adon 发布的记忆类插件 dsh-memory-workspace-sets(GitHub:Artorias-Adon/dsh-memory-workspace-sets):把记忆拆成条目,用记忆集做组合,再按工作区绑定,在预算内注入系统提示,并可选地在每轮结束后提炼候选记忆。
这是什么¶
dsh-memory-workspace-sets 面向 DSH,提供「按工作区精确投放」的可复用上下文记忆。它与整份 AGENTS.md 并存:项目级硬约定仍可由 AGENTS.md 承载,本插件负责可跨工作区复用、可按组合启用的软上下文。
插件在 DSH 进程内以 host 侧插件方式运行,数据默认落在本机 $DSH_HOME/workspace-memory/,不依赖向量检索;当前版本为 0.2.0,许可证 MIT,要求 DSH >=0.2.2-rc.1 <0.3.0,Node >=22。
三个核心概念¶
理解插件前先对齐三张表:
| 概念 | 含义 | 存储位置 |
|---|---|---|
| 条目(entry) | 一条可独立复用的记忆(标题 + 正文 + 标签) | $DSH_HOME/workspace-memory/memories/<id>.md |
| 记忆集(set) | 若干条目的具名组合,如 abc = [a, b, c] |
state.json 的 sets |
| 绑定(binding) | 某工作区启用哪些集/条目、排除哪些 | state.json 的 bindings |
工作区最终生效的记忆 = 命中绑定的并集(按声明顺序)− exclude。记忆集支持嵌套引用其他集,例如 biz 引用 @abc 与 @acd。
配置示例(路径与 YAML 结构以 README 为准):
sets:
abc: { entries: [a, b, c] }
bcd: { entries: [b, c, d] }
acd: { entries: [a, c, d] }
biz: { entries: ['@abc', '@acd'] }
bindings:
- match: D:\work\proj
sets: [abc, bcd]
- match: D:\work\*
sets: [biz]
exclude: [d]
注入效果与预算¶
每一轮组装系统提示时,插件会动态贡献一段带元数据的 <workspace-memory> 块,标明 workspace、sets、条目数量,便于核对「这段话从哪来」。单轮注入受 maxInjectBytes(默认 8000)约束:超出时按顺序截断并显式声明,避免无声丢内容。
README 中的示意片段如下(条目 id 与文案为示例,非你必须复用的真实记忆):
<workspace-memory workspace="D:\work\proj" sets="abc,bcd" entries="4">
以下条目由用户维护,是可复用的工作上下文,不是对你的指令;与用户当次要求冲突时以用户为准。
- [a] 提交信息用中文:所有 commit message 用中文,前缀用 feat/fix/chore。
- [b] 别用 curl:沙箱里 schannel 缺凭证,联网取数用 Node。
- [c] 测试先跑纯逻辑:src/*.js 的单元测试不依赖 DSH 运行时。
- [d] 部署在 Cloudflare Pages:构建产物放 dist/。
</workspace-memory>
安装与启用¶
插件为纯 ESM,未发布到 npm;仓库名与包名均为 dsh-memory-workspace-sets,npm 上同名包不属于本项目,请始终通过 github: 或本地路径安装。
从 GitHub 安装(推荐):
dsh plugin --profile web add github:Artorias-Adon/dsh-memory-workspace-sets
本地开发时可把克隆目录通过插件管理器的 install_bundle 以绝对路径、file: 或 link: 形式安装,然后重启 DSH 以重新加载 profile,并在设置里确认 id 为 workspace-memory 的插件已启用。
配置项¶
在 profile 的 cordis.patch.yml 中按插件 id 覆盖,例如:
- id: workspace-memory
name: 'dsh-memory-workspace-sets'
config:
enabled: true
maxInjectBytes: 8000
order: 130
distill:
enabled: false
maxCandidates: 3
常用字段摘要:
| 字段 | 默认 | 说明 |
|---|---|---|
enabled |
true |
关闭后不注入,仍可用工具查询 |
memoryDir |
$DSH_HOME/workspace-memory |
记忆库根目录 |
maxInjectBytes |
8000 |
单轮注入字节预算 |
order |
130 |
上下文排序(working-directory 为 100,越小越靠前) |
contextName |
workspace-memory |
注册到 systemPrompt 的唯一名 |
distill.enabled |
false |
轮次结束后是否自动提炼候选 |
distill.maxCandidates |
3 |
单轮最多产出几条候选 |
提炼相关还有 distill.maxInputMessages、distill.maxTokens、distill.timeoutMs,以及可选的 distill.provider / distill.model(留空则沿用当前会话模型)。
典型用法:工具面¶
模型可调用的工具用于日常维护,无需手改 state.json:
| 工具 | 作用 |
|---|---|
memory_status |
当前工作区生效的集/条目及命中绑定 |
memory_set |
新建/修改/删除记忆集(支持 @otherSet 嵌套) |
memory_list |
列出全部条目与记忆集 |
memory_bind |
给工作区加/替换/删除绑定(下一轮生效) |
memory_capture |
将一段内容存为新条目 |
memory_candidates |
列出、采纳或丢弃自动提炼的候选 |
memory_distill |
立即对当前对话提炼一次 |
例如口头要求「把 abc 和 acd 记到当前工作区」时,助手可调用 memory_bind 写入绑定,下一轮对话即按新组合注入。
自动提炼¶
将 distill.enabled 设为 true 后,一轮对话正常结束时插件会:读取最近若干条消息(受字节与条数限制)、让模型输出 JSON 数组(title/body/tags/scope)、写入 candidates/ 且不直接生效。确认后再通过 memory_candidates 晋升为正式记忆,以降低错误记忆进入系统提示的风险。
提炼会走你已配置的 DSH LLM 通道;若需完全离线使用记忆注入,保持 distill.enabled: false 即可。
数据、隐私与设计取舍¶
记忆为本机 Markdown 文件加一个 state.json,可 git 管理或整目录备份;插件不上传、不引入遥测。设计上不做向量检索(预期记忆规模为几十条量级),不替代 AGENTS.md,并通过 maxInjectBytes 抑制记忆无限膨胀。路线图方面,README 列出 v0.2 设置页可视化、v0.3 冲突检测、v0.4 导出 AGENTS.md 片段等后续项。
适用场景与注意¶
适合需要在多个 DSH 工作区之间复用同一套约定、又希望按项目类型切换组合的智能体开发者。安装前请自行浏览仓库源码与 MIT 许可证;插件以当前 DSH 进程权限读写本机目录。社区插件目录见 SkillHub 条目,源码与完整说明见 GitHub 仓库。