dsh-reload:不重啓 DSH 熱重載插件與 Skill

前言

在 DeepSeek Harness(DSH)裏做插件或 Skill 開發時,改完 lib/index.js 或磁盤上的 Skill 文件,往往還要重啓應用才能看到效果。DSH 自帶 HMR,但在實際主機上測下來,用戶安裝在 profile node_modules 裏的第三方插件通常不會被自動重載;Skill 註冊表也不會按 TTL 自行刷新。下面介紹的 dsh-reload(維護者 louisyeaaah)用兩個工具、兩條斜槓命令,把「改代碼 → 立刻重載 → 失敗回滾」和「強制 Skill 再發現 + 不可見診斷」收進一個工作流類插件。

這是什麼

dsh-reload 是 DSH 社區插件,分類爲工作流。它提供:

工具 / 命令 作用
reload_plugin 對已加載插件:清模塊緩存 → 釋放舊 fiber → 重新 entry.init();任一步失敗則回滾到舊模塊。也可激活「已註冊但未運行」的行。
reload_skill 強制 Skill 再發現(清註冊表緩存並廣播 skills/change),報告增刪改,並診斷指定 Skill 爲何不可見。
/reload-plugin 與 reload_plugin 相同,在 Composer 裏手動輸入。
/reload-skill 與 reload_skill 相同。

插件還 bundled 一份 Skill(skills/dsh-reload/SKILL.md),apply() 時通過 ctx.skills.register() 註冊;另含備用 filesystem skill provider,用於緩解部分環境下 Skill 列表異常的問題(設計細節見倉庫 DESIGN.md)。

爲何需要它(與內置 HMR 的差距)

README 歸納了三類缺口(在 live host 上測量,證據見 DESIGN.md §6):

  1. 插件源碼未被 watch:profile 的 HMR 配置裏 root: [],編輯插件文件不會觸發監視。
  2. HMR 自動重載跳過 node_modules:loadDependencies() 對 URL 含 /node_modules/ 的模塊直接返回,用戶裝在 <profile>/node_modules/<pkg>/ 的插件依賴集爲空,不會被 partial reload。 monorepo 內通過 symlink 指向 packages/* 的官方插件則不同。
  3. Skill 註冊表無 TTL:只有 provider 主動 invalidate() 纔會清目錄;filesystem provider 若在某個 root 上 list() 拋錯,可能整批 Skill 不可見。

reload_plugin 針對前兩類;reload_skill 針對第三類並帶診斷。

環境與限制

  • DSH:面向 0.2.0-rc.2 主機內部 API(cordis 4.0.4、@deepseek-ai/dsh-tools / dsh-commands 0.2.0-rc.2)。package.json 聲明 peer:>=0.2.0-rc.1 <0.3.0-0。
  • Node:engines.node 爲 >=22.0.0;作者在 Node 24.18.1 / Electron 44.0.0 上驗證。
  • 僅主機側:瀏覽器端插件代碼不會被重載(見倉庫 Limitations)。

安裝或啓用前,請自行查看 GitHub 源碼 與 MIT 許可證;插件以當前 DSH 進程權限運行。

安裝

dsh plugin --profile <profile> <args> 會把參數轉給 profile 目錄下的 pnpm,以下命令均來自官方 README。

1. 從 GitHub 安裝

dsh plugin --profile <profile> add github:louisyeaaah/dsh-reload

2. 從發佈 tarball 安裝(無需構建,URL 釘在 tag)

dsh plugin --profile <profile> add "https://github.com/louisyeaaah/dsh-reload/releases/download/v0.1.4/dsh-reload-0.1.4.tgz"

3. 從 npm(發佈後)

dsh plugin --profile <profile> add dsh-reload

4. 在應用內:打開 Plugin Manager / dsh-market,安裝 dsh-reload。包內 dsh.bundle.patch 指向 cordis.patch.yml,其中 id: tool-reload 的 insert 行註冊上述工具與命令。

本地開發可用倉庫 scripts/install.sh [profile](默認 profile:desktop),拷貝產物併合並 patch;文檔稱無需重啓即可熱組裝新 patch 行(約 4s),可用 reload_plugin({}) 自檢。

典型用法

在會話或工具調用裏可按 README 示例操作:

reload_plugin({})                                     # 列出插件行:包名、entry id、是否運行
reload_plugin({ name: 'dsh-video' })                  # 按包名重載(也可用 entry id,如 'tool-video')
reload_plugin({ name: 'dsh-video', dryRun: true })    # 預覽將清除的模塊,不改動
reload_skill({ name: 'my-skill' })                    # 強制再發現並診斷該 Skill

補充行爲:

  • reload_plugin({ filter: '@deepseek-ai/' }) 可列出更廣範圍(默認可視第三方、本地及未運行行)。
  • reload_skill() 不帶 name 僅刷新;reload_skill({ cwd: '/path/to/repo' }) 用絕對路徑解析項目 Skill 根(不支持 ~ 展開)。
  • 人工輸入:/reload-plugin dsh-video、/reload-skill my-skill。

重載成功時報告會列出被清緩存並重新求值的模塊 URL、耗時,以及工具列表是否變化;失敗則恢復緩存並重新初始化舊模塊,避免半加載狀態。僅目標插件包根下的自有模塊會被清除(不含嵌套 node_modules),共享依賴仍留在緩存中。

適用場景

  • 正在開發或調試 profile 內第三方 DSH 插件,希望改 lib/*.js 後立刻驗證 tools / services / commands / prompt,而不重啓 Electron 應用。
  • Skill 在磁盤存在但會話目錄裏看不到,需要 強制刷新註冊表 並查看診斷信息。
  • 需要 激活已安裝但未成功啓動 的插件行。

不適合期望「瀏覽器 UI 插件熱更新」的場景;也不應替代對上游 DSH 版本與 peer 依賴的兼容性檢查。

參考鏈接

dsh-reload 把插件熱重載與 Skill 再發現做成可重複調用的工作流,適合在 DSH「一切皆插件」的生態裏縮短本地迭代閉環。

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

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

小夜