Skip to content

feat: align the core version with the bundled Vite version - #3317

Merged
fengmk2 merged 29 commits into
mainfrom
feat/core-version-alignment
Nov 14, 2026
Merged

fengmk2 merged 29 commits into
mainfrom
feat/core-version-alignment

Conversation

@fengmk2

@fengmk2 fengmk2 commented Nov 2, 2026 •

Copy link
Copy Markdown
Member

Closes #2806. Part of the Q4 plan in #3277 ("Align the Core Version with Vite").

@voidzero-dev/vite-plus-core now has a version that encodes the bundled Vite version. Projects alias vite to the core package, and package managers compare the alias target's version with plugin peer ranges. With core 1.x, every vite peer check failed, so pnpm projects needed broad peerDependencyRules exceptions, and npm printed ERESOLVE overriding peer dependency warnings with no per-package fix. With this change, compatible plugins pass the check, and incompatible plugins still fail it on pnpm and Yarn.

The design is in rfcs/core-version-alignment.md.

Version scheme

The core major and minor equal the Vite major and minor. The core patch is vitePatch * 1000 + n, where n counts stable Vite+ releases on one Vite version, from 0. vite-plus keeps its own 1.x line. A Vite major upgrade is also a vite-plus major release.

Release Core version Example
Stable vite-plus <major>.<minor>.<patch * 1000 + n> Vite 8.3.8: 8.3.8000, 8.3.8001
vite-plus prerelease, stable Vite <next stable core version>-vp.<k> 8.3.8001-vp.0
vite-plus prerelease, Vite prerelease <vite version>.vp.<k> 9.0.0-beta.3.vp.0
Local and CI builds, stable Vite n = 999 8.3.8999
Local and CI builds, Vite prerelease <vite version>.vp.999 9.0.0-beta.3.vp.999

The committed core version is now 8.3.8000 (bundled Vite 8.3.8). Core 8.x sorts above every published 1.x and 0.x version.

Peer results against the alias, before and after:

Consumer vite peer range Core 1.6.0 Core 8.3.8000
^8.0.0 (@vitejs/plugin-react) unmet met
^6.4.0 || ^7.0.0 || ^8.0.0 (Vitest 5) unmet met
>=8.3.2 unmet met
^7.0.0 unmet unmet

The scheme has three remaining false results: a patch floor above the bundled patch inside the same minor (>=8.3.9 passes against 8.3.8000), a patch ceiling inside the same minor (<8.3.10 fails), and an exact pin (8.3.8 fails).

vp toolchain

Only the core node changes. Before, it showed the vite-plus version (@voidzero-dev/vite-plus-core@1.6.0). After, it shows the encoded version, and the line under it shows the Vite version that it encodes:

vite-plus@1.6.0
├── depends on @voidzero-dev/vite-plus-core@8.3.8000
│   ├── bundles vite@8.3.8
│   │   └── uses rolldown@1.2.18
│   │       ├── compiles oxc@0.156.0
│   │       └── compiles oxc-resolver@11.24.3
│   ├── bundles rolldown@1.2.18
│   │   ├── compiles oxc@0.156.0
│   │   └── compiles oxc-resolver@11.24.3
│   └── bundles tsdown@0.23.4
├── depends on vitest@5.1.0
├── depends on oxlint@1.91.0
├── depends on oxlint-tsgolint@7.0.2005
├── depends on oxfmt@0.76.0
├── compiles vite-task (built 2026-11-06T08:34:14Z, revision 40cb9cac46bddbf8aa5ce5373df1a6a1980acc38)
└── compiles oxc-node@1.0.1 (7ff14c3b1d15e2ef12310ee209d0b72b58fa880e)
    ├── compiles oxc@0.156.0
    └── compiles oxc-resolver@11.24.3

vp toolchain vite-plus-core prints only the core line. The manual upgrade docs use it to read the alias version.

