dsh-panel-scroll:給 DSH 側欄補上滾動

前言

用 DeepSeek Harness(DSH)久了會遇到兩個界面問題:左側面板列表有幾個條目就佔幾行,選項一多,底部的「工作區」就被擠出窗口;右側欄有些 tab 的內容比盒子高,卻被 overflow: hidden/clip 裁掉,既看不見也滾不到。這兩處都不是配置項,插件註冊接口也只接受 id / order / label,沒有尺寸參數。下面介紹的 gusong1729/dsh-panel-scroll 就是一個客戶端插件,直接在 DOM 層補這兩個缺口。

這是什麼

dsh-panel-scroll 由 gusong1729 維護,分類是客戶端插件,給 DSH 的 Web / Desktop 界面打一個小布局補丁:左側面板列表封頂 4 行、剩下的用滾輪滑出來;右側欄被裁掉內容的容器改成可以上下滾動。倉庫地址是 https://github.com/gusong1729/dsh-panel-scroll ,社區目錄頁是 https://www.skillhub.cn/plugins/gusong1729/dsh-panel-scroll 。許可證爲 MIT,package.json 裏版本號爲 0.2.4。

核心功能

  1. 左側面板列表封頂:默認只顯示 4 行(學習 / 插件 / 插件市場 / 自動化任務等),剩下的用滾輪滑出來,「工作區」往上升、會話列表多露幾條。
  2. 右側欄不再裁內容:右欄裏凡是「內容比盒子高、卻被 overflow: hidden/clip 切掉」的容器,改成可以上下滾動,滑到底能看到原本夠不到的項。

安裝與啓用

README 給出的安裝方式有兩種。方式一是本地目錄,適合開發或自用,把插件所在的絕對路徑交給 dsh plugin add:

dsh plugin --profile <你的 profile> add /絕對路徑/dsh-panel-scroll

也可以在 DSH 裏讓 agent 用 plugin_manager 的 install_bundle 指向該目錄。方式二是 npm,README 標註爲「如果已發佈」:

dsh plugin --profile <你的 profile> add dsh-panel-scroll

無論哪種方式,裝完都要重啓一次 DSH 才生效,因爲客戶端插件代碼是在啓動時裝載的。

配置

配置全部走 localStorage,改完刷新頁面即可,不需要重啓。可用鍵有兩個:

鍵 默認 說明
dsh-panel-scroll:rows 4 面板列表顯示幾行,取值 1–20。設成 3 時算上「學習」那一行正好 4 行
dsh-panel-scroll:unclog 開 設爲 "off" 關閉右欄的滾動修復,只保留左側 4 行封頂

在 DevTools Console 裏改值後刷新即可:

localStorage['dsh-panel-scroll:rows'] = 3
location.reload()

工作原理

左欄的做法是向 sidebar.panellist 註冊一個不可見的標記行,它的 DOM 節點必然落在真正的面板列表裏,插件從這個錨點往上走,找到「自己那一行」和「行列表」,判據是有沒有同 tag 同 class 的兄弟,而不是硬編碼的類名,再給列表發佈一條 max-height: N × 行距 的樣式表規則。這裏刻意用樣式表加 !important,不用內聯樣式,因爲 shell 重渲染會把內聯值沖掉。

右欄的做法是先不認類名,按「貼着視口右邊緣、高度 ≥ 70% 視口的最寬容器」定位右欄,再掃描其子樹:內容比盒子高、且被 hidden/clip 裁掉的容器改成 overflow-y: auto;另外還處理起始側溢出——justify-content: flex-end/center 這類末端或居中對齊時,多出的內容會落在容器上邊界之外,scrollHeight 不計入、任何 scrollTop 都夠不到,表現爲「滾到頂也看不到第一項」,這類容器往往還是 overflow: visible,所以這條判據先於 overflow 判斷執行:檢測到有子元素跑到容器上邊界之上,就先把對齊改成 flex-start,讓溢出變成正常的下方溢出、可滾動。

適用場景與注意

適合在 DSH 里長期開多個面板、右側欄有長內容、又不想動 shell 源碼的人。安裝前應檢查源碼與許可證。下面是 README 列出的已知限制:

  1. 依賴 shell 的 DOM 結構。插件刻意避開類名(DSH 用的是 CSS Module 哈希類名),但 shell 若改了層級關係,插件可能失效,失效時表現爲「沒效果」,不會破壞界面。
  2. 在 dsh 0.2.1-rc.2 上驗證過,package.json 裏 dsh.engines.dsh 聲明爲 >=0.2.1-rc.2 <0.3.0。
  3. 右欄關閉時,「貼右邊的那條」是主區,因此右欄規則也會作用到主區。不想要就把 dsh-panel-scroll:unclog 設成 "off"。
  4. 註冊的標記項 label 爲空,會出現在面板列表的「更多」菜單和無障礙樹裏,是一個空項。
  5. 面板少於 2 個時左側封頂邏輯不生效,因爲沒有兄弟行可判定。
  6. 高度小於 60px 的被裁容器不處理,閾值內是滾動條比內容還高的區域,修了反而更糟。
  7. 開發時改完 client.js,刷新頁面即可生效,不需要重啓 DSH。

驗收與開發

插件包是 link: 安裝到 profile 的,相關文件都在 client.js,通過 window.__ModuleLoader__.load({ id, factory }) 暴露 apply/inject。兩種驗證方式都不需要裝進 DSH:

node tests/smoke.mjs

這條命令用無依賴的冒煙測試裝載 client.js,跑 apply()/註冊/銷燬。瀏覽器驗收頁 tests/harness.html 復刻了 shell 骨架,打開後底部打印 HARNESS PASS。也可以用無頭 Edge 跑一遍並截圖:

msedge --headless=new --disable-gpu --window-size=1400,900 \
  --screenshot=harness.png tests/harness.html

卸載

dsh plugin --profile <你的 profile> remove dsh-panel-scroll

或者在 Plugins 頁面把 dsh-panel-scroll 關掉或卸載。插件全部效果都走注入的樣式表加類名,卸載時樣式表移除、加過的類在 dispose() 裏清掉,不殘留。README 提到 0.2.2 及更早版本曾用內聯樣式,卸載後左欄會保持封頂直到刷新,0.2.3 起修正。

小結

dsh-panel-scroll 的價值不在新功能,而是把兩個沒有配置項可用的界面問題在 DOM 層補掉:左欄封頂滾動、右欄解除裁剪。改動面小、回退也乾淨,適合需要面板列表更緊湊、又希望右側長內容可滾動的人。目錄頁 https://www.skillhub.cn/plugins/gusong1729/dsh-panel-scroll ,源碼 https://github.com/gusong1729/dsh-panel-scroll 。

說明:社區目錄是獨立站點,與 DeepSeek / 幻方無官方從屬關係,不是官方應用商店。

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

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

小夜