dsh-runner
给 DeepSeek Harness(DSH) 的对话输入框正下方加一个低调的「▶ 运行」小按钮:点击选择命令,在 DSH 自带的右侧栏终端里执行,输出实时滚动。命令可以在 设置弹窗的「dsh-runner」页里增删改查、排序、启停,并选择「全局」或「仅某个项目」显示。
适用于 DSH 0.2.1 线(
0.2.1-rc.2实测)。插件依赖 DSH 的内部客户端服务,升级 DSH 后可能需要适配,见文末「版本风险」。
一键安装
方式 A:DSH 界面(推荐)
侧栏 插件 → 添加插件(Add plugin)
选择 Install a third-party plugin
粘贴:
github:lcx19970714/dsh-runner安装后,进入任意会话,输入框卡片正下方出现「▶ 运行」。
方式 B:命令行(桌面版需先完全退出 DSH)
dsh plugin --profile desktop add github:lcx19970714/dsh-runner
其它 profile 把 desktop 换成对应名字。
方式 C:本地开发
git clone https://github.com/lcx19970714/dsh-runner
dsh plugin --profile desktop add file:<仓库绝对路径>
按钮在哪 / 长什么样
- 位置:对话输入框卡片正下方(DSH 的
conversation.composer.dock槽位,和输入框下方的状态胶囊同一行); - 样式:按钮只有「▶」图标 + 「运行」两个字,无外边框、无胶囊底色(默认透明,悬停才显示淡背景),不占额外高度、不遮挡对话和输入框;
- 点击:向上展开命令菜单(按当前项目过滤、显示运行中绿点、关闭本会话终端、管理命令、更新状态与 GitHub 入口);
- 有新版本时按钮上会有一个小橙点;
- 运行结果(启动中/运行中/失败)以小字显示在按钮右侧,6 秒后自动消失。
不再有浮动按钮、拖动和位置记忆——按你的要求改成了「简单一点,放在输入框下面」。
配置页面在哪?
DSH 左下角 设置(Settings)弹窗 → 左侧导航新增一页 「dsh-runner」。
(技术实现:注册到 DSH 设置页的 settings.section 槽位,每个条目就是一页,不需要改 DSH 源码。)
也可以从「运行」菜单的 「管理命令…」 直接打开同一套配置(弹窗形式)。
配置页能做:
| 操作 | 说明 |
|---|---|
| 新增命令 | 名称、工作目录、命令(PowerShell 固定文本)、终端标题(可选) |
| 编辑 / 删除 | 点击命令行即可编辑;删除前需二次确认 |
| 排序 | 行内上移 / 下移,决定菜单里的顺序 |
| 启用 / 停用 | 停用的命令不在菜单里出现,但保留配置 |
| 作用域 | 全局:所有项目都显示;指定项目:从下拉列表选择 DSH 工作区(或自定义路径) |
| 中文命令 | 勾选「先执行 chcp 65001」避免 Windows PowerShell 5.1 中文乱码(输入含中文时自动勾选) |
| 运行按钮 | 显示 / 隐藏输入框下方的按钮 |
| 备份 | 导出配置 JSON、导入配置 JSON、恢复内置的 4 条命令 |
界面是紧凑的列表 + 内联表单,不再是多张留白很大的卡片:顶部是命令统计和「运行按钮」开关,列表中一行一条命令,编辑时在列表上方展开表单。
全局 vs 项目作用域
- 全局:任何会话都能看到这条命令。
- 指定项目:只有当前会话所属的工作区路径等于所选项目,或位于它下面(子目录)时,命令才出现在菜单里。
- 项目直接从下拉列表选择(来自 DSH 侧栏已经添加的工作区,例如
Limob-windows · H:\Limob-windows),不需要手输路径;如果项目尚未注册到 DSH,可选「自定义路径…」手动填写。 - 不在会话里时菜单只显示提示(运行命令需要会话)。
让 AI 直接帮你加启动命令(0.6.0+)
装好后,AI 侧多了一个工具 dsh_runner_config。在任何项目的会话里直接说:
- 「给当前项目加一个启动命令:
pnpm dev,名字叫启动开发服务器」 - 「给这个项目加一个
cargo check命令」 - 「把启动开发服务器改成
pnpm dev:web」 - 「删除启动开发服务器」
- 「加一个全局命令:打开记事本」
AI 调用工具时的默认行为:
- 作用域 = 当前项目(project),项目路径 = 当前会话的工作区,不需要你手写
H:\...; - 工作目录 = 项目路径(除非显式指定
cwd); - 命令里含中文时自动勾选 chcp 65001;
- 只有你明确说「全局」时才会创建全局命令。
保存后不需要重启 DSH:打开输入框下方的「运行」菜单,或进入设置页「dsh-runner」,插件会自动从 Host 同步;设置页底部也有「同步宿主」按钮可手动刷新。
配置由 Host 统一保存到:
C:\Users\main\.dsh\dsh-runner\commands.json
(可用环境变量 DSH_RUNNER_CONFIG 指向别的路径;AI 也可以用普通文件工具直接读写这个 JSON。)
如果没有 Host(例如离线/旧版),浏览器会自动退回 localStorage。
工具只负责保存配置,不会直接执行命令;真正运行仍需你在菜单里点一下,避免 AI 直接跑危险命令。
默认自带 4 条 全局 命令:
| 名称 | 工作目录 | 命令 |
|---|---|---|
| 开发调试 | H:\Limob-windows |
pnpm 客户端-调试 |
| Rust 检查(cargo check) | H:\Limob-windows\src-tauri |
cargo check |
| 快速构建(tauri build --debug) | H:\Limob-windows |
pnpm exec tauri build --debug --no-bundle |
| 正式构建(pnpm 构建桌面端) | H:\Limob-windows |
pnpm 构建桌面端 |
旧版升级上来的用户会自动得到这份默认配置;之前的终端复用记录(dsh.limob-runner.v1)继续兼容。旧配置里的 ui.floating 字段会被自动忽略。
运行与终端
点击命令后:
- 通过
remote.terminal在 Host 侧创建 PTY(标题默认Limob-<命令 id>,可在配置里改); - 优先
pwsh(退回 Windows PowerShell),并把%USERPROFILE%\.cargo\bin拼到 PATH 最前面; - 命令前可自动执行
chcp 65001(中文命令); - 自动展开右侧栏并打开 DSH 内置
terminal页签,实时显示输出。
重复点击同一命令:
- 该命令终端还在运行 → 聚焦已有页签并提示「已在运行」,不重复启动;
- 终端已退出(构建完成/失败)→ 关闭旧终端释放配额,再新建重跑;
- 想重跑「shell 还在、但上一条命令已结束」的命令:先点「关闭本会话的运行终端」,再点命令。
「关闭本会话的运行终端」会关闭当前会话里由「运行」打开的终端(等价于逐个点终端页签的 ×),正在运行的命令会一并结束;菜单里会显示可关闭的终端数量,没有终端时该菜单项是禁用状态。
更新提示
插件内建 GitHub Releases 检查(10 分钟缓存,打开菜单时可点小圆点手动检查):
菜单底部只有一个小圆点 + 版本号(不单独占一个菜单项);有新版本时圆点变橙色并显示最新版本号,点击打开 GitHub Release;
菜单右下角的 GitHub 图标按钮可以直接打开仓库;
按钮本身也会在发现新版本时显示小橙点,DSH 插件页本插件详情会出现「可更新」徽标与升级说明;
升级方式:DSH 插件页卸载后用
github:规格重装,或退出 DSH 后执行:dsh plugin --profile desktop add github:lcx19970714/dsh-runner为什么不做静默自动升级:安装要写 profile、跑 pnpm、重新组合,属于 DSH Host/插件管理器的权限;自动升级也会绕过用户确认。
维护者发版:同时改 package.json 与 client.js 的 PLUGIN_VERSION(scripts/smoke.mjs 会校验一致)→ commit → git tag vX.Y.Z → git push --tags → gh release create vX.Y.Z --generate-notes。仓库 contrib/github-workflows/ 里有可选的 Actions 模板。
数据与回退
- 配置:Host 侧
C:\Users\main\.dsh\dsh-runner\commands.json(主数据);浏览器localStorage["dsh.limob-runner.config.v1"]作为缓存/离线兜底 - 终端复用记录:
localStorage["dsh.limob-runner.v1"] - 更新缓存:
localStorage["dsh.limob-runner.update.v1"]
以上都是本机本地数据,删掉只会丢失自定义命令/按钮开关,不会影响 DSH 其它功能。卸载插件后如需彻底清理,删除 commands.json 和这三个 localStorage 键即可。
实现与版本风险
- 客户端插件与 DSH 内置 UI 插件在同一个 Cordis 根 Context 中运行,可访问
remote.terminal、webTerminals、sidebarRight等客户端服务。 - 运行按钮:
conversation.composer.dock(输入框卡片下方的环境条目槽位)。 - 配置页:
settings.section(设置弹窗的页面列表,每个条目一页)。 - 更新提示:
plugins.detail.badge/plugins.detail.section(插件页详情扩展点)。 - 终端:
remote.terminal.create/list/attach/rename/close+sidebarRight.openTab("terminal",{params:{terminalId}})。 - 这些是 DSH 内部接口(非官方承诺稳定的插件 API)。所有调用都有能力检测与 try/catch,失败只影响对应提示,不影响聊天;DSH 升级后如功能异常,按上表对照新版本
app.asar中的包修正。
开发与测试
node --check index.js
node --check client.js
node --check host-config.js
node scripts/host-smoke.mjs
node scripts/smoke.mjs
scripts/smoke.mjs 在 Node 里用假的 window.__ModuleLoader__ / react / ctx 执行 client.js,并测试:4 个 slot 注册、配置默认值与作用域匹配、GitHub 更新检查(mock fetch/localStorage)、最小 props 下的组件首次渲染。
scripts/host-smoke.mjs 用临时目录测试 Host 侧 commands.json 的读写和 AI Tool 的 create/update/delete 核心逻辑。
No comments yet. Be the first to write one.