Behavior changes

  • pnpm: For a stable core on pnpm 10.2.0 and later, vp migrate removes vite from peerDependencyRules and prints a line that says so. A user range such as allowedVersions.vite: '7 || 8' stays. The rule stays on pnpm before 10.2.0 and for preview and prerelease cores.
  • Incompatible plugins: On pnpm and Yarn, a plugin whose vite peer range excludes the bundled Vite produces a peer warning again. The migration rules document a rule for that plugin only.
  • npm: The ERESOLVE overriding peer dependency warnings from Support strict pnpm peer validation with the required Vite core alias #2806 are gone. npm still does not report an incompatible plugin, because overrides.vite also applies to peer edges.
  • Version check: The CLI compares the installed core with the exact version in its own vite alias, not with the CLI version.
  • npm and Bun install size: In a project that declares only vite-plus, with no vite alias or overrides, Vitest's vite peer now resolves to the CLI's core. Before, npm and Bun installed upstream Vite and Rolldown as a second copy for Vitest, so Vitest and the CLI loaded different Vite instances. node_modules is about 20.5 MiB smaller on macOS arm64, mostly from the Rolldown native binding (17.34 MiB):
Package manager Before (core 1.6.0) After (encoded core)
npm 11.17.0 144.20 MiB 123.65 MiB
Bun 1.4.4 144.15 MiB 123.61 MiB

pnpm and Yarn already shared the CLI's core, so their size does not change. They no longer print a peer warning.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

✅ Staging deployment successful!

Preview: https://viteplus-staging.void.app/
Commit: 14017be

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

🚀 Deploying Preview to Cloudflare 🚀

Preview URL: https://feat-core-version-alignment-viteplus-dev.voidzero-docs.workers.dev (commit 14017be)

This URL reflects your latest Preview deployment

Preview Deployments by commit

Status Deployment URL Commit Updated (UTC) See this deployment's details
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://b8227792-viteplus-dev.voidzero-docs.workers.dev 14017be 2026-11-14T14:30:52.516Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://ef84ee11-viteplus-dev.voidzero-docs.workers.dev 680b254 2026-11-13T10:21:39.102Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://16b2119e-viteplus-dev.voidzero-docs.workers.dev 1981565 2026-11-13T10:16:52.157Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://fac47bb1-viteplus-dev.voidzero-docs.workers.dev 66a296e 2026-11-13T10:12:53.734Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://4ed48efe-viteplus-dev.voidzero-docs.workers.dev 9507271 2026-11-12T06:28:26.979Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://efd2c0e4-viteplus-dev.voidzero-docs.workers.dev ce92b4c 2026-11-12T03:44:34.678Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://fdf3361e-viteplus-dev.voidzero-docs.workers.dev 2637958 2026-11-10T17:47:41.922Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://85721087-viteplus-dev.voidzero-docs.workers.dev c5befa2 2026-11-10T14:29:14.736Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://ab2dbecf-viteplus-dev.voidzero-docs.workers.dev faa8a15 2026-11-10T06:29:07.315Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://cf97fb63-viteplus-dev.voidzero-docs.workers.dev a0189c5 2026-11-10T06:06:46.234Z Visit the dashboard ↗

View all previews: View all previews ↗

@fengmk2 fengmk2 added the preview-build Publish this PR's commits to the registry bridge as preview builds label Nov 3, 2026
@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

Preview binary sizes (9507271)

Compared with the latest stable release, v1.6.0. Preview build.
Each row measures one binary. Negative changes mean a smaller preview binary.

