前言¶
在 DeepSeek Harness(DSH)Web 客户端里,侧边栏「工作区文件」树是日常改代码、看目录的主入口。浏览器自带的右键菜单往往只有复制、检查之类,无法直接在工作区里建文件夹、重命名或把路径交给本机编辑器。要么切到终端或资源管理器,要么自己写脚本调 Host API,打断节奏。
dsh-menu 是维护者 tangu2023 发布的客户端插件,专门给这棵树挂一套自定义右键菜单,把常见文件操作收进侧边栏。实现上是纯前端 UI 加 Host 路由,无第三方依赖、无构建步骤,适合已经跑起 DSH Web GUI、又希望少切窗口的开发者。
这是什么¶
dsh-menu(npm 包名 dsh-menu,仓库 tangu2023/dsh-menu)面向 DSH Web 客户端侧边栏的「工作区文件」树:在文件或文件夹行上右键时,拦截浏览器默认菜单,改弹插件自绘菜单。Host 半区负责重命名、建目录、删除、打开、下载等文件系统操作;Client 半区只发 JSON 请求并展示交互。当前公开版本为 1.0.2,许可证 MIT。插件索引见 SkillHub 目录页;社区插件目录与 DeepSeek / 幻方无官方从属关系,安装前仍建议自行查看源码与许可证。
核心功能¶
右键任意 [data-files-entry] 树行后,菜单项顺序与 README 一致,共八项:
- 新建文件夹:内联输入;点在目录行则在其内部创建,点在文件行则在父目录创建。
- 重命名:内联编辑当前名称(仅改名,不移动)。
- 在文件管理器中显示:走官方
remote.session.openWorkspacePath({ action: "reveal" }),在系统资源管理器中定位。 - 在浏览器中打开:文件原样返回内容;目录渲染为可浏览的 HTML 列表(HTML 响应带 CSP sandbox)。
- 在 VS Code 中打开:解析本机 VS Code 并打开文件或目录(Windows 为主要实测平台;macOS / Linux 有候选路径回退)。
- 复制文件路径:把工作区路径写入剪贴板。
- 下载文件夹 / 下载文件:目录流式打包 ZIP;单文件直接下载。
- 删除:菜单项为危险样式,点击后二次确认再执行递归删除。
交互上,重命名与新建共用内联表单,支持中文输入法组合输入、Enter 提交、Esc 取消;操作结果有 toast;点击外部、滚动或缩放窗口会关闭菜单。文案随界面语言在 zh / en 间切换。
Host 侧路由统一挂在 /api/workspace-files-menu/* 命名空间,例如重命名、建目录、删除为 POST;浏览器打开与下载为 GET。所有操作先做会话工作区根路径校验,越界返回 403;对工作区根目录的删除一律拒绝。
安装与启用¶
前置:已部署并运行 DeepSeek Harness(含 Web GUI);宿主进程需能运行 Node.js 与 pnpm。
推荐从 npm 安装(README 原文命令):
dsh plugin --profile web add dsh-menu
也可从 GitHub 或本地目录安装(后者在插件管理中选择仓库绝对路径,无需构建)。GitHub 方式示例:
dsh plugin --profile web add github:tangu2023/dsh-menu
三种方式装完后步骤相同:
- 重启 DSH 宿主进程,让 Host 半区(
index.js)重新加载;仅靠插件管理器的 enable/disable 不会重载已缓存模块。 - 浏览器 硬刷新(如
Ctrl+Shift+R),加载 Client 半区(client.js)。
卸载示例:
dsh plugin --profile web remove dsh-menu
cordis.patch.yml 由插件管理器写入 profile,请勿手工改 profile 下的 package.json / cordis.patch.yml。若 pnpm 对新包有 minimumReleaseAge 保护,dsh plugin add 会自动把 dsh-menu 加入排除列表。
典型用法¶
安装并重启、硬刷新之后,在侧边栏「工作区文件」中 右键任意文件或文件夹行 即可。无需额外配置项。
- 「新建文件夹 / 重命名」:在树行旁的内联框输入名称后确认。
- 「删除」:先进入确认面板,再点确认才会调用 Host 删除。
- 其余项点击即执行,成功或失败会有 toast。
若需直接验证 Host 路由(需替换真实 sessionId 与路径),README 给出冒烟示例:
curl -X POST http://127.0.0.1:12012/api/workspace-files-menu/rename \
-H "Content-Type: application/json" \
-d '{"sessionId":"<会话ID>","path":"D:/workspace/a.txt","name":"b.txt"}'
右键仍是浏览器默认菜单时,先硬刷新,并确认 shell.overlay 槽位存在 id 为 workspace-files-menu 的占用;Host 路由 404/500 而插件已启用时,优先重启宿主进程。
适用场景与注意¶
适合谁:长期在 DSH Web 里通过「工作区文件」树浏览、改名的开发者;希望在侧边栏完成建目录、复制路径、ZIP 下载、用 VS Code 打开,而不反复切终端或资源管理器。
架构要点:Client 在捕获阶段处理 contextmenu,仅命中工作区文件树行时接管;其它区域仍用浏览器默认菜单。插件不 patch 宿主模块,样式类名带 wfm- 前缀。与多数插件的路由、overlay 槽位互不替换,唯一需注意是若有其它插件也拦截同一树行的右键,可能出现两个菜单(README 称当前未发现此类插件)。
安全与权限:所有文件操作在 当前 DSH 宿主进程权限 下执行,路径严格限制在会话工作区内。安装插件前应阅读 index.js / client.js 与 MIT 许可证,确认符合你的部署策略。Host 仅使用 Node 内置模块,无 npm 运行时依赖;安装过程仍依赖宿主能找到 pnpm(找不到时可全局安装 pnpm 或使用 shim)。
平台:Windows 上 VS Code 打开路径较完整;macOS / Linux 的 VS Code 与其它路由在文档中描述为跨平台通用,但除 Windows 外未在 README 中逐项实机列明。
结尾¶
dsh-menu 把「工作区文件」树从只能看、只能靠浏览器菜单,扩展成一套可内联编辑、带边界校验的右键操作集,且零依赖、装完重启宿主并硬刷新即可用。需要菜单项说明、路由表与安全设计细节时,以仓库 README 为准。