插件側欄管理:給 DSH 左上角入口做分類與顯隱

前言

DeepSeek Harness(DSH)的左上角側欄通過 sidebar.panellist 插槽向各插件開放:誰要放圖標入口,就註冊一條記錄並用 order 決定排序。外殼只按數字從小到大畫一列,不關心這些按鈕分別代表什麼。

插件裝多了之後,這一列容易變成互不相干的長列表,很難一眼分清用途。社區裏也有按插件各自加側欄按鈕的做法,但沒有統一的分組層。下面介紹的 插件側欄管理(包名 dsh-plugins-sidebar-manager,維護者 HighToward)只在視覺上接管這一列:自建一級/二級分類、調整順序、隱藏不需要的入口,不改其他插件代碼,也不要求對方配合。

這是什麼

這是一個面向 DSH Web 外殼的客戶端插件(DSH Desktop 與 dsh web 同屬 Web 外殼)。當前版本 0.1.0,許可 MIT。在 設置 → 插件側欄管理 裏完成所有調整,保存後立刻生效,無需重啓(link: 本地開發時改宿主半源碼需重啓 DSH)。

核心功能

分類

  • 一級分類:側欄頂層的分組標題。
  • 二級分類:掛在一級下面,帶縮進,可再拆細。
  • 分類可重命名、上移、下移、刪除;可摺疊,摺疊狀態會記住。
  • 刪除分類不會丟入口,成員退回「未分類」。

入口

  • 每個側欄入口可放入任意分類,分類內可調順序。
  • 每個入口可單獨隱藏或顯示;隱藏後從側欄消失,插件仍照常運行。
  • 未歸類入口排在所有分類之後,順序與插件註冊時一致。

整體控制

  • 接管側欄:總開關。關閉後側欄立刻恢復各插件註冊時的原樣,配置保留;再打開即恢復你的佈局。
  • 重新掃描:重新讀取當前已註冊的側欄入口。
  • 恢復默認:清空全部分類與隱藏設置,需 3 秒內點兩次確認。

側欄收折成約 36 像素寬的圖標條時,分類標題會自動隱藏,避免撐破布局;外殼自帶的「更多」等入口不受本插件管理。

安裝與啓用

從 GitHub 安裝

在 DSH 插件管理頁(側欄「插件」)點安裝,填入:

github:HighToward/dsh-plugins-sidebar-manager

命令行(以 desktop profile 爲例):

dsh plugin --profile desktop add github:HighToward/dsh-plugins-sidebar-manager

或使用 pnpm:

cd ~/.dsh/profiles/desktop
pnpm add github:HighToward/dsh-plugins-sidebar-manager

裝完之後

打開 設置,左側會多出一項 插件側欄管理(在「插件」之後)。插件列表中顯示中文名「插件側欄管理」,說明來自包內 locale/zh.json。

依賴:DSH >= 0.2.1-rc.2;React 18 及以上(設置頁使用 useSyncExternalStore)。插件無額外運行時依賴,由外殼注入模塊。

典型用法

第一步:建分類

進入 設置 → 插件側欄管理,點 新建一級分類。名稱可留空,但側欄會顯示空標題,建議命名。

在一級分類卡片內點 新建二級分類 可掛二級;也可用 上級分類 下拉改掛父級,或選「未指定」升爲一級。

第二步:歸類入口

每個分類卡片底部有下拉(僅未歸類入口)和 加入 按鈕。成員列表中:

  • ↑ ↓:分類內順序。
  • 眼睛圖標:隱藏或顯示(隱藏後行變淡並標「已隱藏」)。
  • ×:移出分類,回到未分類。

第三步:側欄呈現

卡片頭部的 ▾ / ▸ 控制摺疊;摺疊後該分類下成員在側欄一併隱藏。一級分類之間的順序用卡片頭部 ↑ ↓ 調整;二級跟隨父級。

排查問題時,可先關閉 接管側欄,確認是否爲本插件導致的顯示差異。

配置與數據

配置存兩份,互爲備份:

位置 作用
瀏覽器 localStorage,鍵 dsh.plugins-sidebar-manager.v1 首屏即可按分類渲染
$DSH_HOME/plugins-sidebar-manager.json(默認 ~/.dsh) 跨瀏覽器緩存、長期保存

改動先寫 localStorage,再防抖 400ms POST 到宿主;宿主用臨時文件加原子 rename 寫盤。清瀏覽器緩存可從宿主讀回;宿主無文件時按「未配置」處理,側欄保持原生順序。

文檔結構示例(version 當前爲 1):

{
  "version": 1,
  "enabled": true,
  "groups": [
    { "id": "g1", "name": "創作", "level": 1, "parent": "", "collapsed": false }
  ],
  "items": {
    "skill-manager": { "group": "g1", "order": 0, "hidden": false }
  }
}

入口 id 即各插件註冊 sidebar.panellist 時的 options.id(如 skill-manager)。讀入後會做規整,非法字段丟棄或回退默認值,避免半截配置拖垮界面。

宿主提供本機-only 的讀寫接口(GET/POST /api/dsh-plugins-sidebar-manager/config 等),非迴環地址返回 403。遠程端口轉發訪問時,POST 可能被拒,但已保存在 localStorage 的佈局仍可用。

實現要點(選讀)

官方插槽是扁平列表,沒有「分組標題」的註冊位。本插件在頁面加載後對側欄列做後置增強:通過 aria-label 與註冊表匹配定位 nav,不改 React 節點結構,用 flex 的 CSS order 調視覺順序,用 display: none 隱藏;分組標題以兄弟節點插入 DOM。外殼重渲染時 React 會復位 DOM 順序,但會保留各按鈕上的 style,因此 order 方案能持續生效。MutationObserver 與定時兜底負責與外殼同步;增強邏輯包在 try/catch 內,失敗只打日誌,不中斷 DSH 啓動。

適用場景與注意

適合:經常安裝多個 DSH 插件、希望按「創作 / 工具 / 調試」等習慣整理左上角入口,或暫時隱藏不常用面板又不想卸載插件的用戶。

注意:

  • 插件在當前 DSH 進程權限下運行,安裝前宜閱讀 GitHub 倉庫 源碼與 MIT 許可。
  • 側欄識別依賴外殼當前 DOM 習慣(如 nav、入口 aria-label);外殼大改側欄結構時,可能表現爲「不接管、保持原樣」,一般不報錯。
  • 卸載插件不會自動刪除 plugins-sidebar-manager.json 與對應 localStorage;徹底清理需手動刪除。
  • 本插件歸類屬於社區目錄中的客戶端類工具;SkillHub 目錄頁 與 GitHub 爲公開來源,與 DeepSeek / 幻方無官方從屬關係。

結尾

插件側欄管理補的是 DSH 開放側欄在「入口變多」時的排版層:分類、順序、顯隱均可本地配置,並可一鍵交回原生順序。需要安裝說明與配置字段細節時,以倉庫 README 爲準。

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

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

小夜