跨平台开发的“魔法“:Superpowers如何消除Windows与Unix的鸿沟 跨平台开发的魔法Superpowers如何消除Windows与Unix的鸿沟【免费下载链接】superpowersAn agentic skills framework software development methodology that works.项目地址: https://gitcode.com/GitHub_Trending/su/superpowers作为一名现代开发者你是否曾经在Windows上打开.sh文件时看到它被文本编辑器无情地打开而不是优雅地执行或者在macOS上调试好的脚本到了Windows环境就变成了一堆无法识别的神秘符号这种跨平台兼容性的噩梦Superpowers用一招魔法就彻底解决了。当.sh文件在Windows上叛变想象一下这个场景你精心编写的bash脚本在Linux上运行得完美无瑕但当你的同事在Windows上使用Claude Code时那个本该自动执行的session-start.sh文件却固执地打开了Notepad。这不是你的错也不是Claude Code的错——这是操作系统差异在作祟。Windows的CMD.exe天生不认识.sh文件而Claude Code的Windows版本为了帮忙会自动给任何包含.sh的路径加上bash前缀。听起来很贴心实际上这导致了双重麻烦要么脚本被错误执行要么根本找不到执行路径。技术揭秘一招双面脚本征服所有平台Superpowers的解决方案堪称优雅——一个同时讲两种语言的双面人脚本。让我们看看这个神奇的run-hook.cmd文件: CMDBLOCK echo off REM Cross-platform polyglot wrapper for hook scripts. REM On Windows: cmd.exe runs the batch portion, which finds and calls bash. REM On Unix: the shell interprets this as a script (: is a no-op in bash). if %~1 ( echo run-hook.cmd: missing script name 2 exit /b 1 ) set HOOK_DIR%~dp0 REM Try Git for Windows bash in standard locations if exist C:\Program Files\Git\bin\bash.exe ( C:\Program Files\Git\bin\bash.exe %HOOK_DIR%%~1 %2 %3 %4 %5 %6 %7 %8 %9 exit /b %ERRORLEVEL% ) if exist C:\Program Files (x86)\Git\bin\bash.exe ( C:\Program Files (x86)\Git\bin\bash.exe %HOOK_DIR%%~1 %2 %3 %4 %5 %6 %7 %8 %9 exit /b %ERRORLEVEL% ) REM Try bash on PATH (e.g. user-installed Git Bash, MSYS2, Cygwin) where bash nul 2nul if %ERRORLEVEL% equ 0 ( bash %HOOK_DIR%%~1 %2 %3 %4 %5 %6 %7 %8 %9 exit /b %ERRORLEVEL% ) REM No bash found - exit silently rather than error REM (plugin still works, just without SessionStart context injection) exit /b 0 CMDBLOCK # Unix: run the named script directly SCRIPT_DIR$(cd $(dirname $0) pwd) SCRIPT_NAME$1 shift exec bash ${SCRIPT_DIR}/${SCRIPT_NAME} $这个脚本的神奇之处在于它的双重人格操作系统看到的脚本执行路径Windows看到echo off开头执行CMD部分寻找bash并调用Unix系统看到# Unix: run...跳过CMD部分直接执行bash脚本跨平台连接技术的核心在于这个巧妙的语法技巧: CMDBLOCK在bash中是一个here文档会忽略直到CMDBLOCK的所有内容但在CMD中:只是一个标签被忽略于是CMD执行后续的批处理命令。为什么不用.sh扩展名一个聪明的规避策略你可能注意到了Superpowers的钩子脚本都没有.sh扩展名。这不是疏忽而是精心设计的规避策略{ hooks: { SessionStart: [ { matcher: startup|clear|compact, hooks: [ { type: command, command: \${CLAUDE_PLUGIN_ROOT}/hooks/run-hook.cmd\ session-start, async: false } ] } ] } }Claude Code的Windows版本会自动检测.sh扩展名并尝试帮助你——它会自动在命令前加上bash。但对于我们的多语言包装器来说这种帮助反而会破坏一切。通过使用无扩展名的脚本我们完全避开了这个自动检测机制。三阶段bash查找确保最大兼容性Windows用户的bash安装位置千奇百怪Superpowers的查找策略体现了工程思维的严谨性标准Git for Windows路径C:\Program Files\Git\bin\bash.exe32位Git安装路径C:\Program Files (x86)\Git\bin\bash.exePATH环境变量中的bash支持MSYS2、Cygwin或非标准安装最妙的是如果完全找不到bash脚本会优雅地静默退出返回0而不是抛出错误。这意味着插件仍然可以工作只是没有会话启动时的上下文注入——这比让整个插件崩溃要好得多。实战演练看看真正的钩子脚本长什么样让我们看看session-start脚本是如何工作的#!/usr/bin/env bash # SessionStart hook for superpowers plugin set -euo pipefail # Determine plugin root directory SCRIPT_DIR$(cd $(dirname $0) pwd) PLUGIN_ROOT$(cd ${SCRIPT_DIR}/.. pwd) # Read using-superpowers content using_superpowers_content$(cat ${PLUGIN_ROOT}/skills/using-superpowers/SKILL.md 21 || echo Error reading using-superpowers skill) # Escape string for JSON embedding using bash parameter substitution. escape_for_json() { local s$1 s${s//\\/\\\\} s${s//\/\\\} s${s//$\n/\\n} s${s//$\r/\\r} s${s//$\t/\\t} printf %s $s }这个脚本展示了几个重要的跨平台开发最佳实践使用纯bash内置函数避免依赖外部工具确保在任何bash环境中都能工作参数替换代替循环${s//old/new}比逐字符循环快几个数量级优雅的错误处理如果读取文件失败提供合理的默认值而不是崩溃平台检测与适配一个脚本服务所有环境Superpowers不仅处理Windows vs Unix的差异还考虑了不同Claude Code变体的差异if [ -n ${CURSOR_PLUGIN_ROOT:-} ]; then # Cursor sets CURSOR_PLUGIN_ROOT (may also set CLAUDE_PLUGIN_ROOT) printf {\n additional_context: %s\n}\n $session_context | cat elif [ -n ${CLAUDE_PLUGIN_ROOT:-} ] [ -z ${COPILOT_CLI:-} ]; then # Claude Code sets CLAUDE_PLUGIN_ROOT without COPILOT_CLI printf {\n hookSpecificOutput: {\n hookEventName: SessionStart,\n additionalContext: %s\n }\n}\n $session_context | cat else # Copilot CLI (sets COPILOT_CLI1) or unknown platform — SDK standard format printf {\n additionalContext: %s\n}\n $session_context | cat fi这种环境感知的适配确保了脚本在Claude Code、Cursor和Copilot CLI中都能正确工作每个平台都能收到它期望的JSON格式。从混乱到优雅跨平台开发的技术演进回顾跨平台脚本开发的历史我们可以看到清晰的技术演进路径阶段方法问题1.0编写两个版本维护成本高容易不同步2.0条件判断脚本逻辑复杂难以调试3.0多语言包装器需要处理扩展名检测问题Superpowers方案无扩展名多语言包装完美解决所有问题Superpowers的方案代表了当前跨平台脚本开发的最佳实践它简单、优雅、可靠而且最重要的是——它只是工作。开始你的跨平台之旅想要体验这种无缝的跨平台开发体验吗只需几个简单的步骤克隆仓库git clone https://gitcode.com/GitHub_Trending/su/superpowers查看实现研究hooks/run-hook.cmd和hooks/session-start应用到你的项目借鉴这种模式让你的工具也能在任何平台上运行记住真正的跨平台兼容性不是关于编写复杂的条件语句而是关于找到那些能自然地在所有平台上工作的模式。Superpowers的多语言包装器方案向我们展示了一个重要的道理有时候最优雅的解决方案往往是最简单的。下次当你在Windows上遇到.sh文件问题时想想Superpowers的双面人脚本——它可能就是你需要的跨平台开发魔法。【免费下载链接】superpowersAn agentic skills framework software development methodology that works.项目地址: https://gitcode.com/GitHub_Trending/su/superpowers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考