packages/dsh-task-board
zhu1090093659/dsh-web侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
为聊天输出中的文件引用添加右键菜单,列出系统关联应用(带图标)供选择打开,在文件管理器中定位文件,并复制基于会话工作区解析的绝对或相对路径;代码块、普通文本与外部链接保持原生菜单。
DSH 文件引用右键菜单插件 —— 在 DSH 聊天输出里的文件路径上右键,直接用本机应用打开、在文件管理器中定位,或复制绝对/相对路径。
DSH 助手经常在回复里引用项目文件(行内代码路径、文件 chip、dsh-resource:// 链接),但原生右键菜单对它们无能为力。本插件接管这些文件引用的右键事件,弹出一个原生风格的浮层菜单;代码块、普通文本、外部链接不受影响。

| 菜单项 | 行为 |
|---|---|
| 用 <应用> 打开(标注「默认」) | 用系统默认关联应用打开文件(带应用图标) |
| 用 <应用> 打开 | 本机所有注册了该文件类型关联的应用(带图标,逐项列出) |
| 显示文件位置 | 在系统文件管理器(Finder / 资源管理器)中定位该文件 |
| 复制绝对路径 | 复制 <当前会话工作区>/<相对路径> |
| 复制相对路径 | 复制相对于当前会话工作区的路径 |
<a href="dsh-resource://file/session/<id>/<path>"> 资源地址链接[data-file-path] 显式标记<button title="<path>">(含带图标的行内引用 chip)<code>:全文恰为文件路径(容忍 :行号 / -行号 后缀)代码块(<pre><code>)、普通文本、外链一律保持原生右键菜单,不会被劫持。
DSH Desktop 的插件即 profile 的 pnpm 依赖,直接用桌面内置 CLI 从 GitHub 安装:
DSH_HOME="$HOME/Library/Application Support/dsh-desktop/harness"
"$DSH_HOME/.desktop-bin/node" \
"/Applications/DSH Desktop.app/Contents/Resources/app.asar.unpacked/node_modules/@deepseek-ai/dsh/lib/bin.js" \
plugin --profile web add --save-exact github:XcodeFish/dsh-file-link-menu
https://github.com/XcodeFish/dsh-file-link-menu(或 git+https://…),效果相同github:XcodeFish/dsh-file-link-menu#v1.0.0(tag)或 #<commit> 可锁版本@codefisher798/dsh-file-link-menu),可省事为:plugin --profile web add @codefisher798/dsh-file-link-menu安装完成后重启 DSH Desktop 生效(client bundle 按文件 mtime 生成 rev 并版本化缓存,不重启不会重载)。
本插件纯 ESM、零依赖、无
prepare构建脚本,不会触发 pnpm 的allowBuilds审批,装完即用。
plugin_managerplugin_manager install_bundle(target="github:XcodeFish/dsh-file-link-menu")
或在 DSH NEXT 里「设置 → 插件 → 添加插件」填入 github:XcodeFish/dsh-file-link-menu。
同样接受 https://github.com/<用户名>/dsh-file-link-menu、release 资产的 .tgz 地址、npm 包名或本地绝对路径;#v1.0.0(tag)或 #<commit> 可锁版本。
plugin_manager install_bundle(target="<本仓库绝对路径>")
或 DSH Desktop CLI:
"$DSH_HOME/.desktop-bin/node" \
"/Applications/DSH Desktop.app/Contents/Resources/app.asar.unpacked/node_modules/@deepseek-ai/dsh/lib/bin.js" \
plugin --profile web add /path/to/dsh-file-link-menu
本地路径安装会以 file: 依赖形式写入 profile(与 DSH 内置插件的源码调试方式一致),改完代码重启即可看到效果。
"$DSH_HOME/.desktop-bin/node" \
"/Applications/DSH Desktop.app/Contents/Resources/app.asar.unpacked/node_modules/@deepseek-ai/dsh/lib/bin.js" \
plugin --profile web remove dsh-file-link-menu
卸载后重启 DSH Desktop。
装好并重启后,在聊天输出里对文件路径右键:
打开与定位均通过 Session Remote 由 Host 执行,Host 端会对路径做二次校验(仅限当前会话工作区内的文件)。
immediately: true 只让脚本被加载并注册 factory,不等于执行 apply()。本插件注册空 slot(conversation.session.header.utilities / conversation.composer.dock)作为消费者。session.workspacePathApplications({path}) 查关联应用,session.openWorkspacePath({path, application}) 打开、{path, action: 'reveal'} 定位。fileMention / fileLink 可能被构建 hash 化),判据以 title 与文本为准。document.body,position: fixed + 高 z-index,并按视口边界收敛坐标。node --check client.js
node self-test.mjs
预期输出:
button[title] right-click -> intercepted | menu: built (7 blocks)
inline code (no path) -> left to native menu (ok)
ROUND TRIP OK — menu build path no longer throws
self-test.mjs 是一个最小 DOM-stub 测试床:加载 client.js、执行 factory + apply()、合成一次右键事件,覆盖「菜单构建」与「判据放行」两条主路径,无需浏览器。
| 文件 | 作用 |
|---|---|
package.json | bundle 清单:dsh.bundle.patch + dsh.client(platform: web, immediately: true) |
cordis.patch.yml | 组合行:insert: id: file-link-menu, name: dsh-file-link-menu |
index.js | host 半边(空 apply;渲染与交互全在 client 半边) |
client.js | 浏览器半边:右键监听 + 自绘浮层菜单 + Session Remote 调用 |
self-test.mjs | 本地 DOM stub 自测(node self-test.mjs) |
web profile,含 0.10.x)/ DSH NEXTworkspacePathApplications 只返回系统注册过的应用)。MIT © 2026 饮冰 (XcodeFish)