- Herbivore2026-09-1111888
本贴主要分享我目前在 Windows 上使用 DeepSeek Harness(DSH)的一套配置方式。
核心思路很简单:
不再让 Agent 使用 DSH 自带的 Bash / PowerShell 工具,而是统一通过 FastCtx 本地MCP工具去调用 Git Bash。
这样可以避开 Windows 下非常烦人的 PowerShell 语法、转义、路径以及 Bash/PowerShell 混用问题,也可以避免模型浪费注意力在拼Bash命令上
我的DSH环境
目前使用版本:```
DSH: 0.1.2-rc.1
Windows 11
Shell: Git Bash
FastCtx: 0.2.5
```我同时使用:-
dsh web-
dsh-tui(解锁Herdr、Orca的Agent Team场景)两套 Profile。
需要注意,DSH 的插件是按 Profile 管理的,所以 Web 和 TUI 使用的插件需要分别安装到对应 Profile。
dsh plugin --profile <name> add <package>本质上就是往指定 Profile 中安装依赖。一、我目前安装的插件
1. dsh-tui
我的 TUI Profile:```
dsh-tui
│
│ dependencies:
├── @anysearch/[email protected]
├── @deepseek-ai/[email protected]
├── @deepseek-harness-tui/[email protected]
└── @nanmicoder/[email protected]
```对应推荐理由:插件 |
推荐理由 |@anysearch/[email protected]|
每天免费搜索 1000 次,日常联网搜索够用了 |@deepseek-ai/[email protected]|
关键插件,用于接入 FastCtx 等 MCP 工具 |@deepseek-harness-tui/[email protected]|
TUI 爱好者狂喜 |@nanmicoder/[email protected]|
权限管理,减少频繁确认 |安装方式:```
dsh plugin --profile dsh-tui add @anysearch/[email protected]
dsh plugin --profile dsh-tui add @deepseek-ai/[email protected]
dsh plugin --profile dsh-tui add @deepseek-harness-tui/[email protected]
dsh plugin --profile dsh-tui add @nanmicoder/[email protected]2. dsh web Web Profile:``` web │ │ dependencies: ├── @anysearch/[email protected] ├── @deepseek-ai/[email protected] ├── @nanmicoder/[email protected] ├── [email protected] └── [email protected] ```对应推荐理由: 插件 | 推荐理由 | `@anysearch/[email protected]` | 每天免费搜索 1000 次 | `@deepseek-ai/[email protected]` | **关键插件**,负责连接 FastCtx MCP | `@nanmicoder/[email protected]` | 权限管理 | `[email protected]` | 改善侧边栏状态显示 | `[email protected]` | DSH 插件市场,安装、查看、管理插件方便很多 | 安装:``` dsh plugin --profile web add @anysearch/[email protected] dsh plugin --profile web add @deepseek-ai/[email protected] dsh plugin --profile web add @nanmicoder/[email protected] dsh plugin --profile web add [email protected] dsh plugin --profile web add [email protected]二、为什么我要折腾 FastCtx?
这其实才是本文的重点。
在 Windows 上使用 DSH 时,一个比较让人头疼的问题就是 PowerShell
模型写代码的时候,大量命令天然更偏向 Bash 使用习惯。
但是 Windows 下 DSH 默认 Shell 体系更偏 PowerShell。
于是很容易出现这种情况:
模型拼Bash命令 → 实际运行的是PowerShell(报错) → 转义(修复) → 路径(报错) →
路径(修复) → …这些东西混合在一起以后,非常容易浪费大量 Token 在修 Shell 命令 而不是解决真正的问题。
DSH 官方本身在 Windows 平台默认也是 PowerShell,但是模型真不会写好 PowerShell。
所以我的解决方法是:不用 PowerShell。
三、我的最终方案
我的方案是:```
DSH
│
├── 内置 bash ❌ 禁用
│
├── 内置 PowerShell ❌ 禁用
│
└── MCP
│
└── FastCtx
│
├── inspect_local_file
├── grep
├── glob
├── replace
│
└── run
│
└── Git Bash
```最终所有终端命令:Agent → FastCtx MCP → FastCtx run → Git Bash → Windows
因此 Agent 只需要写:```
pwd
ls
grep
git status
pnpm install
npm test
```模型完全按照标准 Bash 去写即可。FastCtx 在 Windows 下的 Bash 执行本身就是通过 Git Bash 完成的。
四、先创建一个自定义模式
我个人建议不要直接乱改 DSH 的默认模式。
创建一个专门用于 FastCtx 的自定义模式。
核心只有一个要求:
把 DSH 自带的 shell tool 全关掉。
也就是将:```
tool-bash
tool-pwsh
```设置为禁用。配置中的核心效果相当于:```
tool-bash:
disabled: truetool-pwsh:
disabled: true
``如果你当前使用的 UI 中显示的是disable` 开关,那么直接把 Bash 和 PowerShell 两项都关闭即可。这里之所以两个都禁用,是因为:
后面所有 Shell 命令全部交给 FastCtx 的
run。这样可以避免模型同时看到:```
bash
pwsh
mcp__fastctx__run
```然后随机挑一个执行。我的目标非常明确:```
Shell 只有一条路:FastCtx → Git Bash
五、安装 FastCtx FastCtx 本身安装非常简单。 需要 Node.js 18+。 执行:``` npm install --global fastctx ```如果 npm 镜像同步不及时导致 404,可以临时使用官方 npm registry:``` npm install --global fastctx --registry=https://registry.npmjs.org/ ```安装完成后:``` fastctx ```即可进入 FastCtx 的配置界面。FastCtx 官方也提供这种全局 npm 安装方式。 --- 六、开启 FastCtx 的 Bash 能力 FastCtx 默认主要提供文件相关能力,例如:``` inspect_local_file grep glob replace ```而我们这套方案还有一个非常重要的需求:``` 让 FastCtx 接管终端 ```因此需要启用 Bash Terminal。 FastCtx MCP 启动方式使用:``` fastctx serve --enable-shell ```启用后除了文件工具以外,还会有:``` run run_background job_output job_kill job_list ```其中最重要的就是:``` run ```**因为以后普通终端命令基本全部通过它执行。** --- 七、把 FastCtx 注册到 dsh-mcp-client 这里需要:``` @deepseek-ai/dsh-mcp-client ```这也是为什么前面我把它标为**关键插件** 官方 `dsh-mcp-client` 的作用就是: 外部 MCP Server → dsh-mcp-client → 注册到 DSH ctx.tools → Agent调用 注册成功以后,FastCtx 最终会变成:``` mcp__fastctx__inspect_local_file mcp__fastctx__grep mcp__fastctx__glob mcp__fastctx__replace mcp__fastctx__run mcp__fastctx__run_background mcp__fastctx__job_output mcp__fastctx__job_kill mcp__fastctx__job_list ```这是 `dsh-mcp-client` 官方定义的 MCP 工具注册方式。 --- FastCtx MCP 配置 在对应 Profile 的:``` cordis.patch.yml ```中添加一个 MCP Client 实例。 例如:``` - insert: - id: mcp-fastctx name: '@deepseek-ai/dsh-mcp-client' config: serverName: fastctx transport: stdio command: 'C:/Users/asus/.fastctx/bin/fastctx.exe'(自己的fastctx路径) args: - serve - --enable-shell cwd: !!js process.cwd() env: FASTCTX_BASH: 'F:/Git/bin/bash.exe'(自己的GitBash路径) toolCallTimeoutMs: 300000 failOnStartupError: false ```核心其实只有:``` serverName: fastctx transport: stdio command: fastctx args: - serve - --enable-shell ```也就是让 DSH 启动:``` fastctx serve --enable-shell ```官方 `dsh-mcp-client` 的 stdio 配置也是通过 `serverName / transport / command / args / env / cwd` 这一套参数启动 MCP Server。 --- 八、Web 和 TUI 都要配置 这里容易踩坑,如果你同时使用**dsh web、dsh-tui** 它们属于不同 Profile。 所以 ~/.dsh/profiles/web/ 和 ~/.dsh/profiles/dsh-tui/ 是两套配置 也就是都需要注册:``` Web └── @deepseek-ai/dsh-mcp-client └── FastCtx TUI └── @deepseek-ai/dsh-mcp-client └── FastCtx ```否则很容易出现:``` Web 能用 FastCtx TUI 看不到 ```或者反过来。 --- 九、配置 `.dsh/AGENTS.md` 光安装 FastCtx 还不够。 因为模型同时可能知道很多读取文件的方法,比如:``` cat Get-Content grep Select-String findstr dir ls ```所以我还会在 ~/.dsh/AGENTS.md 中明确告诉 Agent: > 本地文件和 Shell 操作优先使用 FastCtx。 我现在使用的是下面这段:``` <!-- fastctx:begin --> ## Local file inspection For reading, searching, and finding local files, prefer the FastCtx MCP server's own tools — `inspect_local_file`, `grep`, and `glob` — over shell equivalents such as `cat`/`Get-Content`, `rg`/`findstr`/`Select-String`, and `dir`/`ls -R`. Use FastCtx file tools directly for local-file operations, including when a local reference is URI-shaped; pass the equivalent plain absolute filesystem path. Read only what the task needs. When you need several files, pass them to one `inspect_local_file` call as files=[{"path": ...}, ...] instead of one call per file. The last line of every result says `Complete` or `Partial` — continue only with the exact parameters a `Partial` note provides. ### Batch replacement Use FastCtx's `replace` for mechanical find-and-replace across files. It preserves each file's encoding and line endings, supports dry-run previews, and rejects concurrent changes before writing. Use apply_patch for generated content, semantic rewrites, or small local edits. ### Shell commands Prefer FastCtx's `run` over the built-in shell for terminal work: it executes with bash (Git Bash on Windows), so always write POSIX bash — never PowerShell syntax. Never pass `apply_patch` to FastCtx's `run`: it is not a program and no shell can run it. Reach it through Codex itself — as its own tool call, or in Codex's built-in shell — never through the FastCtx tools. Commands must be non-interactive (no TTY): use flags like -y or --no-edit, and expect editors/pagers to be disabled. For anything that may outlast run's four-minute maximum, use `run_background`, check on it with `job_output`, and stop it with `job_kill`. Background jobs run independently of this session and survive restarts; rediscover an earlier job with `job_list` and read its output by job_id. A non-zero exit code is a normal result. The last line of every result says `Complete` or `Partial`. <!-- fastctx:end --> ```这段提示词主要解决三件事情。 1. 文件读取不要再绕 Shell 优先:``` inspect_local_file grep glob ```而不是:``` cat grep find ```更不要在 Windows 上变成:``` Get-Content Get-ChildItem Select-String2. 批量替换使用 FastCtx replace
比如全项目机械替换:AAA → BBB,其实可以交给 replace 这种结构化工具处理
而真正需要理解代码语义的修改,再让 Agent 使用专门的 Patch/Edit 工具。
3. Shell 永远按照 Bash 写
这是最关键的一句:```
always write POSIX bash — never PowerShell syntax
``从此这些命令都按照标准 Bash 来:``
&&
||
grep
find
rm
cp
mv
sed
awk
``不再考虑PowerShell的命令:``
Get-ChildItem
Get-Content
Select-String
Remove-Item
Copy-Item十、怎么确认 真的跑的是 Git Bash? 配置完成以后,以下提示词发给 DSH: 调用 mcp__fastctx__run 工具并执行:``` echo "BASH=$BASH" echo "BASH_VERSION=$BASH_VERSION" echo "MSYSTEM=$MSYSTEM" which bash pwd ```正常情况下 Windows + Git Bash 应该能看到类似:``` BASH=/usr/bin/bash BASH_VERSION=5.x.x MSYSTEM=MINGW64 /usr/bin/bash /c/Users/xxx ```看到 **MSYSTEM=MINGW64** 和 **/usr/bin/bash** 基本就能确认: > **现在真的跑在 Git Bash,而不是 PowerShell。** --- 十一、最终效果 以前:``` Agent -> PowerShell -> 命令语法错误 -> 修转义 -> 路径错误 -> 再修 -> 继续报错 ```现在:``` Agent -> FastCtx -> Git Bash ->正常执行 ```同时文件操作也变成:``` 读文件 → inspect_local_file 搜索内容 → grep 搜索文件 → glob 机械替换 → replace 运行命令 → run 长时间任务 → run_background 后台输出 → job_output 终止任务 → job_kill 找回后台任务 → job_list ```整个工具边界会清晰很多。 --- 十二、总结 **DSH 负责 Agent,FastCtx 负责本地文件和 Shell,Windows 终端统一使用 Git Bash** 这样配置以后,Windows 上使用 DSH 的体验会干净很多,尤其是再也不用看 Agent 和 PowerShell 的转义规则互相折磨 ^-^主楼 - apparition2026-09-114670
突然想起
我好像很久之前写过
本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容:
我的帖子已经打上 开源推广 标签: 是
我的开源项目完整开源,无未开源部分: 是
我的开源项目已链接认可 LINUX DO 社区: 是
我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是
以上选择我承诺是永久有效的,接受社区和佬友监督: 是以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出
除了本文
… - Herbivore2026-09-1111888
刷到过这个开源贴,但我更倾向于使用Fastctx原汁原味的mcp工具 ^-^
- 清风2026-09-1215723
奇怪,为什么我在Windows下用dsh没有遇到powershell报错