中文EN

dsh-tweaks-git-bash-terminal-tool

ui已测通过npmMIT

可将 Windows 环境下的终端工具替换为 Git Bash

下载量 / Downloads
1,460
依赖体积 / node_modules
0.53 MB
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

安装

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

链接

GitHub · Homepage · npm

同类插件