dsh-vscode-runner:在 DSH Web UI 裏跑 VS Code 啓動配置

前言

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
羽毛球分组比赛记分
小程序二维码

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

小夜