Binary Latest release Preview Change
vp (macOS ARM64) 5.46 MiB 5.46 MiB +32 B (+0.00%)
NAPI (macOS ARM64) 43.39 MiB 43.40 MiB +16.14 KiB (+0.04%)
vp (macOS x64) 6.92 MiB 6.92 MiB +4.03 KiB (+0.06%)
NAPI (macOS x64) 48.76 MiB 48.76 MiB +8 B (+0.00%)
vp (Linux ARM64 GNU) 6.90 MiB 6.91 MiB +4.05 KiB (+0.06%)
NAPI (Linux ARM64 GNU) 32.68 MiB 32.66 MiB -20.00 KiB (-0.06%)
vp (Linux ARM64 musl) 6.97 MiB 6.98 MiB +7.58 KiB (+0.11%)
NAPI (Linux ARM64 musl) 31.89 MiB 31.89 MiB -2.75 KiB (-0.01%)
vp (Linux x64 GNU) 8.33 MiB 8.35 MiB +16.05 KiB (+0.19%)
NAPI (Linux x64 GNU) 36.69 MiB 36.70 MiB +4.00 KiB (+0.01%)
vp (Linux x64 musl) 8.41 MiB 8.42 MiB +4.70 KiB (+0.05%)
NAPI (Linux x64 musl) 35.90 MiB 35.90 MiB +1.13 KiB (+0.00%)
vp (Windows x64) 6.19 MiB 6.20 MiB +5.00 KiB (+0.08%)
NAPI (Windows x64) 32.45 MiB 32.45 MiB +1.50 KiB (+0.00%)
Trampoline (Windows x64) 13.00 KiB 13.00 KiB 0 B (0.00%)
Installer (Windows x64) 4.69 MiB 4.69 MiB +4.00 KiB (+0.08%)
vp (Windows ARM64) 5.42 MiB 5.42 MiB +5.00 KiB (+0.09%)
NAPI (Windows ARM64) 28.66 MiB 28.66 MiB +2.50 KiB (+0.01%)
Trampoline (Windows ARM64) 13.00 KiB 13.00 KiB 0 B (0.00%)
Installer (Windows ARM64) 3.86 MiB 3.86 MiB +4.00 KiB (+0.10%)
gzip -9 sizes
Binary Latest release Preview Change
vp (macOS ARM64) 3.25 MiB 3.25 MiB +2.75 KiB (+0.08%)
NAPI (macOS ARM64) 18.85 MiB 18.85 MiB +3.28 KiB (+0.02%)
vp (macOS x64) 3.43 MiB 3.43 MiB +4.69 KiB (+0.13%)
NAPI (macOS x64) 20.12 MiB 20.12 MiB +3.50 KiB (+0.02%)
vp (Linux ARM64 GNU) 3.74 MiB 3.75 MiB +4.68 KiB (+0.12%)
NAPI (Linux ARM64 GNU) 13.93 MiB 13.93 MiB -1.59 KiB (-0.01%)
vp (Linux ARM64 musl) 3.77 MiB 3.77 MiB +2.28 KiB (+0.06%)
NAPI (Linux ARM64 musl) 13.64 MiB 13.63 MiB -1.82 KiB (-0.01%)
vp (Linux x64 GNU) 3.81 MiB 3.82 MiB +3.24 KiB (+0.08%)
NAPI (Linux x64 GNU) 14.65 MiB 14.65 MiB +1.86 KiB (+0.01%)
vp (Linux x64 musl) 3.84 MiB 3.84 MiB +4.02 KiB (+0.10%)
NAPI (Linux x64 musl) 14.33 MiB 14.33 MiB -3.30 KiB (-0.02%)
vp (Windows x64) 2.86 MiB 2.87 MiB +4.04 KiB (+0.14%)
NAPI (Windows x64) 13.31 MiB 13.31 MiB -1.13 KiB (-0.01%)
Trampoline (Windows x64) 7.14 KiB 7.14 KiB 0 B (0.00%)
Installer (Windows x64) 2.25 MiB 2.25 MiB +1.87 KiB (+0.08%)
vp (Windows ARM64) 2.73 MiB 2.73 MiB +1.60 KiB (+0.06%)
NAPI (Windows ARM64) 12.62 MiB 12.62 MiB -618 B (-0.00%)
Trampoline (Windows ARM64) 6.93 KiB 6.92 KiB -2 B (-0.03%)
Installer (Windows ARM64) 2.14 MiB 2.14 MiB +2.48 KiB (+0.11%)

