dsh-instruction-memory
在 DSH 设置界面中维护长期指令记忆:保存后自动注入此后每一轮对话的系统提示词。
设置页截图
想先看看界面?在 GitHub 仓库中打开 docs/demo.html,无需安装 DSH,浏览器直接体验真实设置页(内置演示数据)。
安装
dsh plugin --profile web add dsh-instruction-memory
装完重启 DSH,设置页会出现「指令记忆」入口。卸载:
dsh plugin --profile web remove dsh-instruction-memory
只由用户本人维护
这份记忆的内容只属于用户。 本插件刻意不注册任何面向模型的工具——模型没有任何
途径自行添加、修改或删除记忆条目。写入入口只有设置页(以及用户本人直接编辑存储文件),
因此不会出现 AI 悄悄给用户"记下"指令的情况。
条目内容由用户输入并被原样注入,本插件不对其做语义判断或自动生成。
组成
| 文件 | 作用 |
|---|
lib/index.js | Host 半:读取/保存记忆,注册 systemPrompt 段落,暴露同源 JSON 路由 |
lib/client.js | Client 半:在 settings.section 注册「指令记忆」设置页(手写模块,无需构建) |
cordis.patch.yml | bundle patch:把 Host 行插入宿主组合 |
contract-test.mjs | 契约测试:驱动真实路由,验证两半之间的响应格式 |
verify.mjs | 装载验证:按 DSH 的方式加载两半 |
smoke-test.mjs | 注入渲染逻辑的单元测试 |
docs/demo.html | 离线演示页:桩掉 DSH 外壳、加载真实 Client 半渲染设置页(不随 npm 包发布) |
生效方式
- 始终 条目:无条件遵守。
- 按需 条目:由模型按相关性自行判断是否适用,不相关时忽略;可填「适用场景」辅助判断。
- 优先级 高 > 普通 > 低,决定注入顺序。
- 注入字数上限:超出时按优先级保留,被略过的条目数会在注入文本末尾注明。
条目全部停用或总开关关闭时,该提示词段落整个注销,系统提示词与未安装本插件时逐字节一致。
存储
记忆保存在 DSH 数据根目录下(设置页会显示完整绝对路径):
<DSH_HOME>/instruction-memory/memory.json # DSH_HOME 默认为 ~/.dsh
路径优先级与官方 @deepseek-ai/dsh-home-paths 一致:显式 $DSH_HOME → ~/.dsh。
空白的 $DSH_HOME 视为未设置,绝不会退回当前工作目录——否则用户换个目录启动
DSH 就会得到第二份空记忆,看起来像"记忆消失"。
1.0.0 之前的构建曾把数据写在宿主进程 cwd 下(.dsh-instruction-memory.json)。
首次启动新版本时会自动迁移到上述位置,并把原文件改名为 *.migrated 保留。
该文件可手工编辑,改完点设置页的「重新载入」即可读回。每次保存先写临时文件再原子替换,
进程崩溃不会留下损坏的半截 memory.json;保存时上一版会保留为 memory.json.bak,
若 memory.json 解析失败会自动临时回退到该备份并明确提示。若手工编辑后的文件有条目为空
或超过 200 条上限,设置页会明确提示哪些条目未能载入(它们将在下次保存时从文件中移除),
不会静默丢弃。
设置页支持导出 / 导入:导出为自带说明的 JSON 文件;导入采用合并语义——按 id 与
「标题+内容」去重,只新增、绝不覆盖或清空现有条目。
兼容性
dsh.compatibility.dsh 声明为:
>=0.1.3-alpha.2 <0.1.4 || >=0.1.4-0 <0.1.5-0 || >=0.1.5-alpha.1
实测范围:以下 5 个宿主版本已在 Windows / Node 22 上逐个真实启动验证(每个版本都确认了
插件装载、系统提示注入真的进入组装后的提示、插件 HTTP 路由可应答、客户端设置页模块被下发):
0.1.3-alpha.2 · 0.1.5-alpha.1 · 0.1.5-alpha.2 · 0.1.5-rc.1 · 0.1.5-rc.2
为什么写成分段形式:node-semver 规定"候选版本带预发布标签时,区间里必须存在同一个
major.minor.patch 且自身带预发布标签的比较符"。因此看起来很宽的写法——例如 >=0.1.3-alpha.2
甚至 >=0.1.3-alpha.2 <0.2.0-0——反而匹配不到 0.1.5-rc.1 / 0.1.5-rc.2 这些预发布版本
(已用 node-semver 7.8.5 与插件市场自带的版本判定实现逐一实测确认)。分段写法在两者下都能覆盖上面 5 个版本。
为什么没有上限:不设上限,未来 DSH 发布新的预发布版本时不会被判为"超出上限"而拒绝升级。
代价是 0.2.0 / 1.0.0 这类未来版本在 node-semver 下也会被判为满足;若你希望严格封顶,
在末尾追加 <0.2.0-0 即可(注意那会让下一版 0.1.6+ 被市场判为超限)。
未验证范围:macOS / Linux、headless 与 tui profile、以及上表之外的其他 DSH 版本均未实测。
同一串范围写在两处:dsh.compatibility.dsh(插件自己的字段)与 dsh.engines.dsh(插件市场实际读取的位置)。
市场只读 engines.dsh / dsh.engines.dsh 以及 @deepseek-ai/dsh* 的 peerDependencies,并不读 dsh.compatibility.dsh。
从 1.0.4 起宿主要求会真实出现在市场卡片上,并生效于安装前的校验:范围之外的宿主上,市场会把本插件从列表中隐藏并拒绝安装/更新
(市场只隐藏"确认不兼容"的条目;"未声明"或"无法确认"的条目照常显示)。范围之外的宿主仍可自行用 dsh plugin add 安装,只是不再被市场担保。
发布(维护者)
# 1. 自检(prepublishOnly 也会自动跑,占位符未替换会中止发布)
npm test
node check-metadata.mjs
# 2. 发布(需先 npm login)
npm publish
发布前自检会拒绝在 TODO 占位符残留时发布,避免把空仓库地址或无名版权声明发出去。
数据格式
{
"version": 1,
"enabled": true,
"budgetChars": 4000,
"entries": [
{
"id": "im-xxxx",
"title": "回答语言",
"content": "所有回答使用简体中文。",
"mode": "always",
"when": "",
"priority": 1,
"enabled": true,
"updatedAt": 1700000000000
}
]
}
mode 为 always | auto;priority 为 2 高 / 1 普通 / 0 低。