dsh-multi-shell:一次注册 shell 工具,按次选择 Git Bash / PowerShell / WSL

前言

在 Windows 上给 DSH 智能体配终端时,常见做法是固定一种后端:要么全程 Git Bash,要么全程 PowerShell,要么单独走 WSL。真实任务里却经常在同一轮对话里混用——POSIX 管道适合 grep/sed,PowerShell 适合查注册表或 .NET,Linux 工具链又更适合 WSL 里的发行版环境。若只能在设置里选「默认终端」,模型无法按命令语法逐次切换,容易写出在错误 shell 里跑不通的脚本。

dsh-multi-shell 是社区维护者 deepseekv41flash 发布的 DSH 工作流类插件(npm 包名 dsh-multi-shell,当前 README 对应版本 0.1.2,MIT 许可证)。它只向宿主注册一个名为 shell 的工具,但在每次调用时通过参数 shell 让模型在 Git Bash(默认)、PowerShell、WSL 之间自行选择后端,并在 profile 里用普通对象配置覆盖超时、路径探测等默认值。下文按「是什么 → 能力 → 安装 → 用法 → 注意」说明,事实均来自 GitHub 仓库 README 与 npm 包说明。

这是什么

一句话:dsh-multi-shell 把「跑 shell 命令」收敛成单一工具面,把「用哪种 Windows/Linux 执行环境」交给模型在每次调用里决定。

与同属终端方向的 dsh-bash-terminal 相比,README 只强调两点差异:

dsh-bash-terminal dsh-multi-shell
选后端的人 用户在设置页选「默认终端」,模型不能改 模型通过 shell 参数逐次选择
跨 DSH 版本 peerDependencies 声明较窄的版本范围 全部 peerDependencies: "*,模块内无版本门控;可选服务按调用解析,缺一项只影响单次调用

插件本体是纯 ESM、零构建:package.json、lib/、cordis.patch.yml 即可运行;Node 要求 >=20。

核心功能

单一 shell 工具与参数

模型可见的主要参数如下(必填与默认值以 README 为准):

参数 必填 说明
command 是 命令正文;语法须匹配所选后端
description 是 5–10 词的主动语态说明(供 UI 展示)
shell 否 gitbash(默认)/ powershell / wsl
distro 否 仅与 shell=wsl 同用;WSL 发行版名,缺省为系统默认
workdir 否 工作目录;相对路径按会话目录展开
timeoutMs 否 前台超时(毫秒),默认 120000、上限 600000
run_in_background 否 后台任务,返回 job id,配合 job_output / job_kill
sandbox_permissions + justification 否 沙箱升级,仅 powershell 后端有意义,经 ctx.approval 审批

三个后端实际执行的 argv 概要:

  • gitbash:<Git>\bin\bash.exe -lc <command>(POSIX;$VAR;PATH 含 /usr/bin、/mingw64/bin)
  • powershell:pwsh -NoLogo -NoProfile -NonInteractive -Command <UTF-8 前导 + command>;前导固定控制台与管道为 UTF-8,并带 LanguageMode 守卫,避免只读沙箱下每次往 stderr 打两条 InvalidOperation
  • wsl:wsl [-d <distro>] -e bash -lc <command>;DSH_* 经 WSLENV 传入

非零退出在输出末行以 [exit code: N] 标记;超时以 [timed out after Nms] 开头且仍带退出码;输出超过 64 KiB 会截尾并给出完整 spill 文件路径。

沙箱与审批

  • PowerShell:在 read-only / workspace-write 下经 ctx.sandbox.confine 包装 argv(fail-closed);无可用 provider 时拒绝执行,不会裸跑。
  • Git Bash / WSL:README 说明 DSH 的 Windows ACL 受限令牌 runner 无法稳定启动 Cygwin/MSYS2 bash,WSL 亦仅为进程隔离、/mnt/c 仍可写,故这两路不隔离;受限会话下结果中会追加模型可见的 [sandbox: …] 提示行。
  • 沙箱升级:sandbox_permissions 只对 powershell 开放;对 gitbash/wsl 传该参数会报错。

工具描述中还写入了宿主机启用 Sudo for Windows 内联模式 时,从 gitbash 提权跑管理员 PowerShell 的模板(每次 UAC、无凭据缓存;不要用 UI 自动化点 UAC)。

可配置项

在 profile 的 patch 里可按需覆盖(普通对象,无 schemastery schema):

