dsh-harmony:在運行時修補、替換與裝飾 DSH 插件

前言

DeepSeek Harness(DSH)把能力拆成插件,多數協作可以靠目標插件暴露的擴展點完成。實際開發裏還會遇到另一類需求:要改的是目標插件內部的組件、加載入口或編譯後行爲,而對方並沒有提供對應 API。常見做法是 fork 一份、直接改 node_modules,或每次升級後手工重貼補丁——維護成本高,也容易在升級後悄悄失效。

下面介紹 dsh-harmony(GitHub:memorax-ai/dsh-harmony)。它是一套運行時 Patch 協調庫,讓插件在不維護 fork、不改動磁盤上已安裝包文件的前提下,對另一個 DSH 插件做內存級源碼變換。

這是什麼

dsh-harmonymemorax-ai 維護,當前 npm 版本爲 0.7.3,許可證 MIT。項目在 SkillHub 社區目錄歸類爲工作流,GitHub 約 16 stars2 forks

一句話定位:在 DeepSeek Harness 運行時,對目標插件的編譯代碼做修補(patch)、替換(replace)和裝飾(decorate),已安裝包文件保持字節級不變。

設計靈感來自 C# 生態中 Andreas Pardeike 等人創建的 Harmony 項目;DSH 版 Harmony 解決的是插件之間的「內部行爲改寫」問題,而不是替代 DSH 自帶的公開擴展點。

核心功能

運行時源碼變換

Harmony 在目標插件運行前加載 Patch,在內存中改寫其編譯代碼,再啓動 Harness。Patch 通過 TSQuery 定位 TypeScript AST 節點,用 MagicString 改寫源碼區間;多個 Patch 按順序依次執行,後一個 Patch 讀取前一個留下的源碼。

這意味着:

  1. 多個插件可以對同一目標各自提交 Patch,磁盤上的安裝文件不受影響。
  2. 可以 inspect 原始源碼、每一步 Patch 結果以及最終變換後的源碼,而不是把 bundle 當黑盒。
  3. 禁用或移除 Provider 後,可恢復原始行爲。

Provider 與 Patch 順序

Provider 可以把 Patch 放在另一個 Provider 之前或之後;單個 Patch 也可聲明自己的 before / after 規則。用戶還可以在 Settings → Harmony 裏跨 Provider 穿插 Patch 順序。

當若干改動必須同時成功時,可用 composite Patch:多個成員共用一個順序位和一個開關,任一成員失敗則整組不生效。

Harmony 維護全局 patchOrder,並校驗保存列表中每個已註冊 Patch 恰好出現一次。插件級禁用是獨立的 provider/* 開關,不會清除單個 Patch 的啓用狀態;重新啓用插件時,只會恢復插件禁用前已單獨啓用的 Patch。

瀏覽器插件的樣式順序

對 browser 類插件,Harmony 會按 Patch 順序維護各 Provider 擁有的 <style data-plugin> 標籤。一個 Provider 對應一組樣式,該組中最後啓用的 Patch 決定這組 CSS 在級聯中的位置;Patch 重載後順序會重新對齊。

版本釘扎與健康檢查

可以爲 Patch 釘住目標包版本和 expect;版本不匹配時會在 status 中明顯失敗,而不是等 UI 選擇器漂移後才察覺問題。

CLI 與 WebUI

啓動 WebUI 後,可在 Settings → Harmony 管理 Profile。終端側支持對任意 Profile 做交互式或非交互式操作;命令會事務性地聯繫運行中的 Host 並報告 live 狀態,對已停止的 Profile 則做 offline 的原子校驗與更新。

安裝與啓用

環境要求:

  • Node.js ^22.22.3>=24.11.1
  • @deepseek-ai/dsh@0.1.0-rc.8@deepseek-ai/dsh@0.1.1-rc.1

先做全局安裝,再啓動 WebUI:

npm install -g @deepseek-ai/dsh@0.1.1-rc.1
npm install -g dsh-harmony
dsh web

啓動後在 Settings → Harmony 中完成配置。Profile、Desktop 集成、更新與卸載等細節見官方安裝指南

常用 CLI 示例(以 web Profile 爲例):

dsh harmony --profile web
dsh harmony status --json --profile web
dsh harmony disable my-provider/optional-patch --profile web
dsh harmony enable-provider my-provider --profile web
dsh harmony patch-order show --profile web
dsh harmony patch-order move my-provider/optional-patch --before other-provider/base --profile web
dsh harmony patch-order auto --profile web
dsh harmony provider-order move my-provider --after base-provider --profile web
dsh harmony inspect target-package --patch my-provider/optional-patch --summary --profile web
dsh harmony reload my-provider --profile web

在 TUI 中按 Tab 可在 Provider 視圖與 Patch 視圖之間切換。statuspatch-order showprovider-order show 在健康或順序約束失敗時以狀態碼 1 退出;inspect --summary 省略變換後的完整源碼,--patch <key> 則只查看被指定 Patch 觸及的目標。reload 需要 Host 正在運行。

編寫、審查或調試 Patch 前,倉庫內提供了 AI agent 技能文檔 use-dsh-harmony,涵蓋安裝、Patch 選擇與編寫、運行時操作和排錯。

典型用法

何時選用 Harmony

README 中的對比表概括了適用邊界:

沒有 Harmony 有 Harmony
隱藏或複製內部 UI,並長期對齊兩套實現 原地替換選定組件或編譯調用點
node_modules、維護 fork、升級後重貼補丁 內存變換源碼,安裝包文件不變
選擇器漂移後 UI 靜默損壞 釘版本與 expect,不匹配時在 status 可見失敗
把最終 bundle 當黑盒 可檢查原始源碼、每步 Patch 與最終結果
手工撤銷自定義改動 禁用或移除 Provider 即可恢復

原則:目標插件已暴露的擴展點仍是首選;Harmony 填補的是「沒有 API、又不想 fork」之間的空隙。它不會把編譯期內部實現變成穩定公開 API,而是讓這類依賴變得可排序、可檢查、可回滾。

開發 Patch 時的入口提示

README 的 Usage 一節寫道:在 vibe coding DSH 插件時,可以直接說 “What about we use dsh-harmony” 作爲起點。具體 Patch 模型、Provider 聲明、description 字段、composite Patch 等細節以官方文檔與倉庫 README 爲準。

適用場景與注意

適合誰

  • 需要修改其他 DSH 插件內部實現,但目標未提供擴展點的插件作者。
  • 希望在多個插件間協調對同一目標的源碼級改動,且需要明確順序與開關的團隊。
  • 維護 browser 插件並需要控制 Provider 樣式注入順序的前端集成場景。

務必注意

  1. 權限:Harmony 以當前 dsh 進程權限運行,Patch 會在運行時改寫插件行爲。安裝或使用前應閱讀源碼與 MIT 許可證,確認 Provider 來源可信。
  2. 穩定性:依賴目標插件內部結構;目標大版本升級後 Patch 可能失效,應配合版本釘扎與 status 檢查。
  3. 生態定位:SkillHub 是面向中國用戶的 DSH 插件社區目錄,與 DeepSeek / 幻方無官方從屬關係;DSH 本身遵循「一切皆插件」理念,Harmony 是在此之上增加的一種插件協作方式。

結尾

dsh-harmony 把「改別人的插件內部實現」從 fork 和改 node_modules 拉回到可編排、可觀測、可撤銷的運行時 Patch 流程。若你的工作流卡在擴展點與 fork 之間的空白地帶,可以從安裝全局包、打開 Settings → Harmony 開始試用。

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

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

小夜