Raw sizes are uncompressed file sizes. gzip sizes recompress each binary at level 9; they are not package or download archive sizes.
The baseline uses published release files, including NAPI packages from npm at the same version. Build versions and toolchains can affect the difference.

@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

Registry bridge build (9507271)

This commit build is published to the registry bridge, which serves these as ordinary npm versions (every other package proxies to npmjs):

Package Version
vite-plus 0.0.0-commit.9507271ad6a2ae552a8adc1d71914e47ad1aecc1
@voidzero-dev/vite-plus-core 0.0.0-commit.9507271ad6a2ae552a8adc1d71914e47ad1aecc1
create-vite-plus 0.0.0-commit.9507271ad6a2ae552a8adc1d71914e47ad1aecc1

Install the Vite+ CLI built from this commit, then migrate a project:

# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/voidzero-dev/vite-plus/9507271ad6a2ae552a8adc1d71914e47ad1aecc1/packages/cli/install.sh | VP_PR_VERSION=3317 VP_LEGACY_INSTALLER_URL=https://raw.githubusercontent.com/voidzero-dev/vite-plus/9507271ad6a2ae552a8adc1d71914e47ad1aecc1/packages/cli/install-legacy.sh bash
# Windows (PowerShell)
$env:VP_PR_VERSION="3317"; $env:VP_LEGACY_INSTALLER_URL="https://raw.githubusercontent.com/voidzero-dev/vite-plus/9507271ad6a2ae552a8adc1d71914e47ad1aecc1/packages/cli/install-legacy.ps1"; irm https://raw.githubusercontent.com/voidzero-dev/vite-plus/9507271ad6a2ae552a8adc1d71914e47ad1aecc1/packages/cli/install.ps1 | iex

Or install with Homebrew (macOS / glibc Linux):

These commands use the formula and binary from this published commit. Replace brew install with brew reinstall if the tap package is already installed.
If Homebrew Core’s vite-plus is installed, run brew uninstall vite-plus first. This keeps your user data; do not run vp implode to switch installations.

(
  set -eu
  export HOMEBREW_NO_AUTO_UPDATE=1
  export HOMEBREW_VP_PR_VERSION=9507271ad6a2ae552a8adc1d71914e47ad1aecc1
  brew tap voidzero-dev/vite-plus https://github.com/voidzero-dev/vite-plus
  preview_tap="$(brew --repository voidzero-dev/vite-plus)"
  git -C "$preview_tap" fetch --depth=1 https://github.com/voidzero-dev/vite-plus.git "$HOMEBREW_VP_PR_VERSION"
  git -C "$preview_tap" switch --detach "$HOMEBREW_VP_PR_VERSION"
  brew install voidzero-dev/vite-plus/vp
  brew test voidzero-dev/vite-plus/vp
  "$(brew --prefix)/bin/vp"
)

The tap stays at the tested commit. Return it to main after testing:

git -C "$(brew --repository voidzero-dev/vite-plus)" switch main

Or download the standalone Windows installer built from this commit:

Architecture Installer
x64 vp-setup-x86_64-pc-windows-msvc.exe
Arm64 vp-setup-aarch64-pc-windows-msvc.exe

GitHub requires you to sign in and downloads each installer as a ZIP artifact. Extract vp-setup.exe, then run it against this preview build:

.\vp-setup.exe --version "0.0.0-commit.9507271ad6a2ae552a8adc1d71914e47ad1aecc1" --registry "https://registry-bridge.viteplus.dev/"

After installing, upgrade the current project's vite-plus to this test build with:

vp migrate

Or create a new project from this commit without installing the CLI:

