Skip to content

feat: integrate with Vite Task for zero-config build caching#22453

Merged
sapphi-red merged 16 commits into
vitejs:mainfrom
wan9chi:feat/vite-task-runner-integration
Jun 2, 2026
Merged

feat: integrate with Vite Task for zero-config build caching#22453
sapphi-red merged 16 commits into
vitejs:mainfrom
wan9chi:feat/vite-task-runner-integration

Conversation

@wan9chi

@wan9chi wan9chi commented May 15, 2026

Copy link
Copy Markdown
Contributor

Integrates Vite with Vite Task so that vite build can be cached with zero configuration when run under vp run: Vite reports its build inputs, outputs, and tracked env vars through @voidzero-dev/vite-task-client, which is a no-op when Vite runs outside Vite Task.

Companion PR on the Vite Task side: voidzero-dev/vite-task#346.

See the proposal for background and design rationale.

@wan9chi wan9chi force-pushed the feat/vite-task-runner-integration branch 2 times, most recently from b4ddf51 to 48ef6c3 Compare May 15, 2026 03:14
@pkg-pr-new

pkg-pr-new Bot commented May 15, 2026

Copy link
Copy Markdown

Open in StackBlitz

@vitejs/plugin-legacy

pnpm add https://pkg.pr.new/@vitejs/plugin-legacy@22453 -D
npm i https://pkg.pr.new/@vitejs/plugin-legacy@22453 -D
yarn add https://pkg.pr.new/@vitejs/plugin-legacy@22453.tgz -D

vite

pnpm add https://pkg.pr.new/vite@22453 -D
npm i https://pkg.pr.new/vite@22453 -D
yarn add https://pkg.pr.new/vite@22453.tgz -D

commit: bdf9921

