- Fixed A task specifier like
vp run nope#build, where no workspace package is namednope, now fails withPackage 'nope' not found in the workspaceand exits 1, including from a task's command, instead of running nothing and exiting 0. A short name that auto-completes to several scoped packages, likeappfor@a/appand@b/app, now fails as ambiguous.--filter nopestill only warns and exits 0, unless--fail-if-no-matchis set (#984). - Added
vp run -vvalso lists what each cached run depends on, changed or not, and the output files a hit restores: in the detailed summary, underUnchanged:andOutputs:, and with--dry-run --json, as each step'sbaseline.fingerprintandbaseline.outputs. It shows, for an unexpected hit, whether an edited file is an input at all.-vis now a counted flag, so-vvis the same as--verbose --verbose(#969). - Added
vp run --dry-run --jsonprints what a run would do as one JSON document for scripts, CI and coding agents: each task the run would run, the tasks it waits for, and each step's program, arguments and directory, with whether it would hit the cache and, if not, every change found. Likevp run --json, it's indented in a terminal and on one line when captured, and its$schemafield points to a JSON Schema that describes each field. A task that runsvp runshows that run's own plan as its step. A step that waits on one that would write files first, by running or by restoring outputs, isunknown, since its files may change before it starts.--jsonwith a task requires--dry-run(#966, #967, #968). - Changed A cache miss now lists every change to the command, the task's cache settings and the envs it depends on, instead of the first: when a task's
inputandoutputsettings changed together, or a tracked env var and a file changed together,vp run --verboseandvp run --last-detailsshow each change on its own line. Without-v, files are checked only up to the first changed one; with-v, every input of a miss is checked, and every changed file is listed in path order. When the command, a setting or acache.envvar changed, only those changes are listed, since there's no cached run with the new ones to compare files with. A summary saved by an earlier version can't be shown byvp run --last-details(#961, #963). - Added
vp run --dry-runshows what a run would do without running anything: each command's line with its cache status, and the summary, as a real run prints them. The cache is checked as in a real run, the remote cache included, and nothing is written: no cache entry, no downloaded or restored outputs, and no change to whatvp run --last-detailsshows. With-v, the detailed summary shows why each command would miss. Like othervp runflags,--dry-rungoes before the task name; after it, it's passed to the task (#960). - Fixed
vp runnow exits with code 1 when a task's cache can't be checked, for example because the cache database can't be read. It already stopped there, but exited 0 (#960). - Changed The helper files
vp runwrites to the system temp directory, such as the library that tracks file accesses and the JSON Schema thatvp run --jsonpoints to, now share one folder that only the current user can write to, like/tmp/vp_run-1000on Linux, instead of a folder for each kind of file (#974). - Perf When several tasks become ready at once,
vp runnow checks their cache entries at the same time instead of one after another, so cache hits start sooner. Hashing a task's input files for its cache lookup no longer holds up other tasks (#982). - Fixed On Windows, the files a task deletes or moves, such as a build cleaning its output folder before writing it again, are no longer among its inputs, as on Linux and macOS. Before, when a later step changed one of those files, for example by stamping a version into the rebuilt output, the next run missed the cache with a reason like
'dist/index.js' modified, though the task never read the file (#980). - Changed In
@voidzero-dev/vite-task-client, agetEnvsquery that matches every env name,{ prefix: '' }or*, now returns nothing instead of every environment variable, and no longer adds them to the cache key (#976). - Added
vp run --jsonprints every package and task in the workspace, with each task'sdependsOnresolved to task IDs, as one JSON document for scripts, editors and coding agents. It runs nothing and, likevp runwithout a task, loads every package's config. It prints the same document from any directory in the workspace: indented in a terminal, on one line when captured. Its$schemafield points to a JSON Schema that describes each field, whichvp runwrites to the system temp directory (#948). - Fixed On Linux, where every user shares the temp folder
/tmp, the helper filesvp runwrites there, such as the library that tracks file accesses, now go in a folder only the current user can write to, like/tmp/fspy-1000. Before, they went in a folder such as/tmp/fspythat belonged to whoever ranvp runfirst: running a different version as another user failed, and the same version used files that user could replace (#947). - Fixed On macOS, task commands that use
shorbashnow behave as they do on Linux in four cases. Awhile readloop with a redirect underset -eno longer exits the script. AnEXITtrap now sees the exit status in$?, and a bareexitin the trap keeps that status, so a failed task is no longer reported as successful.$BASHis now set when the command runs asbash. The bundled shell is updated to an Oils build from master that has these fixes (#939). - Changed
vp runnow loads a package'svite.config.*only when the run reaches one of that package's tasks; the workspace root's config still always loads. A run in one package no longer waits for every package's config to load, and a broken config in another package no longer fails it. Runs that reach that package, such asvp run -r buildor a task whosedependsOnnames one of its tasks, still fail with the config's error, andvp runwithout a task, which lists every task, still loads every config (#944). - Changed Folder listings no longer skip entries named
dist: adistfolder appearing in or disappearing from a folder a task lists now makes the next run a cache miss. To keep it out, add"!dist/**"to the task'sinput(#919). - Changed Exclusions in a task's
input, like"!dist/**", now also apply to the folders the task lists, so an excluded entry appearing or disappearing there no longer makes the next run a cache miss (#941). - Added Rebuildable inputs: tasks that read files they also write are now cached. What a task can rebuild, meaning the files it writes and the folders that hold only those, may be missing on the next run, as on a fresh clone, and a cache hit restores it with the task's outputs (#913, #914, #915, #916, #917, #918).
- Fixed On Linux and macOS, a task that writes outside the workspace through a relative path with
.., likecp -r dist ../site, no longer fails withCache update failed: paths in archives must not have .., and is now cached. Like any other path outside the workspace, what the task writes there isn't among its outputs, and what it reads there isn't among its inputs (#940). - Fixed Tasks that read the task cache folder,
node_modules/.vite/task-cache, now hit the cache.vp runchanges that folder after every run, and tools such as Parcel and Gatsby read it once they rebuild with their own cache in place, so from then on those tasks missed every time with a reason like'node_modules/.vite/task-cache/v20/last-summary.json' modified(#937). - Fixed A cache hit restores the symbolic links a task's
outputglobs match as links, instead of dropping them, so a replayed output that links a directory, such as a bundler'snode_modules/<package>link, is complete (#885). - Fixed On Linux and macOS, programs using automatic file-access tracking no longer abort when they call
execve,execv,execl,execle, orposix_spawnwith an empty path; the call fails withENOENT, as it does without tracking. On Linux,execveatwith an empty path and withoutAT_EMPTY_PATHnow also fails withENOENT, instead of trying to run what its directory descriptor refers to (#896). - Perf
vp runstarts faster in workspaces whose tasks share cacheinputandoutputpatterns: each distinct pattern is now parsed once instead of once for every task that uses it. In a 138-package workspace, this saves about 2 seconds of CPU on every run (#887, #890). - Perf When tasks miss the cache,
vp runno longer waits for the disk after saving each task's result, so the run finishes sooner. If the computer loses power or the operating system crashes duringvp run, the cache entries that the run saved can be lost, and those tasks run again next time instead of hitting the cache (#871). - Fixed Running
vp runin a package that sits inside a workspace folder but isn't listed in itspnpm-workspace.yamlpackagesorpackage.jsonworkspacesnow runs that package's own tasks, instead of treating the enclosing workspace as its root. When both configurations exist,pnpm-workspace.yamltakes precedence (#859). - Fixed On Linux and macOS, programs using automatic file-access tracking no longer abort when they call
execl,execlp, orexeclewith 32 or more arguments (#699, #865). - Fixed A mistyped or misplaced setting in a task now gets an error that names it. For example,
cache: { outputs: [...] }now fails with anunknown fielderror that namesoutputsand lists the accepted settings, instead ofdata did not match any variant of untagged enum UserTaskDefinition(vite-plus#2635, #815). - Fixed In cached tasks on Linux and macOS, programs that pass
-1as a directory descriptor to calls such asopenatno longer abort. For example,ps -p <pid>from procps-ng 4.0.6 or later aborted when the process had already exited (#862). - Fixed
vp runno longer panics before running a script that contains non-ASCII characters, such asecho こんにちは, and no longer cuts off such commands where it displays them (#861). - Fixed On Linux, concurrent system calls in tracked programs, such as
pnpm dlx, no longer cause a stack overflow (#854). - Fixed Cached tasks can now run scripts whose shebang names an interpreter path longer than 126 bytes. Before, the path was cut short and the script failed to start or ran the wrong program. On macOS, text after a
#in the shebang line is now ignored, as it is when the script runs on its own (#788). - Fixed On macOS, tasks with automatic file-access tracking can now run Node.js single executable applications, such as pnpm 11's standalone
pnpmbinary, which previously aborted withAssertion failed: (magic) == (kMagic), anddeno compileoutputs, which previously failed withDid not find magic bytes(#840). - Fixed Reinstalling dependencies with pnpm, or installing them at another path or with another pnpm version, no longer causes cache misses, and tasks that run
pnpm runorpnpm execno longer miss the cache after pnpm rechecks dependencies (#823, #824, #825, #850). - Added Vite+ now builds and runs on platforms without file-access tracking support, such as FreeBSD. On those platforms, automatic input and output tracking is unavailable, so tasks that rely on it report that tracking is unsupported and must configure their
inputandoutputmanually to be cached (#829). - Changed The
vp runsummary now reads like3/4 cache hit (75%), 9/10 successful, 2s saved.The cache hit count leaves out tasks with caching disabled, and the count of successful tasks out of all tasks replaces the count of failed tasks. When no task has caching enabled, the summary shows only the successful count. Invp run --verboseandvp run --last-details, the cache hit rate also leaves out tasks with caching disabled, and saysno task has caching enabledwhen there are none (#821). - Perf On Linux, tasks with automatic file-access tracking start faster (#817).
- Fixed When a cache hit's outputs can't be restored, for example because the cached archive was deleted or is corrupt,
vp runnow fails with an error suggestingvp cache cleaninstead of exiting 0 and reporting a cache hit.vp run --last-detailsshows the task as a cache hit whose outputs couldn't be restored (#770). - Changed When a task isn't cached because it wrote a file it also read,
vp run --last-detailsnow says the task read and wrote the file, and shows thecache: { input, output }exclusions that let the task be cached (#784). - Changed The run summary now says a task that wrote a file it also read was
not cached because it modified its inputs, and the statistics invp run --verboseandvp run --last-detailsuse the singular for a count of one, e.g.1 task • 1 cache miss(#783). - Fixed An invalid glob in
--filterno longer shows its error message twice (#763). - Changed The detailed summary from
vp run --verboseandvp run --last-detailsnow shows each underlying cause of an error on its own line (#761). - Fixed On Windows, environment variable names used by
vp runnow match regardless of ASCII letter case. Assignments in task commands override earlier assignments and inherited variables spelled differently, andFORCE_COLOR,VP_RUN_CONCURRENCY_LIMIT, and variables requested through@voidzero-dev/vite-task-clientare found under any spelling (#747). - Changed A task's cache settings now go inside
cache, e.g.cache: { env: ["NODE_ENV"], input: ["src/**"] };cache: trueis the same ascache: {}.env,untrackedEnv,input, andoutputare no longer supported at the top level of a task (#749). - Fixed Cached tasks on macOS no longer intermittently fail with exit 2 and
oils I/O error (main): No such processwhen a fast command finishes before the shell gets scheduled. The bundled shell that runs task commands is updated to Oils 0.38.0, which fixes this race (#702, #703). - Fixed
vp runno longer hangs or fails when a task leaves a process running behind it, such as a dev server or a background helper, or when one of a task's processes is killed. The run finishes as soon as the task itself does, and the files the task used are still recorded (#544, #675). - Fixed A task that reads or writes an unusually large number of files now runs to the end instead of being killed partway through. Vite+ reports the run as not cached, because it could not record every file the task used (#533, #675).
- Fixed Vite+ diagnostics now display individual paths and working directories without Rust debug formatting such as quoted paths or escaped Windows backslashes (#534).
- Fixed Automatic file-access tracking now works inside the default Codex CLI and Claude Code sandboxes (#562, #563, #576, #569).
- Fixed Broad workspace globs no longer discover and run package scripts inside
node_modules(#539). - Added Tasks now run with
VP_RUN=1set, so tools can tell they are running undervp runinstead of being invoked directly (#570). - Fixed The task cache now supports much larger automatically tracked input sets without hitting wincode's default 4 MiB sequence preallocation limit (#554).
- Fixed npm workspace patterns beginning with
./now discover matching packages correctly (vite-plus#2201, #547). - Fixed Failures while forwarding output from a started task process no longer incorrectly say the process failed to spawn (#506).
- Fixed An issue where Bun tasks on macOS did not rerun when files they read, wrote, or listed changed (#532, #542).
- Improved Windows file-access tracking now uses sparse temporary backing files where supported, avoiding upfront allocation of the full backing file on disk (#524).
- Fixed Automatic file-access tracking on Linux now works in containers and Kubernetes runners with limited
/dev/shmspace (#353, #523). - Fixed Windows automatic input tracking now records executable image reads when process creation performs the lookup inside
NtCreateUserProcess(#518). - Fixed Failures while waiting for a started task process to exit no longer incorrectly say the process failed to spawn (#515).
- Fixed Missing env vars requested through
@voidzero-dev/vite-task-clientnow returnundefinedinstead ofnull, preserving Vite productionNODE_ENVsemantics when builds run throughvp run(#508). - Fixed Windows builds no longer hang on CI when a
node_modules/.bin.cmdshim is routed through PowerShell: the npm/pnpm/yarn.ps1wrappers read stdin and block forever on a non-TTY pipe, so the PowerShell rewrite is now skipped when stdin is not an interactive terminal, falling back to the.cmd(which never reads stdin) (#491). - Added First-party support for caching
vite buildwith zero cache config, giving Vite projects correct cache hits out of the box (vitejs/vite#22453). - Added Support for specifying tasks from dependency packages in
dependsOn, such asdependsOn: [{ "task": "build", "from": "dependencies" }](#479). - Added
@voidzero-dev/vite-task-client, allowing tools to report cache information to Vite Task at runtime so users do not need to configure it manually (#441, #454, #449, #450, #458, #431, #459, #472). - Changed Cached tasks now restore automatically tracked output files by default; use
output: []to disable restoration (#460, #461). - Changed Environment values in task cache fingerprints are now stored only as SHA-256 digests, and env-related cache miss details report names without values (#455).
- Fixed Prefix environment assignments like
PATH=... commandnow affect executable lookup during task planning, so tools provided only by the prefixedPATHcan be resolved correctly (#440) - Changed Cache misses caused by a tracked env var now name the env var inline, for example
cache miss: env 'NODE_ENV' changed, instead of the genericenvs changedmessage (#438) - Fixed The task cache is now stored in a per-schema-version subdirectory (e.g.
node_modules/.vite/task-cache/v13/), so switching between branches that pin different Vite+ versions no longer fails withUnrecognized database version. Each version keeps its own cache directory; a cache from a different version is ignored rather than aborting the run (#433) - Added A task's
envanduntrackedEnvglob patterns now support!negation: a!-prefixed pattern excludes matching variables (e.g.["VITE_*", "!VITE_SECRET"]tracks everyVITE_*exceptVITE_SECRET) (#425) - Fixed
package.jsonandpnpm-workspace.yamlfiles with a UTF-8 BOM no longer fail to parse (#424) - Changed
vp run --filter <expr>now exits 0 with a warning when the filter matches no packages, matching pnpm. Use--fail-if-no-matchto restore the previous strict behavior (#393) - Added task command shorthands for defining tasks as command strings or command string arrays (#391)
- Changed Cached logs are stored with colors intact (
FORCE_COLOR=1is auto-injected into spawned tasks). Colors are then stripped at display time when the terminal does not support them. Other color-related env vars (NO_COLOR,COLORTERM,TERM,TERM_PROGRAM) are no longer passed through by default. Opt in via a task'senv/untrackedEnv(#378) - Added
outputfield for cached tasks: archives matching files after a successful run and restores them on cache hit (#375) - Fixed Windows cached tasks can now run package shims rewritten through PowerShell; default env passthrough now preserves
PATHEXT(#366) - Added Platform support for targets without
inputauto-inference (e.g. Android). Tasks still run; those relying on auto-inference run uncached, with the summary noting thatinputmust be configured manually to enable caching (#352) - Fixed
vp runno longer aborts withfailed to prepare the command for injection: Invalid argumentwhen the user environment already hasLD_PRELOAD(Linux) orDYLD_INSERT_LIBRARIES(macOS) set. The tracer shim is now appended to any existing value and placed last, so user preloads keep their symbol-interposition precedence (#340) - Changed Arguments passed after a task name (e.g.
vp run test some-filter) are now forwarded only to that task. Tasks pulled in viadependsOnno longer receive them (#324) - Fixed Windows file access tracking no longer panics when a task touches malformed paths that cannot be represented as workspace-relative inputs (#330)
- Fixed
vp run --cachenow supports running without a task specifier and opens the interactive task selector, matching barevp runbehavior (#312) - Fixed Ctrl-C now prevents future tasks from being scheduled and prevents caching of in-flight task results (#309)
- Added
--concurrency-limitflag to limit the number of tasks running at the same time (defaults to 4) (#288, #309) - Added
--parallelflag to ignore task dependencies and run all tasks at once with unlimited concurrency (unless--concurrency-limitis also specified) (#309) - Added object form for
inputentries:{ "pattern": "...", "base": "workspace" | "package" }to resolve glob patterns relative to the workspace root instead of the package directory (#295) - Fixed arguments after the task name being consumed by
vpinstead of passed through to the task (#286, #290) - Changed default untracked env patterns to align with Turborepo, covering more CI and platform-specific variables (#262)
- Added
--log=interleaved|labeled|groupedflag to control task output display:interleaved(default) streams directly,labeledprefixes lines with[pkg#task],groupedbuffers output per task (#266) - Added musl target support (
x86_64-unknown-linux-musl) (#273) - Changed cache hit/miss indicators to use neutral symbols (◉/〇) instead of ✓/✗ to avoid confusion with success/error (#268)
- Added automatic skip of caching for tasks that modify their own inputs (#248)