export npm_config_registry=https://registry-bridge.viteplus.dev/ pnpm_config_registry=https://registry-bridge.viteplus.dev/
pnpm create vite-plus@0.0.0-commit.9507271ad6a2ae552a8adc1d71914e47ad1aecc1 # or: npm create vite-plus@0.0.0-commit.9507271ad6a2ae552a8adc1d71914e47ad1aecc1
$env:npm_config_registry="https://registry-bridge.viteplus.dev/"; $env:pnpm_config_registry="https://registry-bridge.viteplus.dev/"
pnpm create vite-plus@0.0.0-commit.9507271ad6a2ae552a8adc1d71914e47ad1aecc1 # or: npm create vite-plus@0.0.0-commit.9507271ad6a2ae552a8adc1d71914e47ad1aecc1

pnpm 11+ reads pnpm_config_registry, npm and older pnpm read npm_config_registry. The new project pins this build, so keep the registry set for later installs, or configure it as below.

Or point your package manager at the bridge registry https://registry-bridge.viteplus.dev/:

Package manager Registry config
npm / pnpm / Bun .npmrc: registry=https://registry-bridge.viteplus.dev/
Yarn (v2+) .yarnrc.yml: npmRegistryServer: "https://registry-bridge.viteplus.dev/"

Then pin the build (vite aliases to vite-plus-core; pnpm can use a catalog, npm an overrides entry):

{
  "devDependencies": {
    "vite-plus": "0.0.0-commit.9507271ad6a2ae552a8adc1d71914e47ad1aecc1",
    "vite": "npm:@voidzero-dev/vite-plus-core@0.0.0-commit.9507271ad6a2ae552a8adc1d71914e47ad1aecc1"
  }
}

@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

🐳 Docker preview image

Built from this PR's registry bridge build:

Image Compressed size
ghcr.io/voidzero-dev/vite-plus:pr-3317 220MB
# remove any stale local copy from a previous run, then pull fresh
docker rmi ghcr.io/voidzero-dev/vite-plus:pr-3317 2>/dev/null; docker pull ghcr.io/voidzero-dev/vite-plus:pr-3317

Quick check:

docker run --rm ghcr.io/voidzero-dev/vite-plus:pr-3317 vp --version

See docs/guide/docker.md for usage.

@fengmk2
fengmk2 force-pushed the feat/core-version-alignment branch 2 times, most recently from 9316e2b to 7f41a5a Compare November 10, 2026 02:36
@fengmk2 fengmk2 added preview-build Publish this PR's commits to the registry bridge as preview builds test: e2e Auto run e2e tests test: install-e2e run vite install e2e test test: create-e2e Run `vp create` e2e tests test: sfw and removed preview-build Publish this PR's commits to the registry bridge as preview builds labels Nov 10, 2026
@fengmk2
fengmk2 force-pushed the feat/core-version-alignment branch 2 times, most recently from 2637958 to ce92b4c Compare November 12, 2026 03:43
@fengmk2 fengmk2 added preview-build Publish this PR's commits to the registry bridge as preview builds and removed preview-build Publish this PR's commits to the registry bridge as preview builds labels Nov 12, 2026
@fengmk2 fengmk2 self-assigned this Nov 12, 2026
fengmk2 and others added 5 commits November 13, 2026 18:07
Propose a version scheme for @voidzero-dev/vite-plus-core that encodes
the bundled Vite version: the core major and minor equal Vite's, and the
core patch is `vitePatch * 100 + n`. Vite+ prereleases use a `vp.<k>`
identifier. With this scheme, peer checks against the `vite` alias pass
for compatible consumers and still fail for incompatible ones, so
migration can drop the broad pnpm `vite` peer rule.

Refs #2806, #3277

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Encode the bundled Vite version in the @voidzero-dev/vite-plus-core
version, as rfcs/core-version-alignment.md describes. The core major and
minor equal Vite's, and the patch is `vitePatch * 100 + n`. Core 8.3.500
bundles Vite 8.3.5. With the `vite` alias, package managers now check
plugin peer ranges against the bundled Vite.

