Skip to content

feat: respect packageManager in package manager shims#1654

Merged
fengmk2 merged 5 commits into
mainfrom
fix/package-manager-shim-package-manager
May 22, 2026
Merged

feat: respect packageManager in package manager shims#1654
fengmk2 merged 5 commits into
mainfrom
fix/package-manager-shim-package-manager

Conversation

@fengmk2
Copy link
Copy Markdown
Member

@fengmk2 fengmk2 commented May 21, 2026

Summary

  • make matching package-manager shims (npm/npx, pnpm/pnpx, yarn/yarnpkg, bun/bunx) resolve the explicit packageManager version without translating mismatched tools
  • add non-mutating packageManager resolution metadata for vp env current and vp env which
  • keep package-manager shim fallback working outside package.json workspaces
  • add global snap coverage for matching npm/npx shims, mismatched npm/npx fallback, and env diagnostics
  • update the package-manager detection RFC, env RFC, and user docs for the new feature behavior

Verification

  • cargo fmt --check
  • cargo check -p vite_global_cli -p vite_install
  • cargo test -p vite_global_cli test_package_manager --bin vp
  • pnpm -F vite-plus snap-test-global command-env-package-manager-diagnostics
  • pnpm -F vite-plus snap-test-global shim-npm-uses-package-manager-version skipped locally on win32
  • pnpm -F vite-plus snap-test-global shim-npm-ignores-mismatched-package-manager skipped locally on win32
  • cargo test -p vite_install package_manager::tests::test_resolve_package_manager_from_package_json --lib compiled, but the generated Windows test executable did not run locally because Windows returned os error 740 (requires elevation).

Note

Medium Risk
Changes shim dispatch and PATH prep for npm/npx/other package-manager tools, which can affect how commands resolve and execute across projects. Logic is guarded by strict tool-family matching, but incorrect resolution could break package-manager invocation workflows.

Overview
Vite+ shims now respect an explicit package.json#packageManager by preferring the managed package-manager binary (including aliases like npx/pnpx/yarnpkg/bunx) only when the invoked tool matches the configured manager family, otherwise falling back to the Node-bundled tool.

vp env current and vp env which gain package-manager diagnostics: current --json can emit a package_manager block and the text output shows a new Package Manager section; which can directly resolve and report pinned package-manager tool paths (and errors if the pinned version isn’t installed). The install crate factors out non-mutating packageManager parsing/resolution helpers (PackageManagerResolution, resolve_package_manager_from_package_json, install/bin path utilities) and adds tests plus new global snapshot coverage and updated docs/RFCs for the behavior.

Reviewed by Cursor Bugbot for commit f3cc216. Configure here.

@netlify
Copy link
Copy Markdown

netlify Bot commented May 21, 2026

Deploy Preview for viteplus-preview canceled.

Name Link
🔨 Latest commit e6cb23f
🔍 Latest deploy log https://app.netlify.com/projects/viteplus-preview/deploys/6a0fefa3734fb9000846208d

@fengmk2 fengmk2 force-pushed the fix/package-manager-shim-package-manager branch from 1da5bfa to 733aeca Compare May 21, 2026 12:43
@fengmk2 fengmk2 changed the title fix: respect packageManager in package manager shims feat: respect packageManager in package manager shims May 21, 2026
@fengmk2 fengmk2 self-assigned this May 21, 2026
@fengmk2 fengmk2 force-pushed the fix/package-manager-shim-package-manager branch 3 times, most recently from d3b6fe1 to 71ebf6a Compare May 21, 2026 13:38
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 21, 2026

✅ Staging deployment successful!

Preview: https://viteplus-staging.void.app/
Commit: e6cb23f

@fengmk2 fengmk2 force-pushed the fix/package-manager-shim-package-manager branch from 71ebf6a to 6ecb674 Compare May 21, 2026 13:53
@fengmk2 fengmk2 force-pushed the fix/package-manager-shim-package-manager branch from 6ecb674 to aef30a6 Compare May 21, 2026 14:06
…ndant work

- Move package_manager_type_for_tool/package_manager_bin_name onto
  PackageManagerType as from_tool/bin_name_for_tool, removing the duplicate
  copies in shim/dispatch.rs and commands/env/which.rs.
