dsh-tweaks-git-bash-terminal-tool
可将 Windows 环境下的终端工具替换为 Git Bash
安装
dsh plugin --profile web add dsh-tweaks-git-bash-terminal-tool
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
dsh-tweaks-git-bash-terminal-tool
把 DSH 在 Windows 上的默认终端工具从 PowerShell(pwsh) 换成 Git Bash(bash) ——
一个开关,所有 preset(standard / ptc / cordis / minimal)自动跟随,不改 DSH 源码、不改任何 preset 文件
(唯一有代价的是 minimal:它会从「持久 shell」退化成「一次性 shell」,见下文)。
它能做什么
Windows 上的 DSH 默认让模型用一个 PowerShell 工具(工具名 pwsh)执行命令:工具目录、
system prompt、终端卡片里都是 PowerShell 方言。装了这个插件之后,你在 设置 → 通用 → 终端工具
里把终端工具切成 Git Bash:
- 模型看到的工具叫
bash,描述改成 Git Bash 方言(POSIX 路径、$VAR、不需要C:\转义); pwsh从模型可见的工具目录里消失(包括 PTC 模式生成的 SDK 签名);- system prompt 里那段 PowerShell 提示词被压掉,换成 bash 的那段;
- 终端卡片、退出码 pill、后台
job_output/job_kill、沙箱拒绝与升级,表现与官方一致; - 前台等超时会「转后台」而不是杀掉命令(官方
promoteOnTimeout语义):长命令等满
timeoutMs 后继续在后台跑,调用立刻交回 job id 与「到目前为止的输出」,之后用
job_output 读、job_kill 停,跑完还会收到一条完成通知;
- 跟随会话当前目录(DSH 0.2.1+):模型用
working_directory工具cd之后,bash命令也在
新目录执行;结果与终端卡片显示实际执行目录(cwd / tool/result.meta.cwd)。沙箱授权仍按
原始项目计算——cd 不会扩大可写范围。
切换只对新会话生效:运行中的会话保持它启动时的选择(这样工具目录与提示词不会中途变化,
KV cache 与历史工具调用都不会错位)。改完开一个新会话即可。
- 只想用 PowerShell?切回
PowerShell(pwsh)就行,行为和没装插件一样。 - 不会碰 DSH 自己的
ctx.shell(host 的 pwsh 执行器原样保留),所以 hooks、内部调用等
用到 ctx.shell 的地方完全不受影响。
- ⚠️ 官方预设里只有
minimal用的是「持久 shell」,它会因为本插件退化成「一次性 shell」;
standard / ptc / cordis 本来就是一次性的,不受影响。详见下节「极简模式(minimal)的影响」。
怎么用
1. 打开 设置 → 通用,找到 终端工具 这一行(插件只在 Windows 上挂载,非 Windows 连这一行都不存在)。
默认是 PowerShell(pwsh),而且这里只有两个工具选项 —— 插件不替你选、也不自己切换。
2. 点 Git Bash(bash):只有这时才出现「Git Bash 路径」与 自动发现 按钮(切回 pwsh 就收起来)。
此时路径若还是空的,新会话仍然跑 pwsh,不会出现半坏状态。
3. 点 自动发现:扫描 Git for Windows / MSYS2 / Cygwin 的安装根,把第一个可用的 bash.exe
填进路径栏并持久化;找到多条 git 路径时,路径栏变成下拉列表,重启 DSH 后依然可以选。
4. 开一个新会话即可生效。
说明:
- 不会用 WSL 的 bash。
C:\Windows\System32\bash.exe与...\WindowsApps\bash.exe会被
硬排除(where bash 在这些机器上经常先解析到 WSL),发现算法是「先找到 git,再由同一个安装反推 bash」。
- 自动发现按目录存在性探测安装根:git 不在 PATH 里时,注册表 /
%ProgramFiles%/ MSYS2 /
Cygwin 的安装目录照样能扫到。
- 路径栏只显示路径本身:候选来源(
Git for Windows/MSYS2/ …)与bash --version
这类扫描细节不再摊在设置页里 —— 多条路径时路径栏就是选择器。
- 一个候选都没找到时,
Git Bash依然可选(只是还没有路径可用),点「自动发现」会给出一行「没有找到」说明。 - 路径栏可以手填,但只有「文件名叫
bash/bash.exe、真实存在、且不是 WSL」的路径才会生效:
每次新会话替换前校验(validateSettings → validateBashPath),不合法就跳过替换(会话照旧 pwsh)
并写一行诊断;路径为空是合法中间态。只判「存在」的话,任何 exe 都会被静默注册成 bash 工具。
- 设置行可写判据:只看宿主设置快照的
writable与status === 'ready',不依赖旧快照 / 家族兼容层里的
mode;不可写时整行控件是灰的、界面不报错。
- 运行时如果这个 DSH 版本不具备替换所需的扩展点,设置行会显示「当前版本不支持:<原因>」,
会话完全不受影响(插件不抛错、不 veto,只写诊断日志)。
DSH 兼容性
- 支持范围:最低 DSH 0.2.0,按 0.2.1 契约基线开发与核对;更高版本不做保证。
- 用到的关键契约(全部以结构性窄化投影读取,不 import 官方包):per-agent 初始化事件
agent/created、async ctx.sandbox.confine、tools.restrict / tools.register、
systemPrompt.section / getSectionOrder、ctx.jobs.start 的 output 拉取源与 owner
解析以及 wait / read / kill / remove、ToolExecution.rootCallId + output.presentationMeta、
entry Config = volatile schemastery;DSH 0.2.1 新增的会话当前目录 ctx.workingDirectory.ensure
与 jobs.start.toolCall(callId + rootCallId)。
0.2.0 上缺 workingDirectory 时命令退回 session.header.cwd,旧任务注册表忽略多出来的
toolCall、旧 UI 忽略 cwd / meta,不影响最低支持范围内的可用性。
- 权威契约位置(官方 d.ts 与客户端产物)与版本基线口径见 [AGENTS.md](../../AGENTS.md) §3.9。
极简模式(minimal)的影响
四个官方预设里,只有 minimal 的终端是「持久 shell」:
预设(win32 上) · 终端工具 · 调用之间保留状态?
standard / ptc / cordis · @deepseek-ai/dsh-tool-pwsh(消费 ctx.shell) · ❌ 一次性:每次调用 spawn 一个新的 pwsh 进程
minimal · @deepseek-ai/dsh-tool-pwsh-persistent + @deepseek-ai/dsh-terminal 的 PTY · ✅ 持久:cwd / 环境变量 / 函数 / 交互式程序跨调用保留
本插件在 win32 上会隐藏 preset 注册的 pwsh(tools.restrict({ deny: ['pwsh'] }))并注册自己的 Git Bash 工具,于是:
- 对
standard/ptc/cordis没有影响:它们本来就是一次性 shell,换成 Git Bash 仍然是一次性,语义一一对应; - 对
minimal有影响:它从「持久 shell」变成「一次性 shell」—— 每次调用都是一个新进程,
cd / 环境变量 / 函数 / source 过的脚本不再跨调用保留,也不能再驱动交互式程序(REPL、需要 TTY 的命令)。
机制:minimal 的持久 shell 绑在 preset 自己的 PTY 栈上(isolate: { terminals: true } 的 realm 私有服务),
外部插件没有办法「只换后端、保留工具」—— 隐藏工具就是连持久性一起换掉。
代价:一次性工具每条命令都要启动一个 bash.exe,而持久 PTY 只在第一条命令付一次启动成本,之后每条是毫秒级。
如果你一定要「极简模式 + 持久 Git Bash」:本插件做不到(PTY realm 是 preset 私有的)。
唯一的路子是自己复制一份 minimal preset 改造:把 terminal-pwsh / persistent-pwsh 两行换成
@deepseek-ai/dsh-terminal-bash(shellPath 指向 Git Bash)+ @deepseek-ai/dsh-tool-bash-persistent。
后端用的是 node-pty(Windows 上走 ConPTY),理论上可行,但本仓库没有验证过这条路。
安装
# 从 npm(推荐;需要 DSH >= 0.2.0) npx @deepseek-ai/dsh plugin --profile web add dsh-tweaks-git-bash-terminal-tool # 或从本仓库源码(开发调试) npx @deepseek-ai/dsh plugin --profile web add "<仓库目录>/plugins/git-bash-terminal-tool"
然后在 profile 的 package.json 里把 dsh-tweaks-git-bash-terminal-tool 加进 dsh.profile.bundles
(本仓库其他插件就是这么挂的;bundle 自带的 cordis.patch.yml 只 insert 自己一行)。
重启一次 DSH,再在浏览器里强制刷新(Ctrl + Shift + R)。
首次挂载必须重启:bundle 自带的 patch 在运行中插入的 row 只进组合树,
宿主半区的 apply 不会被调用(client bundle 会进启动图)。
web为 DSH 的 profile 名称;profile 配置在 DSH 主目录下的profiles/里:默认即用户目录下的
~/.dsh(Windows 为%USERPROFILE%\.dsh),若设置了DSH_HOME则以其为准。
装不上?先看是不是「本地 link 留下的 junction」
如果之前用本地路径装过本插件(上面那条开发调试命令),profile 的 node_modules 里会留下一个
指向本仓库的 junction:
<profile>\node_modules\dsh-tweaks-git-bash-terminal-tool -> <仓库目录>\plugins\git-bash-terminal-tool
之后再用市场 / npm 装正式版时,pnpm add 会把它当成本地包重新导入,并在导入后的目录里重建依赖链接;
Windows 上创建真实符号链接需要管理员权限或开发者模式,于是整条命令失败(pnpm 与 dsh 市场都会以同样的形式挂掉):
[ERR_PNPM_EPERM] [importPackage <profile>\node_modules\dsh-tweaks-git-bash-terminal-tool] EPERM: operation not permitted, symlink '<仓库目录>\plugins\git-bash-terminal-tool\node_modules\...\@deepseek-ai\schemastery'
先删掉那个 junction,再装正式版。它只是一个指向开发目录的链接,删掉不会动仓库里的任何文件:
$profile = "$env:USERPROFILE\.dsh\profiles\web" # 换 …(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:11,最后更新 2026-10-17