zefferry/dsh-plugin-manager-plus:給 DSH 插件列表加一層管理

前言

DSH 的理念是「一切皆插件」,裝插件是常態。但原生「插件」頁做的是基礎陳列:按內置 / 實驗性 / 已安裝三個分區展出,啓用開關點了就生效。裝得多了之後,幾個問題會一直存在:找插件要靠滾動,插件名和簡介是官方寫的,卸載要逐個點,裝了什麼自己記不清,多個窗口編輯還會互相覆蓋。

zefferry 維護的 zefferry/dsh-plugin-manager-plus 就是針對這一頁做的第三方增強。它不是替換頁面,而是在原生 DOM 之上疊加一層純展示邏輯:標籤篩選、搜索、排序與拖拽、批量操作、改名 / 改簡介 / 換圖標,以及用 DSH 當前默認模型做 AI 生成。下面介紹它的能力、安裝方式和限制。

需要先說明:這是非官方第三方插件,與 DeepSeek 官方無關,也沒有發佈到 npm。

它是什麼

一句話定位:給 DSH 原生插件列表頁做 UI 增強的客戶端插件,作者 zefferry,當前版本 v0.9.1,MIT 許可。

它的實現方式值得先看清楚:純展示層疊加,不改原生 DOM 結構,不移動節點,只寫文本與樣式。這意味着禁用插件後原生頁面立刻恢復原樣,沒有向後兼容的包袱。渲染在 DSH Web 客戶端上完成,無第三方運行時依賴。

插件還引入了一層 Surface 契約 v1:任何頁面只要按契約標註 data-plugin-surface / data-plugin-caps,就能複用篩選、改名、圖標、排序、批量這些能力,並按 caps 裁剪。原生插件頁是隱式 surface,無需適配。這對後續有多個插件列表頁面(比如分身管理)的場景比較有用。

核心功能

篩選與搜索

插件欄從左到右是:標籤 pills(全部 / 啓用中 / 未啓用 / 自定義標籤 / +新建)→ 搜索框 → 批量操作 → 調整順序 → 排序。

標籤裏有兩類要區分。全部是全量,其餘可以理解成兩個系統標籤加自定義標籤:

  • 「啓用中 / 未啓用」是派生標籤,讀卡片上啓用開關的 aria-checked 自動歸類,不需要手動維護,也不能刪除或改名。
  • 自定義標籤需要手動添加,支持「+新建」。

需要注意一個取捨:v0.9 起移除了「內置 / 實驗性 / 已安裝」分組標籤,因爲原生頁面本身已按這三個分區展示,再放一層只會造成重複。

搜索框的匹配規則是:名稱按嚴格子串匹配,原生名與自定義名都參與;簡介按模糊子序列匹配。搜索結果與當前標籤篩選取交集。

排序與手動拖拽

「排序」下拉提供手動順序 / 名稱 A→Z / 名稱 Z→A / 啓用優先 / 版本高→低 / 最近出現。

手動排序走「調整順序」按鈕。進入後整張卡片可拖,落點會畫一條插入指示線,鬆手才提交,卡片之間的空隙也能放置。順序按分區保存(all / tag:<id>),也就是說不同標籤視圖各自記住一份手順。拖動期間面板會抑制原生 hover 背景,避免結束後殘留高亮。

批量操作

工具欄點「批量操作」後分裂成「全選」與「完成」兩個按鈕,點卡片即可多選。然後右鍵出批量菜單:批量添加標籤、批量添加到分身、批量卸載(卸載帶確認,失敗項保留選中)。批量只作用於「仍選中且當前可見」的卡片,工具欄有 aria-live 的「已選擇 N 項」計數,數量變化會被讀出來。

「批量添加到分身」讀取分身管理插件的實例列表:運行中或已安裝的分身置灰並標註原因,其餘點擊即添加,添加後需要重啓該分身才生效。

卡片編輯

右鍵菜單項是:重命名… / 更改圖標… / 添加標籤 ▸ / 添加到分身 ▸ / 卸載…。

重命名可以自定義顯示名稱與簡介,原名保留爲小字,改名後立即反映到卡片上。卸載調用原生卸載邏輯,只對可卸載插件出現。