- id: tool-multi-shell
  config:
    defaultShell: gitbash        # 模型不传 shell 时的后端
    pwshPath: ''                 # 留空则自动探测
    gitBashPath: ''
    wslPath: ''
    timeoutMs: 120000
    maxTimeoutMs: 600000
    maxOutputBytes: 65536
    maxSpillBytes: 67108864
    graceMs: 3000
    enableRunInBackground: true

apply() 启动时会校验数值配置(须为正有限数等),非法值在启动阶段报错并指明字段名。

README 记载在 DSH 0.2.1-rc.4 / desktop-next 2.0.21-next 环境下做过多项验证(默认 gitbash、pwsh UTF-8、WSL 路径映射、超时、后台 job、沙箱探针、审批 allow-once/rejected、sudo 模板等);未验证项(如审批 cancelled、workspace-write 升级后的实际执行在特定宿主布局下受限)也在 README 中单独列出。

安装与启用

从 npm 安装到某个 profile(把包加入该 profile 并登记到 bundles,重启 DSH 后生效):

dsh plugin --profile desktop add dsh-multi-shell
# 然后把 "dsh-multi-shell" 加进该 profile package.json 的 dsh.profile.bundles 数组
# (或用 DSH 设置页的插件管理器安装,它会同时写 dependencies + bundles)

npm 包地址:https://www.npmjs.com/package/dsh-multi-shell。

回滚时从 profile 的 dsh.profile.bundles 与 dependencies 移除 dsh-multi-shell 并删除 junction;若要恢复 dsh-bash-terminal,需去掉 cordis.patch.yml 里对 tool-bash-terminal 的 disabled: true。两个插件都注册 shell 工具名,同时只能启用一个。

社区目录页(与 DeepSeek / 幻方无官方从属关系):https://www.skillhub.cn/plugins/deepseekv41flash/dsh-multi-shell。

典型用法

用法即模型(或你在调试时)对 shell 工具的调用约定,没有单独的 CLI 子命令。

1、默认 Git Bash 跑 POSIX 命令(不传 shell 或 shell: gitbash):

{
  "command": "echo \"$PATH\" | head -c 80",
  "description": "Show PATH prefix in Git Bash"
}

2、需要 PowerShell 语法或 .NET 时显式选后端:

{
  "command": "Get-Location | Select-Object -ExpandProperty Path",
  "description": "Print current directory via pwsh",
  "shell": "powershell"
}

3、在指定 WSL 发行版里跑 Linux 命令(distro 仅在与 wsl 同用时有效):

{
  "command": "uname -a && pwd",
  "description": "Check Linux kernel and cwd in WSL",
  "shell": "wsl",
  "distro": "Debian",
  "workdir": "C:\\Users\\Admin\\project"
}

4、长时间任务可设 run_in_background: true,再用宿主提供的 job_output / job_kill 跟踪;前台命令用 timeoutMs 控制上限(默认 120000 ms)。

5、只读沙箱下若 PowerShell 写盘被拒,可按 README 流程携带 sandbox_permissions 与 justification 请求升级;用户拒绝后应停止绕行。gitbash/wsl 不支持该升级参数。

适用场景与注意

适合谁:主要在 Windows 上跑 DSH、又希望模型在同一会话里按命令性质切换 Git Bash / pwsh / WSL 的开发者;愿意接受 gitbash 与 wsl 路径不受 DSH ACL 沙箱同等约束、并在输出里看到明确 [sandbox: …] 提示的场景。

务必知晓:

  • 插件以当前 DSH 进程权限执行命令;安装前请自行查看 GitHub 源码 与 MIT 许可证。
  • 与 dsh-bash-terminal 工具名冲突,切换插件前按 README 处理 bundle 与 disabled 标记。
  • peerDependencies 为 *,意在减少宿主小版本升级时的安装门控;仍建议在目标 DSH 版本上按 README「已验证」表做一次冒烟。
  • 社区插件目录 skillhub.cn 是独立生态站点,不等同于官方应用商店。

结尾

dsh-multi-shell 用「一个 shell 工具 + 按次 shell 参数」把 Windows 上常见的三种执行面交给模型调度,并在 PowerShell 侧保留沙箱 confine、UTF-8 前导与可选审批升级;与固定默认终端的方案相比,差在控制权在模型侧、版本依赖更宽。进一步了解可打开 SkillHub 目录页 与 GitHub 仓库。

羽毛球分组比赛记分
小程序二维码

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

小夜