feat(env): use trampoline exe instead of .cmd wrappers on Windows#981
feat(env): use trampoline exe instead of .cmd wrappers on Windows#981
Conversation
✅ Deploy Preview for viteplus-preview canceled.
|
How to use the Graphite Merge QueueAdd the label auto-merge to this PR to add it to the merge queue. You must have a Graphite account in order to use the merge queue. Sign up using this link. An organization admin has enabled the Graphite Merge Queue in this repository. Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue. This stack of pull requests is managed by Graphite. Learn more about stacking. |
6a57f80 to
880a128
Compare
1d70634 to
b68fc97
Compare
21e0c54 to
edc1dc3
Compare
ed71eb6 to
849c126
Compare
cfccc29 to
d64cba8
Compare
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d64cba8cda
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@cursor review |
df57cf4 to
5534094
Compare
Merge activity
|
## Summary - Replace Windows `.cmd` shim wrappers with lightweight trampoline `.exe` binaries - Eliminates the "Terminate batch job (Y/N)?" prompt on Ctrl+C - The trampoline detects its tool name from its own filename, sets `VITE_PLUS_SHIM_TOOL` env var, spawns `vp.exe`, ignores Ctrl+C (child handles it), and propagates the exit code - Thanks for the solution suggestion from @sunfkny ## Changes - Add `crates/vite_trampoline/` — minimal Windows trampoline binary (~100-150KB) - Update shim detection (`detect_shim_tool`) to check `VITE_PLUS_SHIM_TOOL` env var before `argv[0]` - Replace `.cmd`/`.sh` wrapper creation with trampoline `.exe` copying in `setup.rs` and `global_install.rs` - Add rename-before-copy pattern for refreshing `bin/vp.exe` while it's running - Add legacy `.cmd`/`.sh` cleanup during `vp env setup --refresh` - Update CI to build and distribute `vp-shim.exe` for Windows targets - Update `install.ps1`, `install.sh`, `publish-native-addons.ts` for trampoline distribution - Update `extract_platform_package` in upgrade path to also extract `vp-shim.exe` - Update npm-link conflict detection to recognize `.exe` shims - Add RFC document and update existing RFCs (`env-command`, `upgrade-command`, `vpx-command`) ## Manual testing (Windows) ### 1\. Fresh install via PowerShell ```powershell Remove-Item -Recurse -Force "$env:USERPROFILE\.vite-plus" -ErrorAction SilentlyContinue & ./packages/cli/install.ps1 dir "$env:USERPROFILE\.vite-plus\bin\*.exe" dir "$env:USERPROFILE\.vite-plus\bin\*.cmd" ``` - [x] Trampoline `.exe` shims created for vp, node, npm, npx, vpx - [x] No legacy `.cmd` wrappers for core tools (only `vp-use.cmd` if present) - [x] `node --version` works - [x] `npm --version` works - [x] `vp --version` works ### 2\. Fresh install via Git Bash ([install.sh](http://install.sh)) ```bash rm -rf ~/.vite-plus bash ./packages/cli/install.sh ls -la ~/.vite-plus/current/bin/vp-shim.exe ``` - [x] `vp-shim.exe` copied alongside `vp.exe` in `current/bin/` - [x] `node --version` works - [x] `npm --version` works ### 3\. Ctrl+C behavior (the main fix) ```powershell vp dev # Press Ctrl+C in each shell ``` - [x] cmd.exe: clean exit, NO "Terminate batch job (Y/N)?" prompt - [x] PowerShell: clean exit - [x] Git Bash: clean exit ### 4\. Exit code propagation ```powershell node -e "process.exit(42)"; echo $LASTEXITCODE npm run nonexistent-script; echo $LASTEXITCODE ``` - [x] Exit code 42 propagated correctly - [x] Non-zero exit code from failed npm command ### 5\. Nested shim invocations (recursion marker) ```powershell npm --version pnpm --version ``` - [x] `npm --version` prints version (npm spawns node internally) - [x] `pnpm --version` prints version (pnpm spawns node internally) ### 6\. `vp env setup --refresh` (running exe overwrite) ```powershell vp env setup --refresh node --version dir "$env:USERPROFILE\.vite-plus\bin\*.old" ``` - [x] Refresh succeeds without "sharing violation" error - [x] Shims still work after refresh - [x] `.old` files cleaned up (or only one recent if vp.exe was still running) ### 7\. `vp install -g` / `vp remove -g` (managed package shims) ```powershell vp install -g typescript where.exe tsc tsc --version vp remove -g typescript dir "$env:USERPROFILE\.vite-plus\bin\tsc*" ``` - [x] `tsc.exe` created (NOT `tsc.cmd`) - [x] `tsc --version` works - [x] After remove: no `tsc.exe`, `tsc.cmd`, or extensionless `tsc` left behind ### 8\. `npm install -g` auto-link (npm-managed packages) ```powershell npm install -g cowsay where.exe cowsay cowsay hello npm uninstall -g cowsay ``` - [x] npm packages use `.cmd` wrapper (NOT trampoline) - [x] `cowsay` works - [x] Uninstall removes the `.cmd` wrapper ### 9\. `vp upgrade` and rollback ```powershell vp --version vp upgrade <version> node --version vp upgrade --rollback vp --version ``` - [x] Upgrade succeeds, shims still work - [x] Rollback succeeds, shims still work ### 10\. Install a pre-trampoline version (downgrade compatibility) ```powershell $env:VITE_PLUS_VERSION = "<pre-trampoline-version>" & ./packages/cli/install.ps1 Remove-Item Env:VITE_PLUS_VERSION dir "$env:USERPROFILE\.vite-plus\bin\*.exe" dir "$env:USERPROFILE\.vite-plus\bin\*.cmd" ``` - [x] Falls back to `.cmd` wrappers - [x] Stale trampoline `.exe` shims removed (`node.exe`, `npm.exe`, etc.) - [x] `vp --version` works via `.cmd` wrapper ### 11\. `vp env doctor` ```powershell vp env doctor ``` - [x] Shows shims as working, no errors about missing files ### 12\. Cross-shell verification - [x] cmd.exe: `node --version`, `npm --version`, `vp --version` all work - [x] PowerShell: `node --version`, `npm --version`, `vp --version` all work - [x] Git Bash: `node --version`, `npm --version`, `vp --version` all work Closes #835
04e854f to
ffee013
Compare
ffee013 to
641a5bc
Compare
65ba5ba to
0c90e9d
Compare
641a5bc to
1b89385
Compare
1b89385 to
86fda74
Compare
0c90e9d to
3135533
Compare
## Summary - Replace Windows `.cmd` shim wrappers with lightweight trampoline `.exe` binaries - Eliminates the "Terminate batch job (Y/N)?" prompt on Ctrl+C - The trampoline detects its tool name from its own filename, sets `VITE_PLUS_SHIM_TOOL` env var, spawns `vp.exe`, ignores Ctrl+C (child handles it), and propagates the exit code - Thanks for the solution suggestion from @sunfkny ## Changes - Add `crates/vite_trampoline/` — minimal Windows trampoline binary (~100-150KB) - Update shim detection (`detect_shim_tool`) to check `VITE_PLUS_SHIM_TOOL` env var before `argv[0]` - Replace `.cmd`/`.sh` wrapper creation with trampoline `.exe` copying in `setup.rs` and `global_install.rs` - Add rename-before-copy pattern for refreshing `bin/vp.exe` while it's running - Add legacy `.cmd`/`.sh` cleanup during `vp env setup --refresh` - Update CI to build and distribute `vp-shim.exe` for Windows targets - Update `install.ps1`, `install.sh`, `publish-native-addons.ts` for trampoline distribution - Update `extract_platform_package` in upgrade path to also extract `vp-shim.exe` - Update npm-link conflict detection to recognize `.exe` shims - Add RFC document and update existing RFCs (`env-command`, `upgrade-command`, `vpx-command`) ## Manual testing (Windows) ### 1\. Fresh install via PowerShell ```powershell Remove-Item -Recurse -Force "$env:USERPROFILE\.vite-plus" -ErrorAction SilentlyContinue & ./packages/cli/install.ps1 dir "$env:USERPROFILE\.vite-plus\bin\*.exe" dir "$env:USERPROFILE\.vite-plus\bin\*.cmd" ``` - [x] Trampoline `.exe` shims created for vp, node, npm, npx, vpx - [x] No legacy `.cmd` wrappers for core tools (only `vp-use.cmd` if present) - [x] `node --version` works - [x] `npm --version` works - [x] `vp --version` works ### 2\. Fresh install via Git Bash ([install.sh](http://install.sh)) ```bash rm -rf ~/.vite-plus bash ./packages/cli/install.sh ls -la ~/.vite-plus/current/bin/vp-shim.exe ``` - [x] `vp-shim.exe` copied alongside `vp.exe` in `current/bin/` - [x] `node --version` works - [x] `npm --version` works ### 3\. Ctrl+C behavior (the main fix) ```powershell vp dev # Press Ctrl+C in each shell ``` - [x] cmd.exe: clean exit, NO "Terminate batch job (Y/N)?" prompt - [x] PowerShell: clean exit - [x] Git Bash: clean exit ### 4\. Exit code propagation ```powershell node -e "process.exit(42)"; echo $LASTEXITCODE npm run nonexistent-script; echo $LASTEXITCODE ``` - [x] Exit code 42 propagated correctly - [x] Non-zero exit code from failed npm command ### 5\. Nested shim invocations (recursion marker) ```powershell npm --version pnpm --version ``` - [x] `npm --version` prints version (npm spawns node internally) - [x] `pnpm --version` prints version (pnpm spawns node internally) ### 6\. `vp env setup --refresh` (running exe overwrite) ```powershell vp env setup --refresh node --version dir "$env:USERPROFILE\.vite-plus\bin\*.old" ``` - [x] Refresh succeeds without "sharing violation" error - [x] Shims still work after refresh - [x] `.old` files cleaned up (or only one recent if vp.exe was still running) ### 7\. `vp install -g` / `vp remove -g` (managed package shims) ```powershell vp install -g typescript where.exe tsc tsc --version vp remove -g typescript dir "$env:USERPROFILE\.vite-plus\bin\tsc*" ``` - [x] `tsc.exe` created (NOT `tsc.cmd`) - [x] `tsc --version` works - [x] After remove: no `tsc.exe`, `tsc.cmd`, or extensionless `tsc` left behind ### 8\. `npm install -g` auto-link (npm-managed packages) ```powershell npm install -g cowsay where.exe cowsay cowsay hello npm uninstall -g cowsay ``` - [x] npm packages use `.cmd` wrapper (NOT trampoline) - [x] `cowsay` works - [x] Uninstall removes the `.cmd` wrapper ### 9\. `vp upgrade` and rollback ```powershell vp --version vp upgrade <version> node --version vp upgrade --rollback vp --version ``` - [x] Upgrade succeeds, shims still work - [x] Rollback succeeds, shims still work ### 10\. Install a pre-trampoline version (downgrade compatibility) ```powershell $env:VITE_PLUS_VERSION = "<pre-trampoline-version>" & ./packages/cli/install.ps1 Remove-Item Env:VITE_PLUS_VERSION dir "$env:USERPROFILE\.vite-plus\bin\*.exe" dir "$env:USERPROFILE\.vite-plus\bin\*.cmd" ``` - [x] Falls back to `.cmd` wrappers - [x] Stale trampoline `.exe` shims removed (`node.exe`, `npm.exe`, etc.) - [x] `vp --version` works via `.cmd` wrapper ### 11\. `vp env doctor` ```powershell vp env doctor ``` - [x] Shows shims as working, no errors about missing files ### 12\. Cross-shell verification - [x] cmd.exe: `node --version`, `npm --version`, `vp --version` all work - [x] PowerShell: `node --version`, `npm --version`, `vp --version` all work - [x] Git Bash: `node --version`, `npm --version`, `vp --version` all work Closes #835
3135533 to
2f51312
Compare
86fda74 to
d63d0df
Compare
## Summary - Replace Windows `.cmd` shim wrappers with lightweight trampoline `.exe` binaries - Eliminates the "Terminate batch job (Y/N)?" prompt on Ctrl+C - The trampoline detects its tool name from its own filename, sets `VITE_PLUS_SHIM_TOOL` env var, spawns `vp.exe`, ignores Ctrl+C (child handles it), and propagates the exit code - Thanks for the solution suggestion from @sunfkny ## Changes - Add `crates/vite_trampoline/` — minimal Windows trampoline binary (~100-150KB) - Update shim detection (`detect_shim_tool`) to check `VITE_PLUS_SHIM_TOOL` env var before `argv[0]` - Replace `.cmd`/`.sh` wrapper creation with trampoline `.exe` copying in `setup.rs` and `global_install.rs` - Add rename-before-copy pattern for refreshing `bin/vp.exe` while it's running - Add legacy `.cmd`/`.sh` cleanup during `vp env setup --refresh` - Update CI to build and distribute `vp-shim.exe` for Windows targets - Update `install.ps1`, `install.sh`, `publish-native-addons.ts` for trampoline distribution - Update `extract_platform_package` in upgrade path to also extract `vp-shim.exe` - Update npm-link conflict detection to recognize `.exe` shims - Add RFC document and update existing RFCs (`env-command`, `upgrade-command`, `vpx-command`) ## Manual testing (Windows) ### 1\. Fresh install via PowerShell ```powershell Remove-Item -Recurse -Force "$env:USERPROFILE\.vite-plus" -ErrorAction SilentlyContinue & ./packages/cli/install.ps1 dir "$env:USERPROFILE\.vite-plus\bin\*.exe" dir "$env:USERPROFILE\.vite-plus\bin\*.cmd" ``` - [x] Trampoline `.exe` shims created for vp, node, npm, npx, vpx - [x] No legacy `.cmd` wrappers for core tools (only `vp-use.cmd` if present) - [x] `node --version` works - [x] `npm --version` works - [x] `vp --version` works ### 2\. Fresh install via Git Bash ([install.sh](http://install.sh)) ```bash rm -rf ~/.vite-plus bash ./packages/cli/install.sh ls -la ~/.vite-plus/current/bin/vp-shim.exe ``` - [x] `vp-shim.exe` copied alongside `vp.exe` in `current/bin/` - [x] `node --version` works - [x] `npm --version` works ### 3\. Ctrl+C behavior (the main fix) ```powershell vp dev # Press Ctrl+C in each shell ``` - [x] cmd.exe: clean exit, NO "Terminate batch job (Y/N)?" prompt - [x] PowerShell: clean exit - [x] Git Bash: clean exit ### 4\. Exit code propagation ```powershell node -e "process.exit(42)"; echo $LASTEXITCODE npm run nonexistent-script; echo $LASTEXITCODE ``` - [x] Exit code 42 propagated correctly - [x] Non-zero exit code from failed npm command ### 5\. Nested shim invocations (recursion marker) ```powershell npm --version pnpm --version ``` - [x] `npm --version` prints version (npm spawns node internally) - [x] `pnpm --version` prints version (pnpm spawns node internally) ### 6\. `vp env setup --refresh` (running exe overwrite) ```powershell vp env setup --refresh node --version dir "$env:USERPROFILE\.vite-plus\bin\*.old" ``` - [x] Refresh succeeds without "sharing violation" error - [x] Shims still work after refresh - [x] `.old` files cleaned up (or only one recent if vp.exe was still running) ### 7\. `vp install -g` / `vp remove -g` (managed package shims) ```powershell vp install -g typescript where.exe tsc tsc --version vp remove -g typescript dir "$env:USERPROFILE\.vite-plus\bin\tsc*" ``` - [x] `tsc.exe` created (NOT `tsc.cmd`) - [x] `tsc --version` works - [x] After remove: no `tsc.exe`, `tsc.cmd`, or extensionless `tsc` left behind ### 8\. `npm install -g` auto-link (npm-managed packages) ```powershell npm install -g cowsay where.exe cowsay cowsay hello npm uninstall -g cowsay ``` - [x] npm packages use `.cmd` wrapper (NOT trampoline) - [x] `cowsay` works - [x] Uninstall removes the `.cmd` wrapper ### 9\. `vp upgrade` and rollback ```powershell vp --version vp upgrade <version> node --version vp upgrade --rollback vp --version ``` - [x] Upgrade succeeds, shims still work - [x] Rollback succeeds, shims still work ### 10\. Install a pre-trampoline version (downgrade compatibility) ```powershell $env:VITE_PLUS_VERSION = "<pre-trampoline-version>" & ./packages/cli/install.ps1 Remove-Item Env:VITE_PLUS_VERSION dir "$env:USERPROFILE\.vite-plus\bin\*.exe" dir "$env:USERPROFILE\.vite-plus\bin\*.cmd" ``` - [x] Falls back to `.cmd` wrappers - [x] Stale trampoline `.exe` shims removed (`node.exe`, `npm.exe`, etc.) - [x] `vp --version` works via `.cmd` wrapper ### 11\. `vp env doctor` ```powershell vp env doctor ``` - [x] Shows shims as working, no errors about missing files ### 12\. Cross-shell verification - [x] cmd.exe: `node --version`, `npm --version`, `vp --version` all work - [x] PowerShell: `node --version`, `npm --version`, `vp --version` all work - [x] Git Bash: `node --version`, `npm --version`, `vp --version` all work Closes #835
d63d0df to
ae93e93
Compare