- Add packages/tools/src/core-version.ts to encode, decode, select, and
  check core versions. Vite+ prereleases use a `vp.<k>` identifier, and
  local CI builds use the reserved counter 99.
- Select the core version from the registry in prepare_release, publish
  core at its own version, and check its latest dist-tag after publish.
- Bake the CLI version into the Rolldown binding guards, because the
  platform packages publish at the CLI version.
- Resolve the expected core version from the CLI's `vite` alias, and map
  the core package to its own version in sync-versions.
- Stop writing the pnpm `vite` peer rule for a stable core, remove an
  existing one, and keep it for preview and prerelease cores.
- Reset the core version when upgrade-deps changes the bundled Vite.

Refs #2806, #3277

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The repository CLI declares `vite: workspace:@voidzero-dev/vite-plus-core@*`,
which has no exact version. The core check then compared only the package
name, so a project core with a stale version passed and `vp dev` started.
Fall back to the version of the core that the CLI resolves.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Remove the pnpm `vite` peer rule from migration snapshots, and record the
  summary line for projects whose rule migration removes.
- npm now keeps a tagged core alias and resolves Vitest's `vite` peer to the
  CLI's core, because the core version satisfies that range. Replace the
  tagged-alias rejection case with a case that checks the shared core, and
  update the CLI-only layout check.
- Read the core version from the core manifest or the CLI alias in the core
  identity fixtures, not from the vite-plus version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Homebrew updater waited for @voidzero-dev/vite-plus-core at the CLI
