dsh-terminal-tool:在 Windows 上把 DSH 会话终端从 pwsh 换成 Git Bash

前言

在 Windows 上使用 DeepSeek Harness(DSH)时,平台组合会把 bash 相关执行器关掉、只保留 PowerShell 路线:bash-sandbox 与 tool-bash 在 win32 上被禁用,ctx.shell 又是单实例服务,宿主平面里根本没有可用的 bash 工具。若你希望模型在 Windows 上走本机 Git Bash(而不是 pwsh,也不是误命中 System32\bash.exe 的 WSL 启动器),改第一方 preset 或自研整套终端工具代价都偏高。社区维护者 road-kid 的 dsh-terminal-tool 走另一条路:会话级隔离替换,默认行为不变,只在 profile 里打开开关后让新会话使用 Git Bash。

这是什么

dsh-terminal-tool 是分类为「客户端」的 DSH 插件(GitHub:road-kid/dsh-terminal-tool)。一句话定位:在 Windows 上把模型的终端工具从 pwsh 换成本机 Git Bash,且不编辑 preset 文件、不接管全局 ctx.shell。默认 dialect: pwsh,安装后若不改动设置,行为与未装插件一致;改成 bash 后,新会话的工具目录里是 bash,继承来的 pwsh 被隐藏,已打开的会话保持启动时的终端类型。

README 写明:在 DSH 尚未内置「终端 / Git Bash 选择」之前,本插件是临时替代方案;官方提供等价能力后,可从 profile 依赖移除并重启即可回到官方终端工具。

核心功能

会话级替换,不动宿主平面

插件在 agent/created 里对当前 agent 做 isolate('shell'),只在该子树注册 GitBashExecutor 与官方 @deepseek-ai/dsh-tool-bash,并对继承层 restrict({ deny: ['pwsh'] }),同时清空 tool:pwsh 的 system prompt 段。执行器继承官方 LocalBashExecutor 的超时、输出收集、abort 与 dshEnv 合并等行为,主要改动是用配置的 bash.exe 绝对路径组 [bash, -c, command],并在 resolve() 里注入 PATH。

设置行:通用 → 终端工具

客户端半区在 设置 → 通用 底部注册一行 终端工具(order 60)。可选终端类型 pwsh(默认)或 bash;选 bash 后出现 Git Bash 路径输入与「自动发现」,以及 Windows 受限沙箱下的 confinedPolicy(unconfined / escalate / fail,默认 unconfined)和极简模式相关选项。说明文案写明:改动只影响新会话。

自动发现 Git Bash

bashPath 为空且 autoDiscover 为真时,按 README 顺序探测:候选列表、Git for Windows 注册表、常见安装目录、MSYS2、Cygwin、PATH 上 git.exe 反推等。硬排除 C:\Windows\System32\bash.exe 与 WindowsApps\bash.exe(WSL)。发现只做 statSync 与 reg.exe query,不会在宿主里 spawn bash --version。

受限沙箱与极简模式

Windows 受限档位下 Git Bash 无法在沙箱内直接启动:默认 confinedPolicy: unconfined 表示直接启动、命令不受文件沙箱约束(设置里可见并可改);也可选 escalate(走官方 ctx.sandbox.confine() 与审批)或 fail(明确报错)。minimalMode 用于处理官方 minimal 预设的持久终端:leave / oneshot(默认)/ variant(另注册 minimal-gitbash 预设,不改官方 minimal 定义)。

安装与启用

前置条件

  • Windows,DSH Desktop 版本满足 engines.dsh:>=0.2.1-rc.2 <0.3.0(插件在该范围内开发与验证)
  • Web shell 需自带 @deepseek-ai/dsh-client-ui-primitives(0.2.1-rc.2 起由冻结模块表播种)
  • 本机已安装 Git for Windows(或 MSYS2 / Cygwin)

安装步骤

README 给出的流程是本地构建后装进 profile,而非固定的 dsh plugin add 一行命令。概要如下:

  1. 获取源码并构建(产物在 lib/):
cd dsh-terminal-tool
npm install
npm run check
  1. 打包或把目录/tarball 加入本机 profile(示例为 desktop)依赖;可用插件管理器 install_bundle,target 指向仓库绝对路径:
npm pack

profile 组合层会读取插件自带的 dsh.bundle.patch,在非 Windows 上禁用该插件条目:

- insert:
    - id: terminal-tool
      name: dsh-terminal-tool
      disabled: !!js process.platform !== 'win32'
  1. 安装或升级后必须重启 DSH,否则组合树插入后插件的 apply 不会被调用。

启用

重启后打开 设置 → 通用,在底部 终端工具 将方言改为 bash(必要时填写或自动发现 bashPath),然后新建会话即可在工具目录看到 bash 而非 pwsh。

常用配置字段(写入 profile patch 层,设置行直接编辑部分)包括:dialect、bashPath、bashCandidates、confinedPolicy、minimalMode,以及 loginShell、extraPath、pythonUtf8、超时与输出上限等继承字段。完整表格见仓库 README。

典型用法

  1. 保持默认:不改 终端工具,继续使用 pwsh,与未装插件一致。
  2. 切换到 Git Bash:设置里选 bash,用默认路径或点「自动发现」,保存后新开一个 agent 会话,让模型执行 shell 命令时走 Git Bash。
  3. 受限沙箱环境:若需要文件沙箱约束,将 confinedPolicy 改为 escalate 或 fail,按 README 理解三种取值的后果;默认 unconfined 会在 UI 提示命令不受文件沙箱限制。
  4. 使用官方 minimal 预设且希望持久 Git Bash 终端:将 minimalMode 设为 variant,由插件注册 minimal-gitbash 变体预设。

状态与发现通过插件 API(不写配置):打开设置时 POST /api/dsh-terminal-tool/state;点「自动发现」时 POST /api/dsh-terminal-tool/discover。

适用场景与注意

适合谁:在 Windows 上用 DSH Desktop 开发或日常使用,希望模型终端与本地 Git Bash / MSYS 工具链一致,又不愿改 dsh-base 或手写 PTY 的开发者。

务必注意:

  • 仅 Windows 生效;非 Windows 上设置行不渲染,组合条目也会被平台断言禁用。
  • 终端类型在会话创建时装配,运行中切换设置不会改写已开会话。
  • 插件以当前 DSH 进程权限运行;安装前请阅读 源码 与 MIT 许可证,自行评估受限沙箱下 unconfined 等策略是否符合你的安全要求。
  • 当前 npm 包版本为 0.5.1(以仓库 package.json 为准);与目录页星标等元数据以社区站点展示为准。

结尾

dsh-terminal-tool 用「一个开关、新会话跟随」的方式,在不动 preset 与全局 ctx.shell 的前提下,把 Windows 上 DSH 的终端工具换成本机 Git Bash,并复用官方 bash 工具与执行器契约。进一步了解与安装说明见社区目录页 road-kid/dsh-terminal-tool 与 GitHub 仓库 https://github.com/road-kid/dsh-terminal-tool。

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

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

Xiaoye