From a8f0738e3a76f3ade5530af9bd0c37cedadd3c44 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Sat, 23 May 2026 16:58:56 -0700 Subject: [PATCH] Probe per-user Git Bash and Scoop before falling back to PATH on Windows Stock Windows 10/11 ships C:\Windows\System32\bash.exe (the WSL launcher) as the first match for `where bash`. WSL's bash cannot execute Windows-style script paths, so when Git Bash is installed outside the two standard system locations -- specifically the per-user "Only for me" Git for Windows installer (%LOCALAPPDATA%\Programs\Git) or a Scoop install (%USERPROFILE%\scoop\apps\git\current\usr\bin) -- run-hook.cmd silently fails: WSL prints "Windows Subsystem for Linux must be updated", the script returns 0, and Superpowers' SessionStart bootstrap is never injected. From the user's perspective skills auto-trigger inconsistently or not at all, with no surfaced error. Add explicit probes for both locations between the existing system- wide Git for Windows checks and the `where bash` fallback. Also add a comment to the fallback documenting the WSL-launcher trap so future maintainers understand why the explicit probes must come first. Verified on a Windows 11 VM (dockur/windows 11, Git Bash 2.x, Node 22): - System Git present: existing probe still matches (no regression) - System Git absent, per-user Git present via junction: new probe matches, hook produces valid 6422-byte JSON, exit 0 - All Git probes absent: confirmed WSL trap fires ("Windows Subsystem for Linux must be updated") and the hook exits 0 silently, demonstrating the original bug Existing tests/hooks/test-session-start.sh still passes on macOS (7/7). Reported by @ytchenak in #1607. Co-authored-by: ytchenak Closes #1607. --- hooks/run-hook.cmd | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/hooks/run-hook.cmd b/hooks/run-hook.cmd index ceec3a73..557dba83 100755 --- a/hooks/run-hook.cmd +++ b/hooks/run-hook.cmd @@ -26,8 +26,21 @@ 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 Per-user Git for Windows installer ("Only for me" / winget user scope) +if exist "%LOCALAPPDATA%\Programs\Git\bin\bash.exe" ( + "%LOCALAPPDATA%\Programs\Git\bin\bash.exe" "%HOOK_DIR%%~1" %2 %3 %4 %5 %6 %7 %8 %9 + exit /b %ERRORLEVEL% +) +REM Scoop user install (`scoop install git`) +if exist "%USERPROFILE%\scoop\apps\git\current\usr\bin\bash.exe" ( + "%USERPROFILE%\scoop\apps\git\current\usr\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) +REM Try bash on PATH (e.g. user-installed Git Bash, MSYS2, Cygwin). Note that +REM on stock Windows 10/11 `where bash` resolves to C:\Windows\System32\bash.exe +REM (the WSL launcher), which fails on Windows-style script paths. The explicit +REM probes above must therefore be exhausted first. where bash >nul 2>nul if %ERRORLEVEL% equ 0 ( bash "%HOOK_DIR%%~1" %2 %3 %4 %5 %6 %7 %8 %9