Summary
.cmdshim wrappers with lightweight trampoline.exebinariesVITE_PLUS_SHIM_TOOLenv var, spawnsvp.exe, ignores Ctrl+C (child handles it), and propagates the exit codeChanges
crates/vite_trampoline/— minimal Windows trampoline binary (~100-150KB)detect_shim_tool) to checkVITE_PLUS_SHIM_TOOLenv var beforeargv[0].cmd/.shwrapper creation with trampoline.execopying insetup.rsandglobal_install.rsbin/vp.exewhile it's running.cmd/.shcleanup duringvp env setup --refreshvp-shim.exefor Windows targetsinstall.ps1,install.sh,publish-native-addons.tsfor trampoline distributionextract_platform_packagein upgrade path to also extractvp-shim.exe.exeshimsenv-command,upgrade-command,vpx-command)Manual testing (Windows)
1. Fresh install via PowerShell
.exeshims created for vp, node, npm, npx, vpx.cmdwrappers for core tools (onlyvp-use.cmdif present)node --versionworksnpm --versionworksvp --versionworks2. Fresh install via Git Bash (install.sh)
vp-shim.execopied alongsidevp.exeincurrent/bin/node --versionworksnpm --versionworks3. Ctrl+C behavior (the main fix)
vp dev # Press Ctrl+C in each shell4. Exit code propagation
5. Nested shim invocations (recursion marker)
npm --versionprints version (npm spawns node internally)pnpm --versionprints version (pnpm spawns node internally)6.
vp env setup --refresh(running exe overwrite).oldfiles cleaned up (or only one recent if vp.exe was still running)7.
vp install -g/vp remove -g(managed package shims)tsc.execreated (NOTtsc.cmd)tsc --versionworkstsc.exe,tsc.cmd, or extensionlesstscleft behind8.
npm install -gauto-link (npm-managed packages).cmdwrapper (NOT trampoline)cowsayworks.cmdwrapper9.
vp upgradeand rollback10. Install a pre-trampoline version (downgrade compatibility)
.cmdwrappers.exeshims removed (node.exe,npm.exe, etc.)vp --versionworks via.cmdwrapper11.
vp env doctor12. Cross-shell verification
node --version,npm --version,vp --versionall worknode --version,npm --version,vp --versionall worknode --version,npm --version,vp --versionall workCloses #835