dsh-plugin-manager:在 WebUI 裏開關 DSH 插件,無需重啓

前言

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
羽毛球分组比赛记分
小程序二维码

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

小夜