Skip to content

feat(install): add bun as a package manager (#557)#1005

Draft
fengmk2 wants to merge 2 commits intomainfrom
bun-pm
Draft

feat(install): add bun as a package manager (#557)#1005
fengmk2 wants to merge 2 commits intomainfrom
bun-pm

Conversation

@fengmk2
Copy link
Member

@fengmk2 fengmk2 commented Mar 18, 2026

Add bun as the 4th supported package manager alongside pnpm, npm, and yarn.
Bun is added only as a package manager — runtime support is not planned.

Rust core:

  • Add Bun variant to PackageManagerType enum
  • Detect bun via packageManager field, bun.lock, bun.lockb, bunfig.toml
  • Download platform-specific native binary from @oven/bun-{os}-{arch} npm packages
  • Add native binary shim support (non-Node.js wrappers for sh/cmd/ps1)
  • Add PackageManagerType::Bun arms to all 30 command files
  • Add bun to interactive package manager selection menu

Global CLI & NAPI:

  • Add "bun" to PACKAGE_MANAGER_TOOLS in shim dispatch
  • Add "bun" => PackageManagerType::Bun in NAPI binding

TypeScript:

  • Add bun to PackageManager type and selection prompt
  • Add bunx as DLX command runner
  • Handle bun in monorepo templates and migration (overrides, no catalog)

RFCs:

  • Update all 11 package-manager RFCs with bun command mappings

Copy link
Member Author

fengmk2 commented Mar 18, 2026

Warning

This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
Learn more


How to use the Graphite Merge Queue

Add 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.

@fengmk2 fengmk2 self-assigned this Mar 18, 2026
@fengmk2 fengmk2 force-pushed the trampoline-exe-for-shims branch from 45e4691 to bc38b7a Compare March 18, 2026 01:50
@fengmk2 fengmk2 force-pushed the trampoline-exe-for-shims branch 2 times, most recently from 810d51c to efc5c42 Compare March 18, 2026 02:28
@fengmk2 fengmk2 force-pushed the trampoline-exe-for-shims branch from efc5c42 to d143fc6 Compare March 18, 2026 03:51
@fengmk2 fengmk2 force-pushed the trampoline-exe-for-shims branch from d143fc6 to 9db93c2 Compare March 18, 2026 04:01
@fengmk2 fengmk2 force-pushed the bun-pm branch 2 times, most recently from 183be48 to f551a2a Compare March 18, 2026 06:05
@fengmk2 fengmk2 force-pushed the trampoline-exe-for-shims branch from 9db93c2 to cc73dcc Compare March 18, 2026 06:05
@fengmk2 fengmk2 force-pushed the trampoline-exe-for-shims branch 2 times, most recently from 000f043 to 00ae674 Compare March 18, 2026 06:15
@fengmk2 fengmk2 force-pushed the bun-pm branch 2 times, most recently from a38d005 to c16f4d5 Compare March 18, 2026 06:49
@fengmk2 fengmk2 force-pushed the trampoline-exe-for-shims branch from 00ae674 to 5fb8073 Compare March 18, 2026 06:49
@fengmk2 fengmk2 force-pushed the bun-pm branch 2 times, most recently from ffb13dd to 3659cb9 Compare March 18, 2026 07:18
@fengmk2 fengmk2 force-pushed the trampoline-exe-for-shims branch 2 times, most recently from cfccc29 to d64cba8 Compare March 18, 2026 07:42
@fengmk2 fengmk2 force-pushed the bun-pm branch 3 times, most recently from f5c94ee to 2430298 Compare March 18, 2026 11:38
@fengmk2 fengmk2 force-pushed the trampoline-exe-for-shims branch from df57cf4 to 5534094 Compare March 18, 2026 11:38
@fengmk2 fengmk2 force-pushed the bun-pm branch 2 times, most recently from d2cab2f to c337bc4 Compare March 18, 2026 11:57
@graphite-app graphite-app bot changed the base branch from trampoline-exe-for-shims to graphite-base/1005 March 18, 2026 12:10
@fengmk2 fengmk2 force-pushed the graphite-base/1005 branch from 04e854f to 641a5bc Compare March 18, 2026 12:26
@fengmk2 fengmk2 force-pushed the bun-pm branch 2 times, most recently from 8924f90 to b56f905 Compare March 18, 2026 12:58
@fengmk2 fengmk2 force-pushed the graphite-base/1005 branch from 1b89385 to 86fda74 Compare March 18, 2026 12:58
## 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
@graphite-app graphite-app bot force-pushed the graphite-base/1005 branch from 86fda74 to ae93e93 Compare March 18, 2026 13:19
@graphite-app graphite-app bot changed the base branch from graphite-base/1005 to trampoline-exe-for-shims March 18, 2026 13:20
Add bun as the 4th supported package manager alongside pnpm, npm, and yarn.
Bun is added only as a package manager — runtime support is not planned.

Rust core:
- Add `Bun` variant to `PackageManagerType` enum
- Detect bun via `packageManager` field, `bun.lock`, `bun.lockb`, `bunfig.toml`
- Download platform-specific native binary from `@oven/bun-{os}-{arch}` npm packages
- Add native binary shim support (non-Node.js wrappers for sh/cmd/ps1)
- Add `PackageManagerType::Bun` arms to all 30 command files
- Add bun to interactive package manager selection menu

Global CLI & NAPI:
- Add `"bun"` to `PACKAGE_MANAGER_TOOLS` in shim dispatch
- Add `"bun" => PackageManagerType::Bun` in NAPI binding

TypeScript:
- Add `bun` to `PackageManager` type and selection prompt
- Add `bunx` as DLX command runner
- Handle bun in monorepo templates and migration (overrides, no catalog)

RFCs:
- Update all 11 package-manager RFCs with bun command mappings
Base automatically changed from trampoline-exe-for-shims to main March 18, 2026 13:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant