前言¶
DeepSeek Harness(简称 DSH)是 DeepSeek 开源的智能体运行时,核心理念是「一切皆插件」:模型、工具、沙箱、会话、界面都可以替换或重组。社区里有一份独立的插件目录(deepseek-harness-plugin.com),用来检索和安装第三方插件;它不是 DeepSeek / 幻方的官方应用商店,收录的项目需要自行核对源码和许可证。
内置的「极简模式」工具面很窄:固定 persona,只暴露 bash 和 str_replace_editor,也不做上下文压缩。很多开发者会用它来对齐模型行为。问题是这套预设在 Windows 上经常直接起不来。失败通常有两层:一是持久 bash 依赖 PTY,而 @deepseek-ai/dsh-subprocess-local 在 win32 上会拒绝终端探测,报错类似 terminal inspection is unsupported on platform win32,跟机器上有没有 bash 无关;二是即便绕过 PTY,@deepseek-ai/dsh-bash-local 也是从 PATH 里找名为 bash 的可执行文件,Windows 默认并不提供。
dsh-gitbash-preset 就是针对这件事做的一个 agent preset 插件。它不改 DSH 核心,而是装一套「极简模式 (Git Bash)」变体:persona 和编辑器工具保持原样,bash 调用改走 Git for Windows 的 MSYS shell,用每次 bash -c 代替持久 PTY 会话。
本文依据插件目录页、GitHub 仓库 README / 源码、npm 包说明,以及 DeepSeek Harness 官方仓库交叉核实后整理。仓库当前版本为 0.1.2(package.json 与 npm 一致),GitHub 于 2026-08-17 显示 121 star;目录页收录时标注为 53 star,以仓库页面为准。
这是什么¶
dsh-gitbash-preset 是一款「工具与能力」类 DSH 插件,GitHub 仓库由 liceses 维护,许可证为 MIT。npm 包名为 @icelily/dsh-gitbash-preset,package.json 的 author 与 LICENSE 版权声明为 icelily,要求 Node.js >= 20。
它做的事情可以概括成一句话:把官方极简模式里的 bash 工具,映射到本机 Git for Windows 的 bash.exe,让 Windows 用户能在 Web 界面里选出「极简模式 (Git Bash)」并真正执行命令。
预设 ID 是 minimal-gitbash。插件启动时会把打包好的预设文件复制到用户预设根目录:
${DSH_HOME:-~/.dsh}/.agent-presets/minimal-gitbash/
复制的文件包括 agent.cordis.yml、gitbash-executor.mjs、preset.yml。界面上的显示名是「极简模式 (Git Bash)」,preset.yml 里的 order 为 6。
需要先说明边界:这不是给 win32 补 PTY 后端。社区里另有走持久 Git Bash / 替换 subprocess 运行时的方案;本插件的设计是 每次调用新开一个 shell,不保持上一次的 cd、export 状态。README 写得很清楚:Windows 上官方持久 PTY 不可用,这是替代方案,不是原极简模式的完整复刻。
核心功能¶
仓库 README 和源码对得上的能力主要有下面几项。
1、幂等安装预设
插件行由 cordis.patch.yml 插入 web profile。启动时检查目标目录里三个预设文件是否都在:都在且未设置 force: true,就只打日志然后跳过;文件内容与包内不一致时,日志会提示用 force: true 覆盖。force: true 会用包内文件覆盖这三个文件,但用户后来自己加的额外文件会保留。
2、自动探测 Git Bash
gitbash-executor.mjs 在 Windows 上按下面顺序找 shell(显式配置 shellPath 时优先):
- 环境变量
GIT_BASH %ProgramFiles%\Git\bin\bash.exe%ProgramFiles(x86)%\Git\bin\bash.exe%LOCALAPPDATA%\Programs\Git\bin\bash.exe- PATH 里的
bash.exe - 都找不到时退回裸命令名
bash,把解析失败交给后续 spawn 报错
PATH 扫描会跳过 System32 / Sysnative / SysWOW64 目录。这些位置常见的是 WSL 启动器 bash.exe,不是 Git Bash;仓库 issue #1 记录过:Git 装在非标准路径时,探测会误命中 C:\Windows\System32\bash.exe,WSL 没装发行版就会报「没有已安装的分发版」。维护者在后续提交里加了这项过滤。非 Windows 平台上,未显式指定路径则直接用 bash;预设里的 gitbash-shell 组还写了 disabled: !!js process.platform !== 'win32',也就是 非 Windows 上这组 shell 默认不启用。
另外,执行器会把 MSYS 风格的盘符路径(如 /d/foo)转成 D:\foo,避免把工作目录传给 Node 的 child_process 时对不上。/usr/bin 这类根路径不会被误改成盘符。
3、沙箱感知门控,不绕过安全边界
MSYS 运行时在 Windows 受限令牌沙箱里初始化会失败(无法创建 signal pipe)。因此 run / start 只在策略为 danger-full-access,或者部署根本没有沙箱策略时放行;workspace-write 或更窄的模式会抛错,并提示用 sandbox_permissions: "danger-full-access" 加 justification 做单次升级,或把会话切到完全访问。这是门控,不是把沙箱关掉。
4、极简工具面保持不变
agent.cordis.yml 里 persona 文本是 You are a helpful software engineer assistant.,并且 complete: true、includeRuntimeContext: false,即系统提示词到此为止,后续组装监听器不再追加身份说明。模型侧仍然是 bash + str_replace_editor,没有上下文压缩。tool-bash 的 enableRunInBackground 为 false。
执行时通过 host 的 subprocess 服务跑 [shellPath, '-c', command],并处理超时、输出截断(溢出写 spill 文件)和终止宽限。环境里会覆盖 NO_COLOR=1、TERM=dumb、PAGER=cat、GIT_PAGER=cat,减少分页器和颜色干扰。
安装与启用¶
目录页给出的安装命令如下,在 DeepSeek Harness 终端里执行:
dsh plugin add github:liceses/dsh-gitbash-preset
如需可复现安装,目录页建议固定 commit 哈希:
dsh plugin add github:liceses/dsh-gitbash-preset#<commit>
仓库 README、cordis.patch.yml 注释以及 npm 页面写的是另一条,针对 web profile,并且用已发布的包名:
dsh plugin --profile web add @icelily/dsh-gitbash-preset
两条不要混着理解。github:liceses/dsh-gitbash-preset 是目录页的 GitHub 规格;@icelily/dsh-gitbash-preset 是 npm 包名,当前版本 0.1.2。DSH 官方文档说明:从 GitHub 安装拉的是源码,从 npm 安装拿到的是发布产物。本插件包内已包含 lib/,README 这条更贴近作者给出的启用方式。--profile 后面换成你实际在用的 profile 名即可,不一定叫 web。
也可以不装插件,直接把仓库里的 agent-presets/minimal-gitbash/ 复制到 ~/.dsh/.agent-presets/。或者手动把 cordis.patch.yml 合并进 profile 的 patch 层。
重启 DSH 后生效。 重启后插件会尝试安装预设;目标已存在则 no-op,不会覆盖你改过的版本,除非把插件配置里的 force 设为 true。
安装前请检查源码仓库和许可证。插件以当前 dsh 进程的权限运行,安装时可能执行代码,不在智能体沙箱之内。
典型用法¶
前置条件:本机已安装 Git for Windows,能找到上面探测链路上的 bash.exe。如果装在自定义目录,可设环境变量 GIT_BASH,或在预设配置里写死 shellPath。
1、重启 DSH 后,打开 Web 界面,新建会话(已有会话不会自动换成这套组合)。
2、在预设列表里选择 极简模式 (Git Bash)。
3、启用 bash 有两种做法,README 写的是二选一:
- 把会话沙箱切到完全访问,之后 bash 调用直接走 Git Bash;
- 保持
workspace-write,让模型在第一次调用失败后,按报错提示用sandbox_permissions: "danger-full-access"加上 justification 做单次升级,走正常审批。
4、如果 Git 不在默认路径,可以在 agent-presets/minimal-gitbash/agent.cordis.yml 的 gitbash-executor 配置里显式指定:
shellPath: 'C:\\Program Files\\Git\\bin\\bash.exe'
预设里默认可调的执行器参数如下(均来自 README / agent.cordis.yml):
| 字段 | 默认 | 说明 |
|---|---|---|
shellPath |
自动探测 | 非空时优先使用 |
timeoutMs |
120000 | 单次命令默认超时 |
maxTimeoutMs |
600000 | 超时上限 |
maxOutputBytes |
64000 | 单流保留字节,溢出写入 spill |
graceMs |
3000 | 终止进程时 SIGTERM 到 SIGKILL 的宽限 |
插件行本身只有一个常用开关 force,默认 false。
仓库提供的自检命令是:
npm run check # 语法检查:插件入口、执行器、测试文件
npm run test # 单元测试:路径转换 / 探测优先级 / 配置校验,10 个用例
适用场景与注意事项¶
适合谁:在 Windows 上用 DSH Web 界面、希望沿用极简模式那种窄工具面,并且本机已经(或可以)安装 Git for Windows 的人。不适合指望「跨调用保持 cwd 和环境变量」的工作流——那是持久 PTY 的能力,这个预设明确没有。
使用时注意下面几点:
1、沙箱不会被插件放宽。 workspace-write 或更窄时 Git Bash 起不来,这是 MSYS 和 Windows 受限令牌的限制。需要执行命令就得完全访问或单次升级;只读会话里 bash 不可用是预期行为。
2、每次调用都是新 shell。 不要假设上一条 cd 还在。需要固定工作目录时,应在命令里写绝对路径,或通过执行器的 cwd / 请求里的 workdir 传入(MSYS 盘符路径会被转换成 Windows 路径)。
3、不要用 WSL 的 System32 bash.exe 冒充 Git Bash。 当前版本会跳过这些目录;若探测仍落到错误二进制,用 GIT_BASH 或 shellPath 钉死 Git 安装路径更稳妥。
4、这是社区插件。 目录站点与 DeepSeek 官方仓库无从属关系。安装前阅读 GitHub 仓库 和 MIT 许可证,确认你信任以 dsh 进程权限运行的代码。需要可复现环境时固定 commit 或 npm 版本号。
5、和「给 Windows 补持久 PTY」的插件不是同一条路。 若你的目标是两次 bash 调用之间变量和当前目录仍然活着,需要看其他 Windows 运行时方案;本插件解决的是「极简工具面 + 能在 Windows 上把命令丢进 Git Bash」。
小结¶
dsh-gitbash-preset 把官方极简模式的 persona 和 str_replace_editor 留在原地,把过不了 win32 PTY 检查的持久 bash,换成 Git for Windows 上的 bash -c,并加上沙箱门控和自动探路。对只想在 Windows 上用窄工具面写代码的人,安装、重启、选「极简模式 (Git Bash)」、把沙箱调到完全访问,就可以开始用。
目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-gitbash-preset/
GitHub:https://github.com/liceses/dsh-gitbash-preset
npm:https://www.npmjs.com/package/@icelily/dsh-gitbash-preset