右键文件引用或链接,在资源管理器或浏览器中打开
30.6/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/13 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add SJcun/dsh-right-click-menu该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-api-session-controller@deepseek-ai/dsh-client-modules@deepseek-ai/dsh-client-ui-primitives给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
README
由 DeepSeek 最新模型翻译生成dsh-right-click-menu
为 DSH Web GUI 补上鼠标右键。右键文件引用会在文件管理器中定位它,右键链接会在外部浏览器中打开,右键左侧栏的工作区项目会打开该目录。
为什么需要它
桌面壳在 Electron 主进程(lib/main.js)里构建右键菜单,且只处理两种情况:
window.webContents.on("context-menu", (_event, { isEditable, selectionText, editFlags }) => {
const items = [];
if (isEditable) items.push(/* undo, redo, cut, copy, paste, select all /);
else if (selectionText.length > 0) items.push({ role: "copy" });
if (items.length > 0) Menu.buildFromTemplate(/ … /).popup({ window });
});
items 为空就完全不弹菜单。所以在 Markdown 链接、@ 文件引用、交付卡片、右侧栏文件树行上右键,目前毫无反应。本插件在页面内接管这些右键,提供产品本身已经具备的两个能力。
展开完整文档(README 剩余 1 节)
dsh-right-click-menu
为 DSH Web GUI 补上鼠标右键。右键文件引用会在文件管理器中定位它,右键链接会在外部浏览器中打开,右键左侧栏的工作区项目会打开该目录。
为什么需要它
桌面壳在 Electron 主进程(lib/main.js)里构建右键菜单,且只处理两种情况:
window.webContents.on("context-menu", (_event, { isEditable, selectionText, editFlags }) => {
const items = [];
if (isEditable) items.push(/* undo, redo, cut, copy, paste, select all /);
else if (selectionText.length > 0) items.push({ role: "copy" });
if (items.length > 0) Menu.buildFromTemplate(/ … /).popup({ window });
});
items 为空就完全不弹菜单。所以在 Markdown 链接、@ 文件引用、交付卡片、右侧栏文件树行上右键,目前毫无反应。本插件在页面内接管这些右键,提供产品本身已经具备的两个能力。
它做什么
| 右键对象 | 菜单项 |
| HTTP(S) 链接 —— Chat/助手 Markdown、行内代码 URL | 在外部浏览器中打开 · 复制链接地址 |
| 文件引用 —— Markdown 文件链接、@path 芯片、交付卡片、文件树行、文档路径标签 | 在资源管理器中打开 · 复制文件路径 |
| 目录 —— 左侧栏工作区项目、@folder/ 芯片、文件树目录行、文件树标题 | 在资源管理器中打开 · 复制文件夹路径 |
文案跟随当前界面语言。插件在英文词典之外注册了简体中文词典(在外部浏览器中打开、在资源管理器中打开、复制文件路径、复制文件夹路径),两种语言下都通顺。
其余右键一律保持原样:可编辑区域仍用原生的撤销/剪切/复制菜单,选中文本仍用原生的复制菜单。菜单用的是共享的 Menu 原语,因此排序、键盘导航(方向键、Tab、Escape)、焦点归还、点击外部关闭、主题联动都是产品自身的行为。
截图
在中文界面下截取;文案跟随当前语言。
| 链接 | 文件引用 | 工作区项目 |
| 右键链接 | 右键文件引用 | 右键左侧栏项目 |
两个动作分别怎么实现
- 在外部浏览器中打开复用产品自己的外链跳转通路:window.open(url, "_blank", "noopener,noreferrer")。Electron 主进程拦截 _blank 开窗并交给 shell.openExternal,所以这和左键点击 Chat 链接走的是同一条路。
- 在资源管理器中打开走 Session Remote 的 session.openWorkspacePath,请求内容取决于点到的是什么 —— 与产品自己的目录控件、文件控件采用同一套区分:
- 目录直接在文件管理器中打开({ path },不带 action),所以工作区项目是"进到里面去",而不是在父目录里把它高亮一下;
- 文件在它所在的位置定位({ path, action: "reveal" }),因为"在资源管理器中打开"绝不能变成"用它的默认程序打开它"。
两种情况 Host 都会先用组合文件系统校验路径再驱动桌面,因此插件本身不碰文件系统,也无法越出该 Session 的权限。
第二行会说明目标到底是什么 —— 文件是 复制文件路径(Copy file path),目录是 复制文件夹路径(Copy folder path)。某类目标拿到哪一组行由纯函数 menuRowsFor(target, t) 决定,所以这段文案无需渲染器即可断言。
Session Remote 会把相对路径按 Host 进程目录解析,所以插件先把路径变成绝对路径 —— 取自左侧栏的 Workspace 列表(项目行只带 Workspace id)、文件树自身的 data-files-root,或主视图保留的那个 Session 的 cwd(用于工作区相对的 Markdown 链接)。
目录结构
package.json bundle + 插件声明(dsh.bundle、dsh.client) cordis.patch.yml 该 bundle 插入的唯一一行 Loader 条目 lib/index.js 宿主半侧 —— 空 apply,这是纯 UI 插件 lib/client.js 浏览器半侧 —— 全部功能 test/detection.test.mjs 零依赖测试 scripts/live-bundle.mjs 针对运行中 Host 的活体校验
lib/client.js 直接按模块系统的 factory-CJS 形态书写(window.__ModuleLoader__.load({ id, factory })),与构建产物完全一致,因此本包不需要构建步骤。它只请求 react、react/jsx-runtime、@deepseek-ai/dsh-client-ui-primitives 三个模块,三者都在外壳冻结的平台模块表内。
开发
无构建步骤、无依赖、无测试框架:
npm test # node test/detection.test.mjs
npm run check:live # node scripts/live-bundle.mjs [baseUrl]
npm test 按模块系统的方式加载 lib/client.js(平台模块以桩替代),断言 factory 形态与 slot/词典注册,然后从交付的源码里抽出 bundle 自身的纯函数段,喂给按各 DSH 界面真实渲染结构搭建的模拟 DOM —— 所以测试不会与代码的副本产生分叉。
npm run check:live 复现 Host 的 artifactRevision(对 mtimeMs/ctimeMs/size 做 framedHash),请求组合路由 /plugins/??<name>/client.js&rev=<rev>,并断言响应以磁盘上的字节开头。地址默认取 $DSH_WEB_URL,否则 http://127.0.0.1:19387;插件名与 bundle 路径都读自本包自己的 package.json。
改动 lib/client.js 无需重新构建:Host 依据文件元数据推导 bundle 版本,保存后即通过客户端 HMR 送达已打开的页面。
兼容性
针对 DSH 0.2.0-rc.2(桌面运行时,Electron Web GUI)构建并验证。
这是 Web surface 插件:它需要一个页面来挂载 document 监听器。在 headless 或 SDK profile 下根本没有浏览器半侧,因此插件是"不起作用",而不是"坏了"。
插件刻意只依赖公开的插件接口 —— ctx.slots、ctx.locale、Session Remote 的 session.openWorkspacePath、客户端 Workspace 列表,以及 dsh-client-ui-primitives 导出的 Menu/Toast/图标。这些都没有私有副本。
但检测读取的是 DSH 未作为 API 发布的标记。这些是脆弱点,全部集中在一处(lib/client.js 的 filePathOf),且全部有测试覆盖,但可能随 DSH 版本变动。右键由从指针向外逐层向上第一个命中的标记接管,因此嵌在里面的图标或文字也能归到它自己的控件:
| # | 标记 | 解析为 |
| 1 | | URL |
| 2 | data-row-key="workspace:<id>" —— 左侧栏项目行 | 目录,读自 ctx.workspaces.list |
| 3 | data-files-path / data-files-root / data-files-entry —— 右侧栏文件树 | 文件或目录 |
| 4 | data-ref-chip = file/folder、Markdown 文件链接类名,或指向绝对路径的按钮/链接 title | 文件或目录 |
本包同时也声明了它所针对运行时的 @deepseek-ai/dsh peer,因此 DSH 在未经核验的版本上会拒绝加载它,而不是弹出一个已经对不上 DOM 的菜单。若某次升级后菜单真的失效,npm test 可以定位:失败的用例会点名出问题的界面,修复点就是上表里的某一行。
安装
把包装进为该 GUI 提供服务的 profile。推荐的路径是插件管理器,它会添加依赖并把 bundle 追加进 profile 的 dsh.profile.bundles:
plugin_manager install_bundle target: <spec>
或者手工操作,在 profile 目录下:
pnpm add <spec>
然后把包名追加进 profile 的 package.json 的 dsh.profile.bundles。
<spec> 是包管理器接受的任意 bundle 来源:registry 包名(dsh-right-click-menu)、Git 地址(github:SJcun/dsh-right-click-menu)、tarball,或本地检出的绝对路径。用插件管理器安装会同时完成"加依赖"和"选中 bundle"两件事;手工安装则两件都要做。
宿主半侧在下次 Host 启动时加载,若启用了配置 HMR 则立即生效;浏览器半侧随下一次页面加载生效。无论哪种,请用 npm run check:live 确认,而不是靠猜。
停用与卸载
在 profile 的 cordis.patch.yml 给 right-click-menu 条目加 disabled: true,或从 dsh.profile.bundles 移除该 bundle。移除 bundle 会一步带走监听器与菜单 —— 不存在第二份行为残留。
验证
1. 在 Chat 消息里右键 HTTP(S) 链接 → 出现「在外部浏览器中打开」(英文 Open in external browser),并在系统浏览器中打开。
2. 右键消息里的 @ 引用文件、交付卡片或右侧栏文件树行 → 出现「在资源管理器中打开」(英文 Show in File Explorer),并在资源管理器中选中该文件。
3. 右键左侧栏的工作区项目名 → 出现「在资源管理器中打开」,并在资源管理器中打开该目录。
4. 右键消息输入框或选中的文本 → 原生菜单不变。
已知限制
- 路径按图片渲染的 Markdown 文件链接没有 title(它的悬浮提示被图片预览占用),因此只有当它自身的标签就是路径时才能识别。
- 项目行经客户端 Workspace 列表解析,因此需要已知的 workspaceId;侧栏共享的未分组桶 id 为空,刻意不提供菜单。
- 右侧栏的应用内浏览器标签页保持自身的原生行为;只有 HTTP(S) 锚点会被接管。
- 工作区相对的 Markdown 链接按主视图保留的那个 Session 的工作区解析。因此来自子代理记录、指向另一个工作区的链接,会相对于当前查看的 Session 来定位。
发布
本包通过仓库分发,而非 npm,因此 package.json 不带 private 守卫,用 Git 或 tarball 安装无需改动。repository、bugs、homepage、author 均已填好;fork 应把它们指向自己的地址。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
SJcun/dsh-right-click-menu
右键文件引用或链接,在资源管理器或浏览器中打开
相关插件 · 市场 / 管理
插件精选列表awesome-dsh-plugin/awesome-dsh-plugin
DeepSeek Harness(dsh)插件精选列表
★ 22,225未汉化DSH
73.6
新词雷达zhuyansen/new-term-radar
new-term-radar新词雷达
★ 2,049已汉化MCP
72.8
插件生态导航0xsline/awesome-deepseek-harness
安装 贡献指南 DeepSeek Docs 公开插件目录 Issues
★ 1,188已汉化DSH
72.6
技能注册中心iflytek/skillhub
企业级开源智能体技能注册中心——发布、发现并管理组织内可复用的技能包。
★ 5,370已汉化DSH
71.9
插件市场目录imsai-sh/awesome-deepseek-harness-plugins
面向 DeepSeek Harnessdsh生态的社区插件目录,共收录 13941 个插件含 PR 收录与…
★ 355已汉化DSH
71.8
插件精选清单Anil-matcha/awesome-dsh-plugin
DeepSeek Harnessdsh精选指南——DeepSeek…
★ 1,013已汉化DSH
71.7
这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。