- Fast-path resolve_matching_package_manager_tool with
  package_manager_install_dir + exists() so the shim hot path no longer
  triple-stats .cmd/.ps1 once the PM is already installed.
- Drop the unreachable tool_path.exists() check after locate_tool.
- Skip Node.js resolution when the matching package manager is bun, since
  bun is a native binary and does not need Node on PATH.
- In `vp env which`, surface a "not installed" hint when the resolved PM
  bin is missing, matching the core-tool behavior.
- Refactor PackageManagerInfo construction in `vp env current` into a
  from_resolution constructor instead of an inline helper.
@fengmk2 fengmk2 linked an issue May 21, 2026 that may be closed by this pull request
4 tasks
@fengmk2
Copy link
Copy Markdown
Member Author

fengmk2 commented May 21, 2026

@cursor review

Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit f3cc216. Configure here.

@fengmk2 fengmk2 requested a review from cpojer May 22, 2026 04:01
@fengmk2 fengmk2 marked this pull request as ready for review May 22, 2026 04:01
Copy link
Copy Markdown
Member

@cpojer cpojer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Always respect the package manager 🫡

fengmk2 added 2 commits May 22, 2026 13:51
Runs serially with a Node.js version (22.11.0) and an npm version (10.5.0)
that no other snap test uses, pre-cleans both install dirs, and verifies
that a single `npm --version` invocation auto-downloads both the pinned
Node.js runtime and the pinned npm package manager before executing.
@fengmk2 fengmk2 merged commit 74f1ee2 into main May 22, 2026
40 checks passed
@fengmk2 fengmk2 deleted the fix/package-manager-shim-package-manager branch May 22, 2026 06:09
@fengmk2 fengmk2 mentioned this pull request May 28, 2026
fengmk2 added a commit that referenced this pull request May 29, 2026
Release vite-plus v0.1.23.

Enterprise-ready HTTP (proxy + custom CA), task command shorthands in
`vite.config.ts`, a smoother `vp create`/`vp migrate`, and the
oxc/vite/rolldown bundled stack moves forward.

### Highlights

