dsh-vscode-runner: Run VS Code launch configurations in DSH Web UI

前言

DSH 的理念是「一切皆插件」。问题随后出现:智能体在聊天里把代码改完之后,开发者仍然要切回 VS Code 才能跑起来那条启动配置、看那条任务链的输出。想看日志、想往 Flutter 里敲一个 r,都得离开当前窗口。

dsh-vscode-runner 解决这个问题。它由 sinvacn 维护,把 VS Code 那套调试目录直接搬进 DSH 的 Web UI:启动配置、复合配置、任务都能在会话面板里点一下就跑起来,输出实时回显。插件不写自己的配置格式,它读的就是你 VS Code 正在读的那批文件。

它做了什么

插件的目录来源与 VS Code 一致:*.code-workspace、.vscode/launch.json、.vscode/tasks.json、.vscode/settings.json。因此不需要迁移或复制配置,现有项目直接可用。支持能力包括:

  • 启动配置、复合配置、任务三者都列出并可执行,不只是 launch.json。任务可单独运行,preLaunchTask 按 label 解析,dependsOn 链按顺序执行。
  • 同时覆盖单文件夹工作区与多根工作区。
  • 支持 VS Code 变量替换:${workspaceFolder}、${workspaceFolder:Name}、${workspaceFolderBasename}、${cwd}、${env:NAME}、${config:key}、${userHome}、${pathSeparator}、${/}。
  • 运行方式对齐集成终端:cwd、env、args、stdin、停止都支持,输出流式回显并剥离 ANSI 转义。
  • Dart 配置若未指定 deviceId,用 flutter devices --machine 取设备列表;只有一台时自动选择,多台时弹出选择器。
  • 同一个引擎额外 expose 成 agent 工具 vscode_launch,聊天里也能列、起、停、看。

安装与启用

安装命令取自插件 README,README 标注的测试版本为 DSH 0.2.1-rc.5:

dsh plugin --profile desktop add github:sinvacn/dsh-vscode-runner

也可以直接在聊天里让 agent 执行上面这条命令。装完打开 Settings → Plugins,确认 VS Code Runner 处于启用状态;如果 Session 头部没出现播放图标,刷新一次页面,桌面端不行则重启应用。

使用方式

入口是会话头部的播放图标。点开后是一个对话框,配置与任务按各自的 cwd(子项目)分组,带搜索与分类标签。键盘操作:↑ / ↓ 移动,Enter 运行,Esc 关闭。运行中的条目标绿,点一下进入 runs 视图。

runs 视图在同一个对话框里切换,不需要额外侧边栏页面:

  • 新启动的配置自动展开,输出实时刷新并剥离 ANSI;
  • 准备、运行、停止三个阶段都可以点 Stop;
  • 进程接受 stdin 时出现输入框,例如 Flutter 的 r / q;
  • Runs 页脚按钮重开当前工作区的运行历史,Back 回到配置列表。

执行过程有明确顺序。启动配置先跑 preLaunchTask,任务失败则中止启动;随后套用该配置的 cwd 与 env;进程经用户 shell 拉起,POSIX 走 $SHELL -lc,Windows 走 cmd.exe。任务则先跑 dependsOn(VS Code 默认的 parallel 顺序目前按串行执行),再套用 command / args / options.cwd / options.env。

支持的启动类型

README 提供了一张对照表,节选如下:

type 实际行为
dart flutter run -d <device>,支持 toolArgs、args、program、flutterMode
go go run / go test / mode: exec,不接 Delve
node-terminal 原样执行 command
node / pwa-node node 或 runtimeExecutable + runtimeArgs + program,--inspect-brk 会被去掉
python / debugpy python3 或 pythonPath + program / module
chrome / pwa-chrome / msedge / pwa-msedge 在系统浏览器打开 url
dotnet dotnet <program>
ruby / php <type> <program>
带 command / program / url 的任意类型 通用命令、可执行文件或浏览器打开器

带 request: attach 的配置不可运行,因为 DSH 没有实现 Debug Adapter Protocol。

工作区发现与变量

插件从所选目录向上查找工作区,顺序固定:同目录存在 .code-workspace 时直接当作工作区;否则向上回溯,只有当所选目录落在某个祖先 .code-workspace 列出的文件夹内时才采用它,无关的祖先工作区文件会被忽略,避免单文件夹项目被上层多根工作区劫持;都不命中时按单文件夹工作区读取自身 .vscode。

多根工作区的目录内容包含工作区级的 launch.configurations / launch.compounds / tasks,以及每个文件夹各自的 .vscode/launch.json、.vscode/tasks.json、.vscode/settings.json。工作区级配置里必须显式指定 ${workspaceFolder},否则该变量连同 ${workspaceRoot}、${workspaceFolderBasename} 都会按 VS Code 的行为报为无效。

需要编辑器上下文的变量(${file}、${relativeFile}、${selectedText}、${lineNumber}、${input:...}、${command:...})在无头环境里取不到值,配置仍会列出,但标示为不可运行并给出原因。

通过 agent 调用

宿主注册了 vscode_launch 工具,动作与参数如下:

{ "action": "list", "cwd": "/path/to/project" }
{ "action": "start", "cwd": "/path/to/project", "id": "launch:folder:/path/to/project:0" }
{ "action": "status", "cwd": "/path/to/project" }
{ "action": "stop", "runId": "run-3" }
{ "action": "input", "runId": "run-3", "data": "r" }
{ "action": "devices", "cwd": "/path/to/project" }
{ "action": "workspaces" }
{ "action": "session", "sessionId": "..." }

先用 list 拿条目 id,再复用它发起 start。UI 与 agent 共用同一个 Runner 实例,所以聊天里起的一条运行会出现在对话框中。

适用场景与注意

适合已经在 VS Code 里组织好 .vscode 配置、想在 DSH 里完成「改完即跑」的开发者,尤其是多根工作区与 Flutter 项目的使用者。现阶段能力边界也要看清:调试器相关的断点、单步、变量面板、attach、postDebugTask 都没有实现,go / node / Python 等类型只能跑,不能调试。

另外两点必须记住。一是插件以当前 dsh 进程的身份运行,启动配置和任务本质上就是可执行代码,只应对你信任的工作区打开并执行,运行前先审一遍 .code-workspace 与 .vscode 里的文件。二是安装前应检查源码与许可证:本插件为 MIT 许可,来源于社区目录,与 DeepSeek / 幻方无官方从属关系。注册信息方面,目录页统计的星标数为 0,作者为 Sinva,包版本 0.1.1。

小结

它把 VS Code 的运行入口搬进 DSH Web UI,复用既有配置、保留变量替换与多根工作区语义,同时提供聊天侧的 vscode_launch 工具,价值集中且边界清楚。目录页与 GitHub 仓库如下:

  • https://www.skillhub.cn/plugins/sinvacn/dsh-vscode-runner
  • https://github.com/sinvacn/dsh-vscode-runner
羽毛球分组比赛记分
小程序二维码

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

Xiaoye