Repository navigation
fix(workspace): error when a package#task names no workspace package - #984
Merged
Merged
Conversation
wan9chi
added a commit
that referenced
this pull request
Nov 9, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fspy benchmarklinuxmacoswindows |
wan9chi
added a commit
that referenced
this pull request
Nov 9, 2026
…it (#986) ## Motivation `dry_run_json::unknown_after_remote_hit`, added in #968, is flaky. It failed on main's macOS CI ([job](https://github.com/voidzero-dev/vite-task/actions/runs/42609456309/job/129134222870)), on #969's, and on #984's Windows job ([run](https://github.com/voidzero-dev/vite-task/actions/runs/42609782121)). In its first step, the backend log read `fetch 404, store 200, fetch 404, store 200` instead of `fetch 404, fetch 404, store 200, store 200`. ## Changes - **Cause:** `vt run after-emit` runs `emit` first. Once `emit` finishes, its upload starts in the background at the same time as `after-emit`'s fetch, and the e2e proxy logs each request when its response finishes, so either can come first. `VP_RUN_INTERNAL_HIDE_PENDING_UPLOADS` hides the upload's progress, but doesn't delay it. - **Fix:** each dependency now runs in its own step first: `vt run emit` before `vt run after-emit`, and `vt run build` before `vt run after-build`. Each step then makes at most one fetch followed by one upload, in a fixed order. - The dry runs that the case checks are unchanged: `after-emit` is still `unknown` after a remote hit that restores outputs, and `after-build` is still a hit. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Test fixture and snapshot updates only; no production run or remote-cache logic changes. > > **Overview** > Fixes flaky **`unknown_after_remote_hit`** dry-run e2e snapshots by **splitting combined runs into separate steps**: `vt run emit` before `vt run after-emit`, and `vt run build` before `vt run after-build`. > > That keeps each remote-cache interaction to a **deterministic fetch-then-store order** (uploads from the first task no longer overlap the dependent task’s fetch when the proxy logs responses). Comments and the **`unknown_after_remote_hit.md`** snapshot were updated for the extra steps, cache-hit replay lines, and corrected expectations (e.g. `after-build` as full cache hit with **no fetch**). > > **`snapshots.toml`** and the markdown snapshot are the only touched files; asserted dry-run behavior is unchanged. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 9226b86. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
`vp run nope#build`, with no package named `nope`, ran nothing and exited 0 without a warning. A `package#task` specifier names one package on purpose, so it now fails with `Package 'nope' not found in the workspace` and exits 1, also when nested in a task's command. A short name that auto-completes to several scoped packages now fails with the existing ambiguous-name error instead of matching nothing. `--filter` keeps its pnpm-compatible warning and exit 0; only the `pkg#task` pattern, now flagged `exactly_one` instead of `unique`, errors. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`run_plan_json::selection` recorded `nope#build` giving an empty plan with exit 0. With the planner now rejecting a `pkg#task` that names no workspace package, the dry run exits 1 with the error on stderr and nothing on stdout, as a real run does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
wan9chi
force-pushed
the
fix/unknown-package-in-task-specifier
branch
from
November 9, 2026 13:01
4f95f6f to
ed120e0
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation
vp run nope#build, where no workspace package is namednope, ran nothing and exited 0 without a word.--filter nope buildat least warnsNo packages matched the filter: nopebefore its pnpm-compatible exit 0. But apackage#taskspecifier names one package on purpose, so a missing package is almost always a typo, and a CI script with that typo passed while running nothing. Turborepo errors here (Could not find package "nope" referenced by task "nope#build" in project).Now the run fails, before anything runs:
It exits 1 with nothing on stdout. A
vp run nope#buildinside a task's command fails the outer run's planning the same way, as a nestedvp run typoalready does:The same rule covers a short name that auto-completes to several scoped packages, like
appfor@a/appand@b/app. Before, it also ran nothing and exited 0; now it fails with the existing ambiguous-name error, which lists the packages' paths. A short name with one scoped match, likeappfor@test/app, still resolves.--filteris unchanged: an unmatched filter warns and exits 0, and--fail-if-no-matchmakes it an error.pkg#taskspecifiers already resolve through an exact-name pattern flaggedunique, which errored only when several packages shared the name. The flag is nowexactly_one, and the resolver also errors when that name matches no package, or several after scoped auto-completion.🤖 Generated with Claude Code
Note
Medium Risk
User-visible planning/CLI semantics change: mistyped package#task specifiers now fail instead of exiting 0 with no work, which fixes CI false positives but may break anyone depending on the old no-op behavior.
Overview
package#taskselectors now fail fast when the package cannot be resolved to exactly one workspace package: missing names exit 1 withPackage '…' not found in the workspace, and short names that scoped-auto-complete to multiple packages use the existing ambiguous-name error. This applies to top-level runs, nestedvp run …in task commands, and--dry-run --json(no empty plan on stdout).Resolution uses a renamed
exactly_oneflag on exact package names (formerlyunique) sopkg#taskpaths require one match after exact and scoped lookup;--filterbehavior is unchanged (warn + exit 0 unless--fail-if-no-match).E2e and plan snapshot tests document the new errors and the filter vs specifier distinction.
Reviewed by Cursor Bugbot for commit ed120e0. Bugbot is set up for automated code reviews on this repo. Configure here.