前言¶
用 DSH 或同類 AI 編碼助手開新會話時,背景、偏好和已經拍板的結論往往要重講一遍;偶爾把要點寫進一兩個 Markdown,文件會越堆越長,每輪都要付上下文成本,過期結論又很難下線。
OpenSpec 一類 spec-driven 工具解決的是「代碼偏離計劃」,但它們是 pull:模型得被提醒去讀 spec,新會話不會自動帶上記憶。dsh-memory-delta 走 push 路線:會話開始時把該知道的蒸餾內容塞給模型,且儘量只推送相對上一輪的 增量;細節仍可按需檢索。下面介紹它是什麼、怎麼裝、怎麼用。
這是什麼¶
dsh-memory-delta 是 DeepSeek Harness(DSH) 插件,同時提供零依賴獨立 CLI mem。維護者在 GitHub 上的倉庫爲 lpf20200901/dsh-memory-delta(Gitee 爲只讀鏡像)。設計思路借用了 OpenSpec 的 spec / change / archive 紀律,方向相反:記憶 推入 會話,而不是等 agent 去 拉。
插件在 SkillHub 等社區目錄中歸類爲「記憶」;DSH 生態是「一切皆插件」,社區站點與 DeepSeek / 幻方無官方從屬關係。
存儲分層與寫入規則¶
記憶庫(默認 <session cwd>/memory,可用配置或 $DSH_MEMORY_ROOT 覆蓋)按 流程階段 與 內容類型 組織:
| 目錄 | 階段 | 內容 | 誰可寫 | 是否注入 |
|---|---|---|---|---|
inbox/ |
候選 | 模型認爲值得保留的結論 | 僅模型(memory_write) |
否 |
facts/ |
在用 | 踩坑與規避:環境限制、工具行爲、真實失敗與修復 | 僅人類 promote | 是 |
decisions/ |
在用 | 約定與選型及理由 | 僅人類 promote | 是 |
archive/ |
已歸檔 | 被取代或不再適用的條目 | 歸檔操作 | 否(可搜索、可恢復) |
主流程:模型只寫 inbox → 人類 promote 到 facts 或 decisions → 退役進 archive。拿不準放哪邊時:若「明天世界變了就不成立」傾向 facts/;若只有你能推翻則傾向 decisions/。
mem init 會在記憶目錄生成 README.md、memory.config.json、index.md、journal.md 等,並說明各層含義。條目爲帶 frontmatter 的 Markdown,狀態含 active / superseded / expired;同一 scope+key 只允許一條 active,更新需顯式 --supersedes,避免錯誤結論進入永久注入層。
核心能力¶
差分注入與字節預算¶
注入層有硬字節預算(可由 store 的 memory.config.json#injectBudget 決定,常見默認約 3072)。每條 standing 條目帶 12 字符內容哈希;插件在 side-car 文件 <harness home>/storages/dsh-memory-delta/inject-state/<session-id>.json 記住上一輪狀態,之後只推送新增、更新、刪除;無變化時 不注入任何內容。README 中對比過:無 diff 的 instructions 類插件在多次小編輯後會重複注入整文件,浪費 token。
首輪注入全部 active 條目作爲 baseline;後續輪次只推 delta。diff 狀態放在 side-car,不塞進會話消息的 source,以符合 DSH session-format 白名單。
DSH 側工具與界面¶
| 能力 | 說明 |
|---|---|
memory_search |
對 facts / decisions / inbox / archive / journal 等做相關性排序檢索;中文按 bigram 匹配;結果通過 tool 的 render 文本返回給模型 |
memory_write |
僅寫入 inbox,不能改 standing 層 |
| 蒸餾提醒 | 會話進行若干步且記憶已是最新時,提醒用 memory_write 記錄結論;每會話一次,且不攜帶會污染 diff 的狀態 |
| 到期複覈 | verify_when 到期時提醒人類複覈,模型只能把新結論寫 inbox |
| bundled skill | 默認 skill: true 時註冊 /dsh-memory-delta;可 skill: false 關閉 |
| 側邊欄「記憶」 | 需配合如 dsh-better-sidebar;提供分組、搜索、promote / 歸檔等(經 POST /dsh-memory-delta/action,可用 allowWrite: false 關閉寫操作) |
插件直接 import 與 CLI 共用的 store 模塊,不在 DSH 內 spawn mem(沙箱對命名管道有限制)。
CLI mem¶
與插件共用同一套 store 與排序邏輯。典型命令如下(節選):
mem init --root ./memory --scope "workspace:/path/to/project"
mem new --type fact --id win-update-cache --key disk-cleanup \
--conclusion "Cleaning the update cache reclaimed nothing measurable" \
--reason "Directory emptied but free space did not move" --tags windows,disk
mem promote win-update-cache
mem promote win-update-cache-v2 --supersedes win-update-cache
mem recall <keywords> [--where all|facts|decisions|inbox|archive|journal|sessions|index]
mem validate [--fix]
mem inject [--json] [--budget 3072]
mem due [--within N] [--json]
全局安裝 CLI:
npm i -g dsh-memory-delta
需要 Node.js >= 20。package 當前版本爲 1.3.4,許可證 MIT。
安裝與啓用¶
README 強調兩種常見誤配會 靜默失敗:把包寫進 package.json 的 dsh.profile.bundles(啓動時會被市場 registry 覆蓋);在 cordis.patch.yml 裏寫裸條目而不包在 - insert: 下。
從 npm / DSH 命令安裝¶
插件已發佈到 npm,DSH 可從 registry 安裝:
cd ~/.dsh && dsh plugin --profile web add dsh-memory-delta
社區插件市場條目爲 lpf20200901/dsh-memory-delta,從市場安裝會使用包內自帶的 bundle patch;該 patch 有意不設置 maxBytes,注入上限由 store 的 memory.config.json 決定。
本地開發 / 手動安裝¶
DSH_HOME 在桌面版常見爲 %APPDATA%\dsh-desktop\harness(Linux 等環境以實際 harness home 爲準,解析鏈:config.stateDir → ctx.dshHomePath → $DSH_HOME → ~/.dsh)。
- 將包複製到 profile 的
node_modules,例如:
<DSH_HOME>\profiles\web\node_modules\dsh-memory-delta\
package.json
bin\mem.mjs
src\plugin.mjs src\hook.mjs src\planner.mjs
- 在
<DSH_HOME>\profiles\web\cordis.patch.yml追加:
- insert:
- id: dsh-memory-delta
name: dsh-memory-delta
config:
root: ''
enabled: true
dueWithin: 0
panel: true
allowWrite: true
skill: true
- 保存後 patch 層會被 watch,熱加載,無需重啓。
卸載:刪除上述 - insert: 塊並刪除 node_modules\dsh-memory-delta。
已知風險(2026-10-08 觀測):通過市場安裝或卸載 其他 插件時,profile 的 cordis.patch.yml 可能被重寫,手寫 - insert:(含註釋)會丟失,表現爲文件仍在 node_modules 但不再注入。安裝後應確認文件中仍有 - id: dsh-memory-delta。
典型用法¶
- 在項目下執行
mem init,或依賴插件默認root: ''(即會話工作目錄下的memory)。 - 會話中模型用
memory_write把候選結論寫入 inbox;人類確認後mem promote或側邊欄提升進 facts / decisions。 - 需要更新同一語義 key 時,用
--supersedes顯式取代舊條目,舊內容進 archive。 - 調試注入 payload 時用
mem inject [--json];檢查 store 健康用mem validate [--fix]。
適用場景與注意¶
適合:長期維護同一倉庫或工作區、希望新會話自動帶上精簡且不過期的約定與踩坑記錄,又願意用 promote / supersede 做人工把關的開發者。
注意:
- 插件以 當前 DSH 進程權限 讀寫記憶目錄與 side-car;安裝前應閱讀 源碼與許可證,確認路徑與寫權限符合預期。
- 錯誤結論若被 promote 到 standing 層,會在每輪注入中持續存在;務必堅持「模型只寫 inbox」。
- 依賴
@deepseek-ai/cordis等 peer 包,需與所用 DSH 內核版本兼容;README 記錄了 session-format v4 等對注入消息source.kind的要求。 - 側邊欄記憶 Tab、skill 註冊爲可選能力;無 Web 側欄時仍可差分注入與 CLI 並用。
鏈接¶
- 社區目錄頁:https://www.skillhub.cn/plugins/lpf20200901/dsh-memory-delta
- 源碼與完整文檔:https://github.com/lpf20200901/dsh-memory-delta
- 常見疑問(中文):倉庫內
docs/faq.zh.md
經過上面的步驟,你可以在 DSH 裏把跨會話記憶做成可審查、可 diff、可歸檔的 Markdown store,並在會話開始時只支付增量上下文成本。