圖標通過「更改圖標…」打開圖標庫,內置圖標與已上傳圖標平鋪在同一網格里,支持 png / jpeg / webp / gif / svg / ico 單圖上傳,或 zip 批量上傳;內置圖標和上傳圖標都可以多選刪除。圖標庫上限 100 張,單圖 ≤512KB,zip ≤8MB 且 ≤40 張。

菜單切鍵完全可用:↑/↓ 移動,→/Enter 展開子菜單,← 返回,Esc 關閉整個菜單,菜單打開時不預亮首項。點菜單外部第一次只關閉菜單,不會誤觸下層卡片;越界時菜單自動翻轉。

AI 生成名稱與簡介

重命名彈窗底部是「一鍵生成」。默認直接使用 DSH 當前默認模型,不需要單獨填 API Key。未配置 AI 時按鈕會禁用並顯示「AI 未配置」,默認模型不可用時狀態行會說明原因。

提示詞可編輯,是五段式結構:角色 / 原始信息 / 要求 / 輸出格式 / 自審,支持 {name}、{description}、{existingNames} 佔位符,並可以恢復默認。

生成過程在 host 側有多輪自檢:合法性(合法 JSON)、長度、名稱不與其它插件重複,不合格會把問題反饋給模型重答,最多 3 輪。模型選擇可以跟隨默認模型,也可以指定 provider/model 並使用其最低推理檔;deepseek-official 在憑證可用時優先走直連 API,失敗靜默回退到 DSH 原生調用。

生成中會提示「AI 正在後臺生成…」,成功提示「插件「舊名」已重命名爲「新名」」。生成長任務在後臺跑,中途關彈窗不取消。

如果要接自建服務,可以顯式配置 OpenAI 兼容端點,走 config.ai 配置或 PMP_AI_* 環境變量。具體配置項與多輪校驗規則在倉庫的 docs/REFERENCE.md 的「AI 代理配置」一節。

安裝防自動啓用

通過原生安裝入口(含市場一鍵安裝)裝好的插件默認處於關閉狀態,避免裝完即激活。這條對於批量裝插件的場景比較實用。

安裝與啓用

該插件未發佈到 npm,安裝方式是給 DSH profile 加一個本地 link: 依賴。下面以 Windows 默認 profile 爲例。

先關閉 DSH,克隆倉庫:

git clone https://github.com/zefferry/dsh-plugin-manager-plus.git

然後編輯 %USERPROFILE%\.dsh\profiles\desktop\package.json,在 dependencies 中加入:

"@local/dsh-plugin-manager-plus": "link:<克隆目錄>"

路徑用正斜槓,例如 link:E:/tools/dsh-plugin-manager-plus。同時把 "@local/dsh-plugin-manager-plus" 追加到 dsh.profile.bundles 數組。這一步是爲了讓 DSH 把插件插入 bundle。

接着創建 junction,讓 profile 能解析到克隆目錄:

mkdir "%USERPROFILE%\.dsh\profiles\desktop\node_modules\@local"
mklink /J "%USERPROFILE%\.dsh\profiles\desktop\node_modules\@local\dsh-plugin-manager-plus" "<克隆目錄>"

最後重啓 DSH。

如果使用非默認 DSH_HOME 或其它 profile,把上面的 .dsh/profiles/desktop 換成正在使用的 profile 目錄即可。

卸載時關閉 DSH,移除上述依賴與 bundle 聲明、刪除 junction,重啓就恢復原生頁面。狀態文件在 $DSH_HOME/plugin-manager-plus/state.json,可以手動刪除。

典型用法

裝好之後,日常操作基本都是從標籤篩選條開始的。

先按狀態過濾:點「啓用中」看當前真正在跑的插件,點「未啓用」看裝了但關着的。插件多了之後這一步比滾動快得多。

再配合搜索縮小範圍。名稱按嚴格子串匹配,輸入 plugin 能命中所有原名或自定義名包含該片段的條目;忘記名字只記得大概方向時,簡介的模糊子序列匹配更合適。

排序如果固定看測試環境裏的版本新舊,可以直接選「版本高→低」,不需要手動拖拽。

