前言¶
在 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):
- 插件源碼未被 watch:profile 的 HMR 配置裏
root: [],編輯插件文件不會觸發監視。 - HMR 自動重載跳過
node_modules:loadDependencies()對 URL 含/node_modules/的模塊直接返回,用戶裝在<profile>/node_modules/<pkg>/的插件依賴集爲空,不會被 partial reload。 monorepo 內通過 symlink 指向packages/*的官方插件則不同。 - 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-commands0.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 依賴的兼容性檢查。
參考鏈接¶
- 社區目錄頁:louisyeaaah/dsh-reload(獨立站點,與 DeepSeek / 幻方無官方從屬關係)
- 源碼與文檔:github.com/louisyeaaah/dsh-reload
dsh-reload 把插件熱重載與 Skill 再發現做成可重複調用的工作流,適合在 DSH「一切皆插件」的生態裏縮短本地迭代閉環。