使用 dsh-gitbash-preset 在 Windows 上启用 DeepSeek Harness 极简模式

前言

DeepSeek Harness(简称 DSH)是 DeepSeek 开源的智能体运行时,核心理念是「一切皆插件」:模型、工具、沙箱、会话、界面都可以替换或重组。社区里有一份独立的插件目录(deepseek-harness-plugin.com),用来检索和安装第三方插件;它不是 DeepSeek / 幻方的官方应用商店,收录的项目需要自行核对源码和许可证。

内置的「极简模式」工具面很窄:固定 persona,只暴露 bashstr_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.2package.json 与 npm 一致),GitHub 于 2026-08-17 显示 121 star;目录页收录时标注为 53 star,以仓库页面为准。

这是什么

dsh-gitbash-preset 是一款「工具与能力」类 DSH 插件,GitHub 仓库由 liceses 维护,许可证为 MIT。npm 包名为 @icelily/dsh-gitbash-presetpackage.jsonauthor 与 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.ymlgitbash-executor.mjspreset.yml。界面上的显示名是「极简模式 (Git Bash)」,preset.yml 里的 order 为 6。

需要先说明边界:这不是给 win32 补 PTY 后端。社区里另有走持久 Git Bash / 替换 subprocess 运行时的方案;本插件的设计是 每次调用新开一个 shell,不保持上一次的 cdexport 状态。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: trueincludeRuntimeContext: false,即系统提示词到此为止,后续组装监听器不再追加身份说明。模型侧仍然是 bash + str_replace_editor,没有上下文压缩。tool-bashenableRunInBackgroundfalse

执行时通过 host 的 subprocess 服务跑 [shellPath, '-c', command],并处理超时、输出截断(溢出写 spill 文件)和终止宽限。环境里会覆盖 NO_COLOR=1TERM=dumbPAGER=catGIT_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.ymlgitbash-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_BASHshellPath 钉死 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

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

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

小夜