chumoe/dsh-file-manager:給 DSH 側欄換一個能編輯的工作區文件管理器

前言

用 DSH 寫代碼時,右側邊欄的「工作區文件」面板通常只能列目錄、點開看一眼。要看一個 Markdown 的實際渲染效果,得先把文件內容粘進對話;要改一個文件,得把內容整段貼出來再讓智能體寫回;要壓縮、解壓、打包上傳,基本只能退回終端。目錄一深,還得在路徑裏反覆點上級。

這個插件針對的就是這些環節。

這是什麼

chumoe/dsh-file-manager 是一個 DSH 客戶端插件,維護者是 chumoe,分類爲「客戶端」。它替換 DSH 右側邊欄裏 Workspace Files 面板的主體與標題,提供瀏覽、預覽、編輯、新建、重命名、複製、移動、刪除、壓縮、解壓、上傳、下載,並把文件以真正的 composer chip 交給對話。

它的做法不是打補丁:自帶的 @deepseek-ai/dsh-client-ui-sidebar-files 面板是隻讀列表,這個 bundle 往同一批插槽鍵上以 priority: -10 註冊了替代項。插件啓用時它勝出,禁用時原來的面板回來,沒有任何文件被改掉或刪除。

基本前提:Node ≥ 22,另外壓縮、解壓、目錄打包下載依賴系統裏的 zip、unzip、tar。插件沒有配置項——沒有任何設置要填。

核心功能

目錄瀏覽

一次只看一層目錄,列表始終是當前文件夾的子項,麪包屑和列表不會互相打架。進入文件夾可以雙擊、按 Enter、點行首箭頭或點麪包屑,ArrowLeft 回到上級;單擊只選中,不會把指針底下的列表換掉。Ctrl/Cmd 與 Shift 多選,選中後出現的操作條放在列表下方,選中一行不會把行挪走。

搜索是唯一一個跨目錄的模式:在已加載的所有目錄裏過濾,保留命中項的祖先層級,以縮進樹呈現。工具欄的跳轉菜單可以切換面板根目錄,會話工作區、家目錄、桌面 / 下載 / 文檔、/tmp 和 / 都在列表裏,任何絕對路徑也都能用,所以面板不會被困在單一工作區裏。

預覽與編輯

圖片、PDF、視頻、音頻、文本在面板內內聯預覽,其他二進制回落到元信息加一個下載按鈕。

Markdown 走宿主自帶的渲染器——與對話正文同一個組件,標題、列表、表格、任務清單、引用塊和高亮代碼圍欄與消息裏的一致,工具欄開關可把單個文件切回高亮源碼。相對路徑的圖片按該文件所在目錄解析;超過 200 KB 的文檔直接停在源碼視圖,避免卡住面板。

HTML 渲染在 sandbox="" 的框架裏:樣式和圖片顯示,腳本、表單和跳轉被瀏覽器本身拒絕;相對的 src/href/poster 被改寫到帶鑑權的下載路由,根絕對路徑保持原樣。

預覽和編輯器都帶行號,語法高亮不依賴第三方庫,內置分詞器覆蓋 C 系語言、Python/Ruby/Shell/Lua、YAML/TOML/INI、SQL、CSS/SCSS/Less、JSON、HTML/XML/Vue/Svelte 和 Markdown,配色用主題別名跟隨明暗主題;超過 80 KB 的文件回退成純文本。編輯在高亮層上進行,用透明 textarea 同步滾動,Ctrl+S 保存,Tab 插入兩個空格;文件被外部改動時彈出衝突提示而不是靜默覆蓋,超過 2 MB 文本上限的文件以只讀打開。

文件操作與右鍵菜單

新建文件、新建文件夾、重命名(F2)、刪除(Del)、複製 / 剪切 / 粘貼(Ctrl+C / X / V)都有。上傳支持文件和整個文件夾,拖放也可以;下載按 blob 取得再經同源錨點保存,Web UI 掛在網關前綴後面時同樣可用。可以下載單個文件、整個文件夾(打包成 zip)或一次多選(打成一個 zip);壓縮支持 ZIP 與 tar.gz,解壓 ZIP / tar / tar.gz 到壓縮包旁邊。