- **Proxy and custom-CA aware HTTP**: a new process-wide
`vite_shared::shared_http_client()` honors `HTTPS_PROXY` / `HTTP_PROXY`
/ `NO_PROXY`, picks up macOS System Settings / Windows registry proxies,
loads custom CAs from `SSL_CERT_FILE` and `NODE_EXTRA_CA_CERTS`, and
exposes a `VP_INSECURE_TLS` diagnostic switch; makes `vp` work through
Socket Firewall Free and other TLS-intercepting proxies
([#1686](#1686)), by
@fengmk2
- **Task command shorthands**: `run.tasks` entries in `vite.config.ts`
now accept a bare string (`"build": "cmd"`) or array (`"build": ["cmd1",
"cmd2"]`) instead of always requiring `{ command: ... }`; arrays reuse
the existing `&&` planning path so cache, `dependsOn`, and task options
stay consistent
([vite-task#391](voidzero-dev/vite-task#391)),
by @jong-kyung
- **Managed `vp outdated -g`**: routes through Vite+'s managed global
package metadata instead of delegating to the underlying `npm outdated
-g` store, so all installed global packages are reported consistently
([#1659](#1659)), by
@liangmiQwQ

### Features

- `vp pm approve-builds`: new unified subcommand that mirrors `pnpm
approve-builds` one-to-one, adapts to `bun pm trust`, and
warns-and-noops on npm/yarn
([#1662](#1662)), by
@fengmk2
- `vp create`: opt-in GitHub Copilot setup; selecting `--agent copilot`
now generates a `.github/workflows/copilot-setup-steps.yml` so the
Copilot Coding Agent can set up Vite+ and run `vp` in the new project
out of the box
([#1683](#1683)), by
@jong-kyung
- `vp migrate`: prompt to remove `baseUrl` from `tsconfig.json` before
applying type-aware lint defaults (runs `@andrewbranch/ts5to6
--fixBaseUrl .` under the hood; auto-applied in non-interactive mode)
([#1692](#1692)), by
@TheAlexLichter
- Respect `packageManager` in package-manager shims (`npm`/`npx`,
`pnpm`/`pnpx`, `yarn`/`yarnpkg`, `bun`/`bunx`); add non-mutating
`packageManager` resolution metadata for `vp env current` and `vp env
which` ([#1654](#1654)),
by @fengmk2
- vite-task: `--filter` no-match now exits `0` by default; add
`--fail-if-no-match` to opt back in
([vite-task#393](voidzero-dev/vite-task#393)),
by @kazupon

### Fixes & Enhancements

- `vp create`: keep generated `.vscode/settings.json` trackable when the
VS Code editor option is selected (avoid templates' `.vscode/*`
`.gitignore` masking it)
([#1700](#1700)), by
@jong-kyung
- `vp create vite:monorepo`: normalize sub-package `vite-plus` to
`catalog:` even when only `vite-plus` (not `vite`/`vitest`/...) is
present, and drop the `vite`/`vitest` aliases generated by the upstream
library template
([#1697](#1697)), by
@fengmk2
- `vp add/install -g <path>`: resolve the real package name from
`package.json` instead of using the path string, so local-path installs
don't create broken directories
([#1685](#1685)), by
@liangmiQwQ
- `vp test --coverage` and other direct built-in commands now expose the
workspace's `package.json#packageManager` to child processes so tools
like Vitest coverage can spawn the configured PM
([#1696](#1696)), by
@jong-kyung
- `vp migrate`: clean up the whole ESLint ecosystem (plugins, configs,
parser/resolver, type-utils) rather than just `eslint`; skip the
migration entirely when `@nuxt/eslint` is detected
([#1682](#1682)), by
@fengmk2
- `vp create`: write `fmt.configPath` (not `configPath`) for Zed oxfmt
settings to match the official Zed OXC extension layout
([#1687](#1687)), by
@chungweileong94
- `vp migrate`: parse `tsconfig.json` as JSONC so files with comments
don't break `baseUrl` detection/removal
([#1688](#1688)), by
@TheAlexLichter
- `vp env setup`: Unix env shims now point at the active `vp` executable
instead of always assuming `VP_HOME/current/bin/vp`, so Homebrew-style
installs work
([#1631](#1631)), by
@leohara
- `vp outdated -g` / `vp why -g`: don't require a local `package.json`;
global commands run regardless of cwd
([#1622](#1622)), by
@liangmiQwQ
- `vp create`: default the "Initialize a git repository?" prompt to yes
([#1650](#1650)), by
@fengmk2
- `vp` hooks: include the managed Node bin in `PATH` so
`./node_modules/.bin/vp` can find `node` from a VS Code commit on macOS
([#1647](#1647)), by
@TheAlexLichter
- `vpx` on Windows now invokes the package's `.cmd` shim instead of the
Unix binary
([#1652](#1652)), by
@tobynguyen27
- vite-task: bump cache database schema to version 13 (forces a one-time
rebuild of the local task cache)
([vite-task#402](voidzero-dev/vite-task#402)),
by @branchseer
- Bump vite-task to `d02b257` and `5833b374`; also bumps the repo's Rust
nightly toolchain to `nightly-2026-05-24` and ships the regenerated
`run` config types and docs for the new task command shorthand
([#1689](#1689),
[#1695](#1695)), by
@branchseer

### Refactor

- Replace `VP_SHELL_NU`/`VP_SHELL_PWSH` with a single `VP_SHELL`
override; add explicit shell parsing for `bash`, `zsh`, `fish`, `nu`,
`pwsh`, and `cmd`, and harden auto-detection against nested shells
([#1658](#1658)), by
@nekomoyi
- vite-task: replace `allocator-api2` with `bumpalo` collections
([vite-task#400](voidzero-dev/vite-task#400)),
by @branchseer
- vite-task: drop the unused `and_item_index` field from
`ExecutionItemDisplay`
([vite-task#394](voidzero-dev/vite-task#394)),
by @branchseer

### Docs

- Add the root `AGENTS.md` as the primary AI-agent guide for the
vite-plus repository; convert `CLAUDE.md` into a compatibility pointer
([#1670](#1670)), by
@jong-kyung
- Align the agent validation table to match `AGENTS.md`
([#1673](#1673)), by
@jong-kyung
- Update the task output caching guide so the documented behavior
matches what vite-task actually does
([#1639](#1639)), by
@ericclemmons
- Correct the bundled-source location in `packages/core/BUNDLING.md`
([#1660](#1660)), by
@shulaoda

### Chore

- Clarify `--help` text for `vp env default`/`pin`/`use`/`exec` with
`Examples:` blocks
([#1664](#1664)), by
@Boshen
- Refresh trusted stack stats on the docs homepage
([#1680](#1680)), by
@voidzero-guard[bot]
- Drop the standalone `pnpm --filter @rolldown/pluginutils build` step
now that `@rolldown/pluginutils` is published from its own package
([#1655](#1655)), by
@shulaoda
- Preserve single-quote style when `sync-remote` rewrites
`pnpm-workspace.yaml`
([#1672](#1672)), by
@lyzno1
- Enable `vite_pm_cli` lib tests by removing a stale `test = false` flag
([#1661](#1661)), by
@shulaoda
- CI: switch macOS runners back to `namespace-profile-mac-default`
([#1701](#1701)), by
@fengmk2
- CI: fix release-day flakes in the upgrade test and snap test when the
dev `package.json` version equals npm latest
([#1645](#1645)), by
@fengmk2
- CI: replace `zizmor` and `cargo-deny` workflows with
`oxc-project/security-action`
([#1635](#1635)), by
@Boshen
- CI: warm-up monorepo cache test under npm
([#1649](#1649)), by
@fengmk2
- CI: attach per-target `vp` binary archives (`.tar.gz`/`.zip`) to
GitHub Releases alongside the existing `vp-setup-*.exe` installers
([#1665](#1665)), by
@Boshen
- CI: declare Playwright via `repo.json` in ecosystem tests and bump
consumers to `>=1.60` to dodge the Node 24.16.0 hang
([#1668](#1668)), by
@fengmk2
- Update GitHub Actions
([#1640](#1640),
[#1675](#1675),
[#1678](#1678),
[#1679](#1679),
[#1691](#1691)), by
@renovate[bot]
- Upgrade upstream dependencies: vite `8.0.11 → 8.0.14`, rolldown `1.0.0
→ 1.0.3`, vitest `4.1.6 → 4.1.7`, oxlint `1.63.0 → 1.67.0`, oxfmt
`0.48.0 → 0.52.0`, oxlint-tsgolint `0.22.1 → 0.23.0`, `@oxc-project/*`
and oxc Rust crates `0.129.0 → 0.133.0`
([#1646](#1646),
[#1653](#1653),
[#1693](#1693),
[#1699](#1699)), by
@voidzero-guard[bot]

### Bundled Versions

| Tool | Version | Source |
| --- | --- | --- |
| vite | `8.0.14` |
[`c917f1e`](vitejs/vite@c917f1e)
|
| rolldown | `1.0.3` |
[`a287faa`](rolldown/rolldown@a287faa)
|
| tsdown | `0.22.0` | [npm](https://npmx.dev/package/tsdown/v/0.22.0) |
| vitest | `4.1.7` | [npm](https://npmx.dev/package/vitest/v/4.1.7) |
| oxlint | `1.67.0` | [npm](https://npmx.dev/package/oxlint/v/1.67.0) |
| oxlint-tsgolint | `0.23.0` |
[npm](https://npmx.dev/package/oxlint-tsgolint/v/0.23.0) |
| oxfmt | `0.52.0` | [npm](https://npmx.dev/package/oxfmt/v/0.52.0) |

### New Contributors

Welcome to all new contributors! 🎉

@ericclemmons, @tobynguyen27, @shulaoda, @leohara, @chungweileong94

**Full Changelog**:
v0.1.22...v0.1.23

Merging this PR will trigger the release workflow.

---------

Co-authored-by: voidzero-guard[bot] <278573678+voidzero-guard[bot]@users.noreply.github.com>
Co-authored-by: MK <fengmk2@gmail.com>
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.

npm shim does not consult packageManager field

2 participants