dsh-plugin-packs:把已裝插件排成兩欄的包管理器

前言

DSH(DeepSeek Harness)的插件機制不算複雜,難的是裝多了之後的事。插件到幾十個以後,問題不再是「哪個插件叫什麼」,而是「我現在到底開着什麼」。官方插件頁給的是一張平鋪的已安裝清單,啓用和停用的都在裏面,只能靠記憶區分:裝的時候順手打開,用的時候忘了關,是常見狀態。

下面介紹的 dsh-plugin-packs 解決的就是這個視角問題。它由 mmmmlp-cloud 維護,MIT 協議,當前版本 0.1.0,在社區目錄中歸爲「工作流」分類。它把已安裝數據重排成 Minecraft 資源包式的左右兩欄(左欄正在用、右欄裝了沒啓用),再疊一層可手工編輯的標籤。倉庫還比較新,公開星標數爲 0,適合願意先試用再反饋的用戶。

這是什麼

一句話定位:一個 DSH 插件包管理器,用兩欄視圖回答「這個包現在開沒開」,用標籤回答「它算哪一類」。

它不是卸載工具,也不是插件分組工具。區別在於視角:分組類插件回答「它屬於哪一類」,組織方式是用戶自定義層級;本插件回答「它現在在不在跑」,左欄是當前 profile 的 bundle 選擇,右欄是閒置的包。兩者可以同時安裝,彼此不寫同一份數據。

核心功能

裝好後,插件在左側欄「插件」頁面頂部新增「插件包」標籤頁,能力如下:

  • 兩欄視圖:左欄「已啓用 · 一起用」,右欄「未啓用」。卡片爲正方形,每欄一行兩個。
  • 搬包:點卡片右上 → / ← 箭頭,或直接拖到對面一欄,即完成啓用/停用。
  • 批量操作:勾選多張卡片後,頂部浮出「批量啓用 / 批量停用」。
  • 標籤:卡片可掛自定義標籤;頂部標籤欄點一下即篩選,再點取消;「未標記」撈出還沒歸類的包。
  • 搜索:匹配中文名、包名、描述、版本和標籤。
  • 範圍篩選:默認只顯示用戶自己安裝的包;可選官方可選包、全部;勾「顯示系統核心」才露出只讀區。
  • 詳情展開:展開可看完整描述、來源、包內插件行及運行狀態,並改中文名、勾標籤。
  • 切換反饋:每次切換後提示區分四種結局:已生效 / 需重啓 DSH / 被更高優先級覆蓋 / 失敗:<code>,前兩種支持撤銷。
  • 會話記憶:訪問過一次「插件包」頁後,本次會話內切走再回來,仍停在該頁。

安裝與啓用

安裝通過 DSH 官方 CLI 完成,指定 --profile web(瀏覽器 half 需要掛在 web profile 上):

# 官方 CLI:走 pnpm 安裝並選中 bundle
dsh plugin --profile web add github:mmmmlp-cloud/dsh-plugin-packs

裝完重啓一次 dsh web(宿主 half 要掛路由),再按 Ctrl+F5 強刷頁面,入口在左側欄「插件」→ 頂部「插件包」。

注意 DSH 有兩個都叫「插件」的入口:左側欄是插件總頁面,「設置 → 插件」是另一個面。本插件掛在前者,排錯先確認這一點。

數據存在哪裏

標籤和中文名不寫在瀏覽器 localStorage,而是寫在一個普通 JSON 文件裏,隨 DSH_HOME 走:

<$DSH_HOME>/plugin-packs/packs.json
# 默認路徑爲 C:\Users\<用戶名>\.dsh\plugin-packs\packs.json

文件格式:

{
  "version": 1,
  "tags": [{ "id": "novel", "label": "小說 · 閱讀", "color": "#7B68EE" }],
  "packs": {
    "dsh-novel-writer": { "name": "小說寫作助手", "tags": ["novel"] }
  }
}

要點:

  1. packs 的鍵是包名而不是 entry id,重裝、升級、換目錄 id 都不丟標籤。
  2. 文件不存在時生成空表,附帶 7 個通用分類標籤(小說·閱讀 / 聯網搜索 / 界面美化 / 安全·滲透 / 模型渠道 / 記憶·知識 / 工具·其它)。出廠不預填任何包和歸屬,哪個包打哪個標籤由用戶決定。
  3. 可以直接手改,刷新即生效;格式寫錯不會靜默丟數據,壞文件先改名留底(packs.json.broken-<時間戳>)再重建。
  4. 寫入是原子寫(臨時文件 + rename)且串行化,連續點擊標籤不會互相吞更新。
  5. 只涉及插件包,不碰會話、提示詞或憑據;換機器不隨賬號同步,要手工拷貝。

它改的是哪一層

「啓用/停用」調用內核的 pluginManager.setBundleEnabled,把包加入或移出 profile 的 bundle 選擇層,改的是真實插件狀態,不是頁面顯示:依賴仍留在 node_modules,隨時可以移回,不是卸載;由上層配置接管(只讀)的包會明確標出,不會假裝可切。

包內單個 loader 行的開關不在本插件職責內,本頁包內行列表是隻讀展示;需要行級管理要配專門的行級工具。

範圍上有保護:勾「顯示系統核心」才露出 dsh-base / dsh-web-app 以及 acp、headless、sdk-app、sdk-minimal 這幾種別的運行模式的包,一律不可切,避免誤觸改壞桌面檔。未安裝(availability === "missing")的包不顯示。

架構與接口

包分宿主 half 和瀏覽器 half,零運行時依賴、無構建步驟。瀏覽器端數據走宿主 half 的同源路由,可用 curl 單獨驗證:

方法 路徑 說明
GET /plugin-packs/api/health 自檢:build 標記、路由、數據文件路徑
GET /plugin-packs/api/bundles 包清單與行狀態
POST /plugin-packs/api/bundles/enabled 整包啓停,body { name, enabled },需 x-plugin-packs: 1 頭
GET/PUT /plugin-packs/api/state 讀 / 整份替換寫入標籤文檔,PUT 需 x-plugin-packs: 1 頭

這樣做是因爲瀏覽器直接調 ctx.remote.pluginManager 要接客戶端遠程裝配順序,容易在啓動競態裏靜默失敗;走宿主路由不受影響。寫操作帶自定義請求頭且路由不答預檢,別的本地頁面無法借道改插件狀態。

排錯先看自檢接口:

curl 127.0.0.1:<端口>/plugin-packs/api/health

build 字段存在即路由正常;頁面報 HTTP 404 / 響應不是 JSON 時,通常是改了宿主代碼未重新應用 bundle 行,重新開關一次即可,不必重啓 DSH。

適用場景與注意

適合插件數量在幾十個量級、習慣按用途分類管理包、願意把分類放進可手改文件的用戶。標籤跟着 DSH_HOME 走,換瀏覽器或清站點數據都不會丟。

留意幾點:

  1. 插件以當前 dsh 進程權限運行,能讀寫該 profile 能訪問的所有插件包,安裝前建議先讀源碼與許可證(MIT)。
  2. 它只管到包這一層,包內行級開關需另找行級工具。
  3. 官方「已安裝」標籤本身無法替換,本插件以並列標籤提供另一種視角,兩者共存。
  4. 個別包(尤其宿主側插件)切換後需重啓 dsh web 才完全生效,頁面會明確提示。

結尾

dsh-plugin-packs 做的事情很小:把已有的插件清單重排成日常語言——兩欄、標籤、搜索、批量。沒引入新的安裝方式,也沒改內核語義,只是把「我現在在跑什麼」從記憶問題變成可見事實。如果這正是痛點,可以從社區目錄頁開始試用:

  • 目錄頁:https://www.skillhub.cn/plugins/mmmmlp-cloud/dsh-plugin-packs
  • GitHub:https://github.com/mmmmlp-cloud/dsh-plugin-packs
羽毛球分组比赛记分
小程序二维码

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

小夜