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

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

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

小夜