dsh-wb-memory:把 WorkBuddy 長期記憶直接渲染進 DSH 的 system prompt

前言

DSH 的插件生態裏,記憶類插件通常有兩種做法:要麼讓 agent 自己建一套記憶庫,要麼把歷史會話抽取成條目後做向量檢索。這兩種做法都引入了第二份數據,和源文件之間會慢慢對不上。

dsh-wb-memory 走的是另一條路。它不建庫、不落副本,直接把 WorkBuddy 已有的 Markdown(SOUL / USER / MEMORY / topics)渲染進 system prompt 的一個獨立 section,寫回也作用在同一批源文件上。

插件由 Nero0427 維護,分類爲「記憶」,許可證 MIT,當前版本 0.1.2,倉庫在 https://github.com/Nero0427/dsh-wb-memory 。下面按「裝起來 → 配好 → 用起來」的順序介紹。

定位

一句話:把工作臺里人寫的長期記憶,原樣接進 DSH 的 system prompt。

它的前提是:記憶已經是一份人維護的 Markdown,不是需要從會話裏挖出來的東西。插件做的事情是「讀這份 Markdown → 渲染成一段 → 插進 system prompt → 讓 agent 按協議寫回同一份文件」。

工作流可以概括成:

~/.workbuddy/user-*-personal/
  SOUL.md      ┐
  USER.md      ├─ 渲染 ──▶  system prompt 的一個獨立 section(dsh-wb-memory)
  MEMORY.md    │              不寫任何副本
  IDENTITY.md  │
  topics/*.md  ┘  只放索引,正文按需 read

三個方向都要覆蓋:

  • 讀:裝配 system prompt 時把身份、畫像、長期記憶渲染成一段,插在 dsh-purge 注入之後、它的尾部錨點之前。
  • 寫:同一段裏帶「記憶協議」,讓 agent 把踩坑、約定、決定寫回源文件,用的是宿主內置 edit 工具,不另造工具。
  • 同步:按源文件 mtime 緩存。源一改,下一輪請求帶新內容;DSH 寫回後,另一個客戶端下次會話自然讀到同一份。

安裝與啓用

前提是宿主是 DSH,且記憶目錄已存在(默認自動探測 ~/.workbuddy/user-*-personal)。

推薦從 GitHub 倉庫安裝,這樣插件市場能識別來源,也能檢測並應用更新:

cd <DSH_HOME>/profiles/desktop
pnpm add github:Nero0427/dsh-wb-memory

也可以從 Releases 下載 dsh-wb-memory-<version>.zip,解壓後把整個插件目錄放到 node_modules/dsh-wb-memory。

開發時才用 link: 掛本地副本,指向倉庫根,不是 src/:

{
  "dependencies": { "dsh-wb-memory": "link:/path/to/dsh-wb-memory" },
  "dsh": { "profile": { "bundles": ["dsh-wb-memory"] } }
}

注意 link: 依賴屬於本地開發副本,插件市場不會爲它提供更新。

接下來在 profile 的 cordis.patch.yml 裏停用 AGENTS.md 加載器,並插入本插件:

- id: agent-instructions
  name: '@deepseek-ai/dsh-agent-instructions'
  disabled: true          # 停用 AGENTS.md 加載器

- insert:
    - id: dsh-wb-memory
      name: dsh-wb-memory
      inject: [systemPrompt, webServer]
      config:
        enabled: true
        maxBytes: 60000
        topicsMode: index
        projectMemory: true

重啓 DSH,設置頁左側會出現「記憶」分區。

停用 AGENTS.md 加載器的原因有兩條:它會在 $DSH_HOME 下落一份 AGENTS.md 副本,和源文件是兩份數據;另外 dsh-purge 的 dropWorkspaceBaseline 在 strict / fallback 策略下會丟掉它的注入。直接注入 system prompt 沒有這兩個問題。

配置

配置項如下,全部有默認值:

鍵 默認 作用
enabled true 關掉後 system prompt 不再帶記憶段
maxBytes 60000 字節預算(下限 4000),超了從 topics 起截斷,SOUL 與 USER 永遠保留
topicsMode index index 只放一句話摘要 + 路徑;full 全文;off 不注入
projectMemory true 注入記憶協議,並允許 agent 讀寫項目級 .workbuddy/memory/
includeIdentity false 是否帶上 IDENTITY.md(與 SOUL / USER 內容重疊)
workbuddyRoot 空 源目錄,留空自動探測 ~/.workbuddy/user-*-personal

配置有三層優先級:設置頁寫入的 <DSH_HOME>/dsh-wb-memory/config.json > cordis.patch.yml 的 config > 內置默認值。設置頁改完下一輪請求即生效,不必開新會話。

要壓體積時,優先級是:MEMORY.md 瘦身(把硬件、系統這類靜態段落挪進 topics)> 關主題索引 > 關協議。

典型用法

裝好後可以手動確認狀態和排查注入問題:

/memory          狀態(字節數、注入輪次、最近一次)
/memory render   清緩存重算
/memory preview  看正文
/memory path     源目錄與段名

比如改了 MEMORY.md 但本輪沒變,先用 /memory render 強制重算;爲什麼沒生效,用 /memory path 確認源目錄探測到了,再用 /memory preview 看正文是否爲空。

寫回過程不需要額外觸發。記憶段裏帶了協議,agent 在會話中判斷時機,用宿主 edit 工具直接改源文件。協議裏還要求:發現陳舊條目直接改掉或刪掉,不要在後面追加「已更新」;不要記工具原始輸出、大段代碼、一次性調試結論。

token 開銷方面,作者實測(2026-11-04):SOUL.md 約 650 token,USER.md 約 500,MEMORY.md 約 1.3 K,topics 索引約 240,記憶協議約 450,合計約 3.3 K token,佔 1M 窗口 0.3%。因爲 DSH 每輪重發完整上下文且前綴緩存命中後按約 1/10 計價,這段固定不變的內容邊際成本幾乎爲零。

與 dsh-purge 的關係

兩者掛在同一個 system-prompt/assemble waterfall 上,但職責不同:

purge dsh-wb-memory
掛載點 同一個 waterfall,先註冊 同一個 waterfall,後註冊
改裝配的哪部分 替換正文、加尾部錨點 只 append 一個獨立 section
順序保證 宿主補丁把 dsh-purge* 段強制排最前 記憶段固定落在錨點之前

實測順序是 dsh-purge → dsh-wb-memory → dsh-purge:anchor。不重複注入,不覆蓋 purge 正文。可以只裝其中一個;一起用時順序由這個規則保證,不需要額外配置。

適用場景與注意

適合的場景:已經在維護一份人寫的 Markdown 記憶(SOUL / USER / MEMORY / topics),希望多個 agent 客戶端複用同一份數據,同時接受「模型按協議自行寫回」的寫入方式。

需要留意的幾點:

  • 插件以當前 DSH 進程權限運行,能讀寫源文件目錄。安裝前建議先讀一遍源碼與許可證(MIT),確認注入內容與寫回行爲符合預期。
  • 文件結構是硬約定。SOUL.md / USER.md / MEMORY.md / topics/*.md 這些文件名由 render.js 約定,改名要同步改源碼。
  • 一個進程讀一個源目錄,不做多用戶。
  • 項目級記憶不自動注入,協議讓 agent 按 <cwd>/.workbuddy/memory/ 自己讀,省 token。
  • 如果 purge 的 /rules 用了 complete(獨佔整個 prompt),記憶段會被宿主丟棄,/memory 的注入輪次能看出來。

小結

dsh-wb-memory 的價值在於把「記憶」這件事壓縮到一句話:同一份 Markdown,兩個客戶端都讀它,agent 寫回也落在同一份上。不建庫、不抽取、不檢索,換來的是沒有副本漂移。

相關資料:

  • 插件目錄頁:https://www.skillhub.cn/plugins/Nero0427/dsh-wb-memory
  • GitHub 倉庫:https://github.com/Nero0427/dsh-wb-memory
  • 許可證:MIT
羽毛球分组比赛记分
小程序二维码

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

小夜