@wan9chi wan9chi force-pushed the feat/vite-task-runner-integration branch from 07daf26 to 96f992f Compare May 18, 2026 03:23
Comment thread packages/vite/package.json Outdated
},
"//": "READ CONTRIBUTING.md to understand what to put under deps vs. devDeps!",
"dependencies": {
"@voidzero-dev/vite-task-client": "github:voidzero-dev/vite-task#1aedd944&path:/packages/vite-task-client",

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Temporarily pointed to git for easier debug. Will publish to npm after this PR is approved, before it's merged.

Comment thread packages/vite/src/node/env.ts Outdated
// alongside inline inherited envs. Outside Vite Task this is a no-op (the
// client cannot connect).
for (const prefix of prefixes) {
getEnvs(`${prefix}*`, { tracked: true })

@wan9chi wan9chi May 18, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

// `outDir`. Without this, those reads would be recorded as build inputs
// and mix with the writes that follow, tripping Vite Task's read-write
// overlap check. No-op outside Vite Task.
ignoreInput(outDir)

@wan9chi wan9chi May 18, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

// The dev server is a long-running, interactive process whose outputs
// (network responses, HMR updates) cannot be replayed from a cache, so
// tell Vite Task to skip storing this run. No-op outside Vite Task.
disableCache()

@wan9chi wan9chi May 18, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Effect verified in vite_dev_disables_cache.md.

Comment thread packages/vite/src/node/config.ts Outdated
// Vite Task knows it. Vite's build output branches on the value below
// (`isProduction`), so changing it between runs must invalidate the
// cache. No-op outside Vite Task.
getEnv('NODE_ENV')

@wan9chi wan9chi May 18, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@wan9chi wan9chi marked this pull request as ready for review May 18, 2026 07:40
Comment thread packages/vite/src/node/optimizer/index.ts
Comment thread packages/vite/src/node/server/index.ts
Comment thread packages/vite/src/node/config.ts
Comment on lines 76 to 77
const processEnv = { ...process.env } as DotenvPopulateInput
expand({ parsed, processEnv })

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The env file may reference a env var and I think those are not tracked now. I don't think we have to try to track them now though.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

You're right. Tracking them would require dotenv-expand to report which variables it referenced. Let me look into it outside of this PR.

wan9chi and others added 10 commits May 21, 2026 14:07
When Vite runs under Vite Task (`vp run`), report build inputs, outputs,
and tracked env vars to Vite Task so that caching of `vite build` works
without manual input/output configuration:

- `loadEnv`: ask Vite Task for every env matching each prefix, so the
  glob + match-set enter the build's cache fingerprint.
- optimizer: mark the deps cache dir as neither input nor output (the
  lockfile hash already drives re-optimization).
- `prepareOutDir`: ignore `outDir` as an input so `emptyDir`'s reads
  don't mix with the writes that follow.
- `loadConfigFromBundledFile`: ignore `node_modules/.vite-temp` so the
  transient bundled-config file doesn't poison the cache.

All calls go through `@voidzero-dev/vite-task-client`, which is a no-op
when Vite is not running inside Vite Task.
`loadConfigFromBundledFile` previously told Vite Task to ignore the
entire `node_modules/.vite-temp/` directory, but only when
`nodeModulesDir` existed. When it didn't (e.g. configs outside a project
with `node_modules`), the temp file was written next to the original
config and still showed up as both an input and an output of the build,
poisoning the Vite Task cache fingerprint.

Move the `ignoreInput`/`ignoreOutput` calls below `tempFileName` and
pass the exact path that's about to be written. The call is a no-op
outside Vite Task, so this is safe in either case.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The previous commit dropped `path: /packages/vite-task-client` from the
resolution metadata in the lockfile. The URL fragment in the resolution
key still encodes the subdir, and pnpm 10.33.2 considers the inner field
redundant (it rewrites the lockfile without it on `pnpm install`), but
pnpm 10.33.4 — the version used by Vite CI — still needs the field to
locate the subdir before deciding whether the package has a `prepare`
script to run. Without it, CI fetches the tarball, sees the root
`vite-task-monorepo` package's `prepare: husky` script, and aborts with
`ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED`.

Restore the field so the preview-release CI job (and consumers like the
vite-task workspace) can install the tarball.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The build output branches on `process.env.NODE_ENV` (`isProduction`
controls default minification, dev-only warnings, esbuild target,
`import.meta.env.PROD/DEV`, etc.), so a different NODE_ENV produces a
different bundle. Add `getEnv('NODE_ENV')` from
`@voidzero-dev/vite-task-client` before the existing
`!!process.env.NODE_ENV` check in `resolveConfig`. The call asks the
runner for the env (populating `process.env` if Vite Task knows the
value and the local environment hasn't already set it) and registers
NODE_ENV as a tracked dependency of the post-run fingerprint, so
flipping NODE_ENV between runs invalidates the cache with `tracked env
'NODE_ENV' changed`.

No-op outside Vite Task.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The dev server is a long-running, interactive process whose outputs
(network responses served on demand, HMR updates, optimizer state) are
not replayable from a cache archive. Call `disableCache()` from
`@voidzero-dev/vite-task-client` at the top of `_createServer` so the
runner skips storing the run even when the user invokes `vp run --cache
dev` or wires a dev task with `cache: true`. Without this, the runner
would observe inputs, refuse to store on read/write overlap, or worse
attempt to replay a useless archive on the next start.

No-op outside Vite Task.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The new commit upstream of `@voidzero-dev/vite-task-client` refactors
the `.node` addon so it exports a `load()` factory rather than the
addon's operations directly, and updates the JS wrapper to
`require(addon).load()`. The shape of the wrapper's public API is
unchanged, but the bundled wrapper code that vite ships in `dist/`
must move in lockstep with the addon shape the runner hands the
process — so this PR's preview-release build needs to be regenerated
against the new commit before vite-task can refresh its lockfile to
consume it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two reasons the bump can't stay at the abbreviated `1aedd944`:

* pnpm 11 (Vite Task's local pin via `mise`, post-`vitejs#383`) refuses to
  resolve abbreviated GitHub spec SHAs with
  `[ERROR] Could not resolve 1aedd944 to a commit of …`. Switching to
  the 40-char form fixes that on both ends.

* `137a0003` is the latest commit on the vite-task branch
  (`runner-aware-tools`) — it bumps the recorded vite-task-client SHA
  inside `vite-task`'s lockfile and allows `clippy::disallowed_macros`
  for `napi-derive`'s generated `std::format!`. The wrapper code shipped
  to vite is identical to `1aedd944`'s, but pointing at the head commit
  keeps the cross-reference between the two PRs unambiguous.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
`Build&Test: node-20, ubuntu-latest` on `0ed26a2ae` timed out twice in
`playground/assets/__tests__/relative-base/assets-relative-base.spec.ts`
(navigating to `http://localhost:5174/` after `createServer().listen()`)
and `playground/fs-serve/__tests__/base/fs-serve-base.spec.ts`
(navigating to `http://vite.dev/404`). The previous commit
(`8f6364431`) ran the same wrapper code (the SHA bump in `0ed26a2ae`
only swaps `1aedd944` → `137a00036d…` and those tree contents at
`packages/vite-task-client/` are identical), and node-22, node-24
ubuntu, node-24 macOS, and node-24 Windows all pass. The retry just
gives Playwright another shot on that runner.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The preview server is long-running and interactive, like the dev
server, so its run should not be stored in the Vite Task cache.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@wan9chi wan9chi force-pushed the feat/vite-task-runner-integration branch from 2924189 to 5b54e07 Compare May 21, 2026 06:08
sapphi-red
sapphi-red previously approved these changes May 21, 2026
Comment thread packages/vite/src/node/config.ts Outdated
`@voidzero-dev/vite-task-client`'s `getEnv`/`getEnvs` no longer mutate
`process.env`; they return the value(s) instead. Populate `process.env`
here: fall back to the returned `NODE_ENV` in `resolveConfig`, and merge
prefixed envs into the resolved env map in `loadEnv`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@wan9chi wan9chi force-pushed the feat/vite-task-runner-integration branch 2 times, most recently from 88f2a9c to 614e0d2 Compare May 25, 2026 09:13
- Adopt the side-effect-free `getEnv`/`getEnvs` shape; the `NODE_ENV`
  fetch is now guarded by `process.env.NODE_ENV === undefined` so a
  caller-set value is never overwritten.
- Drop the now-default `{ tracked: true }` argument from `getEnvs`.
- Bump vite-task-client to commit c1634234.
- Add the `path:` field to the lockfile `resolution` for the github
  tarball; without it pnpm extracts the entire vite-task monorepo
  into `node_modules/@voidzero-dev/vite-task-client/`.
- Allowlist `vite-task-monorepo` in `allowBuilds` so pnpm runs its
  (now no-op) prepare script during the git-dep flow.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
wan9chi added a commit to voidzero-dev/vite-task that referenced this pull request May 28, 2026
Lays the groundwork for publishing `@voidzero-dev/vite-task-client` to
npm. JS-side only — `src/index.js` (JSDoc as source of truth),
`src/index.d.ts` regenerated from it, and the metadata required to
publish. No Rust changes; no runner integration.

The package is a thin wrapper with no `dependencies`: under a
`vp run` task it loads the runner-provided napi addon at runtime,
otherwise every method is a graceful no-op.

## Next steps

1. Publish `@voidzero-dev/vite-task-client@0.1.0` to npm.
2. Update the [Vite PR](vitejs/vite#22453) to
   depend on the published `@voidzero-dev/vite-task-client`.
3. Merge #410 — the remaining Rust implementation (IPC protocol +
   transport, napi binding, executor refactor, cache integration, e2e
   tests).

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

@sapphi-red sapphi-red left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM (after the package is pointing to the published one)

Comment thread packages/vite/package.json Outdated
@wan9chi

wan9chi commented May 29, 2026

Copy link
Copy Markdown
Contributor Author

LGTM (after the package is pointing to the published one)

@sapphi-red Thank you for your time! The latest commit points @voidzero-dev/vite-task-client to the published version.

@wan9chi wan9chi force-pushed the feat/vite-task-runner-integration branch from 9198994 to bdf9921 Compare June 1, 2026 09:20
@sapphi-red sapphi-red merged commit f8d75f7 into vitejs:main Jun 2, 2026
18 of 19 checks passed
wan9chi added a commit to voidzero-dev/vite-plus that referenced this pull request Jun 23, 2026
vite reports its transient bundled-config file under
node_modules/.vite-temp to the task runner at runtime (ignoreInput/
ignoreOutput via @voidzero-dev/vite-task-client, vitejs/vite#22453),
so the synthetic input excludes for pack/test/check are redundant.
Keeps the OXLINT_TSGOLINT_PATH env tracking, results.json, !dist/**,
and .vite/task-cache excludes unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
wan9chi added a commit to voidzero-dev/vite-plus that referenced this pull request Jun 23, 2026
vite reports its transient bundled-config file under
node_modules/.vite-temp to the task runner at runtime (ignoreInput/
ignoreOutput via @voidzero-dev/vite-task-client, vitejs/vite#22453),
so the synthetic input excludes for pack/test/check are redundant.
Keeps the OXLINT_TSGOLINT_PATH env tracking, results.json, !dist/**,
and .vite/task-cache excludes unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
wan9chi pushed a commit to voidzero-dev/vite-task that referenced this pull request Jun 26, 2026
The vite-task-client integration (vitejs/vite#22453) has shipped in the
tagged vite 8.1 release, so the e2e harness no longer needs to track
vitejs/vite main via a pinned pkg.pr.new sha. Move the
vite-task-tools>vite override to a normal ^8.1.0 version range.

Co-authored-by: Claude <noreply@anthropic.com>
fengmk2 added a commit to voidzero-dev/vite-plus that referenced this pull request Jul 2, 2026
Release vite-plus v0.2.2: the Vite+ Beta release.

**Vite+ is now in Beta**: stable and ready for production adoption,
fully open source under MIT. Read the announcement to see what Vite+ is
about and where it is headed: [Announcing Vite+
Beta](https://voidzero.dev/posts/announcing-vite-plus-beta).

On top of the Beta milestone, this release brings cross-version upgrades
via `vp migrate`, an official Docker toolchain image on GHCR,
zero-config runner-aware `vp build` caching, and PGP-verified managed
Node.js downloads.

### Highlights

- **`vp migrate` upgrades existing Vite+ projects across versions**:
previous release notes told users not to run `vp migrate` for upgrades.
It now runs from the global CLI when the local one is older, re-pins
`vite-plus` and the `vite` -> `@voidzero-dev/vite-plus-core` alias
across dependencies, overrides/resolutions, and catalogs in every
workspace package, aligns `vitest` / `@vitest/*` by actual usage, and
defaults to a version-only upgrade (pass `--full` to also run the
first-time setup bucket: hooks, editor, agent files, lint migration)
([#1891](#1891)), by
@fengmk2
- **Official Vite+ Docker toolchain image**:
`ghcr.io/voidzero-dev/vite-plus` bundles `vp` plus a native build
toolchain on `debian:bookworm-slim` (amd64/arm64, non-root). Since `vp`
provisions the exact Node.js from `.node-version`, one image builds any
project, and a documented multi-stage build copies the resolved Node.js
into a small vp-free runtime stage
([#1944](#1944)), by
@fengmk2
- **Zero-config `vp build` caching via runner-aware Vite**: Vite reports
its inputs, outputs, and tracked env reads to the `vp` runner over the
new `@voidzero-dev/vite-task-client` IPC
([vite#22453](vitejs/vite#22453)), so `vp build`
caches correctly with no hand-written cache config: outputs are tracked
and restored automatically, and a changed `VITE_*` env var invalidates
the cache and is named in the cache-miss message
([#1774](#1774)), by
@wan9chi
- **PGP-verified Node.js downloads**: installing a managed Node.js now
verifies the release's clearsigned `SHASUMS256.txt.asc` against the
vendored Node.js release keyring (pure Rust, no `gpg` required) before
trusting any checksum, so a tampered archive is rejected before install;
unsigned sources (musl builds, custom mirrors) fall back to
checksum-only verification
([#1848](#1848)), by
@fengmk2

### Features

- `vp check`: a `check` block in `vite.config.ts` (`check.fmt` /
`check.lint`) can make plain `vp check` skip formatting or linting by
default, mirroring `--no-fmt` / `--no-lint`; standalone `vp fmt` / `vp
lint` and git hooks are unaffected, and a `note:` line keeps the
config-based skip discoverable
([#1981](#1981)), by
@fengmk2
- `vp env list-remote`: highlight installed versions (color, or a `*`
prefix when piped) and label the project-resolved `current` and global
`default` versions; `--json` gains `installed` / `current` / `default`
fields ([#1907](#1907)),
by @semimikoh
- `vpr` ships as a `vite-plus` package bin, so the `vp run` shorthand
works on clean installs without global PATH shims (Vercel build image,
generic CI runners)
([#1988](#1988)), by
@kvnwolf
- Vite Task: `dependsOn` can select tasks from dependency packages, e.g.
`dependsOn: [{ "task": "build", "from": "dependencies" }]`
([vite-task#479](voidzero-dev/vite-task#479)),
by @wan9chi
- Vite Task: a task's `env` / `untrackedEnv` glob patterns support `!`
negation (e.g. `["VITE_*", "!VITE_SECRET"]`)
([vite-task#425](voidzero-dev/vite-task#425)),
and an env-caused cache miss now names the variable inline, e.g. `cache
miss: env 'NODE_ENV' changed`
([vite-task#438](voidzero-dev/vite-task#438)),
by @wan9chi
- Upgrade upstream dependencies: vite `8.0.16 -> 8.1.2`, rolldown `1.1.1
-> 1.1.4`, oxlint `1.70.0 -> 1.72.0`, oxfmt `0.55.0 -> 0.57.0`,
oxlint-tsgolint `0.23.0 -> 0.24.0`, and the oxc toolchain `0.136.0 ->
0.138.0` ([#1924](#1924),
[#1989](#1989),
[#2000](#2000),
[#2009](#2009)), by
@voidzero-guard[bot]

### Fixes & Enhancements

- Windows: `vp run` no longer hangs CI when a `node_modules/.bin` `.cmd`
shim is routed through PowerShell; the npm/pnpm/yarn `.ps1` wrappers
read stdin and block forever on a non-TTY pipe, so the PowerShell
rewrite is now skipped when stdin is not an interactive terminal
([vite-task#491](voidzero-dev/vite-task#491),
via [#1973](#1973)), by
@fengmk2
- Vite Task: the task cache is stored in a per-schema-version directory
(e.g. `node_modules/.vite/task-cache/v13/`), so switching between
branches that pin different Vite+ versions no longer fails with
`Unrecognized database version`
([vite-task#433](voidzero-dev/vite-task#433)),
by @fengmk2
- Vite Task: env values in cache fingerprints are stored only as SHA-256
digests and env cache-miss details report names without values
([vite-task#455](voidzero-dev/vite-task#455));
prefix env assignments like `PATH=... command` now affect executable
lookup during planning
([vite-task#440](voidzero-dev/vite-task#440));
`package.json` / `pnpm-workspace.yaml` files with a UTF-8 BOM parse
correctly
([vite-task#424](voidzero-dev/vite-task#424)),
by @wan9chi
- `vp upgrade`: run the pinned pnpm with a managed Node.js LTS directly
instead of re-entering `vp install`, so an incompatible
session/project/system runtime can no longer make pnpm skip optional
native binaries and leave the upgraded CLI broken
([#1900](#1900)), by
@liangmiQwQ
- Global package installs: each install writes to an immutable
`packages/<name>#<uuid>` prefix that is activated via metadata after npm
succeeds, so an interrupted reinstall can no longer leave the active
package unavailable
([#1906](#1906)), and
stale interrupted-install directories are swept with file-lock
protection for concurrent installs
([#1945](#1945)), by
@liangmiQwQ
- `lazyPlugins()`: skip plugin factories only while config metadata is
being resolved instead of keying off `VP_COMMAND`, so builds spawned
under `vp run` / `vp exec` keep the user's plugins and `vp format` no
longer loads them
([#1939](#1939)), by
@fengmk2
- `vp migrate` (pnpm): add a direct `vite` devDep aliased to the core
override wherever `vite-plus` is depended on, so vitest's `vite` peer
binds to `@voidzero-dev/vite-plus-core` instead of pulling in a second
upstream vite that broke the `vp test` cache
([#1933](#1933)), by
@fengmk2
- `vp pack`: bundle `@tsdown/exe` and `@tsdown/css` into core so `--exe`
and CSS bundling work without a resolvable top-level `tsdown`; the
native `lightningcss` becomes an optional peer loaded lazily with an
actionable error
([#1919](#1919)), by
@fengmk2
- `vp env`: invalidate stale shim resolve cache entries when the
project's Node.js version source changes
([#1951](#1951)), by
@jong-kyung
- Node shim: when the project declares npm via `packageManager` /
`devEngines.packageManager`, child processes spawned from `node` resolve
the managed npm instead of the Node-bundled one
([#1938](#1938)); `vp env
which` reports bins linked by an intercepted `npm install -g` (e.g.
`tsc`) instead of "not found"
([#1968](#1968)); bins
with uppercase names (e.g. `vitePlus`) dispatch correctly
([#1963](#1963)), by
@liangmiQwQ
- `vp-setup`: pass the configured npm registry to the inner pnpm install
so setup works behind custom registries
([#1795](#1795)), by
@daflyinbed
- Native binding: declare the platform packages' true ABI floor
`engines.node >=20.0.0` so engine-strict package managers (pnpm) no
longer skip the optional native dependency and fail with `Cannot find
native binding` when a consumer's Node floor lands in a product-policy
gap ([#1993](#1993)), by
@fengmk2
- `vp create`: run `git init` without creating an initial commit, so
commitlint-configured templates no longer reject the hardcoded message
and template placeholders are not baked into history
([#2008](#2008)), by
@forehalo
- `vp staged --debug`: inline the bundled lint-staged version so debug
logging no longer crashes reading a `package.json` that does not exist
in the bundle
([#1925](#1925)), by
@rokuosan
- Installer: retry downloads truncated mid-body in
`HttpClient::get_bytes` (the platform-tarball path for `vp upgrade` and
the standalone installer)
([#1940](#1940)), and
clean up the temp dir when a package-manager install fails instead of
leaking `.tmpXXXX` directories
([#1949](#1949)), by
@shulaoda
- Windows/msys: normalize backslashes in the `env.fish` fallback path
([#1954](#1954)), by
@Aalivexy
- `install.ps1`: detect the missing VC++ runtime (`0xC0000135`) and
print VC++ Redistributable guidance instead of a generic failure;
interactive `irm | iex` installs keep the shell open
([#1962](#1962)), by
@cheezone
- `vp migrate`: preserve comments, key order, and trailing commas in
existing `.vscode` / `.zed` JSONC configs by patching the original text
instead of re-serializing it
([#1956](#1956)), by
@fengmk2
- Migration: link the git hook warning to the migration guide
([#1902](#1902)), by
@naokihaba
- `vp info` / `vp view`: use package-manager-native commands (`pnpm
view`, `bun info`, `yarn npm info`) instead of routing every lookup
through `npm view`
([#1895](#1895)), by
@jong-kyung
- Correct overused `ErrorConfig` error types across the codebase
([#1934](#1934)), by
@liangmiQwQ

### Refactor

- `vite_install`: centralize Yarn v1/berry branching with
`is_yarn_berry`
([#1897](#1897)), by
@jong-kyung

### Docs

- Document Vite Task automatic tracking (fs tracking and cache-reporting
tools), reusing the task cache with GitHub Actions cache, and
`dependsOn: [{ task, from: "dependencies" }]`
([#1992](#1992)), by
@wan9chi
- Rewrite the "Upgrading Vite+" guide: preview builds install through
the registry bridge as ordinary `0.0.0-commit.<sha>` npm versions, and
`vp migrate` is the recommended way to upgrade a project or move it onto
a preview build
([#1965](#1965)), by
@fengmk2
- Describe how to switch back to the release version from nightly
([#1887](#1887)), by
@situ2001
- Clarify Git hook tool migration
([#1901](#1901)), by
@naokihaba
- Add a global installation explanation
([#1915](#1915)), update
the `vp env` help output
([#1969](#1969)), and add
liangmiQwQ as a team member
([#1911](#1911)), by
@liangmiQwQ
- Fix package manager command examples
([#1937](#1937)) and the
`dependsOn` guide link
([#1883](#1883)), by
@jong-kyung
- Remove Fathom analytics from the uninstall docs
([#1946](#1946)), by
@mdong1909
- Center the README logo and fix its size
([#1878](#1878)), by @hyf0

### Chore

- Prevent Vite beta upgrades in the upstream-deps script
([#1879](#1879)),
stabilize flaky network-dependent tests
([#1923](#1923)), and bump
the ecosystem-ci bun-vite-template to the oxlint jsx-a11y fix
([#1898](#1898)), by
@fengmk2
- Pin snap-test install fixtures to a published `vite-plus` version so
release-branch CI can pass before the new version is published
([#2017](#2017)), by
@fengmk2
- Update the deprecated `VITE_PLUS_` env var prefixes to `VP_` in the
RFCs ([#1984](#1984)), by
@liangmiQwQ
- CI: skip full CI for docs-only PRs
([#1991](#1991)) and for
the docs deploy config
([#2015](#2015)), by
@wan9chi
- Update GitHub Actions
([#1904](#1904),
[#1977](#1977)),
claude-code-action to v1.0.158
([#1979](#1979)), and pnpm
to v10.34.4
([#1996](#1996)), by
@renovate[bot]
- Update oxc-project/security-action to v1.0.8
([#1918](#1918)), by
@fengmk2
- Refresh trusted stack stats on the docs homepage
([#1913](#1913),
[#1982](#1982)), by
@voidzero-guard[bot]

### Bundled Versions

| Tool | Version | Source |
| --- | --- | --- |
| vite | `8.1.2` |
[`ba31193`](vitejs/vite@ba31193)
|
| rolldown | `1.1.4` |
[`6cbd233`](rolldown/rolldown@6cbd233)
|
| tsdown | `0.22.3` | [npm](https://npmx.dev/package/tsdown/v/0.22.3) |
| vitest | `4.1.9` | [npm](https://npmx.dev/package/vitest/v/4.1.9) |
| oxlint | `1.72.0` | [npm](https://npmx.dev/package/oxlint/v/1.72.0) |
| oxlint-tsgolint | `0.24.0` |
[npm](https://npmx.dev/package/oxlint-tsgolint/v/0.24.0) |
| oxfmt | `0.57.0` | [npm](https://npmx.dev/package/oxfmt/v/0.57.0) |

### Upgrade

```bash
vp upgrade
```

New to Vite+? Start with the [Beta
announcement](https://voidzero.dev/posts/announcing-vite-plus-beta),
then create a project with `vp create` or bring an existing one over
with `vp migrate`.

### New Contributors

Welcome to our new contributors @rokuosan, @Aalivexy, @cheezone,
@daflyinbed, @forehalo, @kvnwolf! 🎉

**Full Changelog**:
v0.2.1...v0.2.2

---

Merging this PR will trigger the release workflow.

---------

Co-authored-by: voidzero-guard[bot] <278573678+voidzero-guard[bot]@users.noreply.github.com>
Co-authored-by: MK <fengmk2@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants