powershell-fix:在 DSH 中检查和修复 Windows PowerShell 命令

前言

在 DeepSeek Harness(DSH)这类宿主环境中,智能体经常需要在 Windows 终端里执行命令。常见问题不是“会不会调工具”,而是命令本身带了 bash 习惯、粘贴提示符、CRLF 污染或断行符错误,导致工具调用先失败,再浪费一轮修复。

已有做法通常是让 agent 直接执行失败命令,或者人工检查后再执行。powershell-fix 是面向 DSH 的 host-layer 插件:它给智能体提供一个 powershell_fix 工具,先检查并修复 Windows PowerShell 命令中的常见语法问题,再通过宿主 shell 通路执行修正后的命令。执行过程继续走宿主原有的沙箱、审批和超时策略,插件本身不额外增加权限。

这是什么

powershell-fix 是 DSH host 层插件,仓库维护者是 GuTianshuo,许可证为 MIT,package.json 中声明的版本为 0.1.0

它解决的是一个很具体的问题:当 bash 风格、粘贴污染或续行符错误的命令进入 Windows PowerShell 环境时,先做本地检查与修复,再决定是否执行。它把这类问题收敛到一次 powershell_fix 调用中,而不是让错误命令直接进入宿主 shell。

核心功能

下面介绍已核实的几类能力。

提供 powershell_fix 工具

插件会向 profile 暴露 powershell_fix 工具。该工具接收待检查、修复或执行的命令,并支持 command、可选 shell、可选 execute 和可选 description 等调用字段。

修复 Windows PowerShell 命令中的语法污染

插件可以处理几类常见的粘贴和执行前问题:

  • 规范化复制粘贴带来的 CRLF 以及杂散 CR 字符。
  • 去除粘贴进来的 shell 提示符。
  • 修复续行符相关问题。
  • 将 bash 风格的行续行转换为 PowerShell 反引号续行。
  • 对无法安全重写的命令给出警告,而不是盲目重写。

正确的 PowerShell 命令会原样通过,修复逻辑也保持幂等:对已经修复过的命令再次执行修复,不会继续改变命令语义。

bash 命令到 PowerShell 的保守映射

插件会把一些常见 bash 命令映射为 PowerShell 等价写法;对于不适合自动改写的命令,它会提示对应的 PowerShell 思路,而不是直接替换。

这个“能改则改、不能改则警告”的策略比较重要:它降低误修风险,也保留智能体继续判断的空间。

执行走宿主 shell 通路

修正后的命令通过宿主 DSH 的 shell 通路执行。执行策略与宿主内置 pwsh 工具使用同一套沙箱、审批和超时策略。

也就是说,插件不绕过 DSH 的宿主控制,也不新增执行权限。它只把命令整理成更接近可执行形态,后续执行仍由宿主策略约束。

危险命令只修复,不自动执行

插件内置执行门禁。对于语义上破坏性较强的命令,即使命令已被修复,它也会拒绝自动执行。

已核实的拒绝类型包括:

  • 根目标递归删除类命令。
  • Format-Volume
  • Clear-Disk
  • Set-ExecutionPolicy
  • del /sdel /q
  • 环境或系统持久化写入类命令。

这类命令不会被自动执行,插件只会停留在修复或警告层面。

支持 dry-run

如果只想检查与修复,不想执行,可以使用 dry-run 模式:

{
  "command": "<待检查命令>",
  "execute": false
}

也可以通过配置项 autoExecute: false 关闭自动执行。

安装与启用

先准备本地插件目录,例如 /path/to/powershell-fix。下面命令会把插件安装到指定 profile 的 host 层:

dsh plugin --profile web add file:/path/to/powershell-fix

这里的 file:/path/to/powershell-fix 是本地路径安装方式,表示从本地目录安装,而不是从远程仓库地址拼接安装命令。

安装完成后,重启 harness。经过上面的步骤,该 profile 下的每个会话都可以获得 powershell_fix 工具。

如果后续修改了插件源码,需要注意本地 file: 依赖可能已经复制过旧的 lib/*.js。建议在 profile 中删除旧的依赖副本,再重新执行安装命令:

# 在 profile 中删除旧副本
node_modules/powershell-fix

# 重新安装
dsh plugin --profile web add file:/path/to/powershell-fix

典型用法

下面是 powershell_fix 的调用形态示意。command 是必填项,shellexecutedescription 是可选字段:

{
  "command": "<要检查、修复或执行的命令>",
  "shell": "powershell51",
  "execute": true,
  "description": "check and run after fix"
}

如果只想做修复检查,不执行命令,可以这样调用:

{
  "command": "<要检查或修复的命令>",
  "execute": false,
  "description": "fix-only dry-run"
}

配置项 autoExecute 的默认值是 truetimeoutMs 的默认值是 60000。也就是说,默认情况下,工具在修复后可能进入自动执行流程;但危险命令仍会被执行门禁拦截,不会自动执行。

开发验证

插件声明零运行时依赖。peer dependencies 为:

{
  "peerDependencies": {
    "@deepseek-ai/dsh-tools": "*",
    "@deepseek-ai/schemastery": "*"
  }
}

这些依赖从宿主侧解析。

开发时可以运行以下命令:

node --test

这条命令运行单元测试。

如果要检查 profile 目录的挂载与运行路径,可以运行:

node acceptance/mount_check.mjs <profile_web_dir>

其中 <profile_web_dir> 需要替换为实际的 profile 目录。

如果要做真实引擎执行检查,可以运行:

node acceptance/real_pwsh_e2e.mjs

适用场景与注意

它适合以下场景:

  • 使用 DSH 在 Windows 上执行 PowerShell 命令。
  • 智能体经常把 bash 风格命令粘贴到终端。
  • 命令经常因 CRLF、提示符、续行符或引号问题失败。
  • 希望先检查与修复,再进入宿主执行策略。

需要注意几点:

  • 插件不额外增加权限。
  • 命令执行仍走宿主 shell 通路,并受宿主沙箱、审批和超时策略约束。
  • 危险命令会被执行门禁拦截,不会自动执行。
  • autoExecute 默认为 true,如果只想检查不执行,应使用 execute: falseautoExecute: false
  • 安装前建议先检查源码与许可证。当前仓库许可证为 MIT。

链接

GitHub 仓库:

https://github.com/GuTianshuo/powershell-fix

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

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

Xiaoye