version. The core version now encodes the bundled Vite version, so that
wait could never succeed. Read the core version from the `vite` alias of
the published vite-plus manifest instead. The manual recovery command keeps
its single version argument.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fengmk2 and others added 12 commits November 13, 2026 18:07
pnpm 12.17.0 deprecates `peerDependencyRules` (pnpm/pnpm#17457). For a
plugin whose `vite` peer range excludes the bundled Vite, the migrate rules
now recommend the override `'vite-plugin-foo>vite:peer': '*'` on pnpm
12.17.0 and later, and the scoped `allowedVersions` entry on earlier pnpm.

The RFC records the deprecation: migration still writes the setting for
preview and prerelease cores, pnpm before 10.2.0, and the redundant `vitest`
rule, which the planned follow-up removes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keep only the `pnpm-workspace.yaml` diff that `vp migrate` produces and the
cases that keep the rule. The npm and Bun limits stay in the Migration
section.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Show the core versions that `nextCoreVersion` gives for `vite-plus` betas on
the stable Vite 8.3.7: each beta appends `-vp.<k>` to the next stable core
version, and the stable release then takes that base.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Show the core versions for three minor releases and one major release of
vite-plus that all bundle Vite 8.3.7: only the release counter changes. Add a
risk item: a vite-plus breaking change can be a core patch bump, so ranges on
the core package are not supported.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Run `nextCoreVersion` over the two release sequences from the RFC: minor
and major vite-plus releases on one Vite version, and betas on a stable
Vite followed by the stable release.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Replace `stalePeerDependencyRuleKeys` and `managedPeerDependencyRuleKeys`
  with `pnpmPeerDependencyRuleKeys(usesVitest, pnpmVersion)`, and pass its
  result to the merge, the satisfied check, and the bootstrap writer. The
  pnpm version is now a required parameter, so a new caller cannot drop the
  `vite` rule on old pnpm by omission.
- Compare the pnpm version with verkit `isLessThan` and a named constant.
- Add `coreAliasVersion` for the CLI's core alias parsing, and use the alias
  prefix constant in ecosystem CI.
- Read the published core manifests in `core-version.ts` with one packument
  fetch for both `prepare` and `check --release`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rder

- Count every version number that npm has used when selecting the core
  counter, including unpublished ones. npm never accepts an unpublished
  number again, but the packument keeps it only in `time`.
- Queue release runs with `concurrency: release`. A second run that overlaps
  the first could check the same core version while npm still hides the
  first publish, pass, and pin its CLI to the first run's core.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…release

`core-version.ts local` called `encodeCoreVersion(vite, 999)`, which
rejects a Vite prerelease, so "Set local core version" failed in CI when
the bundled Vite was a prerelease. Local builds now use
`<vite>.vp.999` on a Vite prerelease. Counter 999 is reserved in both
forms: releases never select it, and `check --release` rejects it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The create snapshots from #3197 use pnpm 10.4.1 to 10.6.1 and the
latest pnpm. With a stable core on pnpm 10.2.0 and later, `vp create`
no longer writes the `vite` peer rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v1.6.0 shipped core 1.6.0 with the old scheme, so the first release with
the encoded core version is the next one. Move the examples and the
matching release-sequence tests one minor version forward.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…shed ones

- `release.yml` also starts on changes to `packages/core/package.json`.
  When `check --release` rejects the core version after the merge, the
  PR from a new Prepare Release run changes only that file, and before
  this change its merge started no release.
- `check --release` rejects a core version number that was unpublished.
  npm does not accept it again, and the publish script would take npm's
  rejection for an earlier upload of the same release.
- Test `prepare` and `check --release` against a local mock registry.
- The release-manager skill covers the recovery and a bundled Vite
  change merged into the release branch.
- The RFC examples start after v1.6.0, and the RFC describes the
  packument read, patch ceilings, the local version scope, the checked
  `version` export, and the snapshot changes on a prerelease Vite.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@fengmk2
fengmk2 marked this pull request as ready for review November 13, 2026 10:08
fengmk2 and others added 2 commits November 13, 2026 18:09
#3436 upgraded the bundled Vite to 8.3.8 on main, so the committed core
version moves from 8.3.7000 to 8.3.8000.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keep every decision, rule, and risk, and remove repeated text: the
alternatives that the scheme comparison already covers, the
file-by-file tables, the experiment setup details, and the decisions
from review. Merge the two release sequence examples into one table on
the bundled Vite 8.3.8, and update the matching test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@fengmk2
fengmk2 force-pushed the feat/core-version-alignment branch from 9507271 to 66a296e Compare November 13, 2026 10:12
Remove the pnpm 12.17.0 deprecation, which is a pnpm change, and the
npm warnings for preview builds and prereleases, which existed before
or are in the Prereleases section. Move the registry failure behavior
of `prepare` to its description.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@fengmk2 fengmk2 added preview-build Publish this PR's commits to the registry bridge as preview builds and removed preview-build Publish this PR's commits to the registry bridge as preview builds labels Nov 13, 2026
The open question has an answer: the vite-plus release that first
bundles a new Vite major is a major release, and so are its
prereleases on a Vite major prerelease. Record the rule in the RFC and
the release-manager skill, and remove the Open questions section.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@fengmk2 fengmk2 changed the title feat(core): align the core version with the bundled Vite version feat: align the core version with the bundled Vite version Nov 13, 2026
@liangmiQwQ

liangmiQwQ commented Nov 13, 2026 •

Copy link
Copy Markdown
Collaborator

I wanna share a great "side effect" of this change:

For npm & bun users, if they only install vite-plus without package alias or overrides settings, its install size will be 20MB smaller.

See for https://github.com/liang-demos/vite-plus-core-peer-resolution and more detail. It might be good to include it in the PR description or future tweets or so.

@fengmk2
fengmk2 merged commit 4dc066a into main Nov 14, 2026
126 checks passed
@fengmk2
fengmk2 deleted the feat/core-version-alignment branch November 14, 2026 14:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

preview-build Publish this PR's commits to the registry bridge as preview builds test: create-e2e Run `vp create` e2e tests test: e2e Auto run e2e tests test: install-e2e run vite install e2e test test: sfw

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support strict pnpm peer validation with the required Vite core alias

3 participants