关于 windowsfy
windowsfy 面向 Node.js 开发者,扫描 package.json 脚本中不兼容 Windows 原生 Shell 的写法,并在确认后提供跨平台或 Shell 专用修复。
主要功能
- 01扫描脚本中的 Windows 不兼容写法
- 02支持 CMD 和 PowerShell
- 03提供跨平台及 Shell 专用修复
- 04编辑前征求确认
- 05扫描前检查运行环境
适用场景
- 01在 Windows 上运行前检查 Node.js 项目
- 02查找 package.json 脚本中的 Unix 命令
- 03为脚本环境变量选择可移植修复
- 04检查并修复 npm 脚本的 Glob 展开
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ unipds-engenharia-de-ia-aplicada/ engenharia-de-software-com-ia-aplicada --skill windowsfy安装后在 Claude Code 中输入/windowsfy确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
examples/native-deps-flag.jsonsingle-quotes-before-after.jsoncross-env-before-after.jsonshx-rm-rf-before-after.jsonglob-directory-before-after.jsonshx-chmod-before-after.jsonreferences/glob-patterns.mdnative-deps.mdinline-env-vars.mdpowershell-5-operator.mdsingle-quotes.mdunix-commands.mdscripts/scan.mjs详细介绍
windowsfy
扫描 Node.js 项目,查找 package.json 脚本中仅适用于 Unix、会在 Windows 原生 shell(CMD 和 PowerShell 5.1)中失败的写法,然后在用户确认后应用可移植的修复。每个问题都可以采用推荐的跨平台方式(使用 cross-env、shx、glob)修复,也可以使用特定 shell 的备用写法(CMD、PowerShell 或 Bash 系原生语法)。
类别
| 类别 | 描述 | 参考 |
|---|---|---|
native-dep | 需要 MS BuildTools 的 C++ 扩展包(tfjs-node、better-sqlite3)。 | native-deps |
inline-env | CMD 和 PowerShell 不支持 KEY=val node … 前缀。 | inline-env-vars |
single-quote | CMD 会将单引号按原样传递——--message 'text' 会出错。 | single-quotes |
unix-cmd | Windows shell 不支持 rm -rf、chmod、cp -r、mv、mkdir -p。 | unix-commands |
glob-expand | CMD/PS 不会展开 **/*.test.ts;二进制程序会收到原样字符串。 | glob-patterns |
ps5-ampamp | PowerShell 5.1 在交互模式下不支持 &&(但 npm 脚本仍可正常运行)。 | powershell-5-operator |
平台要求(严格)
此技能仅在 Windows 原生 shell 中运行:
- 支持:
cmd.exe、powershell.exe(PS 5.1)、pwsh.exe(PS 7+)。 - 禁止:Linux、macOS、WSL、Git Bash / MSYS2 / Cygwin、mintty。
被禁止的环境本身已提供 POSIX shell 语义——troubleshooting/windows/commons.md 中的脚本可在这些环境中正确执行,因此运行 windowsfy 只会添加不必要的 devDependencies,或应用实际上并不需要的 shell 专用备用写法。没有可覆盖此限制的标志。
调用
/windowsfy [path]
[path]可以是目录、单个package.json,也可以省略。- 省略 →
./(当前工作目录,递归扫描)。 - 目录 → 从该目录开始递归扫描。
package.json文件 → 仅扫描该文件。- 其他情况(路径不存在、文件不是
package.json)→ 中止并显示明确的错误。
步骤 0 — 环境检查(每次都要最先运行)
解析路径之前,运行:
node <skill-dir>/scripts/scan.mjs --check-env --json
解析 JSON 对象:{"env":"...","allowed":true|false,"reason":"..."}。
- 如果
allowed === false:打印检测到的env和reason,然后停止。不要解析路径。不要调用扫描器。不要编辑文件。 - 如果
allowed === true:继续步骤 1。
扫描器也会在其他每种模式下于内部运行 detectEnv(),因此即使跳过此步骤,--root/--file 也会以状态码 2 退出并输出 stderr 消息。
步骤 0b — 询问用户使用哪种交互式 Shell
环境检查通过后,使用 AskUserQuestion 询问用户当前使用哪种 Shell。提供三个选项,不要自动检测:
- CMD(
cmd.exe) - Windows PowerShell 5.x(
powershell.exe)—— Windows 10 和 11 上的默认选项 - PowerShell 7+(
pwsh.exe)
将答案存储为 $SHELL_CHOICE,取值为 cmd、ps5 或 ps7。后续每次调用 scan.mjs 时,都通过 --shell $SHELL_CHOICE 传入该值。
该选项决定以下两项:
- 扫描器中的严重程度矩阵 — 仅当选项为
ps5时,ps5-ampamp才报告为info;当选项为cmd或ps7时则静默处理,因为这两种环境都原生支持&&。无论选项为何,其他所有类别均为error,因为 Windows 上的npm默认通过cmd.exe启动脚本——即使用户的交互式 Shell 是 PowerShell,脚本运行时使用的仍是 CMD。 - 步骤 6 中的回退选项排序 — 与
$SHELL_CHOICE匹配的回退选项排在第二位(紧跟跨平台选项之后),并突出显示为自然的替代方案。
各 Shell 的严重程度矩阵
| 类别 | cmd | ps5 | ps7 |
|---|---|---|---|
native-dep | info | info | info |
inline-env | error | error | error |
single-quote | error | error | error |
unix-cmd | error | error | error |
glob-expand | error | error | error |
ps5-ampamp | 静默 | info | 静默 |
步骤 1 — 参数处理
-
从用户的调用中提取
[path]。如果为空,则视为./。 -
转换为绝对路径。使用
Bash搭配realpath,或使用node -e "console.log(require('path').resolve(...))"。 -
对路径进行分类:
if [ -d "$P" ]; then echo dir elif [ -f "$P" ]; then echo file else echo missing fi -
应用以下处理(始终包含
--shell $SHELL_CHOICE):- dir →
node <skill-dir>/scripts/scan.mjs --root <abs-path> --shell $SHELL_CHOICE --json。 - file → 文件名必须为
package.json。运行node <skill-dir>/scripts/scan.mjs --file <abs-path> --shell $SHELL_CHOICE --json。 - missing → 输出
windowsfy: path not found: <input>并停止。
- dir →
步骤 2 — 检测到的模式
| # | 类别 | 在 Windows 上的问题 | 严重程度 |
|---|---|---|---|
| 1 | native-dep | 带有 C++ 插件的包需要安装 MS BuildTools 才能安装(@tensorflow/tfjs-node、better-sqlite3、@huggingface/transformers、@xenova/transformers)。 | info |
| 2 | inline-env | KEY=val node … — Windows 会将 KEY=val 视为命令名称。 | error |
| 3 | single-quote | --message 'text' — CMD 会原样传递单引号。 | error |
| 4 | unix-cmd | rm -rf、chmod、cp -r、mv、mkdir -p — Windows 上不存在这些命令。 | error |
| 5 | glob-expand | tests/**/*.test.ts — CMD/PS 不会展开 glob;程序收到的是原始字符串。 | error |
| 6 | ps5-ampamp | 在 PS 5.1 中使用 && 会抛出 ParserError: The token '&&' is not a valid statement separator。 | info |
步骤 3 — 检测工作流
- 按
category对扫描器--json输出中的发现项进行分组。 - 构建汇总表:
Category | Files affected | Severity。 - 向用户打印汇总信息。
- 对发现项数量为零的类别,跳过后续步骤。
Step 4 — 确认要修复的类别
使用 AskUserQuestion 询问用户想修复哪些类别。事先说明:
native-dep(信息)→ 按照references/native-deps.md中的步骤手动安装 winget。不编辑package.json。ps5-ampamp(信息)→ 安装 PowerShell 7。默认不编辑package.json(另有仅适用于 PS 的备用方案)。- 所有其他类别 → 可自动修复。
Step 5 — 选择修复方式
针对用户在第 4 步确认的类别,全局询问要采用哪种修复方式(单次 AskUserQuestion)。根据 $SHELL_CHOICE 的值排列选项,确保与用户所用 Shell 匹配的备用方案排在第二位:
$SHELL_CHOICE | 选项顺序 |
|---|---|
cmd | 1. 跨平台 · 2. CMD 备用方案 · 3. PowerShell 备用方案 · 4. 按发现项分别选择 |
ps5 或 ps7 | 1. 跨平台 · 2. PowerShell 备用方案 · 3. CMD 备用方案 · 4. 按发现项分别选择 |
选项描述:
- 跨平台(推荐) —
cross-env、shx、glob。适用于所有环境;会添加 devDependencies。 - CMD 备用方案 —
cmd /V:ON /C "set KEY=val & node …"、rmdir /S /Q。脚本将仅适用于 CMD。 - PowerShell 备用方案 —
$env:KEY='val'; node …、Remove-Item -Recurse -Force。脚本将仅适用于 PS。 - 按发现项分别选择 — 针对每个发现项单独询问。
有意省略 Windows 原生环境下的 Bash 系备用方案(在这里没有意义——用户运行的是 CMD 或 PowerShell)。如果某个类别没有备用方案(例如 CMD 中的 glob-expand、chmod),则对此类别静默改用跨平台方案,并在输出中注明。
Step 6 — 修复方式选项表
| # | 类别 | 跨平台(首选) | CMD 备用方案 | PowerShell 备用方案 | Bash 系备用方案 |
|---|---|---|---|---|---|
| 2 | inline-env | cross-env KEY=val node … | cmd /V:ON /C "set KEY=val & node …" | $env:KEY='val'; node … | 保留 KEY=val node … |
| 3 | single-quote | 转义 \"…\" | 转义 \"…\"(CMD 要求如此) | 保留 '…' 或转义 | 保留 '…' |
| 4a | unix-cmd(rm -rf) | shx rm -rf folder | rmdir /S /Q folder | Remove-Item -Recurse -Force folder | 保留 rm -rf folder |
| 4b | unix-cmd(chmod) | shx chmod 755 file(在 Win 上无操作) | 无原生命令等效项 — 改用跨平台方案 | 无原生命令等效项 — 改用跨平台方案 | 保留 chmod 755 file |
| 5 | glob-expand | dir(Node 22+)或 glob -c "…" "…**" | 无备用方案 — 改用跨平台方案 | 无备用方案 — 改用跨平台方案 | 无备用方案 — 改用跨平台方案 |
| 6 | ps5-ampamp | 安装 PS 7(手动) | 不适用 — && 在 CMD 中可用 | PS 5.1:cmd1; if ($?) { cmd2 } | 不适用 — && 可用 |
每个类别的完整差异和边缘情况见 references/<topic>.md。
Step 7 — 应用修复
对于每个受影响的 package.json,按以下顺序修复各类别,以避免重新排版已修改的字符串:
unix-cmdinline-envsingle-quoteglob-expand
规则:
- 使用
Edit,每个脚本值只进行一次有针对性的编辑。不要重写整个文件。 - 如果选择了跨平台方式,且编辑引入了新工具,则在对应
package.json所在目录中运行npm install --save-dev <pkg>,但仅限于该工具尚未列入dependencies/devDependencies的情况:inline-env跨平台方案 →cross-envunix-cmd跨平台方案 →shxglob-expand选项 B →glob
- Shell 专用备用方案不会添加 devDependency。
第 8 步 — 验证
使用相同的路径/模式(--root 或 --file)重新运行扫描器。已修复的类别不应再出现。剩余的发现很可能是误报(例如,sed 被 unix-cmd 匹配);请将其交由人工审核。
直接使用检测脚本
node scan.mjs --check-env [--json]
node scan.mjs [--root <dir> | --file <path/to/package.json>] [--shell <cmd|ps5|ps7>] [--json]
--shell 默认为 cmd(最严格)。无效值会以代码 64 退出。
退出代码:
0成功 / 环境允许2环境不是 Windows 原生环境,或未找到路径64CLI 参数无效
人类可读的输出格式:
<rel-path>/package.json:<script-name>: [category] <snippet>
<rel-path>/package.json: [native-dep] @tensorflow/tfjs-node
JSON 输出:{file, script, category, severity, snippet, fix} 数组(使用 --check-env 时则为 env 对象)。
示例差异
examples/cross-env-before-after.jsonexamples/shx-rm-rf-before-after.jsonexamples/shx-chmod-before-after.jsonexamples/single-quotes-before-after.jsonexamples/glob-directory-before-after.jsonexamples/native-deps-flag.json
警告和边缘情况
- 在 Windows 上,
shx chmod不会执行任何操作,也不会报错。 Windows 文件系统没有可执行位。如果 Linux CI/部署需要可执行位,请改用通过process.platform进行条件判断的 Node 脚本,并调用fs.chmodSync。 @tensorflow/tfjs-node在 Windows 上需要 Node 24。 根据 troubleshooting/windows/commons.md,Node 22 不受支持。迁移说明:https://nodejs.org/en/blog/migrations/v22-to-v24package.json中的&&在 PS 5.1 下无法自动修复。 扫描器将其标记为info,而非error。不要将&&改写为;——这会导致 Unix 执行失败。PS 锁定式改写(cmd1; if ($?) { cmd2 })仅作为备用方案。- 误报。
sed、包含单引号的 URL,以及有意仅用于 Unix 的脚本。--json的 snippet 字段允许用户在应用修复前取消选择相关发现。 cross-env双重包装保护。 如果cross-env出现在KEY=value标记之前,扫描器会跳过该值。链式命令&& cross-env KEY=val node …会被识别为已处理。- 锁定 Shell 的备用方案会改变可移植性。 如果用户选择 CMD 或 PS 备用方案,
package.json就会绑定到该 Shell——脚本在其他 Shell 中将无法运行。建议在项目 README 中说明所选的 Shell。 - 混合风格的项目。 除非用户明确选择“per-finding”,否则避免在同一个
package.json中混用主要风格和备用风格。 - 环境检查不支持覆盖。 此技能无法通过强制手段在 Linux、macOS、WSL、Git Bash、MSYS2 或 Cygwin 上运行。如需在这些环境中操作,请通过
references/*.md手动应用差异。 - 在 Windows 上,npm 的
script-shell默认值为cmd.exe。 即使用户在第 0b 步选择了ps5或ps7,single-quote和unix-cmd仍会标记为error——这些错误发生在脚本运行时(即npm run启动的cmd.exe中),而非交互式 Shell 中。受 Shell 选择影响的唯一类别是ps5-ampamp:对于cmd和原生支持&&的ps7,该类别不会报错。执行过npm config set script-shell powershell.exe(这种情况并不常见)的用户会看到不同的运行时行为;此技能不会检测这一设置。