Skip to content

fix(workspace): error when a package#task names no workspace package - #984

Merged
wan9chi merged 2 commits into
mainfrom
fix/unknown-package-in-task-specifier
Nov 9, 2026
Merged

wan9chi merged 2 commits into
mainfrom
fix/unknown-package-in-task-specifier

Conversation

@wan9chi

@wan9chi wan9chi commented Nov 9, 2026 •

Copy link
Copy Markdown
Member

Motivation

vp run nope#build, where no workspace package is named nope, ran nothing and exited 0 without a word. --filter nope build at least warns No packages matched the filter: nope before its pnpm-compatible exit 0. But a package#task specifier 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:

$ vp run nope#build
error: Package 'nope' not found in the workspace

It exits 1 with nothing on stdout. A vp run nope#build inside a task's command fails the outer run's planning the same way, as a nested vp run typo already does:

error: Failed to plan tasks from `vp run nope#build` in task app#build
* Package 'nope' not found in the workspace

The same rule covers a short name that auto-completes to several scoped packages, like app for @a/app and @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, like app for @test/app, still resolves.

--filter is unchanged: an unmatched filter warns and exits 0, and --fail-if-no-match makes it an error.

pkg#task specifiers already resolve through an exact-name pattern flagged unique, which errored only when several packages shared the name. The flag is now exactly_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#task selectors now fail fast when the package cannot be resolved to exactly one workspace package: missing names exit 1 with Package '…' 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, nested vp run … in task commands, and --dry-run --json (no empty plan on stdout).

Resolution uses a renamed exactly_one flag on exact package names (formerly unique) so pkg#task paths require one match after exact and scoped lookup; --filter behavior 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.

wan9chi added a commit that referenced this pull request Nov 9, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Nov 9, 2026 •

Copy link
Copy Markdown

fspy benchmark

linux

dynamic/launch             change  +0.19%  [ -3.40% ..  +4.62%]  overhead   +57.19%
dynamic/access             change  +0.35%  [-10.52% ..  +7.83%]  overhead   +17.85%
dynamic/access-relative    change  -0.29%  [ -4.83% ..  +3.32%]  overhead   +69.98%
dynamic/access-contended   change  -5.18%  [-13.46% ..  +2.54%]  overhead   +30.05%
static/launch              change  -0.43%  [ -5.33% ..  +4.50%]  overhead  +191.94%
static/access              change  -0.22%  [ -1.58% ..  +1.82%]  overhead +1462.06%
static/access-relative     change  -0.59%  [ -2.22% ..  +0.47%]  overhead +1976.65%
static/access-contended    change  -0.61%  [ -2.91% ..  +3.05%]  overhead +1909.10%

macos

dynamic/launch             change  +0.44%  [ -3.60% ..  +4.95%]  overhead  +231.58%
dynamic/access             change  -1.23%  [-18.23% ..  +9.56%]  overhead    +4.16%
dynamic/access-relative    change  +1.14%  [-13.58% .. +22.74%]  overhead  +238.50%
dynamic/access-contended   change  +2.32%  [ -2.12% .. +43.08%]  overhead    +4.49%

windows

dynamic/launch             change  -1.05%  [ -4.22% ..  +3.20%]  overhead   +26.61%
dynamic/access             change  +0.00%  [ -0.96% ..  +0.96%]  overhead    +1.35%
dynamic/access-relative    change  +0.18%  [ -0.56% ..  +0.96%]  overhead    +1.32%
dynamic/access-contended   change  +0.18%  [ -0.73% ..  +0.91%]  overhead    +1.67%

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>
wan9chi and others added 2 commits November 9, 2026 20:59
`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
wan9chi force-pushed the fix/unknown-package-in-task-specifier branch from 4f95f6f to ed120e0 Compare November 9, 2026 13:01
@wan9chi
wan9chi merged commit 5784bca into main Nov 9, 2026
23 checks passed
@wan9chi
wan9chi deleted the fix/unknown-package-in-task-specifier branch November 9, 2026 13:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant