前言¶
DSH 的理念是「一切皆插件」,用得久了,profile 裏往往裝了不少社區插件。想臨時關掉其中一個——比如某個帶前端界面的桌寵或側邊欄——通常要改配置、再重啓 dsh,來回成本不低。
dsh-plugin-manager 把這件事搬進了 WebUI:在「設置 → 插件 → 插件管理」裏點開關即可完成,切換即時生效,不用重啓 dsh。下面介紹它的功能、安裝和日常用法。
這是什麼¶
dsh-plugin-manager 是由 Retr67 維護的 DSH 插件管理器,當前版本 0.1.0,採用 MIT 許可證。它提供一個 WebUI 面板,可視化查看當前加載的插件列表與開關狀態,並對用戶插件做熱開關。
開關走的是 Cordis loader 的 entry.update({ disabled }),與官方 dsh-market 主題開關是同一條路。它只管插件的開與關,不負責安裝、升級插件。
核心功能¶
- 用戶插件可開關:包括
profile/package.json裏安裝的社區插件,以及你在cordis.patch.yml裏手工添加的條目(如 MCP 橋樑)。 - 系統組件只讀:DSH 自帶的 host/web 基礎設施只展示、不提供開關,避免誤關導致 Harness 起不來;管理器自身(plugin-manager)也不會被關閉。
- 無需重啓:切換後默認自動刷新網頁,帶前端界面的插件(桌寵、側邊欄等)也會立即完全生效;也可切換爲手動刷新模式,選擇保存在瀏覽器 localStorage。
- 跨重啓保持:被關閉的插件 id 記錄在
<profile>/.plugin-manager/state.json,下次啓動自動回放爲關閉,直到你把它重新打開。 - 「全部恢復開啓」按鈕:一鍵清空所有保持關閉的插件。
- group 插件處理:group 插件無法直接置
disabled時,管理器會自動改爲開關其子條目。
狀態持久化、啓動回放和自愈守衛(監聽 internal/plugin 事件)移植自 dsh-market。
安裝與啓用¶
環境要求:已安裝 DeepSeek Harness (dsh) 與 Node.js(含 npx),engines 要求 node >= 22,Windows / macOS / Linux 均可。
在任意終端執行下面的命令,默認安裝到 web profile:
npx -y @deepseek-ai/dsh plugin --profile web add https://github.com/Retr67/dsh-plugin-manager.git
這條命令會安裝依賴,並在檢測到包聲明瞭 dsh.bundle 後,自動把插件加進 dsh.profile.bundles,下次啓動自動加載。
如果你的 dsh 已全局可用,也可以直接用:
dsh plugin --profile web add https://github.com/Retr67/dsh-plugin-manager.git
要安裝到其他 profile,把 web 換成對應的 profile 名即可:
npx -y @deepseek-ai/dsh plugin --profile myprofile add https://github.com/Retr67/dsh-plugin-manager.git
注意:這一步只是把插件加進 dsh.profile.bundles,不會熱生效。安裝後需要重啓一次 dsh web 讓插件加載,並刷新瀏覽器頁面。倉庫裏另附 install.ps1 / install.sh 一鍵腳本,內部就是上面的標準 npx 命令。
卸載命令:
npx -y @deepseek-ai/dsh plugin --profile web remove dsh-plugin-manager
日常使用¶
經過上面的步驟,插件已經加載。日常操作如下:
1、打開「設置(⚙️ / Settings)→ 插件 → 插件管理」。
2、面板裏分兩類展示:
- 用戶插件(可開關):每個插件一行,右側有開關,點擊即可打開 / 關閉。
- 系統組件(只讀):只展示,不提供開關。
3、按需選擇刷新模式:
- 默認自動刷新:開關後頁面自動刷新,帶前端界面的插件立即完全生效。
- 手動刷新:開關後不自動刷新,點面板裏的「刷新」或手動刷新網頁後生效;這個選擇保存在瀏覽器 localStorage。
需要回到全開狀態時,點「全部恢復開啓」按鈕,會一鍵清空所有保持關閉的插件。
HTTP API¶
面板之外,插件還暴露了三個同源 HTTP 接口,便於腳本化操作:
| 方法 | 路徑 | 說明 |
|---|---|---|
| GET | /plugin-manager/list |
返回插件列表與開關狀態 |
| POST | /plugin-manager/toggle |
{ id, enabled } 熱開關某個插件 |
| POST | /plugin-manager/reset |
恢復所有被保持關閉的插件 |
POST 接口做了 Origin === Host 的同源校驗;GET 列表是隻讀的,且只暴露在迴環地址綁定的 web server 上。
安全與實現邊界¶
主機端僅使用 node 內置模塊(fs/os/path),無網絡調用、無子進程、無 eval;客戶端用 React 渲染插件名(自動轉義),所有請求都是同源 fetch。
實現邊界上,它不對 package.json 的 dsh.profile.bundles 做熱增刪——那需要重啓才能生效;它操作的是運行中的 loader entry,這也是 dsh-market 主題切換驗證過的做法。
適用場景與注意事項¶
適合的情況:
- 裝了不少插件,想臨時關掉某個出問題或暫時不用的插件,又不想反覆重啓 dsh。
- 調試帶前端界面的插件時,需要頻繁開關對比效果。
- 希望某個插件在重啓後仍保持關閉,但不想手動改配置文件。
注意事項:
- 開關只作用於運行中的 loader entry,不會修改
dsh.profile.bundles;增刪 bundles 仍需重啓。 - 與所有 DSH 插件一樣,插件以當前 dsh 進程的權限運行。安裝前建議自行檢查源碼與許可證;本插件源碼公開在 GitHub,採用 MIT 許可證。
結尾¶
dsh-plugin-manager 解決的是一個小而具體的問題:把「關插件要重啓」變成 WebUI 裏點一下開關,並且跨重啓保持。如果你的 profile 裏插件越裝越多,值得一試。
- 社區插件目錄頁:https://www.skillhub.cn/plugins/Retr67/dsh-plugin-manager
- 源碼與 README:https://github.com/Retr67/dsh-plugin-manager