dsh-runner: Centralized Management of Development Services' Run Panel in DSH

前言

在 DeepSeek Harness(DSH)里做全栈或前后端分离项目时,常见做法是:后端起一个 uvicorn 或 npm run dev,前端再起一个 Vite,还要记得端口别冲突、依赖谁先谁后。若这些都放在 DSH 自带终端或聊天里随手敲命令,进程是否还在跑、日志在哪、端口是否被旧实例占住,往往要再切到 VS Code 的「运行与调试」或单独开一个终端窗口核对。

dsh-runner 是社区维护的 DSH 客户端插件(维护者 lcx19970714,GitHub:lcx19970714/dsh-runner),目标是在 DSH 内提供接近 VS Code 任务运行器那一半的体验:服务启停、状态、输出、端口与依赖编排;不含断点与单步调试(那需要 DAP,属于另一量级)。适用于 DSH 0.2.1 线(README 注明 0.2.1-rc.2 实测);package.json 中 engines.dsh 为 >=0.2.1-0 <0.3.0-0,当前插件版本 0.17.1,许可证 MIT。

这是什么

一句话:给 DSH 增加项目级「运行」面板——在客户端左侧导航打开 「运行」,按工作区分组查看并启动/停止/重启多条开发命令,看状态、端口徽标和日志;输入框下方仍保留紧凑的 「▶ 运行」 快捷菜单(启停重启与日志入口)。完整配置与 AI 侧维护则通过 Host 上的 commands.json 以及工具 dsh_runner_config、dsh_runner_run 完成。

社区目录页:https://www.skillhub.cn/plugins/lcx19970714/dsh-runner(SkillHub 为独立插件目录,与 DeepSeek / 幻方无官方从属关系)。

核心功能

下面介绍面板与 Host 侧已文档化的能力,均来自仓库 README。

「运行」面板

左侧 运行 打开的是全部项目视图(不依赖当前会话项目):所有工作区里的命令与运行状态在一页展示。

  1. 按项目分组:每条命令按 projectRoot 归组;标题显示工作区名(找不到时用路径末段)、完整路径、「当前」标记和运行计数。
  2. 分组可折叠:折叠状态写入 ~/.dsh/dsh-runner/ui-state.json,跨会话与 Host 重启保留。
  3. 本组启停:每组有「本组启动 / 本组停止」,按该项目 dependsOn 拓扑序执行。
  4. 全局命令:scope: global 的命令带「全局」标签;无当前项目会话时单列「全局命令」。
  5. 状态轮询:运行中 / 启动中 / 停止中 / 外部运行中 / 未运行等状态一目了然;顶部支持启动全部、停止全部、刷新、管理命令。
  6. 日志:点某行命令,下方显示该命令日志(每秒轮询,自动贴底;可清空、复制)。

配置里已删除但仍在运行的命令/项目仍会显示,避免「删配置就看不见进程」。

端口契约

对声明了 ports 的命令,插件按严格契约处理,而不是仅作提示:

  • 启动前检查 IPv4 + IPv6 监听者,占用则 port-conflict。
  • 启动后校验端口是否由本次启动的进程树监听;若命令静默换端口(例如 Vite 从 5174 改到 5175),判为 port-mismatch 并终止进程,行内显示声明端口与实际/未绑定徽标。
  • 同一 projectRoot 或全局作用域内端口不可重复声明;不监听端口的构建/检查类命令应保持 ports: []。
  • 约每 6 秒诊断:非托管进程占用声明端口时,行内可显示「外部运行中」等,并提供「结束并启动」等入口(托管进程不能从端口入口直接杀,需先停对应命令)。

AI 工具

Host 提供两个 Tool,便于在对话里维护配置与操作进程:

工具 作用
dsh_runner_config 配置的 list/create/update/delete/reorder,支持 env、ports、readyPort、readyTimeoutMs、dependsOn
dsh_runner_run status / start / stop / restart / startAll / stopAll / diagnose / log

Tool 说明要求:长驻服务用 dsh_runner_run,不要用终端工具——终端起的进程没有托管状态、日志与端口诊断,关会话还可能残留。

示例说法(README 原文意图):「给这个项目加一个启动后端……端口 8001,就绪端口 8001」「把网页端改成依赖后端,端口 5174」「启动所有项目服务」「有哪些端口被不在插件里的进程占了」。