只有想要固定分區順序時才進「調整順序」拖拽模式,退出時點一下按鈕即可,draggable 與把手會被清理。

批量場景:裝了一批插件後,在批量模式下全選,右鍵批量卸載,卸載前有確認;也可以批量加上自定義標籤做分組。

改插件名和圖標適合在統一整理插件列表時做:右鍵重命名填自定義名與簡介,重命名彈窗裏點「一鍵生成」讓模型出版本,不滿意再手改。

狀態與數據

插件的所有改動落在本地文件中:

數據 位置
標籤、分區順序、名稱/簡介/圖標覆蓋、AI 提示詞、模型選擇 $DSH_HOME/plugin-manager-plus/state.json
上傳的圖標 $DSH_HOME/plugin-manager-plus/icons/
AI 失敗診斷(一行 JSON,權限 0600) $DSH_HOME/plugin-manager-plus/ai-error.log

狀態寫入使用原子替換加版本 CAS;文件損壞會備份爲 state.json.bak-<時間戳> 並以空狀態繼續。跨窗口同步是 2.5 秒輪詢,不是實時推送,多窗口同時編輯時以此爲準。

兼容性與注意

項目 說明
DSH Desktop 在 0.2.2-rc.1 上驗證,同時兼容 0.2.1-rc.5 的頁面結構(v0.9.1 起自適應兩種 DOM)
運行環境 DSH Web 客戶端(platform: web),無第三方運行時依賴
瀏覽器 Chromium / Edge 內核(隨 DSH 桌面端)
平臺 主要驗證 Windows

這條需要特別留意:插件使用了 DSH 未公開的插件加載與 DOM 結構。DSH 升級如果改動這些結構,插件可能需要跟進適配。維護者主要在 Windows 上驗證過,其它平臺可能失效。

插件以當前 DSH 進程的權限運行,並且安裝方式是鏈接本地克隆目錄。裝之前建議先通讀源碼(client.js 是瀏覽器端 UI,host/index.js 是狀態存儲、HTTP 路由與 AI 代理),許可是 MIT。倉庫裏沒有隨附發佈維護者的測試代碼,只有運行時代碼與文檔,所以行爲邊界以 docs/REFERENCE.md 爲準。

已知限制摘要:

  • 「配置條目卡」沒有啓用開關,只支持改名稱,不參與狀態篩選,也不能改圖標。
  • 狀態篩選下隱藏「調整順序 / 排序」,因爲狀態視圖跨三個分區,無法表達分區手順。
  • 手動排序模式下卡片 :hover 背景會被抑制,這是爲消除拖動殘留高亮做的取捨。
  • 推理強度由模型元數據決定,無檔位時不下發該參數。

代碼體積方面,client.js 219,105 B,host/index.js 89,267 B,合計約 301 KiB。開發上沒有構建步驟,client.js 由 DSH 的 window.__ModuleLoader__ 直接加載,host/index.js 由 Cordis 加載,改完重啓 DSH 生效;提交前至少執行:

node --check client.js
node --check host/index.js

適用場景

適合 DSH Desktop 用戶,尤其是插件數量多到需要篩選和搜索、需要統一整理插件列表、要給插件換名字和圖標的人。

不太適合的場景:依賴 DSH 私有插件 API 與 DOM 結構,DSH 升級後需要等適配;插件列表本身就是按官方分區陳列、沒有額外分組需求的用戶,原生頁面已經夠用。

結尾

這插件的價值在於它沒有重寫插件頁,而是在原生 DOM 上加了一層可控的界面能力:篩選、搜索、排序、批量、改名、換圖標、AI 生成,並且在 Surface 契約下還可以遷移到其它插件列表頁面。以 v0.9.1 的實際形態看,它是一個面向「插件多了之後怎麼管」這個具體問題的開源方案。

目錄頁:https://www.skillhub.cn/plugins/zefferry/dsh-plugin-manager-plus

源碼:https://github.com/zefferry/dsh-plugin-manager-plus

說明:DSH 社區目錄是獨立站點,與 DeepSeek、幻方無官方從屬關係。本文介紹的插件是非官方第三方組件。

羽毛球分组比赛记分
小程序二维码

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

小夜