右鍵菜單覆蓋目錄樹、預覽、編輯器三處,不適用項直接不顯示而不是置灰——沒有選中就沒有複製,剪貼板不可用就沒有粘貼。菜單提供複製相對路徑、複製絕對路徑、複製文件名,多選時一行一個路徑。

加入對話的 chip

「加入對話」生成的是與 @ 選文件一樣的 composer chip。整篇草稿通過草稿快照 {text, references} 重寫,這是讓 composer 重建 chip 節點的唯一途徑;已有 chip 隨編輯整體位移,所以先前加入的文件不會消失。光標區間在拼接前會做座標換算,若結果仍會被 composer 拒絕,整次編輯會重新規劃一遍,所以第二次加入不會插進第一個 chip 內部。目錄樹下方還有一排 chip 風格標記,鏡像當前已附加到對話的每個文件——composer 把點擊 chip 當作「打開文件」而不是「移除」,所以這裏纔是移除入口。

安裝與啓用

插件沒有發佈到 registry,安裝路徑就是本地目錄或 clone 後的 checkout。--profile 必填,且必須放在 add 之前;瀏覽器界面用 web。

從本地目錄安裝:

dsh plugin --profile web add /absolute/path/to/dsh-file-manager

或者用插件管理工具,效果相同,並會把 bundle 登記進 profile:

plugin_manager  action: install_bundle  target: /absolute/path/to/dsh-file-manager

從 GitHub 安裝,先 clone 再加入 checkout:

git clone https://github.com/chumoe/dsh-file-manager.git
dsh plugin --profile web add "$PWD/dsh-file-manager"

兩種方式都會加依賴並把 bundle 登記到 dsh.profile.bundles,剩下只需重啓。重啓 Web UI(或讓 HMR 接上),打開右側邊欄 → Workspace Files 即爲替換後的面板;在插件列表裏移除或禁用 dsh-file-manager 即恢復自帶面板。

典型用法

面板打開在會話的工作區目錄,也可以從工具欄的「更多操作 → 跳轉到」改名根目錄。在目錄裏選中幾張照片後點「加入對話」,它們會作爲 chip 出現在輸入框,發送後智能體拿到的是文件引用而不是一段路徑文本。

要在面板裏改一個配置文件:打開 .yaml 或 .toml,源碼視圖帶高亮與行號,改完 Ctrl+S 保存;如果同時在終端裏改過同一個文件,面板會彈出衝突提示而不是覆蓋。想恢復原面板,在插件列表裏禁用這個 bundle 即可。

適用場景與注意

適合自己跑 DSH、希望在瀏覽器界面裏直接完成查看與修改的操作者,尤其是需要頻繁在多個工作區、下載目錄、日誌目錄之間切換的場景。

需要注意的幾點:

  • 插件以當前 DSH 進程的權限運行,路由通過 ctx.connection.fetch.register 註冊,繼承 Host 的登錄 Cookie、Origin 與 Host 校驗。它能把任何存在的絕對目錄打開爲根目錄,這是設計上的本機優先取捨,也意味着它不是一道安全邊界。
  • 根目錄以下仍然受限:相對路徑會規範化(空、.、.. 段拒絕,反斜槓統一,前導 / 剝掉),符號鏈接目標會被 realpath 檢查,結果必須仍在根內。上傳自動取唯一文件名,寫入是臨時文件加原子 rename,文本 / HTML / JS 下載強制 text/plain + nosniff 並加 CSP: sandbox。
  • 服務端的限額只用於防止面板意外卡死:JSON 請求體 32 MB,面板內可編輯文本 32 MB,單次目錄返回 20000 條(超出會返回 truncated),上傳 8 GB。
  • 安裝前建議先覈對源碼與許可證(MIT)。壓縮與解壓功能依賴系統的 zip、unzip、tar,缺失時這些操作不可用。

小結

這個插件的價值在於把「看一眼、改一改、打包帶走」這些文件操作留在側欄裏完成,而不是繞到終端或把內容反覆貼進對話。它不修改宿主文件,卸載即恢復原面板,沒有配置項,維護者的 README 對安全模型和路由做了完整說明。

目錄頁:https://www.skillhub.cn/plugins/chumoe/dsh-file-manager
GitHub:https://github.com/chumoe/dsh-file-manager

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

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

小夜