生命周期与数据

  • 进程归属项目,与会话无关;Host 为状态唯一来源。
  • DSH 或插件重载/升级不会因此杀掉已托管进程;重启后用 pid + 命令行标记接管仍在运行的进程。
  • 数据位置(README 以 Windows 用户目录为例,实际为 DSH 配置下的 dsh-runner 目录):
  • 配置:commands.json(模型 version 2)
  • 运行状态:runner-state.json
  • 日志:logs\<项目hash>\<命令id>.log(追加写入,不轮转)

安装与启用

推荐在 DSH 侧栏 插件 → 添加插件 → Install a third-party plugin,粘贴:

github:lcx19970714/dsh-runner

桌面版也可用命令行(需先完全退出 DSH):

dsh plugin --profile desktop add github:lcx19970714/dsh-runner

装好后进入项目会话,左侧导航会出现 「运行」 图标。本地开发插件时使用 file:<仓库绝对路径> 添加,README 中有说明;正文任务要求不展开 git clone 步骤。

安装前建议自行查看仓库源码与 MIT 许可证;插件以当前 DSH Host 进程权限执行命令,配置中的 command 会交给 PowerShell 运行。

配置模型 commands.json

Host 是唯一配置源。README 示例路径为 C:\Users\main\.dsh\dsh-runner\commands.json;字段以 version 2 为准。节选结构如下:

{
  "version": 2,
  "ui": { "visible": true },
  "commands": [
    {
      "id": "cmd-xxxx",
      "title": "调试后端",
      "command": "python -m uvicorn main:应用 --host 127.0.0.1 --port 8001 --reload",
      "cwd": "H:\\AI达人BD系统-海外版\\后端",
      "scope": "project",
      "projectRoot": "H:\\AI达人BD系统-海外版",
      "enabled": true,
      "env": { "APP_ENV": "dev", "APP_PORT": "8001", "PYTHONUNBUFFERED": "1" },
      "ports": [8001],
      "readyPort": 8001,
      "readyTimeoutMs": 120000,
      "dependsOn": []
    }
  ]
}

常用字段:title / command(显示名与 PowerShell 命令)、cwd、scope(project | global)、projectRoot、env、ports、readyPort、readyTimeoutMs(1000–1800000,默认 120000)、dependsOn(依赖的其他命令 id)。旧版 0.10/0.11 的 commands.json 可读,未知字段会被忽略;要启用端口预检与就绪等待,需补上 ports / readyPort。

面板内「管理命令」与 AI 的 dsh_runner_config 均可维护该文件;默认 projectRoot 对应当前会话工作区。

典型用法

  1. 安装插件,打开左侧 运行,确认当前项目分组出现。
  2. 通过管理命令或对话让 AI 写入后端、前端两条命令,前端 dependsOn 指向后端 id,并声明真实监听的 ports 与 readyPort。
  3. 使用「本组启动」或「启动全部」,观察状态点与端口徽标;点行查看日志。
  4. 若提示端口被占用,按对话框查看占用进程信息,选择结束占用后启动,或先在面板停止托管实例。

经过上面的步骤,日常 dev server 可在 DSH 内完成,而不必仅为「跑起来」单独开 VS Code 任务面板;需要断点调试时仍应使用 VS Code 或专用调试器。

适用场景与注意

适合:在 Windows 上用 DSH 0.2.1 线开发,希望把多服务启停、依赖顺序、端口一致性收拢到一个面板,并让 Agent 通过 dsh_runner_* 工具代劳配置与操作。

务必知晓的限制(README「限制与版本风险」):

  • 仅支持 Windows + PowerShell(Host 使用 taskkill、Get-CimInstance 等)。
  • 日志为文件轮询视图,非交互终端:无 stdin、无 Ctrl+C、无 ANSI 颜色;需要交互时用 DSH 终端,但长驻服务建议本插件托管。
  • 依赖 DSH 0.2.1 内部客户端槽位(如 sidebar.panellist、settings.section)与 Host RPC;升级 DSH 后可能需要插件适配。
  • engines.node 要求 >=22。

结尾

dsh-runner 把「在 DSH 里跑 dev server」从散落的终端命令,收成可配置、可诊断、可被 AI 操作的项目级运行面板;若你已在用 DSH 做智能体开发,值得在 SkillHub 目录页或 GitHub 仓库核对版本与说明后再安装。

  • 目录页:https://www.skillhub.cn/plugins/lcx19970714/dsh-runner
  • 仓库:https://github.com/lcx19970714/dsh-runner
羽毛球分组比赛记分
小程序二维码

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

Xiaoye