前言¶
DeepSeek Harness(DSH)的擴展能力通常以插件 bundle 的形式提供。對插件做安裝、卸載、更新或啓用/禁用後,如果每次都要重啓實例,調試和切換配置會比較慢。
kyorakuyk/dsh-hotreload-plugin-manager 是一個樹外 DSH 插件:它可以在運行中的實例上熱安裝、熱卸載、更新、禁用/啓用 profile 插件 bundle,並提供 Web 設置頁標籤頁。下面介紹它的定位、安裝方式和主要邊界。
這是什麼¶
這是一個由 kyorakuyk 維護的 MIT 許可證插件。
它的特點是:
- 零內核改動:純樹外 bundle。
- 雙面包:一個 npm 包同時是 host 網關與瀏覽器設置標籤頁。
- 提供 Web 設置頁標籤頁:設置 → 插件 → 插件管理。
- 提供
/plugin-manager/*HTTP API,用於列表、安裝、卸載、更新和啓用/禁用。
它解決的問題是:在運行中的 DSH 實例上,對 profile 插件 bundle 做生命週期管理,而不是每次都在外部改完配置後重啓實例。
核心能力¶
下面介紹已確認的主要能力。
熱安裝 bundle¶
支持按 spec 安裝插件 bundle。可接受的來源形式包括:
- npm 包名
- git URL
github:owner/repofile:/link:路徑
熱卸載 bundle¶
卸載時會移除行與 fiber、清理依賴,並移除陳舊 bundle 層條目。
禁用 / 啓用 bundle¶
已安裝 bundle 可以被禁用或啓用。狀態持久化且立即生效。
熱更新 bundle¶
熱更新會替換 bundle 的補丁行並即時重放配置。
需要注意:這裏熱更新的是組合與配置,不是模塊代碼。模塊代碼或 exports map 變更仍需要重啓。
Web 設置頁¶
安裝並啓用後,可以在 Web UI 中進入:
設置 → 插件 → 插件管理
在這個標籤頁中,可以按 spec 安裝其他插件,並對已安裝項執行更新、禁用/啓用、卸載。
HTTP API¶
插件提供 /plugin-manager/* HTTP API。常見操作包括:
| 操作 | 方法與路徑 | Body 字段 |
|---|---|---|
| 列表 | GET /plugin-manager/list |
無 |
| 安裝 | POST /plugin-manager/install |
{ spec } |
| 卸載 | POST /plugin-manager/uninstall |
{ packageName } |
| 更新 | POST /plugin-manager/update |
{ packageName } |
| 啓用 / 禁用 | POST /plugin-manager/setEnabled |
{ entryId, enabled } |
安裝與啓用¶
前置條件:
- Node ≥ 22
- pnpm ≥ 10
- 已安裝 dsh
- 已初始化目標 profile
下面以 web profile 爲例。
1、安裝本插件¶
可以直接從 GitHub 安裝:
dsh plugin --profile web add "github:kyorakuyk/dsh-hotreload-plugin-manager"
也可以使用完整 git URL:
dsh plugin --profile web add "https://github.com/kyorakuyk/dsh-hotreload-plugin-manager.git"
如果希望本地克隆後安裝,可以先克隆倉庫:
git clone https://github.com/kyorakuyk/dsh-hotreload-plugin-manager.git
然後使用本地路徑安裝:
dsh plugin --profile web add "file:$(pwd)/dsh-hotreload-plugin-manager"
如果以 npm 包形式發佈,也可以使用 npm 包名 spec。示例中出現的包名是:
dsh plugin --profile web add "@kyorakuyk/dsh-plugin-manager"
這個 npm 包名與倉庫名不一致,使用前需要確認實際發佈目標。
2、重啓 dsh web 實例¶
安裝本插件後,必須重啓 dsh web 實例:
dsh --profile web
3、瀏覽器硬刷新一次¶
瀏覽器需要硬刷新一次:
Ctrl+Shift+R
4、打開插件管理頁¶
進入 Web UI 後打開:
設置 → 插件 → 插件管理
完成上面的步驟後,就可以在這個頁面管理其他插件 bundle。
典型用法¶
安裝其他 bundle¶
在插件管理頁中,按 spec 填寫安裝對象。可填寫的來源形式包括:
- npm 包名
- git URL
github:owner/repofile:/link:路徑
例如,本地路徑形式可以是:
file:$(pwd)/some-dsh-bundle
這裏只是說明 spec 形式;具體安裝哪個 bundle,取決於你要引入的插件。
管理已安裝 bundle¶
安裝後,可以對已安裝項執行:
- 更新
- 禁用
- 啓用
- 卸載
禁用/啓用會改變條目狀態,並且狀態持久化。
通過 HTTP API 操作¶
如果不在 Web UI 中操作,也可以調用 /plugin-manager/* 接口。
例如,查詢列表:
GET /plugin-manager/list
安裝一個 bundle:
POST /plugin-manager/install
{ "spec": "<bundle-spec>" }
卸載一個 bundle:
POST /plugin-manager/uninstall
{ "packageName": "<package-name>" }
更新一個 bundle:
POST /plugin-manager/update
{ "packageName": "<package-name>" }
啓用或禁用一個條目:
POST /plugin-manager/setEnabled
{ "entryId": "<entry-id>", "enabled": true }
限制與注意事項¶
熱更新不是替換模塊代碼¶
熱更新替換的是組合與配置,不是模塊代碼。
如果 bundle 的模塊代碼或 exports map 變更,需要重啓後才生效。
不要與 dsh plugin CLI 混用¶
不要與 dsh plugin CLI 對同一 bundle 混用。每個 bundle 只使用一種安裝與清理機制,避免同一個 bundle 被重複組合。
行 id 衝突會被拒絕¶
如果補丁行 id 與用戶層或其他 bundle 衝突,該 bundle 會被拒絕安裝。
無法解析包名的 git spec 會失敗¶
使用 git spec 安裝時,如果無法解析出包名,會明確失敗。
普通庫會被拒絕¶
沒有 dsh.bundle.patch 的普通庫會被拒絕,並自動 pnpm remove 回滾。
舊安裝格式不支持¶
舊的 .dsh-plugin / config.yaml 安裝格式不支持。
非閉包 peer 由 bundle 作者負責¶
如果 bundle import 的 peer 既不在 profile 中,也不在 DSH 安裝閉包中,其可用性由 bundle 作者負責。
遠程信任需要注意¶
/plugin-manager/* 路由對任何能觸達服務器的人都開放。
如果將實例暴露到局域網,不能依賴 /api 信任圍欄的保護。暴露前需要先確認網絡邊界和訪問控制。
pnpm minimumReleaseAge¶
pnpm ≥ 11 的 minimumReleaseAge 默認會拒絕剛發佈的包。
管理器執行 pnpm 時會附加:
--config.minimumReleaseAge=0
安裝前應檢查源碼與許可證¶
這個插件會在當前 dsh 實例中管理 profile 插件 bundle,並以當前 dsh 進程權限運行。
在安裝其他插件前,應先檢查目標 bundle 的源碼、許可證和依賴來源。
鏈接¶
- 社區目錄:https://www.skillhub.cn/plugins/kyorakuyk/dsh-hotreload-plugin-manager
- GitHub:https://github.com/kyorakuyk/dsh-hotreload-plugin-manager
該目錄頁是社區目錄,不是官方應用商店;它作爲獨立站點列出插件,與 DeepSeek / 幻方無官方從屬關係。