Repository navigation
Conversation
VP_NODE_VERSION=22 vp env install node requested /v22/SHASUMS256.txt and failed, because the env var branch of config::resolve_version returned the raw value while every other branch resolves to an exact version. Resolve it the same way the shim fast path does since voidzero-dev#2411.
<!-- claude-projects-attribution: {"github_login":"Brooooooklyn"} -->
_Requested by **Brooklyn** · [project
thread](https://claude.ai/code/project/chan_018s9RxRdtH424j2EhXdzV3N?thread=cmsg_018s9RxRdtH424j2EhXdzV3NQxbeR8Pt7qaqSQwoq9rEFo)_
<!-- routine:prune-tests:duplicate-shell-and-helper-tests -->
Before: `vp_global_cli` and `vp_pm_cli` carried Rust unit tests that
could not fail when the product broke: an `assert!(true)` in
`create.rs`, four `env use` shell-detection tests that repeat
`commands::shell` tests for code `env use` only imports, and three tests
of test-only helpers. `upgrade_check.rs` had 20 hand-unrolled lookup
tests.
After: those 8 tests are gone and the 20 lookup tests are 2 table-driven
tests that keep every row and comment, with the failing row named in the
assertion message. Only test code changes: every hunk is inside a
`#[cfg(test)]` module or the `#[cfg(test)]`-only
`resolution::test_utils` module.
How: each candidate was defended by mutating product code with the most
realistic regression only it would catch, running the crate's tests, and
reverting. No deleted test failed alone on any mutation.
### Totals
| | Before (origin/main c04bcf6) | After |
|---|---|---|
| Files touched | – | 5 |
| `vp_global_cli` cases collected (Linux) | 502 (+2 ignored) | 479 (+2
ignored) |
| `vp_pm_cli` cases collected | 923 (+2 ignored) | 920 (+2 ignored) |
- Cases deleted: **8** of 1,425 collected in the two touched crates.
Repo-wide: about 2,432 `#[test]`/`#[tokio::test]` attributes in tracked
Rust (static count) and 1,492 static `it`/`test` calls in 101 JS spec
files (not collected; Vitest needs a full `packages/core` build).
- Cases folded: **20 into 2**, every row and comment kept.
Runner-collected total: −26.
- Net lines: **−159** (+42 / −201).
- Runtime saved: about 0.03 s (the 8 deleted cases each report 0.000 s;
the 20 folded cases summed 0.028 s against 0.011 s for the 2
replacements).
- Test-binary time on this shared machine: `vp_global_cli` 3.13 s → 3.32
s, `vp_pm_cli` 27.81 s → 29.06 s (noise).
### Per file
1. **`crates/vp_global_cli/src/commands/create.rs` ›
`test_create_command_module_exists`**
- Class: tautology (`assert!(true)`).
- Best defense: M1 (delegate `"new"` instead of `"create"`) passes all
502 tests, so this test cannot fail. The whole `mod tests` goes.
- Coverage gap (pre-existing, unchanged by this PR): no unit test covers
`vp create` delegation. It may be covered by the PTY snapshot suite,
which was not run.
2. **`crates/vp_global_cli/src/commands/env/use.rs` ›
`test_detect_shell_vp_shell_{powershell,fish,nu}`,
`test_detect_shell_posix_default`**
- Class: duplicates of stronger tests. `detect_shell` /
`Shell::from_str` live in `commands/shell.rs`; `env use` only imports
them.
- Still covered: `fish` is byte-identical to
`commands::shell::tests::test_detect_shell_vp_shell_fish`; `nu` to
`test_detect_shell_vp_shell_explicit`; lowercase `powershell` by
`test_shell_from_str` and `test_detect_shell_vp_shell_case_insensitive`;
`posix_default` by `test_detect_shell_defaults_without_vp_shell`.
- Best defenses M2–M5: each failed the nominee together with at least
one `commands::shell` test.
- The `use vp_shared::env_vars;` import is now `#[cfg(windows)]`, since
only the three Windows-only tests in the module still use it.
3. **`crates/vp_pm_cli/src/resolution/test_utils.rs` ›
`parses_args_without_a_program_name`,
`parses_subcommands_without_a_program_name`**
- Class: test tooling testing test tooling.
- Best defense: M7 fails 122 tests and M8 fails 17; every resolution
parser test exercises these helpers.
4. **`crates/vp_pm_cli/src/resolution/commands/list.rs` ›
`list_args_helper_keeps_pattern`** (and its test-only `list_args`
helper, which had no other caller)
- Class: test tooling testing test tooling; it only checked struct
construction.
- Best defenses: M9 fails only
`test_list_with_pattern_and_pass_through_args`; M10 fails
`test_parser_accepts_short_dev_and_global_flags` and
`cli::tests::projects_managed_global_commands`. The nominee passes both.
### Folds (`crates/vp_global_cli/src/upgrade_check.rs`)
- The 9 `is_newer_version_*` tests → `is_newer_version_compares_semver`
(12 rows, original comments kept, one comment added for the `0.0.0`
dev-build row).
- The 11 `should_run_for_*` / `should_not_run_for_*` tests →
`should_run_for_command_skips_excluded_and_machine_readable_commands`
(11 rows).
- M11, M12 and M13 still fail the folded tables.
### Kept after defense — do not re-nominate
None: no nominee survived its defense.
### Case counts
| file | before | after | delta | expected delta |
|---|---|---|---|---|
| vp_global_cli `commands/create.rs` | 1 | 0 | −1 | −1 |
| vp_global_cli `commands/env/use.rs` (Linux) | 16 | 12 | −4 | −4 |
| vp_global_cli `upgrade_check.rs` | 36 | 18 | −18 | −18 (20 folded into
2) |
| vp_pm_cli `resolution/commands/list.rs` | 45 | 44 | −1 | −1 |
| vp_pm_cli `resolution/test_utils.rs` | 2 | 0 | −2 | −2 |
| **Crates total** | 1,425 | 1,399 | −26 | −26 |
**0 new failures** (0 failed and 4 ignored, before and after).
### Mutations
Each was temporary and reverted (`git status` clean afterwards).
1. M1 `create.rs:15`: delegate `"new"` instead of `"create"`. Failed:
none.
2. M2 `shell.rs:30`: `"fish"` → `"fishshell"`. Failed: `use::…_fish`,
`shell::test_shell_from_str`, `shell::…_fish`.
3. M3 `shell.rs:31`: `"nu" | "nushell"` → `"nushell"`. Failed:
`use::…_nu`, `shell::…_explicit`, `shell::test_shell_from_str`.
4. M4 `shell.rs:32`: drop `"powershell"`. Failed: `use::…_powershell`,
`shell::…_case_insensitive`, `shell::test_shell_from_str`.
5. M5 `shell.rs:54`: default always `Cmd`. Failed:
`use::…_posix_default`, `shell::…_defaults_without_vp_shell`,
`shell::…_invalid_vp_shell_falls_back_to_default`.
6. M6 `shell.rs:49`: upper-case the value. Failed: none (equivalent
mutation; `from_str` lowercases).
7. M7 `test_utils.rs:70`: `test_argv` no longer prepends a program name.
Failed: 122 tests, including both nominees.
8. M8 `test_utils.rs:57`: `parse_subcommand` gets raw args. Failed: 17
tests (`config`, `dist_tag`, `owner`, `stage`, `token`, plus the
nominee).
9. M9 `list.rs:78-80`: pnpm drops the pattern. Failed:
`test_list_with_pattern_and_pass_through_args` only.
10. M10 `list.rs:11`: `pattern` becomes `#[arg(long)]`. Failed:
`test_parser_accepts_short_dev_and_global_flags`,
`cli::tests::projects_managed_global_commands`.
11. M11 `upgrade_check.rs:170` (after the fold): `>` → `>=`. Failed:
`is_newer_version_compares_semver`.
12. M12 `upgrade_check.rs:338` (after the fold): `Upgrade` removed from
the excluded commands. Failed:
`should_run_for_command_skips_excluded_and_machine_readable_commands`.
13. M13 `upgrade_check.rs:165` (after the fold): the `0.0.0` early
return removed. Failed: `is_newer_version_compares_semver`.
### What ran and what did not
- Ran, at origin/main and on this branch: `cargo test -p vp_global_cli`
and `cargo test -p vp_pm_cli` with `--report-time`; `cargo clippy -p
vp_global_cli -p vp_pm_cli --all-targets --all-features -- --deny
warnings` with the `just lint` allow-list; `cargo fmt --all -- --check`;
`git diff --check`. All pass.
- Not run: the full workspace `just test` / `just lint` / `just check`;
Windows targets (none installed here, so the `#[cfg(windows)]` import
gate was reviewed but not compiled; Windows CI will compile it); the
JS/Vitest suite; the PTY snapshot suite.
### Excluded pull requests
55 open PRs touch 737 files between them; none of the 5 files here is
among them. #3055 #3052 #3051 #3049 #3047 #3046 #3044 #3040 #3038 #3037
#3020 #3018 #3014 #3012 #3009 #3008 #3000 #2986 #2981 #2966 #2936 #2922
#2900 #2863 #2862 #2810 #2792 #2740 #2721 #2699 #2695 #2574 #2557 #2552
#2549 #2543 #2542 #2541 #2483 #2475 #2463 #2462 #2461 #2456 #2428 #2418
#2357 #2267 #2125 #1958 #1783 #1782 #1614 #1517 #1180.
### Age check (cutoff: 30 days, 2026-09-14)
First-added dates from `git log -S`, followed across the `vite_*` →
`vp_*` crate rename.
| Test | First added |
|---|---|
| `test_create_command_module_exists` | 2026-02-10 (a29ac83, #570) |
| `test_detect_shell_posix_default` | 2026-02-07 (194c0dc, #524) |
| `test_detect_shell_vp_shell_{powershell,fish,nu}` | 2026-05-24
(53ae721, #1658) |
| `test_utils` tests and `list_args_helper_keeps_pattern` | 2026-08-03
(c1574dd, #2140) |
| The 20 folded `upgrade_check` tests | 2026-03-30 (db75675) |
None was added for a bug or incident, and none is in a permission,
security or entitlement suite.
### Checks
| Check | Before | After |
|---|---|---|
| Tests `vp_global_cli` | 502 pass | 479 pass |
| Tests `vp_pm_cli` | 923 pass | 920 pass |
| Clippy (deny warnings) | pass | pass |
| rustfmt | – | pass |
| `git diff --check` | – | clean |
To revert: `git revert 687935d`.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01PxVsmvB9xfZKfVnUonY8kf
---
_Generated by [Claude
Code](https://claude.ai/code/session_01PxVsmvB9xfZKfVnUonY8kf)_
Co-authored-by: Claude <noreply@anthropic.com>
|
@codex review |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Codex Review: Didn't find any major issues. More of your lovely PRs please. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
|
Thanks for approving the workflows. The red CLI snapshot shards don't come from this change. The run tested the merge with On the three Linux shards, the same two snapshots fail too. Of the other 33 failures, 28 are steps that hit the registry and time out ( Found by a defect-hunting pipeline I build and run (Dev-next-gen), using Claude Code with Anthropic's Claude Opus 5.5. |
Vite+ 1.4 runs TypeScript and JavaScript files with `vpx`, and `vp migrate` can move tsx scripts to it. It also adds `vp check --deny-warnings` and `vp pm team`, and installs the global CLI's dependencies from a lockfile published with each release. ### Features - `vpx <file>` runs a TypeScript or JavaScript file on the project's Node.js with the [oxc-node](https://github.com/oxc-project/oxc-node) loader that ships with Vite+, and `vpx --watch <file>` reruns it when a file it uses changes. In `package.json` scripts, the `vpx` bin of the `vite-plus` package runs scripts without the global CLI and runs package binaries only from `node_modules/.bin`, pointing to `vp dlx` for anything not installed ([docs](https://viteplus.dev/guide/vpx#running-scripts)) ([#2936](#2936), [#3164](#3164)), by @Brooooooklyn and @fengmk2. - `vp migrate` offers to move tsx scripts to `vpx`: `tsx a.ts`, `npx tsx a.ts`, `node --import tsx a.ts`, and `tsx watch a.ts` in `package.json` scripts, lint-staged tasks, and `#!/usr/bin/env tsx` shebangs become `vpx a.ts` or `vpx --watch a.ts`. A project already on Vite+ gets the offer with `vp migrate --full` ([docs](https://viteplus.dev/guide/migrate-rules#tsx-to-vpx)) ([#3179](#3179)), by @fengmk2. - `vp check --deny-warnings` fails the check on lint warnings, so CI no longer needs a separate `vp lint --deny-warnings` run ([docs](https://viteplus.dev/guide/check#usage)) ([#3075](#3075)), by @acalvino4. - `vp pm team` creates and destroys registry organization teams and adds, removes, and lists their members, through npm or pnpm 11.13.0 and later, falling back to npm for older pnpm and Bun ([#3040](#3040)), by @jong-kyung. - Security: `vp` no longer accepts HTTPS certificates issued through the distrusted emSign intermediates when downloading Node.js, package managers, and upgrades ([RUSTSEC-2026-0382](https://rustsec.org/advisories/RUSTSEC-2026-0382.html), [RUSTSEC-2026-0383](https://rustsec.org/advisories/RUSTSEC-2026-0383.html)), and it ships tokio 1.54.1, which fixes a race in `tokio::time::Interval` ([RUSTSEC-2026-0384](https://rustsec.org/advisories/RUSTSEC-2026-0384)) ([#3159](#3159), [#3202](#3202)), by @wan9chi and @fengmk2. - `vp pm` registry commands (`login`, `logout`, `whoami`, `owner`, `token`, `dist-tag`, `deprecate`, `search`, `ping`, and `publish`) run pnpm's own commands on pnpm 11 and later (`token` from 12.13.0), and `vp pm owner` and `vp pm publish` run Yarn's own commands, so they follow that package manager's registry configuration and authentication. Older versions still go through npm ([#3044](#3044)), by @jong-kyung. - The installer and `vp upgrade` install the global CLI's JavaScript dependencies from a lockfile published with each release, so every installation of a version gets the same dependency versions. Set `VP_SETUP_SKIP_INSTALL_LOCKFILE=1` to resolve them again if that installation fails ([docs](https://viteplus.dev/guide/global-cli#vp-setup-skip-install-lockfile)) ([#3117](#3117)), by @fengmk2. - Upgrade the bundled tools ([#3133](#3133), [#3158](#3158), [#3175](#3175)), by @voidzero-guard[bot] and @fengmk2: - `vite@8.3.4` to `vite@8.3.5`, with fixes for bundled dev mode, chunk import maps, CSS `url()` values containing `%`, and subpath imports with several `#` characters. - `rolldown@1.2.14` to `rolldown@1.2.15`, with fixes for `this.resolve` recursion between plugins using `skipSelf: true`, strict execution order, and chunk import maps. - `oxlint@1.88.0` to `oxlint@1.89.0`, with rule fixes that report cases missed before, for example in `prefer-const`, `no-param-reassign`, and `sort-imports`. - `oxfmt@0.73.0` to `oxfmt@0.74.0`, with formatting fixes for comments, parentheses, JSDoc, JSON, YAML, and Markdown. - The new oxlint and oxfmt versions can flag code that passed before. If your CI runs `vp check`, run `vp fmt` after upgrading. - `vpx` scripts run on `oxc-node@1.0.0`. - `@vitejs/devtools` 0.8 is accepted as a peer dependency, alongside 0.7. ### Fixes & Enhancements - The standalone `vp` executable is 30%+ smaller ([#3086](#3086)), by @fengmk2. - `VP_SETUP_NODE_VERSION` selects the Node.js version the installer uses for the CLI's dependencies, so `setup-vp` can use the project's version and avoid downloading a second Node.js in CI ([docs](https://viteplus.dev/guide/global-cli#vp-setup-node-version)) ([#3087](#3087)), by @fengmk2. - When tasks miss the cache, `vp run` finishes sooner because it no longer waits for the disk after saving each result. If the computer loses power or the operating system crashes during a run, the entries it saved can be lost and those tasks run again ([vite-task#871](voidzero-dev/vite-task#871)), by @magurotuna. - Cached tasks no longer miss the cache when only pnpm's `node_modules/.modules.yaml` differs, for example after installing with another pnpm version, with `--ignore-scripts`, or on glibc and musl machines ([vite-task#850](voidzero-dev/vite-task#850)), by @wan9chi. - `vp run` in a package that sits inside a workspace folder but is not listed in its `pnpm-workspace.yaml` `packages` or `package.json` `workspaces` runs that package's own tasks with its own `packageManager`, instead of treating the enclosing workspace as its root ([vite-task#859](voidzero-dev/vite-task#859)), by @liangmiQwQ. - A mistyped or misplaced task setting fails with an error that names it, such as `unknown field outputs`, instead of `data did not match any variant of untagged enum UserTaskDefinition` ([vite-task#815](voidzero-dev/vite-task#815)), by @tlq5l. - `vp run` no longer panics on scripts that contain non-ASCII characters, such as `echo こんにちは`, and no longer cuts those commands off in its output ([vite-task#861](voidzero-dev/vite-task#861)), by @magurotuna. - In cached tasks on Linux and macOS, programs that pass `-1` as a directory descriptor, such as `ps -p <pid>` from procps-ng 4.0.6 and later, no longer abort ([vite-task#862](voidzero-dev/vite-task#862)), by @magurotuna. - On Linux, cached tasks such as `pnpm dlx` no longer occasionally abort with a stack overflow when the program makes concurrent system calls at startup ([vite-task#854](voidzero-dev/vite-task#854)), by @fengmk2. - On Windows, `vp run` and the global `vpx` wait for the child process to finish its Ctrl+C cleanup and exit with its code, instead of exiting immediately ([#3167](#3167)), by @fengmk2. - `vp migrate` and the `prefer-vite-plus-imports` lint autofix leave `vite/rolldown` and `vite/rolldown/*` imports unchanged, instead of rewriting them to `vite-plus/rolldown` subpaths that `vite-plus` does not export ([#3070](#3070), [#3191](#3191)), by @Crimson341 and @Dunqing. - `vp migrate` keeps existing `.nvmrc` files instead of converting them to `.node-version`, so nvm, fnm, and other tools that read `.nvmrc` keep working and the selected Node.js version does not change ([#3126](#3126)), by @liangmiQwQ. - `vp migrate` converts Oxlint configs that `extends` shared JSON files into TypeScript modules imported through `lint.extends`, so the inherited rules keep applying after migration ([#3097](#3097)), by @fengmk2. - `vp migrate` skips the git hooks prompt when the project's Vite+ hooks are already set up, and completes a partial setup without prompting ([#3118](#3118)), by @0froq. - `vp migrate` keeps the workspace members declared in `package.json` `workspaces` when it selects pnpm for a project without a lockfile, so recursive commands still include them ([#2863](#2863)), by @SaKaNa-Y. - `vp migrate` no longer reports `unawaited-assertion` for a local assertion promise that the function later awaits or returns ([#3180](#3180)), by @fengmk2. - `pnpm create vite-plus` and `yarn create vite-plus` no longer fail during dependency installation when `vp` is not on `PATH`, and no longer run a different global `vp` version for installation, formatting, and hooks ([#3181](#3181)), by @fengmk2. - `vp create` and `vp migrate` resolve the npm registry and credentials as npm does: a `.npmrc` above the project is no longer read, `userconfig` and `globalconfig` are honored, and registry hosts in credential keys match regardless of case ([#3124](#3124)), by @liangmiQwQ. - `vp pack` and `vp create` find the monorepo root the same way as `vp run` and `vp install`, and `vp pack` at a monorepo root without a `vite.config` no longer picks up a config from the directory above ([#3101](#3101)), by @liangmiQwQ. - `defineConfig` keeps plugins that are promises unchanged, so plugins that find themselves through properties on their promise, such as `vike()`, work under Vite+ ([#3154](#3154)), by @liangmiQwQ. - `vp dev` with `experimental.bundledDev` no longer fails with `ERR_MODULE_NOT_FOUND` when no separate `rolldown` package is installed, and no longer picks up the runtime of an unrelated installed `rolldown` ([#3111](#3111)), by @fengmk2. - With `nodeShimMode: system_first`, `vp node` and `vp env exec` run the system tool that the shell would find, instead of downloading and running the managed Node.js ([#3100](#3100)), by @liangmiQwQ. - `VP_NODE_VERSION=22` and other partial versions resolve to an exact release in `vp env install`, `vp env exec`, and `vp env clean`, instead of failing with a 404 download error ([#3038](#3038)), by @Dev-next-gen. - `vp env pin` and `vp env unpin` show the file and field they changed. Package-manager pins from a workspace member update the workspace root `package.json`, and the help and guide now say so ([#3103](#3103)), by @SaKaNa-Y. - In PowerShell, a bare `--` reaches `vp` again, so `vp create vite -- --template react-ts` forwards `--template` to create-vite ([#3083](#3083)), by @fengmk2. - Nushell 0.112.1 and later starts when the user defines a custom command with the same name as a built-in that the Vite+ `env.nu` calls, such as `update`. Run `vp env setup` again to regenerate `env.nu` ([#3123](#3123)), by @naokihaba. - Package-manager commands reject options that the selected version would silently ignore, such as `--dry-run` or `--provenance` with an npm whose version is unknown, instead of running without them ([#3122](#3122)), by @jong-kyung. - Fresh Bun installs verify the integrity hash in a `packageManager` pin and reject a mismatched download, as pnpm 12 and later already did ([#3134](#3134)), by @jong-kyung. - A failed `vp install -g` restores the executables and npm links that existed before, instead of deleting files it never created ([#3119](#3119)), by @jong-kyung. - `vp install -g` skips package binaries with unsafe names or targets instead of linking them, as pnpm does ([#3156](#3156)), by @jong-kyung. - `npm uninstall -g <package> --dry-run` no longer removes the package's commands from Vite+ ([#3112](#3112)), by @jong-kyung. ### Refactor - Replace `glob` with `tinyglobby` in the CLI and share `.nvmrc` line parsing between reading and pinning. Workspace discovery in `vp create` and `vp migrate` now honors negated patterns such as `!packages/foo` and follows symlinked directories in `**` patterns, as pnpm does ([#3099](#3099), [#3125](#3125)), by @liangmiQwQ. - Share clap error diagnostics, manager preference parsing, external tool lookup, and native shell parsing for migration rewrites, and remove a redundant git hooks wrapper ([#3172](#3172), [#3143](#3143), [#3138](#3138), [#3173](#3173)), by @jong-kyung, @myuron, and @fengmk2. ### Docs - Note that `run.cache` can only be set in the workspace root's `vite.config.ts` ([#3139](#3139)), by @yusuke99. ### Chore - Bump vite-task to `a3c087a`; its user-facing changes are listed above ([#3153](#3153), [#3168](#3168), [#3184](#3184)), by @wan9chi. - Run Node.js, runtime download, and package-manager tests against local mirrors and offline fixtures, serve snapshot registry traffic from local fixtures and a shared cache, replace sleeps with deterministic waits, keep snapshot setup off the npm registry, and fix or remove tests that checked nothing ([#3067](#3067), [#3169](#3169), [#3170](#3170), [#3171](#3171), [#3144](#3144), [#3146](#3146), [#3145](#3145), [#3147](#3147), [#3148](#3148), [#3194](#3194), [#3203](#3203)), by @fengmk2 and @liangmiQwQ. - Cover package-manager detection for nested projects and owner listing with pnpm 11.28.7, and allow time for the Playwright type check on slow runners ([#3051](#3051), [#3174](#3174), [#3082](#3082)), by @liangmiQwQ, @jong-kyung, and @fengmk2. - Update the Node.js versions used for development, CI, and release publishing to the [October 2026 security releases](https://nodejs.org/en/blog/vulnerability/october-2026-security-releases): 22.23.4, 24.22.1, and 26.12.1 ([#3186](#3186)), by @fengmk2. - Reduce GitHub Actions cache storage and enable the e18e lint rules for the repository ([#3149](#3149), [#3088](#3088)), by @fengmk2. - Upgrade JavaScript dependencies and Rust crates, including `@ast-grep/napi@0.51.0` and `serial_test@4` ([#3108](#3108), [#3109](#3109)), by @renovate[bot]. - Refine the release-manager and vite-task bump guidance ([#3084](#3084), [#3160](#3160)), by @fengmk2 and @wan9chi. ### Bundled Versions | Tool | Version | Source | Changelog | | --------------- | ---------- | --------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | | vite | `8.3.5` | [`981f07f`](vitejs/vite@981f07f) | [8.3.5](https://github.com/vitejs/vite/releases/tag/v8.3.5) | | rolldown | `1.2.15` | [`89d821c`](rolldown/rolldown@89d821c) | [1.2.15](https://github.com/rolldown/rolldown/releases/tag/v1.2.15) | | oxc-node | `1.0.0` | [`4759ced`](oxc-project/oxc-node@4759ced) | [1.0.0](https://github.com/oxc-project/oxc-node/releases/tag/v1.0.0) | | tsdown | `0.23.1` | [npm](https://npmx.dev/package/tsdown/v/0.23.1) | unchanged | | vitest | `5.0.5` | [npm](https://npmx.dev/package/vitest/v/5.0.5) | unchanged | | oxlint | `1.89.0` | [npm](https://npmx.dev/package/oxlint/v/1.89.0) | [1.89.0](https://github.com/oxc-project/oxc/releases/tag/oxlint_v1.89.0) | | oxlint-tsgolint | `7.0.2004` | [npm](https://npmx.dev/package/oxlint-tsgolint/v/7.0.2004) | unchanged | | oxfmt | `0.74.0` | [npm](https://npmx.dev/package/oxfmt/v/0.74.0) | [0.74.0](https://github.com/oxc-project/oxc/releases/tag/oxfmt_v0.74.0) | ### Upgrade ```bash vp upgrade ``` ### New Contributors @acalvino4, @Dev-next-gen, @0froq, @Crimson341, @Dunqing, @magurotuna, @tlq5l **Full Changelog**: v1.3.0...v1.4.0 --- 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) <fengmk2@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
> [!NOTE] > This PR body was truncated due to platform limits. This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Adoption](https://docs.renovatebot.com/merge-confidence/) | [Passing](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---|---|---| | [@ast-grep/napi](https://ast-grep.github.io) ([source](https://redirect.github.com/ast-grep/ast-grep)) | [`0.51.0` → `0.51.1`](https://renovatebot.com/diffs/npm/@ast-grep%2fnapi/0.51.0/0.51.1) |  |  |  |  | | [@iconify/vue](https://iconify.design/) ([source](https://redirect.github.com/iconify/iconify/tree/HEAD/components/vue)) | [`5.0.1` → `5.0.5`](https://renovatebot.com/diffs/npm/@iconify%2fvue/5.0.1/5.0.5) |  |  |  |  | | [@nkzw/safe-word-list](https://redirect.github.com/nkzw-tech/safe-word-list) | [`3.1.0` → `3.1.2`](https://renovatebot.com/diffs/npm/@nkzw%2fsafe-word-list/3.1.0/3.1.2) |  |  |  |  | | [bingo](https://create.bingo) ([source](https://redirect.github.com/bingo-js/bingo/tree/HEAD/packages/bingo)) | [`^0.13.2` → `^0.16.0`](https://renovatebot.com/diffs/npm/bingo/0.13.2/0.16.0) |  |  |  |  | | [es-module-lexer](https://redirect.github.com/guybedford/es-module-lexer) | [`3.0.3` → `3.0.4`](https://renovatebot.com/diffs/npm/es-module-lexer/3.0.3/3.0.4) |  |  |  |  | | [fast-wrap-ansi](https://redirect.github.com/43081j/fast-wrap-ansi) | [`0.2.0` → `0.2.2`](https://renovatebot.com/diffs/npm/fast-wrap-ansi/0.2.0/0.2.2) |  |  |  |  | | [mermaid](https://redirect.github.com/mermaid-js/mermaid) | [`12.2.0` → `12.3.0`](https://renovatebot.com/diffs/npm/mermaid/12.2.0/12.3.0) |  |  |  |  | | [playwright](https://playwright.dev) ([source](https://redirect.github.com/microsoft/playwright)) | [`1.62.1` → `1.65.0`](https://renovatebot.com/diffs/npm/playwright/1.62.1/1.65.0) |  |  |  |  | | [reka-ui](https://redirect.github.com/unovue/reka-ui) | [`2.9.9` → `2.11.0`](https://renovatebot.com/diffs/npm/reka-ui/2.9.9/2.11.0) |  |  |  |  | | [tailwindcss](https://tailwindcss.com) ([source](https://redirect.github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss)) | [`4.3.0` → `4.3.5`](https://renovatebot.com/diffs/npm/tailwindcss/4.3.0/4.3.5) |  |  |  |  | | [vitepress-plugin-group-icons](https://redirect.github.com/yuyinws/vitepress-plugin-group-icons) | [`1.7.5` → `1.8.1`](https://renovatebot.com/diffs/npm/vitepress-plugin-group-icons/1.7.5/1.8.1) |  |  |  |  | | [vitepress-plugin-llms](https://redirect.github.com/okineadev/vitepress-plugin-llms) | [`1.13.1` → `1.14.0`](https://renovatebot.com/diffs/npm/vitepress-plugin-llms/1.13.1/1.14.0) |  |  |  |  | | [vue](https://vuejs.org/) ([source](https://redirect.github.com/vuejs/core)) | [`3.5.35` → `3.5.45`](https://renovatebot.com/diffs/npm/vue/3.5.35/3.5.45) |  |  |  |  | | [wrangler](https://redirect.github.com/cloudflare/workers-sdk) ([source](https://redirect.github.com/cloudflare/workers-sdk/tree/HEAD/packages/wrangler)) | [`4.127.1` → `4.158.0`](https://renovatebot.com/diffs/npm/wrangler/4.127.1/4.158.0) |  |  |  |  | --- ### Release Notes <details> <summary>ast-grep/ast-grep (@​ast-grep/napi)</summary> ### [`v0.51.1`](https://redirect.github.com/ast-grep/ast-grep/blob/HEAD/CHANGELOG.md#0511) [Compare Source](https://redirect.github.com/ast-grep/ast-grep/compare/0.51.0...0.51.1) > 2 November 2026 - fix(cli): report skipped files and reason in --inspect entity [`#3044`](https://redirect.github.com/ast-grep/ast-grep/pull/3044) - chore(deps): update rust crate tree-sitter-scala to v0.26.4 [`#3054`](https://redirect.github.com/ast-grep/ast-grep/pull/3054) - fix(dynamic): only replace metavariable sigils with the expando char [`#3052`](https://redirect.github.com/ast-grep/ast-grep/pull/3052) - fix(core): keep $ followed by a digit literal in fix templates [`#3045`](https://redirect.github.com/ast-grep/ast-grep/pull/3045) - fix(deps): update rust-wasm-bindgen monorepo [`#3046`](https://redirect.github.com/ast-grep/ast-grep/pull/3046) - Fix macOS universal2 wheel matching [`#3050`](https://redirect.github.com/ast-grep/ast-grep/pull/3050) - chore(deps): update rust crate napi-derive to v3.7.0 [`#3049`](https://redirect.github.com/ast-grep/ast-grep/pull/3049) - chore(deps): update rust crate napi to v3.16.1 [`#3047`](https://redirect.github.com/ast-grep/ast-grep/pull/3047) - fix(scan): bind utilDirs utils for --inline-rules and --rules [`#2943`](https://redirect.github.com/ast-grep/ast-grep/pull/2943) - fix(cli): percent-encode file paths in sarif uri [`#3042`](https://redirect.github.com/ast-grep/ast-grep/pull/3042) - chore(deps): update dependency node to v26 [`#3043`](https://redirect.github.com/ast-grep/ast-grep/pull/3043) - chore(deps): update dependency oxlint to v1.90.0 [`#3036`](https://redirect.github.com/ast-grep/ast-grep/pull/3036) - chore(deps): update astral-sh/setup-uv action to v10.3.3 [`#3040`](https://redirect.github.com/ast-grep/ast-grep/pull/3040) - chore(deps): update rust crate globset to v0.4.21 [`#3037`](https://redirect.github.com/ast-grep/ast-grep/pull/3037) - chore(deps): update rust crate ignore to v0.4.34 [`#3038`](https://redirect.github.com/ast-grep/ast-grep/pull/3038) - chore(deps): update dependency node to v26 [`#3039`](https://redirect.github.com/ast-grep/ast-grep/pull/3039) - fix(sarif): set the log version to 2.1.0 [`#3035`](https://redirect.github.com/ast-grep/ast-grep/pull/3035) - fix(cli): escape special characters in github format output [`#3034`](https://redirect.github.com/ast-grep/ast-grep/pull/3034) - chore(deps): update dependency web-tree-sitter to ^0.26.0 || ^0.27.0 [`#3019`](https://redirect.github.com/ast-grep/ast-grep/pull/3019) - chore(deps): update dependency dprint to v0.64.3 [`#3029`](https://redirect.github.com/ast-grep/ast-grep/pull/3029) - chore(deps): update rust crate smallvec to v1.16.4 [`#3030`](https://redirect.github.com/ast-grep/ast-grep/pull/3030) - chore(deps): update rust crate similar to v3.2.1 [`#3031`](https://redirect.github.com/ast-grep/ast-grep/pull/3031) - chore(deps): update rust crate tree-sitter-md to v0.5.4 [`#3032`](https://redirect.github.com/ast-grep/ast-grep/pull/3032) - fix(deps): update rust crate tree-sitter-dart to 0.3.0 [`#3033`](https://redirect.github.com/ast-grep/ast-grep/pull/3033) - chore(deps): update dependency oxlint to v1.89.0 [`#3018`](https://redirect.github.com/ast-grep/ast-grep/pull/3018) - chore(deps): update dependency [@​napi-rs/cli](https://redirect.github.com/napi-rs/cli) to v3.10.9 [`#3025`](https://redirect.github.com/ast-grep/ast-grep/pull/3025) - chore(deps): update rust crate napi-derive to v3.6.13 [`#3026`](https://redirect.github.com/ast-grep/ast-grep/pull/3026) - chore(deps): update rust crate napi to v3.15.0 [`#3028`](https://redirect.github.com/ast-grep/ast-grep/pull/3028) - chore(deps): update astral-sh/setup-uv action to v10.3.2 [`#3024`](https://redirect.github.com/ast-grep/ast-grep/pull/3024) - chore(deps): update dependency dprint to v0.64.1 [`#3017`](https://redirect.github.com/ast-grep/ast-grep/pull/3017) - chore(deps): update rust crate tokio to v1.54.1 [`#3020`](https://redirect.github.com/ast-grep/ast-grep/pull/3020) - refactor(cli): apply project defaults through InputArgs [`#3027`](https://redirect.github.com/ast-grep/ast-grep/pull/3027) - feat(cli): support no-ignore in project config [`#3003`](https://redirect.github.com/ast-grep/ast-grep/pull/3003) - fix(deps): update rust crate tree-sitter-php to 0.25.0 [`#3022`](https://redirect.github.com/ast-grep/ast-grep/pull/3022) - chore(deps): update rust crate tree-sitter to v0.27.1 [`#3014`](https://redirect.github.com/ast-grep/ast-grep/pull/3014) - chore(deps): update dependency [@​ast-grep/napi](https://redirect.github.com/ast-grep/napi) to v0.51.0 [`#3016`](https://redirect.github.com/ast-grep/ast-grep/pull/3016) - chore(deps): update rust crate tree-sitter-scala to v0.26.3 [`#3015`](https://redirect.github.com/ast-grep/ast-grep/pull/3015) - chore(deps): update astral-sh/setup-uv action to v10.3.0 [`#2938`](https://redirect.github.com/ast-grep/ast-grep/pull/2938) - chore(deps): update dependency [@​napi-rs/cli](https://redirect.github.com/napi-rs/cli) to v3.10.8 [`#3004`](https://redirect.github.com/ast-grep/ast-grep/pull/3004) - chore(deps): update rust crate toml_edit to v0.25.17 [`#3013`](https://redirect.github.com/ast-grep/ast-grep/pull/3013) - chore(deps): update rust crate smallvec to v1.16.3 [`#3011`](https://redirect.github.com/ast-grep/ast-grep/pull/3011) - chore(deps): update rust crate tokio-util to v0.7.20 [`#3012`](https://redirect.github.com/ast-grep/ast-grep/pull/3012) - chore(deps): update rust crate schemars to v1.2.3 [`#3009`](https://redirect.github.com/ast-grep/ast-grep/pull/3009) - chore(deps): update rust crate serde_json to v1.0.154 [`#3010`](https://redirect.github.com/ast-grep/ast-grep/pull/3010) - chore(deps): update dependency [@​types/node](https://redirect.github.com/types/node) to v24.19.2 [`#3007`](https://redirect.github.com/ast-grep/ast-grep/pull/3007) - chore(deps): update dependency web-tree-sitter to ^0.27.0 [`#2914`](https://redirect.github.com/ast-grep/ast-grep/pull/2914) - chore(deps): update rust crate napi-derive to v3.6.12 [`#3008`](https://redirect.github.com/ast-grep/ast-grep/pull/3008) - chore(deps): update dependency smol-toml to v1.9.1 [`#2985`](https://redirect.github.com/ast-grep/ast-grep/pull/2985) - fix(deps): update rust-wasm-bindgen monorepo [`#2924`](https://redirect.github.com/ast-grep/ast-grep/pull/2924) - chore(deps): update rust crate tree-sitter-swift to v0.7.4 [`#2982`](https://redirect.github.com/ast-grep/ast-grep/pull/2982) - chore(deps): update rust crate napi-build to v2.6.0 [`#2987`](https://redirect.github.com/ast-grep/ast-grep/pull/2987) - chore(deps): update rust crate napi to v3.14.2 [`#2986`](https://redirect.github.com/ast-grep/ast-grep/pull/2986) - fix(config): reject unknown top-level keys in rule config [`#3006`](https://redirect.github.com/ast-grep/ast-grep/pull/3006) - fix(cli): report skipped files and reason in --inspect entity ([#​3044](https://redirect.github.com/ast-grep/ast-grep/issues/3044)) [`#2990`](https://redirect.github.com/ast-grep/ast-grep/issues/2990) - fix(config): reject unknown top-level keys in rule config ([#​3006](https://redirect.github.com/ast-grep/ast-grep/issues/3006)) [`#2963`](https://redirect.github.com/ast-grep/ast-grep/issues/2963) - Revert "chore(deps): update dependency node to v26 ([#​3039](https://redirect.github.com/ast-grep/ast-grep/issues/3039))" [`6b5708a`](https://redirect.github.com/ast-grep/ast-grep/commit/6b5708a32991134bf0bef6ec158d071a6612a79c) - fix: mark GlobalRules::insert crate pub only and unsafe [`e52c478`](https://redirect.github.com/ast-grep/ast-grep/commit/e52c4783d89576fb265e0746603c1848250a11a4) - fix: fix web-tree-sitter 0.26 memory corruption [`ecb8578`](https://redirect.github.com/ast-grep/ast-grep/commit/ecb85782c2381bfca337156c89bbe91972de3b1a) </details> <details> <summary>bingo-js/bingo (bingo)</summary> ### [`v0.16.0`](https://redirect.github.com/bingo-js/bingo/blob/HEAD/packages/bingo/CHANGELOG.md#0160) [Compare Source](https://redirect.github.com/bingo-js/bingo/compare/bingo@0.15.0...bingo@0.16.0) ##### Minor Changes - [#​552](https://redirect.github.com/bingo-js/bingo/pull/552) [`8f50ea7`](https://redirect.github.com/bingo-js/bingo/commit/8f50ea7e8bdc4608213bfaba2108d2aebb1e8470) Thanks [@​michaelfaith](https://redirect.github.com/michaelfaith)! - Bumped Node support to `^22.22.2 || ^24.15.0 || >=26.0.0`. Namely, this just means a slightly higher minimum for v22. ##### Patch Changes - [#​544](https://redirect.github.com/bingo-js/bingo/pull/544) [`94c14ee`](https://redirect.github.com/bingo-js/bingo/commit/94c14ee7d83e96a24efe67d21510578e4dd79e54) Thanks [@​michaelfaith](https://redirect.github.com/michaelfaith)! - Updated attribution for all packages to include both maintainers. - [#​553](https://redirect.github.com/bingo-js/bingo/pull/553) [`41f0dbe`](https://redirect.github.com/bingo-js/bingo/commit/41f0dbe2d45509e82bf9569bd815df4d9174414d) Thanks [@​michaelfaith](https://redirect.github.com/michaelfaith)! - *Deps:* Updated `hosted-git-info` to v10. - [#​551](https://redirect.github.com/bingo-js/bingo/pull/551) [`f256818`](https://redirect.github.com/bingo-js/bingo/commit/f25681821ac79bccf85a71322cd644b995b9ea81) Thanks [@​michaelfaith](https://redirect.github.com/michaelfaith)! - Bumped multiple dependencies. - Updated dependencies \[[`94c14ee`](https://redirect.github.com/bingo-js/bingo/commit/94c14ee7d83e96a24efe67d21510578e4dd79e54), [`f256818`](https://redirect.github.com/bingo-js/bingo/commit/f25681821ac79bccf85a71322cd644b995b9ea81), [`8f50ea7`](https://redirect.github.com/bingo-js/bingo/commit/8f50ea7e8bdc4608213bfaba2108d2aebb1e8470)]: - bingo-fs\@​0.8.0 - bingo-requests\@​0.7.0 - bingo-systems\@​0.9.0 ### [`v0.15.0`](https://redirect.github.com/bingo-js/bingo/blob/HEAD/packages/bingo/CHANGELOG.md#0150) [Compare Source](https://redirect.github.com/bingo-js/bingo/compare/bingo@0.14.0...bingo@0.15.0) ##### Minor Changes - [#​495](https://redirect.github.com/bingo-js/bingo/pull/495) [`1e0acec`](https://redirect.github.com/bingo-js/bingo/commit/1e0acece25c593e8f22727006ed239c440c287e3) Thanks [@​michaelfaith](https://redirect.github.com/michaelfaith)! - Added `exports` conditions to the package to establish a strict public API. In addition to the primary entry point, the `package.json` is also exported. - [#​495](https://redirect.github.com/bingo-js/bingo/pull/495) [`1e0acec`](https://redirect.github.com/bingo-js/bingo/commit/1e0acece25c593e8f22727006ed239c440c287e3) Thanks [@​michaelfaith](https://redirect.github.com/michaelfaith)! - Updated supported versions of node to `^22.15.0 || ^24.15.0 || >=26.0.0`, removing support for EoL versions. ##### Patch Changes - [#​509](https://redirect.github.com/bingo-js/bingo/pull/509) [`89223e9`](https://redirect.github.com/bingo-js/bingo/commit/89223e9724b08d8747ad7e9d91bd07bff623d6b5) Thanks [@​michaelfaith](https://redirect.github.com/michaelfaith)! - Declared `sideEffects: false` to the package.json. - Updated dependencies \[[`1e0acec`](https://redirect.github.com/bingo-js/bingo/commit/1e0acece25c593e8f22727006ed239c440c287e3), [`1e0acec`](https://redirect.github.com/bingo-js/bingo/commit/1e0acece25c593e8f22727006ed239c440c287e3), [`89223e9`](https://redirect.github.com/bingo-js/bingo/commit/89223e9724b08d8747ad7e9d91bd07bff623d6b5)]: - bingo-fs\@​0.7.0 - bingo-requests\@​0.6.0 - bingo-systems\@​0.8.0 ### [`v0.14.0`](https://redirect.github.com/bingo-js/bingo/blob/HEAD/packages/bingo/CHANGELOG.md#0140) [Compare Source](https://redirect.github.com/bingo-js/bingo/compare/bingo@0.13.2...bingo@0.14.0) ##### Minor Changes - [#​480](https://redirect.github.com/bingo-js/bingo/pull/480) [`471336b`](https://redirect.github.com/bingo-js/bingo/commit/471336be2234f8569c0b7ad0cadebb9f5fc388cd) Thanks [@​mike-4040](https://redirect.github.com/mike-4040)! - Declare `zod` as an optional peer dependency `bingo` and the `input-from-*` packages list `zod` (`^4.4.3`) under both `dependencies` and optional `peerDependencies`. Package managers that support peers with defaults, such as pnpm and Yarn, give `bingo` the project's own copy of `zod` and warn when its version falls outside the supported range. Projects that use `zod` only through `bingo` get it installed as a regular dependency. </details> <details> <summary>guybedford/es-module-lexer (es-module-lexer)</summary> ### [`v3.0.4`](https://redirect.github.com/guybedford/es-module-lexer/releases/tag/3.0.4) [Compare Source](https://redirect.github.com/guybedford/es-module-lexer/compare/3.0.3...3.0.4) #### What's Changed - perf(lexer): reduce TS lookahead work by [@​BridgeAR](https://redirect.github.com/BridgeAR) in [#​258](https://redirect.github.com/guybedford/es-module-lexer/pull/258) - fix(parser): preserve complete import attribute metadata by [@​BridgeAR](https://redirect.github.com/BridgeAR) in [#​260](https://redirect.github.com/guybedford/es-module-lexer/pull/260) - fix(ts): lex `/` after a postfix non-null assertion as division by [@​guybedford](https://redirect.github.com/guybedford) in [#​263](https://redirect.github.com/guybedford/es-module-lexer/pull/263) - ci: add release and publish workflows by [@​guybedford](https://redirect.github.com/guybedford) in [#​264](https://redirect.github.com/guybedford/es-module-lexer/pull/264) **Full Changelog**: <guybedford/es-module-lexer@3.0.3...3.0.4> </details> <details> <summary>43081j/fast-wrap-ansi (fast-wrap-ansi)</summary> ### [`v0.2.2`](https://redirect.github.com/43081j/fast-wrap-ansi/releases/tag/0.2.2) [Compare Source](https://redirect.github.com/43081j/fast-wrap-ansi/compare/0.2.0...0.2.2) #### What's Changed - chore: fix typescript build by [@​43081j](https://redirect.github.com/43081j) in [#​95](https://redirect.github.com/43081j/fast-wrap-ansi/pull/95) **Full Changelog**: <43081j/fast-wrap-ansi@0.2.1...0.2.2> </details> <details> <summary>mermaid-js/mermaid (mermaid)</summary> ### [`v12.3.0`](https://redirect.github.com/mermaid-js/mermaid/releases/tag/mermaid%4012.3.0) [Compare Source](https://redirect.github.com/mermaid-js/mermaid/compare/mermaid@12.2.0...mermaid@12.3.0) ##### Minor Changes - [#​8164](https://redirect.github.com/mermaid-js/mermaid/pull/8164) [`592d0e4`](https://redirect.github.com/mermaid-js/mermaid/commit/592d0e407d557b501d9f273ed18c7c62b1b9f48b) Thanks [@​filipsajdak](https://redirect.github.com/filipsajdak)! - feat: add the open-arrow and hollow-circle edge markers, so a notation can tell two kinds of flow apart by whether the head is filled - [#​8165](https://redirect.github.com/mermaid-js/mermaid/pull/8165) [`5c8aa5d`](https://redirect.github.com/mermaid-js/mermaid/commit/5c8aa5d834b7090258259eaf8b827cbefd6ff40f) Thanks [@​filipsajdak](https://redirect.github.com/filipsajdak)! - feat: add the BPMN element shapes - events, gateways, activities, data objects, data stores and text annotations - each reporting where a line meets what is drawn - [#​8470](https://redirect.github.com/mermaid-js/mermaid/pull/8470) [`692d22a`](https://redirect.github.com/mermaid-js/mermaid/commit/692d22a3ec9cf235cecf17013160f14dafb42999) Thanks [@​openmindednewby](https://redirect.github.com/openmindednewby)! - feat: flowchart edges accept a `step` number (`e1@{ step: 1 }`); a dot travels the edges in step order and loops, hidden under `prefers-reduced-motion` - [#​8478](https://redirect.github.com/mermaid-js/mermaid/pull/8478) [`56aa105`](https://redirect.github.com/mermaid-js/mermaid/commit/56aa10536075a320c084087478c468553b923e6e) Thanks [@​openmindednewby](https://redirect.github.com/openmindednewby)! - feat: add `flowchart.stepDuration` to set how many seconds each step of the flowchart step animation lasts - [#​8479](https://redirect.github.com/mermaid-js/mermaid/pull/8479) [`800f7ef`](https://redirect.github.com/mermaid-js/mermaid/commit/800f7efb1c7e80cf56478507808c744a1d07e1c1) Thanks [@​openmindednewby](https://redirect.github.com/openmindednewby)! - feat: highlight the flowchart edge whose step is playing, in sync with the step animation dot - [#​8480](https://redirect.github.com/mermaid-js/mermaid/pull/8480) [`50d6294`](https://redirect.github.com/mermaid-js/mermaid/commit/50d6294dab27123d7ecc1301c2c861bfe7ef4dce) Thanks [@​openmindednewby](https://redirect.github.com/openmindednewby)! - feat: add `flowchart.stepNumbers` to show each step edge's number in a badge ##### Patch Changes - [#​8443](https://redirect.github.com/mermaid-js/mermaid/pull/8443) [`2ff8286`](https://redirect.github.com/mermaid-js/mermaid/commit/2ff8286f9aa82b89aefe26c575c49a575fa518c1) Thanks [@​knsv-bot](https://redirect.github.com/knsv-bot)! - fix: agentflow renders the `a[/…/]` short form as an input instead of falling back to a task with a SHAPE_UNSUPPORTED warning - [#​8661](https://redirect.github.com/mermaid-js/mermaid/pull/8661) [`b200b27`](https://redirect.github.com/mermaid-js/mermaid/commit/b200b270f5e51d9199c5263dc402f4a6fe4fa33a) Thanks [@​pbrolin47](https://redirect.github.com/pbrolin47)! - fix: Bump DOMPurify to 3.4.17 to address GHSA-55q2-fjhq-7xh7 and GHSA-6688-9rhm-gjv2 - [#​8633](https://redirect.github.com/mermaid-js/mermaid/pull/8633) [`686f350`](https://redirect.github.com/mermaid-js/mermaid/commit/686f350e8c7627dfcc6b0035f237f76bca1152b2) Thanks [@​sidharthv96](https://redirect.github.com/sidharthv96)! - chore: Remove the `uuid` dependency and the unused legacy ER diagram renderer - [#​8661](https://redirect.github.com/mermaid-js/mermaid/pull/8661) [`7eec083`](https://redirect.github.com/mermaid-js/mermaid/commit/7eec083adcaba707257795feb937f2274c990713) Thanks [@​pbrolin47](https://redirect.github.com/pbrolin47)! - fix: Stop an edge from a node inside a subgraph from crossing an edge from the subgraph itself to the same node with ELK 0.10+ (e.g. `outer --> a` with `da --> a`, or `three --> two` with `two --> c2`) - [#​8532](https://redirect.github.com/mermaid-js/mermaid/pull/8532) [`42d3760`](https://redirect.github.com/mermaid-js/mermaid/commit/42d37602aed5ddbfb2674b78e08336fa5f3fb548) Thanks [@​Devehab](https://redirect.github.com/Devehab)! - fix: upgrade bundled elkjs from 0.9.3 to 0.12.0, which is licensed `EPL-2.0 OR GPL-3.0-or-later`, so GPL-3.0 projects can ship mermaid with ELK - [#​8162](https://redirect.github.com/mermaid-js/mermaid/pull/8162) [`d5ca27a`](https://redirect.github.com/mermaid-js/mermaid/commit/d5ca27a636a2a5b65768c8ef3f847601dac055a9) Thanks [@​filipsajdak](https://redirect.github.com/filipsajdak)! - fix(swimlanes): size a lane that holds a nested subgraph (TB drew it as an empty 0x0 box, and likewise an outer group holding lanes), and grow LR and RL lanes by the nested group's padding - [#​8405](https://redirect.github.com/mermaid-js/mermaid/pull/8405) [`b4299f2`](https://redirect.github.com/mermaid-js/mermaid/commit/b4299f2f440e63092caab6fdfe2d1b6cc19308a8) Thanks [@​filipsajdak](https://redirect.github.com/filipsajdak)! - fix: do not draw a stray empty swimlane when a node is listed in two lanes, and warn about it and about a subgraph nested in a lane - [#​8385](https://redirect.github.com/mermaid-js/mermaid/pull/8385) [`37d0ace`](https://redirect.github.com/mermaid-js/mermaid/commit/37d0aceb1e435490a7614299d035c7dc91729282) Thanks [@​filipsajdak](https://redirect.github.com/filipsajdak)! - fix(swimlanes): keep two arrowheads that land on one face of a node apart when a sibling edge is straightened - [#​8385](https://redirect.github.com/mermaid-js/mermaid/pull/8385) [`38e810a`](https://redirect.github.com/mermaid-js/mermaid/commit/38e810afe946ac4ebf48b7274c02689e032c51db) Thanks [@​filipsajdak](https://redirect.github.com/filipsajdak)! - fix(swimlanes): an edge routed round the outside of a diamond now arrives at one of its vertices instead of ending in empty space beside it - [#​8385](https://redirect.github.com/mermaid-js/mermaid/pull/8385) [`25d7e31`](https://redirect.github.com/mermaid-js/mermaid/commit/25d7e314d143efb31b5f0813f9ee5fb7b50bd19b) Thanks [@​filipsajdak](https://redirect.github.com/filipsajdak)! - fix(swimlanes): a second edge leaving a diamond on the same level as its target now leaves from a free vertex instead of running beside the first - [#​8171](https://redirect.github.com/mermaid-js/mermaid/pull/8171) [`a4750b4`](https://redirect.github.com/mermaid-js/mermaid/commit/a4750b42aa697b2fed476cdfb297407b70b61e8e) Thanks [@​filipsajdak](https://redirect.github.com/filipsajdak)! - fix: dock a swimlane edge on the shape it points at, so a line reaches an event's ring instead of stopping at the room its caption reserves - [#​8385](https://redirect.github.com/mermaid-js/mermaid/pull/8385) [`67315b9`](https://redirect.github.com/mermaid-js/mermaid/commit/67315b937147ad06ce202dd9bdaaa219697b55d4) Thanks [@​filipsajdak](https://redirect.github.com/filipsajdak)! - fix: an edge label no longer pushes the nodes it joins a rank apart - [#​8385](https://redirect.github.com/mermaid-js/mermaid/pull/8385) [`21a1f5c`](https://redirect.github.com/mermaid-js/mermaid/commit/21a1f5c11de99daef5dae6639c9cd4649ae62efd) Thanks [@​filipsajdak](https://redirect.github.com/filipsajdak)! - fix(swimlanes): stop the crossing cleanup from joining two routes at a corner so they read as one line - [#​8385](https://redirect.github.com/mermaid-js/mermaid/pull/8385) [`e14bc3a`](https://redirect.github.com/mermaid-js/mermaid/commit/e14bc3a752b1c18e01fef3e849ae83bc0f35417f) Thanks [@​filipsajdak](https://redirect.github.com/filipsajdak)! - fix(swimlanes): an edge no longer arrives at the vertex of a hexagon that another edge leaves from - [#​8459](https://redirect.github.com/mermaid-js/mermaid/pull/8459) [`edd162f`](https://redirect.github.com/mermaid-js/mermaid/commit/edd162f3f052649709a660cff4b511ed45584d7f) Thanks [@​Yun-seoung](https://redirect.github.com/Yun-seoung)! - fix: Allow flowchart edge IDs regardless of whitespace after the node shape Edge IDs may no longer contain `[ ] ( ) { } |`. - [#​8402](https://redirect.github.com/mermaid-js/mermaid/pull/8402) [`4f2bade`](https://redirect.github.com/mermaid-js/mermaid/commit/4f2bade8434bf25e9b3daf3fdd873515ae70ce23) Thanks [@​pcp-cmd](https://redirect.github.com/pcp-cmd)! - fix: Render use case include and extend relationship labels with UML guillemets. </details> <details> <summary>microsoft/playwright (playwright)</summary> ### [`v1.65.0`](https://redirect.github.com/microsoft/playwright/releases/tag/v1.65.0) [Compare Source](https://redirect.github.com/microsoft/playwright/compare/v1.64.1...v1.65.0) ##### 🥟 Run tests with Bun The test runner now runs under [Bun](https://bun.com). Bun transpiles your TypeScript test files itself, so Playwright does not use Babel or its compilation cache. Pass the `--bun` flag, because without it `bunx playwright test` runs on Node.js: ```bash bunx --bun playwright test ``` Our CI runs the test runner tests under Bun 1.4.3 on Linux. Some features work differently under Bun: - There is no watch mode. UI mode does not run tests again when files change, and `--only-changed` does not follow imports. - Bun loads modules itself, so `--tsconfig` and the JSX options in `tsconfig.json` have no effect, and custom ESM loaders are not supported. - Stack traces do not include async frames, and API names do not include the class name: `click` instead of `locator.click`. This changes some step locations, step titles and error messages. - Console output of a test does not get into the trace and UI mode. ##### 🚨 Reports with only failures New [`failures`](https://playwright.dev/docs/test-reporters#failures-reporter) reporter prints failures and successful retries as they occur, followed by a summary, without progress output. New `onlyFailures` option of the HTML, JSON and JUnit reporters [keeps only](https://playwright.dev/docs/test-reporters#report-only-failures) tests with unexpected outcomes, flaky tests and interrupted tests: ```js // playwright.config.ts import { defineConfig } from '@playwright/test'; export default defineConfig({ reporter: [ ['failures'], ['html', { onlyFailures: true }], ], }); ``` ##### 🎯 Test runner - New built-in `-exclusive-` [test lock](https://playwright.dev/docs/test-parallel#test-locks) runs a test only when no other tests are running. All other tests continue to run in parallel with each other: ```js test('restart the server', { lock: '-exclusive-' }, async () => { // No other test runs while this one is running. }); ``` - [test.skip()](https://playwright.dev/docs/api/class-test#test-skip), [test.fixme()](https://playwright.dev/docs/api/class-test#test-fixme), [test.fail()](https://playwright.dev/docs/api/class-test#test-fail) and [test.slow()](https://playwright.dev/docs/api/class-test#test-slow) now accept only a description. It is recorded in the test annotation: ```js test('upload a file', async ({ page }) => { test.skip('Not implemented yet'); }); ``` - New `PLAYWRIGHT_TRANSFORM_CACHE_DIR` environment variable sets the directory for transpiled test files, for example on a Linux machine shared with other users. ##### New APIs - New options [`timeout`](https://playwright.dev/docs/api/class-cdpsession#cdp-session-send-option-timeout) and [`signal`](https://playwright.dev/docs/api/class-cdpsession#cdp-session-send-option-signal) in [cdpSession.send()](https://playwright.dev/docs/api/class-cdpsession#cdp-session-send). - New [testRun.mode()](https://playwright.dev/docs/api/class-testrun#test-run-mode) returns the execution mode of a suite during [reporter.preprocess()](https://playwright.dev/docs/api/class-reporter#reporter-preprocess). ##### Notable Changes⚠️ - TypeScript class fields now follow [`useDefineForClassFields`](https://playwright.dev/docs/test-typescript#tsconfig-class-fields) from your `tsconfig.json`, the same as `tsc`. It is enabled for `ES2022` and later targets, and when `target` is not specified. A field initializer that reads a constructor parameter property now fails, because the initializer runs first: ```js class LoginPage { // TypeError: Cannot read properties of undefined (reading 'getByRole') readonly submit = this.page.getByRole('button', { name: 'Submit' }); constructor(private readonly page: Page) {} } ``` Move the initialization to the constructor, or set `"useDefineForClassFields": false` in your `tsconfig.json`. - Actions such as [locator.click()](https://playwright.dev/docs/api/class-locator#locator-click), [locator.check()](https://playwright.dev/docs/api/class-locator#locator-check), [locator.tap()](https://playwright.dev/docs/api/class-locator#locator-tap), [locator.fill()](https://playwright.dev/docs/api/class-locator#locator-fill), [locator.clear()](https://playwright.dev/docs/api/class-locator#locator-clear) and [locator.selectOption()](https://playwright.dev/docs/api/class-locator#locator-select-option) now wait for the element to be [not inert](https://playwright.dev/docs/actionability#not-inert). An action on an element with the `inert` attribute, or inside such an element, now times out if the element stays inert. - A sharded run now fails with "No tests found" when no tests match across all shards. Pass `--pass-with-no-tests` to allow this. An empty shard still passes when other shards have tests. - Cookie matching now follows RFC 6265. With a URL, [browserContext.cookies()](https://playwright.dev/docs/api/class-browsercontext#browser-context-cookies) and [apiRequestContext.cookies()](https://playwright.dev/docs/api/class-apirequestcontext#api-request-context-cookies) no longer return host-only cookies for subdomains or `Path=/api` cookies for `/apiv2`, and a `Path=/foo/` cookie does not match `/foo`. [APIRequestContext](https://playwright.dev/docs/api/class-apirequestcontext) sends a cookie without a name as `Cookie: x` instead of `Cookie: =x`, and stores `Set-Cookie: token` as a cookie without a name. - Proxy credentials are no longer sent to websites. The credentials in the [`proxy`](https://playwright.dev/docs/api/class-browsertype#browser-type-launch-option-proxy) option now answer only proxy challenges. To authenticate on a website, use [`httpCredentials`](https://playwright.dev/docs/api/class-browser#browser-new-context-option-http-credentials). - Text that the browser does not render, such as text that is not assigned to a slot or text directly inside a closed `<details>`, is no longer part of accessible names and aria snapshots. This can change the results of [page.getByRole()](https://playwright.dev/docs/api/class-page#page-get-by-role) with a name, [locator.ariaSnapshot()](https://playwright.dev/docs/api/class-locator#locator-aria-snapshot) and [expect(locator).toMatchAriaSnapshot()](https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-match-aria-snapshot). - String and `URLSearchParams` values of the `params` option in [APIRequestContext](https://playwright.dev/docs/api/class-apirequestcontext) requests are now appended to the query that the URL already has, instead of replacing it. - `.css`, `.less` and `.scss` imports in test files now load as empty modules instead of being removed, so the imported file must exist. - The blob reporter again deletes the content of its output directory before it writes the report. Playwright 1.64 kept reports with other names. - Test locations of imported calls such as `test(` in CommonJS output now point to the start of the callee, for example `a.spec.ts:3:7` instead of `a.spec.ts:3:11`. This is the same as in ESM. ##### Announcements -⚠️ Playwright no longer tests on Node.js 20. Use Node.js 22, 24 or 26, as listed in the [system requirements](https://playwright.dev/docs/intro#system-requirements). - 🐳 [Docker images](https://playwright.dev/docs/docker) now include Node.js 26 instead of Node.js 24, and the latest patch of Chromium on the same branch. ##### Browser Versions - Chromium 158.0.8127.18 - Mozilla Firefox 159.0 - WebKit 27.2 This version was also tested against the following stable channels: - Google Chrome 157 - Microsoft Edge 156 ### [`v1.64.1`](https://redirect.github.com/microsoft/playwright/releases/tag/v1.64.1) [Compare Source](https://redirect.github.com/microsoft/playwright/compare/v1.64.0...v1.64.1) ##### Bug Fixes - [#​43247](https://redirect.github.com/microsoft/playwright/issues/43247) \[Bug]: \_electron.launch intermittently loses a packaged app's first window since 1.64.0 - [#​43242](https://redirect.github.com/microsoft/playwright/issues/43242) \[Regression]: Chromium 155+ aborts a preflighted cross-origin redirect whenever any route is registered (net::ERR_ABORTED) ### [`v1.64.0`](https://redirect.github.com/microsoft/playwright/releases/tag/v1.64.0) [Compare Source](https://redirect.github.com/microsoft/playwright/compare/v1.63.0...v1.64.0) #### 🧰 WebMCP New [page.webmcp](https://playwright.dev/docs/api/class-page#page-webmcp) and [frame.webmcp](https://playwright.dev/docs/api/class-frame#frame-webmcp) give access to the tools that a page registers through the experimental [WebMCP](https://playwright.dev/docs/api/class-webmcp) browser API, so you can test them like any other part of your app: ```js const browser = await chromium.launch({ args: ['--enable-features=WebMCP'] }); const page = await browser.newPage(); await page.goto('https://example.com'); for (const tool of await page.webmcp.tools()) console.log(tool.name, tool.description); const result = await page.webmcp.callTool('add', { a: 2, b: 40 }); console.log(result.content[0].text); // "42" ``` [Playwright MCP](https://playwright.dev/docs/getting-started-mcp) also supports WebMCP by default, with page-defined tools offered to the agent as `webmcp_<tool>`. Pass `--no-webmcp` to opt out. [`playwright-cli`](https://playwright.dev/docs/getting-started-cli) exposes them as well: ```bash playwright-cli webmcp-list playwright-cli webmcp-call search_catalog --params '{"query":"cats"}' ``` #### 🎬 Better videos Videos can now be recorded at a custom frame rate, and the decorations for actions are styled with plain CSS: ```js // playwright.config.ts import { defineConfig } from '@playwright/test'; export default defineConfig({ use: { video: { mode: 'on', size: { width: 1920, height: 1080 }, fps: 60, show: { actions: { style: { point: 'width: 20px; height: 20px; border-radius: 50%; background: red', highlight: 'outline: 2px solid #​333; background: rgba(0, 128, 255, .15)', title: 'font-size: 16px', }, }, }, }, }, }); ``` - New `fps` option in [testOptions.video](https://playwright.dev/docs/api/class-testoptions#test-options-video), [`recordVideo`](https://playwright.dev/docs/api/class-browser#browser-new-context-option-record-video) and [screencast.start()](https://playwright.dev/docs/api/class-screencast#screencast-start). Firefox and WebKit currently capture up to 25 frames per second. - New [`style`](https://playwright.dev/docs/api/class-screencast#screencast-show-actions-option-style) option takes CSS declarations for the `point` marker, the target `highlight` and the action `title`. It replaces the `fontSize` option, which is now deprecated. - The cursor stays visible at the last action point, survives navigations and travels along a natural, eased path. - Videos are encoded with VP9 instead of VP8, which takes less CPU and produces smaller files of the same or better quality. - All video options are also available in [Playwright MCP](https://playwright.dev/docs/getting-started-mcp) and [`playwright-cli`](https://playwright.dev/docs/getting-started-cli). #### 🎯 Test runner - New [testProject.default](https://playwright.dev/docs/api/class-testproject#test-project-default) option keeps a project in the config without running it by default. You can configure every browser you care about, and let a plain `npx playwright test` run just your favourite one: ```js // playwright.config.ts import { defineConfig, devices } from '@playwright/test'; export default defineConfig({ projects: [ { name: 'chromium', use: devices['Desktop Chrome'] }, { name: 'firefox', use: devices['Desktop Firefox'], default: false }, { name: 'webkit', use: devices['Desktop Safari'], default: false }, ], }); ``` ```bash npx playwright test # runs chromium only npx playwright test --project=firefox # runs firefox npx playwright test --project="*" # runs all three, for example on CI ``` - New `--shuffle` command line option schedules tests in a random order, which helps to find tests that accidentally depend on each other. ```bash npx playwright test --shuffle # Running 42 tests using 4 workers, shuffle seed 271828182 # ... # Pass the seed to reproduce the same order. npx playwright test --shuffle 271828182 ``` - New `lock` option in [test.describe.configure()](https://playwright.dev/docs/api/class-test#test-describe-configure) adds [test locks](https://playwright.dev/docs/test-parallel#test-locks) to all tests in a file or a group: ```js test.describe.configure({ lock: 'user-settings' }); ``` - New `type` option of `toHaveScreenshot` in [testConfig.expect](https://playwright.dev/docs/api/class-testconfig#test-config-expect) stores all unnamed screenshots as WebP: ```js // playwright.config.ts export default defineConfig({ expect: { toHaveScreenshot: { type: 'webp' }, }, }); ``` #### 🪆 Locator.within() New [locator.within()](https://playwright.dev/docs/api/class-locator#locator-within) combines two locators that you already have, reading in the natural order — "this button, within that dialog": ```js const saveButton = page.getByRole('button', { name: 'Save' }); const dialog = page.getByTestId('settings-dialog'); await saveButton.within(dialog).click(); ``` Relative locators such as [locator.nth()](https://playwright.dev/docs/api/class-locator#locator-nth) or [locator.first()](https://playwright.dev/docs/api/class-locator#locator-first) are resolved inside each parent separately, which makes column-like queries straightforward: ```js // The third cell of every row, not the third cell in the table. const thirdColumn = page.getByRole('cell').nth(2).within(page.getByRole('row')); await expect(thirdColumn).toHaveText(['Apple', 'Banana', 'Cherry']); ``` #### New APIs - New [page.getByRef()](https://playwright.dev/docs/api/class-page#page-get-by-ref) locates an element by its aria ref, such as `e2`, reported by [page.ariaSnapshot()](https://playwright.dev/docs/api/class-page#page-aria-snapshot) in the `'ai'` mode. - New option [`includeShadow`](https://playwright.dev/docs/api/class-page#page-content-option-include-shadow) in [page.content()](https://playwright.dev/docs/api/class-page#page-content) and [frame.content()](https://playwright.dev/docs/api/class-frame#frame-content) serializes open shadow roots as [declarative shadow DOM](https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_shadow_DOM#declaratively_with_html). - New option [`signCount`](https://playwright.dev/docs/api/class-credentials#credentials-create-option-sign-count) sets the initial signature counter of a virtual credential. [credentials.create()](https://playwright.dev/docs/api/class-credentials#credentials-create) and [credentials.get()](https://playwright.dev/docs/api/class-credentials#credentials-get) return the current `signCount`, and it is saved and restored together with the credentials in the storage state. - New [fullConfig.filteredProjects](https://playwright.dev/docs/api/class-fullconfig#full-config-filtered-projects) lists the projects that were selected to run after applying the `--project` filter. It is available in global setup and reporters. - New [apiRequestContext.addCookies()](https://playwright.dev/docs/api/class-apirequestcontext#api-request-context-add-cookies), [apiRequestContext.cookies()](https://playwright.dev/docs/api/class-apirequestcontext#api-request-context-cookies) and [apiRequestContext.clearCookies()](https://playwright.dev/docs/api/class-apirequestcontext#api-request-context-clear-cookies) manage cookies of a request context, mirroring the [BrowserContext](https://playwright.dev/docs/api/class-browsercontext) methods: ```js await request.addCookies([{ name: 'session-id', value: '42', url: 'https://example.com' }]); console.log(await request.cookies('https://example.com')); await request.clearCookies({ name: 'session-id' }); ``` #### Breaking changes⚠️ - `screen` property is now forwarded from the [device descriptors](https://playwright.dev/docs/emulation#devices). If you use `...devices['Desktop Chrome']` and alike, `window.screen` and media queries now see the emulated screen size. You can opt-out by explicitly setting `screen` to `undefined`: ```js // playwright.config.ts export default defineConfig({ use: { ...devices['Desktop Chrome'], screen: undefined, }, }); ``` - JSX in your test files now follows your `tsconfig.json`. Playwright compiles JSX in test files according to the `jsx`, `jsxFactory`, `jsxFragmentFactory` and `jsxImportSource` [tsconfig options](https://playwright.dev/docs/test-typescript#tsconfig-jsx-options), and defaults to the automatic runtime from `react/jsx-runtime`. - `--update-snapshots=missing` now passes the test run. Tests that only create missing snapshots now pass in the `'missing'` mode of [testConfig.updateSnapshots](https://playwright.dev/docs/api/class-testconfig#test-config-update-snapshots), so that CI can generate new snapshots and verify the existing ones in a single run. The mode used when the option is not specified is now > [!IMPORTANT] > ✂ PR body was truncated to here. </details> --- ### Configuration 📅 **Schedule**: (in timezone Asia/Shanghai) - Branch creation - "before 10am on monday" - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://redirect.github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/voidzero-dev/vite-plus). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4yMjAuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjIyOC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: voidzero-guard[bot] <278573678+voidzero-guard[bot]@users.noreply.github.com> Co-authored-by: MK <fengmk2@gmail.com>
Summary
VP_NODE_VERSION=22is the documented form (global CLI env vars), and #2411 made the shim fast path resolve it.config::resolve_versionstill returns the raw value for the env var branch, while its file, default and LTS branches all return an exact version. Callers pass that value straight todownload_runtime, which builds/v22/SHASUMS256.txtand fails:The same value reaches
vp env exec --npm/--package-managerwithout--node, the node bin dir used byvp envpath output, andvp env clean.The fix resolves the env value with
resolve_version_alias, the same call the shim uses since #2411. Exact versions (22.0.0, whatvp env usewrites) come back unchanged, so the existingtest_resolve_version_env_var_takes_prioritystill passes. An unresolvable value now gets the usual "Invalid Node.js version" message instead of a 404 from the download.Test
Added
test_resolve_version_env_var_partial_versionnext to the existing env var test. It fails onmain(resolution.versionis"22") and passes with the fix.I also built
vpfrommainand from this branch and ranVP_NODE_VERSION=22 vp env install nodeagainst a localVP_NODE_DIST_MIRRORserving an index withv22.99.0. Onmainit requests/v22/SHASUMS256.txtand exits 1. With the fix it readsindex.json, installsv22.99.0and exits 0.Found by a defect-hunting pipeline I build and run (Dev-next-gen), using Claude Code with Anthropic's Claude Opus 5.5.