Skip to content

perf: Reuse compiled workspace matchers - #13970

Merged
anthonyshew merged 13 commits into
mainfrom
shew/reduce-cli-startup-overhead
Sep 8, 2026
Merged

anthonyshew merged 13 commits into
mainfrom
shew/reduce-cli-startup-overhead

Conversation

@anthonyshew

@anthonyshew anthonyshew commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Description

Layer 11 of 11 in the startup-performance stack, split from #13970. Each PR is based on the previous layer so its diff contains only this optimization. The top layer preserves the original combined source tree.

Reuse compiled workspace matchers between inference and local discovery. Retain one successful set keyed by exact ordered inclusion/exclusion vectors, including spelling and duplicates. Configuration is still reread; no discovered paths, mtimes, symlink resolutions, or containment results are cached. Clone outside the mutex, preserve caller isolation, and fall back to compilation if the lock is poisoned.

Testing Instructions

Ordinary 50/500-package fixtures were mostly neutral. On a committed stress fixture with 50 real packages, one matching workspace pattern, and 200 unmatched patterns, Linux cache-hit medians improved 25.10 → 21.26 ms (15.3%) and macOS 16.42 → 15.68 ms (4.5%). Repeated --skip-infer and large dry-run guardrails did not establish a regression. DHAT cumulative allocations fell approximately 0.9–1.1 MB, with a small live-memory increase from retaining a matcher; this is not an RSS reduction. Strace confirmed unchanged filesystem-check counts. The cache is bounded to one entry, not a fixed byte budget.

Measurement limits

  • Measurements used optimized binaries, randomized paired before/after runs, warm OS/local caches, and synthetic npm fixtures. CPU/heap/syscall profiling was separate from wall-time timing.
  • Early batches had an unborn Git HEAD; later normalization and matcher-reuse batches used committed fixtures. Results from separate batches are not cumulative.
  • Windows runtime performance remains unmeasured. No worker-pool sizes or task concurrency defaults are reduced.

This is the original PR retained as the top of the stack. Rejected byte-scanning, direct task-output arena, and Mach-O chained-fixup experiments remain excluded. Profiling artifacts and the original combined PR description are preserved locally.

@vercel

vercel Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
examples-basic-web Ready Ready Preview, v0 Sep 8, 2026 12:46pm UTC
examples-designsystem-docs Ready Ready Preview, v0 Sep 8, 2026 12:46pm UTC
examples-gatsby-web Ready Ready Preview, v0 Sep 8, 2026 12:46pm UTC
examples-kitchensink-blog Ready Ready Preview, v0 Sep 8, 2026 12:46pm UTC
examples-nonmonorepo Ready Ready Preview, v0 Sep 8, 2026 12:46pm UTC
examples-svelte-web Ready Ready Preview, v0 Sep 8, 2026 12:46pm UTC
examples-tailwind-web Ready Ready Preview, v0 Sep 8, 2026 12:46pm UTC
examples-vite-web Ready Ready Preview, v0 Sep 8, 2026 12:46pm UTC
turbo-site Ready Ready Preview, v0 Sep 8, 2026 12:46pm UTC
turborepo-factory Ready Ready Preview, v0 Sep 8, 2026 12:46pm UTC

@anthonyshew
anthonyshew force-pushed the shew/reduce-cli-startup-overhead branch from 6fc528b to d2fa588 Compare September 8, 2026 11:54
@vercel
vercel Bot temporarily deployed to Preview – turborepo-factory September 8, 2026 11:55 Inactive
@anthonyshew anthonyshew changed the title perf: Reduce CLI startup overhead perf: Reuse compiled workspace matchers Sep 8, 2026
@anthonyshew
anthonyshew changed the base branch from main to shew/startup-10-root-inference September 8, 2026 11:56
anthonyshew added a commit that referenced this pull request Sep 8, 2026
### Description

Layer 1 of 11 in the startup-performance stack, split from #13970. Each
PR is based on the previous layer so its diff contains only this
optimization. The top layer preserves the original combined source tree.

Handle help, version, and argument-error exits before creating
Rayon/Tokio worker pools. Keep parsing after shim selection and
diagnostics setup, so local-version selection is unchanged. Actual task
execution still initializes both pools with the same concurrency
settings.

### Testing Instructions

Release timing of parser-only invocations showed version startup roughly
7–11% faster in the initial investigation. This is not a general `turbo
run` speedup. The regression case uses an invalid Tokio worker count to
ensure parser-only exits never construct a runtime.

#### Measurement limits

- Measurements used optimized binaries, randomized paired before/after
runs, warm OS/local caches, and synthetic npm fixtures. CPU/heap/syscall
profiling was separate from wall-time timing.
- Early batches had an unborn Git HEAD; later normalization and
matcher-reuse batches used committed fixtures. Results from separate
batches are not cumulative.
- Windows runtime performance remains unmeasured. No worker-pool sizes
or task concurrency defaults are reduced.
@anthonyshew
anthonyshew requested a review from a team as a code owner September 8, 2026 12:16
@anthonyshew
anthonyshew requested review from tknickman and removed request for a team September 8, 2026 12:16
@anthonyshew
anthonyshew changed the base branch from shew/startup-10-root-inference to main September 8, 2026 12:25
@anthonyshew
anthonyshew requested a review from a team September 8, 2026 12:25
@anthonyshew
anthonyshew merged commit 7aaf7cb into main Sep 8, 2026
49 of 50 checks passed
@anthonyshew
anthonyshew deleted the shew/reduce-cli-startup-overhead branch September 8, 2026 12:59
anthonyshew added a commit that referenced this pull request Sep 8, 2026
### Description

Undo the ten startup-optimization layers that were unintentionally
merged together in #13970 (`7aaf7cbc823e5ce5579f3bc45d19abed3282505a`).
This is a mechanical rollback so those changes can be reviewed and
landed individually, not a rejection of the optimizations.

- Keep the parser-exit optimization from the separately merged #13971.
- Keep the independent Go watch-test timeout correction included in the
bundled merge.
- Restore the telemetry, package-manager, environment, configuration,
repository-discovery, and glob code to its pre-bundle behavior.
- Carry the config diagnostic-comparison test fix back with the
deferred-config-check optimization when that PR is restored.

### Recovery order

1. Merge this revert first.
2. Rebuild the optimization stack on the actual merged revert commit on
`main`, accounting for squash-merge ancestry.
3. Reopen #13972 through #13980 with one optimization commit per PR, and
create a replacement for the matcher-reuse layer because merged #13970
cannot be reopened.
4. Review and land those draft PRs from bottom to top. Do not retarget a
higher layer to `main` while its predecessors are unmerged: its branch
contains their cumulative changes.

The rollback is necessarily large; each reintroduced optimization will
have its own isolated review diff.
anthonyshew added a commit that referenced this pull request Sep 8, 2026
<!-- startup-recovery-20260908 -->
### Review scope

Independent optimization targeting `main`, with exactly one feature
commit. No other optimization PR is a prerequisite.

Recovered after the bundled #13970 merge was reverted by #13982. The
separately merged parser optimization #13971 remains on `main`. This is
not part of a cumulative optimization stack.

The timing figures below are historical measurements from the original
incremental benchmark sequence. They have not been remeasured on these
newly independent branches and are not additive.
<!-- /startup-recovery-20260908 -->

### Description

Accept ordinary numeric package-manager versions without initializing
the Unicode validation regex. All other inputs use the existing parser
and diagnostics, including URLs, prerelease/build labels, and non-ASCII
input. Compare the fast path with the original expression in regression
coverage.

### Testing Instructions

DHAT attributed approximately 1 MB of startup allocations to the
package-manager validation path. Bypassing it for ordinary versions
removed that work; an isolated reliable wall-time improvement was not
demonstrated. Do not attribute the later combined cache-hit speedups to
this layer alone.

#### Measurement limits

- Measurements used optimized binaries, randomized paired before/after
runs, warm OS/local caches, and synthetic npm fixtures. CPU/heap/syscall
profiling was separate from wall-time timing.
- Early batches had an unborn Git HEAD; later normalization and
matcher-reuse batches used committed fixtures. Results from separate
batches are not cumulative.
- Windows runtime performance remains unmeasured. No worker-pool sizes
or task concurrency defaults are reduced.
anthonyshew added a commit that referenced this pull request Sep 8, 2026
<!-- startup-recovery-20260908 -->
### Review scope

Independent optimization targeting `main`, with exactly one feature
commit. No other optimization PR is a prerequisite.

Recovered after the bundled #13970 merge was reverted by #13982. The
separately merged parser optimization #13971 remains on `main`. This is
not part of a cumulative optimization stack.

The timing figures below are historical measurements from the original
incremental benchmark sequence. They have not been remeasured on these
newly independent branches and are not additive.
<!-- /startup-recovery-20260908 -->

### Description

Stop ancestor discovery once a multi-package root has been selected:
later candidates cannot replace it under the existing selection rules.
Continue searching outward when an intermediate workspace does not
include the closest standalone package.

### Testing Instructions

Isolated macOS measurements showed modest gains, roughly 1% for
50-package cache hits; large and forced cases were mostly inconclusive.
The combined normalization/inference batch used committed synthetic Git
fixtures and showed about 1.5% faster macOS 50-package hits and 3.1%
faster Linux hits. Root-selection regression coverage includes nested
workspaces and excluded standalone packages. Task concurrency is
unchanged.

#### Measurement limits

- Measurements used optimized binaries, randomized paired before/after
runs, warm OS/local caches, and synthetic npm fixtures. CPU/heap/syscall
profiling was separate from wall-time timing.
- Early batches had an unborn Git HEAD; later normalization and
matcher-reuse batches used committed fixtures. Results from separate
batches are not cumulative.
- Windows runtime performance remains unmeasured. No worker-pool sizes
or task concurrency defaults are reduced.
anthonyshew added a commit that referenced this pull request Sep 8, 2026
<!-- startup-recovery-20260908 -->
### Review scope

Independent optimization targeting `main`, with exactly one feature
commit. No other optimization PR is a prerequisite.

Recovered after the bundled #13970 merge was reverted by #13982. The
separately merged parser optimization #13971 remains on `main`. This is
not part of a cumulative optimization stack.

The timing figures below are historical measurements from the original
incremental benchmark sequence. They have not been remeasured on these
newly independent branches and are not additive.
<!-- /startup-recovery-20260908 -->

### Description

Reuse compiled workspace matchers between inference and local discovery.
Retain one successful set keyed by exact ordered inclusion/exclusion
vectors, including spelling and duplicates. Configuration is still
reread; no discovered paths, mtimes, symlink resolutions, or containment
results are cached. Clone outside the mutex, preserve caller isolation,
and fall back to compilation if the lock is poisoned.

### Testing Instructions

Ordinary 50/500-package fixtures were mostly neutral. On a committed
stress fixture with 50 real packages, one matching workspace pattern,
and 200 unmatched patterns, Linux cache-hit medians improved 25.10 →
21.26 ms (15.3%) and macOS 16.42 → 15.68 ms (4.5%). Repeated
`--skip-infer` and large dry-run guardrails did not establish a
regression. DHAT cumulative allocations fell approximately 0.9–1.1 MB,
with a small live-memory increase from retaining a matcher; this is not
an RSS reduction. Strace confirmed unchanged filesystem-check counts.
The cache is bounded to one entry, not a fixed byte budget.

#### Measurement limits

- Measurements used optimized binaries, randomized paired before/after
runs, warm OS/local caches, and synthetic npm fixtures. CPU/heap/syscall
profiling was separate from wall-time timing.
- Early batches had an unborn Git HEAD; later normalization and
matcher-reuse batches used committed fixtures. Results from separate
batches are not cumulative.
- Windows runtime performance remains unmeasured. No worker-pool sizes
or task concurrency defaults are reduced.

Rejected byte-scanning, direct task-output arena, and Mach-O
chained-fixup experiments remain excluded. Profiling artifacts and the
original combined PR description are preserved locally.
anthonyshew added a commit that referenced this pull request Sep 8, 2026
<!-- startup-recovery-20260908 -->
### Review scope

Independent optimization targeting `main`, with exactly one feature
commit. No other optimization PR is a prerequisite.

Recovered after the bundled #13970 merge was reverted by #13982. The
separately merged parser optimization #13971 remains on `main`. This is
not part of a cumulative optimization stack.

The timing figures below are historical measurements from the original
incremental benchmark sequence. They have not been remeasured on these
newly independent branches and are not additive.
<!-- /startup-recovery-20260908 -->

### Description

Skip the normalization regexes when globstars are already standalone and
non-consecutive. None of the existing rewrites can match that shape.
Preserve platform path normalization and use the original rewrite chain
for ambiguous patterns, including overlapping globstars.

### Testing Instructions

The isolated normalization A/B showed modest Linux improvements on
50-package fixtures, with larger cases mostly neutral. A later combined
batch with bounded root inference improved Linux 50-package cache hits
3.1%, per-config hits 4.3%, and dry runs 2.4%. These are incremental
batches and must not be added together. Differential coverage
exhaustively compares short ASCII/Unicode patterns with the original
rewrites.

#### Measurement limits

- Measurements used optimized binaries, randomized paired before/after
runs, warm OS/local caches, and synthetic npm fixtures. CPU/heap/syscall
profiling was separate from wall-time timing.
- Early batches had an unborn Git HEAD; later normalization and
matcher-reuse batches used committed fixtures. Results from separate
batches are not cumulative.
- Windows runtime performance remains unmeasured. No worker-pool sizes
or task concurrency defaults are reduced.
anthonyshew added a commit that referenced this pull request Sep 8, 2026
<!-- startup-recovery-20260908 -->
### Review scope

Independent optimization targeting `main`, with exactly one feature
commit. No other optimization PR is a prerequisite.

Recovered after the bundled #13970 merge was reverted by #13982. The
separately merged parser optimization #13971 remains on `main`. This is
not part of a cumulative optimization stack.

The timing figures below are historical measurements from the original
incremental benchmark sequence. They have not been remeasured on these
newly independent branches and are not additive.
<!-- /startup-recovery-20260908 -->

### Description

Memoize missing workspace configs when no updater is present, and
resolve the physical repository root once per loader. Preserve updater
retries and synthesized configs; do not cache parse/I/O errors. Fresh
loaders rediscover changed configs and symlink targets.

### Testing Instructions

Linux strace on a 50-package fixture showed missing
`turbo.json`/`turbo.jsonc` opens falling from 300 to 100: each of 100
distinct paths was opened once rather than three times. Root/path
caching reduced readlink probes by 947 in that batch. Timing was
combined with parser/environment changes, so their 15.2%/10.8% cache-hit
gains are not attributed solely to this PR. This layer intentionally
retains the pre-deferred-read flow; a later layer moves schema/physical
checks after successful reads.

#### Measurement limits

- Measurements used optimized binaries, randomized paired before/after
runs, warm OS/local caches, and synthetic npm fixtures. CPU/heap/syscall
profiling was separate from wall-time timing.
- Early batches had an unborn Git HEAD; later normalization and
matcher-reuse batches used committed fixtures. Results from separate
batches are not cumulative.
- Windows runtime performance remains unmeasured. No worker-pool sizes
or task concurrency defaults are reduced.
anthonyshew added a commit that referenced this pull request Sep 8, 2026
<!-- startup-recovery-20260908 -->
### Review scope

Independent optimization targeting `main`, with exactly one feature
commit. No other optimization PR is a prerequisite.

Recovered after the bundled #13970 merge was reverted by #13982. The
separately merged parser optimization #13971 remains on `main`. This is
not part of a cumulative optimization stack.

The timing figures below are historical measurements from the original
incremental benchmark sequence. They have not been remeasured on these
newly independent branches and are not additive.
<!-- /startup-recovery-20260908 -->

### Description

Match builtin environment names/prefixes and literal-only selection
lists without compiling regexes. Match builtin passthrough variables
once per environment snapshot, not per task. Preserve exclusion
precedence, escaping, LF behavior, and Windows Unicode case-folding
through the existing regex fallback.

### Testing Instructions

DHAT identified environment-matcher compilation as startup allocation
work. This layer was measured together with package-manager parsing and
config lookup caching: that combined Linux batch improved 50-package
cache hits 15.2% and 500-package hits 10.8%. Those are combined results,
not an isolated claim for environment matching. Before/after task-hash
validation was used to guard cache-key compatibility.

#### Measurement limits

- Measurements used optimized binaries, randomized paired before/after
runs, warm OS/local caches, and synthetic npm fixtures. CPU/heap/syscall
profiling was separate from wall-time timing.
- Early batches had an unborn Git HEAD; later normalization and
matcher-reuse batches used committed fixtures. Results from separate
batches are not cumulative.
- Windows runtime performance remains unmeasured. No worker-pool sizes
or task concurrency defaults are reduced.
anthonyshew added a commit that referenced this pull request Sep 8, 2026
<!-- startup-recovery-20260908 -->
### Review scope

Independent optimization targeting `main`, with exactly one feature
commit. No other optimization PR is a prerequisite.

Recovered after the bundled #13970 merge was reverted by #13982. The
separately merged parser optimization #13971 remains on `main`. This is
not part of a cumulative optimization stack.

The timing figures below are historical measurements from the original
incremental benchmark sequence. They have not been remeasured on these
newly independent branches and are not additive.
<!-- /startup-recovery-20260908 -->

### Description

Resolve the physical repository root once per knowledge build, and reuse
each manifest resolution for containment and duplicate-identity checks.
Try canonicalization directly for existing files rather than statting
them first; preserve the missing-path parent fallback and symlink
validation.

### Testing Instructions

This was measured with the following deferred-config-check layer in a
separate Linux FS A/B batch. Together they reduced 500-package readlink
calls from 13,042 to 6,033 and statx calls from 6,070 to 4,566; cache
hits improved 6.0% and dry runs 7.2%. These are paired synthetic-fixture
batch results, not isolated per-layer or universal gains. Coverage
includes symlink retargeting and aliases of the same manifest.

#### Measurement limits

- Measurements used optimized binaries, randomized paired before/after
runs, warm OS/local caches, and synthetic npm fixtures. CPU/heap/syscall
profiling was separate from wall-time timing.
- Early batches had an unborn Git HEAD; later normalization and
matcher-reuse batches used committed fixtures. Results from separate
batches are not cumulative.
- Windows runtime performance remains unmeasured. No worker-pool sizes
or task concurrency defaults are reduced.

<sub>CLOSES TURBO-6045</sub>
anthonyshew added a commit that referenced this pull request Sep 8, 2026
<!-- startup-recovery-20260908 -->
### Review scope

Independent optimization targeting `main`, with exactly one feature
commit. No other optimization PR is a prerequisite.

Recovered after the bundled #13970 merge was reverted by #13982. The
separately merged parser optimization #13971 remains on `main`. This is
not part of a cumulative optimization stack.

The timing figures below are historical measurements from the original
incremental benchmark sequence. They have not been remeasured on these
newly independent branches and are not additive.
<!-- /startup-recovery-20260908 -->

### Description

Make explicitly disabled telemetry inert. Environment opt-out skips
config loading; disabled telemetry creates no worker and avoids event
UUID generation, formatting, hashing, and shutdown timers. Preserve
enabled behavior and distinguish opt-out from missing initialization.

### Testing Instructions

The startup investigation traced work performed even when telemetry was
disabled. End-to-end run measurements did not establish a consistent
standalone speedup for this layer; this removes avoidable opt-out work
rather than claiming the combined benchmark gains. Enabled-mode
measurements used a closed local proxy to exclude external network
variability.

#### Measurement limits

- Measurements used optimized binaries, randomized paired before/after
runs, warm OS/local caches, and synthetic npm fixtures. CPU/heap/syscall
profiling was separate from wall-time timing.
- Early batches had an unborn Git HEAD; later normalization and
matcher-reuse batches used committed fixtures. Results from separate
batches are not cumulative.
- Windows runtime performance remains unmeasured. No worker-pool sizes
or task concurrency defaults are reduced.
anthonyshew added a commit that referenced this pull request Sep 8, 2026
<!-- startup-recovery-20260908 -->
### Review scope

Depends on #13975: this change uses its per-loader `physical_repo_root`
cache and extends its missing-config coverage. This PR targets
`shew/startup-05-config-lookups`, so its diff contains only deferred
filesystem checks. After #13975 lands, rebase this feature commit onto
updated `main` before retargeting it. No other optimization PR is a
prerequisite.

Recovered after the bundled #13970 merge was reverted by #13982. The
separately merged parser optimization #13971 remains on `main`. This is
not part of a cumulative optimization stack.

The timing figures below are historical measurements from the original
incremental benchmark sequence. They have not been remeasured on these
newly independent branches and are not additive.
<!-- /startup-recovery-20260908 -->

### Description

Resolve root-versus-package config schema only after reading config
contents. Reuse explicit config-existence observations while preserving
precedence and errors for conflicting configs. Avoid
physical-path/schema work for absent configs without removing checks for
files that are actually read.

### Testing Instructions

In the Linux FS batch with the preceding repository-canonicalization
layer, 500-package cache hits improved 6.0% and dry runs 7.2%. Smaller
and forced-run cases were inconclusive, including a 2.7% median slowdown
for the per-package-config cache-hit fixture whose paired interval
spanned zero. All 888 saved timing measurements were preserved when only
the unfinished strace/perf phase was resumed. Do not add these
percentages to earlier batches.

#### Measurement limits

- Measurements used optimized binaries, randomized paired before/after
runs, warm OS/local caches, and synthetic npm fixtures. CPU/heap/syscall
profiling was separate from wall-time timing.
- Early batches had an unborn Git HEAD; later normalization and
matcher-reuse batches used committed fixtures. Results from separate
batches are not cumulative.
- Windows runtime performance remains unmeasured. No worker-pool sizes
or task concurrency defaults are reduced.
anthonyshew added a commit that referenced this pull request Sep 8, 2026
<!-- startup-recovery-20260908 -->
### Review scope

Independent optimization targeting `main`, with exactly one feature
commit. No other optimization PR is a prerequisite.

Recovered after the bundled #13970 merge was reverted by #13982. The
separately merged parser optimization #13971 remains on `main`. This is
not part of a cumulative optimization stack.

The timing figures below are historical measurements from the original
incremental benchmark sequence. They have not been remeasured on these
newly independent branches and are not additive.
<!-- /startup-recovery-20260908 -->

### Description

Compile workspace directory-glob combinators directly from expressions
instead of first compiling individual regexes that `wax::any` discards.
Add an owning conversion for `Any` without recompiling. Retain the
original per-expression validation/error fallback.

### Testing Instructions

DHAT showed another approximately 0.83 MB fewer allocations per
50-package invocation. Incremental Linux wall times were mostly neutral,
with a modest roughly 2% improvement on the 500-package cache-hit
fixture. Matching and task hashes were unchanged. This is not a speedup
equal to the full workspace-compilation share in the CPU profile.

#### Measurement limits

- Measurements used optimized binaries, randomized paired before/after
runs, warm OS/local caches, and synthetic npm fixtures. CPU/heap/syscall
profiling was separate from wall-time timing.
- Early batches had an unborn Git HEAD; later normalization and
matcher-reuse batches used committed fixtures. Results from separate
batches are not cumulative.
- Windows runtime performance remains unmeasured. No worker-pool sizes
or task concurrency defaults are reduced.
github-actions Bot added a commit that referenced this pull request Sep 9, 2026
## Release v2.10.13-canary.2

> [!CAUTION]
> Versioned docs aliasing FAILED. [View
logs](https://github.com/vercel/turborepo/actions/runs/34359600232)

### Changes

- fix: Keep Cargo tasks runnable without compiler identity (#13857)
(`31645fb`)
- chore: Release Turborepo 2.10.13-canary.1 (#13858) (`5ac6ea4`)
- feat: Support Cargo root packages (#13856) (`e732034`)
- feat(repository): Expose flat lockfile package list for metrics
(#13859) (`935ee2c`)
- chore: Release Turbo repository packages 0.0.1-canary.25 (#13860)
(`b0d4c71`)
- docs: Upgrade Geistdocs to 1.25.1 (#13861) (`81b0414`)
- feat: Expand repository lockfile package metadata (#13862) (`2c84c66`)
- chore: Release Turbo repository packages 0.0.1-canary.26 (#13863)
(`69e394b`)
- fix: Restrict Factory to review comments (#13864) (`1a34319`)
- fix: Pluralize package count in run prelude (#13865) (`a175bd9`)
- chore: Update with-vite example (#13866) (`0e1ff63`)
- chore: Add searchable workspace model picker (#13870) (`73b6268`)
- fix: Restore docs client navigation (#13872) (`2995e17`)
- feat: Improve Factory workspace statuses (#13869) (`35f03fa`)
- chore: Clarify Factory pull request descriptions (#13871) (`5df4cb3`)
- fix: Refresh Factory workspaces from main (#13873) (`efa4ae0`)
- perf: Speed up plain package listings (#13868) (`f68d214`)
- fix: Detect package-level turbo.jsonc (#13875) (`e945403`)
- fix: Format Slack pull request notifications (#13877) (`15c15f3`)
- feat: Link workspaces to pull requests (#13878) (`ae25f97`)
- chore: Upgrade repository to pnpm 12 (#13879) (`4e11bad`)
- chore: Update with-vite-react example (#13880) (`54cf466`)
- chore: Improve Factory chat streaming (#13881) (`eebf1b0`)
- fix: Show workspace failure details (#13884) (`c7661b8`)
- chore: Add selectable Factory coding harnesses (#13887) (`6b5ca16`)
- fix: Gracefully handle native lockfile failures (#13886) (`463a292`)
- chore: Update merged PR Slack messages (#13888) (`66ebcac`)
- fix: Show native tasks in task listings (#13889) (`7e4d9d3`)
- docs: Clarify turbo ls stability in Agent Skill (#13892) (`8ee758c`)
- chore: Resume workspace chat on refocus (#13894) (`7026627`)
- chore: Preserve HarnessAgent bridge assets (#13896) (`26f3160`)
- fix: Deduplicate multi-language watch hashes (#13897) (`5ade89b`)
- fix: Normalize multi-language cache environment inputs (#13898)
(`cfca6f2`)
- chore: Add workspace diff view (#13900) (`813d54a`)
- refactor: Migrate CLI parser to usage-rs (#13890) (`712e0e4`)
- fix: Update --filter help links to canonical docs URL (#13891)
(`6cf116d`)
- chore: Update with-vue-nuxt example (#13901) (`d10e3e0`)
- docs: Document missing reference flags and fix query typo (#13902)
(`1f2acc5`)
- docs: Align CONTRIBUTING Node and pnpm versions (#13883) (`a3bda61`)
- perf: Skip Cargo resolution for workspace-only queries (#13903)
(`b928ecc`)
- fix: Bound memory usage for streamed task output (#13908) (`7f85401`)
- fix: Clarify generator action reporting (#13910) (`7fe0201`)
- fix: Bump tar to 7.5.22 in @turbo/releaser (CVE-2026-73566) (#13911)
(`aba64e9`)
- fix: Correct devtools --port default in CLI help (#13905) (`11f7ee6`)
- fix: Resolve lint errors (#13912) (`d06cf32`)
- fix: Stabilize Rust builds on macOS (#13913) (`7d14df2`)
- docs: Clean up Rust docs (#13914) (`3225cee`)
- fix: Preserve task metadata for command overrides (#13915) (`54bbf8a`)
- perf: Resolve Git SCM state in one process (#13882) (`7c993ef`)
- fix: Only treat files literally named .gitignore as ignore files in
the untracked walk (#13916) (`ac32a79`)
- fix: Pass merge_base and allow_unknown_objects in signature order for
task-level filter ranges (#13917) (`48f64e1`)
- fix: Hash deferred inputs after dependencies (#13919) (`4cc80f7`)
- test: Make Cargo hash fixtures hermetic (#13920) (`32ff2f3`)
- fix: Allow release versioning with pending changes (#13921)
(`5114901`)
- chore: Update to Rust 1.98.0 (#13821) (`ebef942`)
- chore: Upgrade Factory to Fable 5.1 (#13924) (`a57476f`)
- docs: Align Python guide with Rust guide (#13927) (`f166370`)
- fix: Give the package changes watcher the future flags so root inputs
reach the task filter (#13926) (`e5ccf55`)
- fix: Support pnpm 6 single-package lockfiles (#13928) (`a3d52a6`)
- feat: Add skipPackageGraph option to @turbo/repository Workspace.find
(#13929) (`99b5a00`)
- fix: Use pnpm 12 in library release containers (#13930) (`0b6aaf9`)
- fix: Upgrade repository N-API build tooling (#13931) (`dd6c1c6`)
- fix: Use Node 20 for musl library builds (#13933) (`61b1635`)
- fix: Bootstrap musl builds with sh (#13934) (`f9ac0c9`)
- fix: Use static library bootstrap shell (#13935) (`f819dca`)
- fix: Allow unclean tree in bump-version (#13936) (`28562e7`)
- fix: Skip git commit in bump-version (#13937) (`ea4ba17`)
- fix: Expect napi 3 artifact paths (#13938) (`6b5eea3`)
- chore: Release Turbo repository packages 0.0.1-canary.27 (#13939)
(`5c54e50`)
- perf: Batch package detail queries (#13923) (`c8347b1`)
- docs: Touch-ups for Python and Rust docs (#13940) (`f20b415`)
- chore: Update basic example (#13922) (`b40dd07`)
- fix: Avoid oxlint false positive on Workspace.find options (#13941)
(`3125eb1`)
- chore: Update kitchen-sink example (#13945) (`fd8dc59`)
- fix: Hash native workspace task inputs (#13947) (`17d0940`)
- chore: Update with-angular example (#13951) (`3770d4c`)
- fix: Recompute eager hashing flag after prepending global inputs
(#13949) (`9cea33b`)
- refactor: Generalize daemon repository discovery (#13946) (`350bd41`)
- feat: Make daemon discovery toolchain generic (#13952) (`d65c615`)
- feat: Add experimental Go workspace graph foundation (#13953)
(`6687fa8`)
- feat: Add native Go task tables (#13954) (`dccc890`)
- feat: Add Go task input and output contracts (#13955) (`8501ce7`)
- test: Cover native Go execution end to end (#13956) (`48d4322`)
- feat: Add Go external resolution fingerprints (#13957) (`f6d5f18`)
- feat: Fingerprint Go toolchain environment (#13958) (`ec18363`)
- feat: Add Go change observations (#13959) (`5256ecc`)
- test: Cover Go query and summary surfaces (#13960) (`a24ea48`)
- feat: Add Go-aware prune planning (#13961) (`026d7fb`)
- test: Add end-to-end Go prune and cache coverage (#13962) (`a1cbfaa`)
- docs: Document experimental native Go workspaces (#13963) (`7f36a42`)
- fix: Harden Go workspace diagnostics (#13964) (`8a6b0f7`)
- fix: Correct Go workspace resolution and task caching (#13966)
(`8ef6aaf`)
- chore: Add Factory thinking controls and message queue (#13967)
(`77e975c`)
- chore: Remove ARCHITECTURE.md docs (#13969) (`4f8e693`)
- fix: Add slug to OPTIONS request (#13943) (`63797e4`)
- perf: Parse CLI exits before starting worker pools (#13971)
(`6888882`)
- perf: Reuse compiled workspace matchers (#13970) (`7aaf7cb`)
- chore: Revert bundled startup optimizations (#13982) (`c11e327`)
- perf: Fast-path numeric package manager versions (#13973) (`3b28640`)
- perf: Stop inference after selecting a workspace root (#13980)
(`a3c5b9c`)
- perf: Reuse compiled workspace matchers (#13984) (`eb80d6f`)
- perf: Skip unnecessary glob normalization (#13979) (`1840e84`)
- perf: Cache workspace configuration lookups (#13975) (`f59661a`)
- perf: Avoid regexes for simple environment matching (#13974)
(`7e5d793`)
- perf: Reuse canonical paths during repository discovery (#13976)
(`2ba3e6e`)
- perf: Skip work for disabled telemetry (#13972) (`267ed73`)
- perf: Defer filesystem checks for absent configs (#13977) (`f7db9df`)
- perf: Compile workspace glob combinators directly (#13978) (`223fa9f`)
- docs(skills): fix the dependencies-only filter caret position (#13965)
(`73ac1fa`)
- chore: Update with-biome example (#13983) (`bd331cf`)
- fix: Normalize bare directory outputs when filtering dependencyOutputs
hashes (#13932) (`555f2bc`)
- chore: Scope panic lint allows in hash crates to tests and generated
code (#13810) (`e901550`)
- perf: Use binary search for resolution states (#13986) (`6a7f1c6`)
- perf: Use dense membership for task graph pruning (#13987) (`4ffbaa9`)
- perf: Throttle TUI tick cadence (#13988) (`b74be22`)
- perf: Fast-path package-only filter selectors with --only (#13990)
(`8059b91`)
- perf: Avoid materializing npm's legacy dependency tree (#13993)
(`acd35c8`)
- perf: Stream custom repository downloads to disk (#13994) (`a6b88ee`)
- perf: Copy shared file dependencies once per destination during prune
(#13995) (`efbe558`)
- perf: Index npm workspace links during subgraph extraction (#13997)
(`996a0bb`)
- perf: Cache Turbo config reads across ESLint rule invocations (#13998)
(`c02f97e`)
- perf: Scope untracked-file discovery to filtered runs (#13991)
(`ead0e19`)
- perf: Limit turbo.json preloading to required task scope (#13992)
(`f788cd8`)
- ci: Restrict release signing to main (#13985) (`2258541`)
- perf: Coalesce glob-watcher invalidation snapshots (#13996)
(`3fec2fe`)
- perf: Reuse resolver inference during file tracing (#13999)
(`596ea4c`)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
github-actions Bot added a commit that referenced this pull request Sep 14, 2026
## Release v2.10.13

> [!CAUTION]
> Versioned docs aliasing FAILED. [View
logs](https://github.com/vercel/turborepo/actions/runs/34866964811)

### Changes

- chore: Release Turborepo 2.10.12 (#13844) (`32748f5`)
- fix: Remove unsupported remote cache environment variable (#13845)
(`b4c2eed`)
- fix: Copy TUI selections locally over SSH (#13847) (`03df632`)
- feat: Use uv workspace metadata (#13848) (`fa1ca7d`)
- feat: Support Python virtual environments (#13849) (`7f66dbd`)
- fix: Scope uv lockfile affectedness (#13850) (`1e074f3`)
- test: Isolate uv prune configuration (#13851) (`9f2fd33`)
- fix: Explain disabled uv task caching (#13852) (`0f59d11`)
- fix: Explain uv identity probe failures (#13853) (`eabe73a`)
- fix: Explain uncached Cargo library builds (#13855) (`35ce2fa`)
- fix: Explain disabled Cargo task caching (#13854) (`39821f6`)
- fix: Keep Cargo tasks runnable without compiler identity (#13857)
(`31645fb`)
- chore: Release Turborepo 2.10.13-canary.1 (#13858) (`5ac6ea4`)
- feat: Support Cargo root packages (#13856) (`e732034`)
- feat(repository): Expose flat lockfile package list for metrics
(#13859) (`935ee2c`)
- chore: Release Turbo repository packages 0.0.1-canary.25 (#13860)
(`b0d4c71`)
- docs: Upgrade Geistdocs to 1.25.1 (#13861) (`81b0414`)
- feat: Expand repository lockfile package metadata (#13862) (`2c84c66`)
- chore: Release Turbo repository packages 0.0.1-canary.26 (#13863)
(`69e394b`)
- fix: Restrict Factory to review comments (#13864) (`1a34319`)
- fix: Pluralize package count in run prelude (#13865) (`a175bd9`)
- chore: Update with-vite example (#13866) (`0e1ff63`)
- chore: Add searchable workspace model picker (#13870) (`73b6268`)
- fix: Restore docs client navigation (#13872) (`2995e17`)
- feat: Improve Factory workspace statuses (#13869) (`35f03fa`)
- chore: Clarify Factory pull request descriptions (#13871) (`5df4cb3`)
- fix: Refresh Factory workspaces from main (#13873) (`efa4ae0`)
- perf: Speed up plain package listings (#13868) (`f68d214`)
- fix: Detect package-level turbo.jsonc (#13875) (`e945403`)
- fix: Format Slack pull request notifications (#13877) (`15c15f3`)
- feat: Link workspaces to pull requests (#13878) (`ae25f97`)
- chore: Upgrade repository to pnpm 12 (#13879) (`4e11bad`)
- chore: Update with-vite-react example (#13880) (`54cf466`)
- chore: Improve Factory chat streaming (#13881) (`eebf1b0`)
- fix: Show workspace failure details (#13884) (`c7661b8`)
- chore: Add selectable Factory coding harnesses (#13887) (`6b5ca16`)
- fix: Gracefully handle native lockfile failures (#13886) (`463a292`)
- chore: Update merged PR Slack messages (#13888) (`66ebcac`)
- fix: Show native tasks in task listings (#13889) (`7e4d9d3`)
- docs: Clarify turbo ls stability in Agent Skill (#13892) (`8ee758c`)
- chore: Resume workspace chat on refocus (#13894) (`7026627`)
- chore: Preserve HarnessAgent bridge assets (#13896) (`26f3160`)
- fix: Deduplicate multi-language watch hashes (#13897) (`5ade89b`)
- fix: Normalize multi-language cache environment inputs (#13898)
(`cfca6f2`)
- chore: Add workspace diff view (#13900) (`813d54a`)
- refactor: Migrate CLI parser to usage-rs (#13890) (`712e0e4`)
- fix: Update --filter help links to canonical docs URL (#13891)
(`6cf116d`)
- chore: Update with-vue-nuxt example (#13901) (`d10e3e0`)
- docs: Document missing reference flags and fix query typo (#13902)
(`1f2acc5`)
- docs: Align CONTRIBUTING Node and pnpm versions (#13883) (`a3bda61`)
- perf: Skip Cargo resolution for workspace-only queries (#13903)
(`b928ecc`)
- fix: Bound memory usage for streamed task output (#13908) (`7f85401`)
- fix: Clarify generator action reporting (#13910) (`7fe0201`)
- fix: Bump tar to 7.5.22 in @turbo/releaser (CVE-2026-73566) (#13911)
(`aba64e9`)
- fix: Correct devtools --port default in CLI help (#13905) (`11f7ee6`)
- fix: Resolve lint errors (#13912) (`d06cf32`)
- fix: Stabilize Rust builds on macOS (#13913) (`7d14df2`)
- docs: Clean up Rust docs (#13914) (`3225cee`)
- fix: Preserve task metadata for command overrides (#13915) (`54bbf8a`)
- perf: Resolve Git SCM state in one process (#13882) (`7c993ef`)
- fix: Only treat files literally named .gitignore as ignore files in
the untracked walk (#13916) (`ac32a79`)
- fix: Pass merge_base and allow_unknown_objects in signature order for
task-level filter ranges (#13917) (`48f64e1`)
- fix: Hash deferred inputs after dependencies (#13919) (`4cc80f7`)
- test: Make Cargo hash fixtures hermetic (#13920) (`32ff2f3`)
- fix: Allow release versioning with pending changes (#13921)
(`5114901`)
- chore: Update to Rust 1.98.0 (#13821) (`ebef942`)
- chore: Upgrade Factory to Fable 5.1 (#13924) (`a57476f`)
- docs: Align Python guide with Rust guide (#13927) (`f166370`)
- fix: Give the package changes watcher the future flags so root inputs
reach the task filter (#13926) (`e5ccf55`)
- fix: Support pnpm 6 single-package lockfiles (#13928) (`a3d52a6`)
- feat: Add skipPackageGraph option to @turbo/repository Workspace.find
(#13929) (`99b5a00`)
- fix: Use pnpm 12 in library release containers (#13930) (`0b6aaf9`)
- fix: Upgrade repository N-API build tooling (#13931) (`dd6c1c6`)
- fix: Use Node 20 for musl library builds (#13933) (`61b1635`)
- fix: Bootstrap musl builds with sh (#13934) (`f9ac0c9`)
- fix: Use static library bootstrap shell (#13935) (`f819dca`)
- fix: Allow unclean tree in bump-version (#13936) (`28562e7`)
- fix: Skip git commit in bump-version (#13937) (`ea4ba17`)
- fix: Expect napi 3 artifact paths (#13938) (`6b5eea3`)
- chore: Release Turbo repository packages 0.0.1-canary.27 (#13939)
(`5c54e50`)
- perf: Batch package detail queries (#13923) (`c8347b1`)
- docs: Touch-ups for Python and Rust docs (#13940) (`f20b415`)
- chore: Update basic example (#13922) (`b40dd07`)
- fix: Avoid oxlint false positive on Workspace.find options (#13941)
(`3125eb1`)
- chore: Update kitchen-sink example (#13945) (`fd8dc59`)
- fix: Hash native workspace task inputs (#13947) (`17d0940`)
- chore: Update with-angular example (#13951) (`3770d4c`)
- fix: Recompute eager hashing flag after prepending global inputs
(#13949) (`9cea33b`)
- refactor: Generalize daemon repository discovery (#13946) (`350bd41`)
- feat: Make daemon discovery toolchain generic (#13952) (`d65c615`)
- feat: Add experimental Go workspace graph foundation (#13953)
(`6687fa8`)
- feat: Add native Go task tables (#13954) (`dccc890`)
- feat: Add Go task input and output contracts (#13955) (`8501ce7`)
- test: Cover native Go execution end to end (#13956) (`48d4322`)
- feat: Add Go external resolution fingerprints (#13957) (`f6d5f18`)
- feat: Fingerprint Go toolchain environment (#13958) (`ec18363`)
- feat: Add Go change observations (#13959) (`5256ecc`)
- test: Cover Go query and summary surfaces (#13960) (`a24ea48`)
- feat: Add Go-aware prune planning (#13961) (`026d7fb`)
- test: Add end-to-end Go prune and cache coverage (#13962) (`a1cbfaa`)
- docs: Document experimental native Go workspaces (#13963) (`7f36a42`)
- fix: Harden Go workspace diagnostics (#13964) (`8a6b0f7`)
- fix: Correct Go workspace resolution and task caching (#13966)
(`8ef6aaf`)
- chore: Add Factory thinking controls and message queue (#13967)
(`77e975c`)
- chore: Remove ARCHITECTURE.md docs (#13969) (`4f8e693`)
- fix: Add slug to OPTIONS request (#13943) (`63797e4`)
- perf: Parse CLI exits before starting worker pools (#13971)
(`6888882`)
- perf: Reuse compiled workspace matchers (#13970) (`7aaf7cb`)
- chore: Revert bundled startup optimizations (#13982) (`c11e327`)
- perf: Fast-path numeric package manager versions (#13973) (`3b28640`)
- perf: Stop inference after selecting a workspace root (#13980)
(`a3c5b9c`)
- perf: Reuse compiled workspace matchers (#13984) (`eb80d6f`)
- perf: Skip unnecessary glob normalization (#13979) (`1840e84`)
- perf: Cache workspace configuration lookups (#13975) (`f59661a`)
- perf: Avoid regexes for simple environment matching (#13974)
(`7e5d793`)
- perf: Reuse canonical paths during repository discovery (#13976)
(`2ba3e6e`)
- perf: Skip work for disabled telemetry (#13972) (`267ed73`)
- perf: Defer filesystem checks for absent configs (#13977) (`f7db9df`)
- perf: Compile workspace glob combinators directly (#13978) (`223fa9f`)
- docs(skills): fix the dependencies-only filter caret position (#13965)
(`73ac1fa`)
- chore: Update with-biome example (#13983) (`bd331cf`)
- fix: Normalize bare directory outputs when filtering dependencyOutputs
hashes (#13932) (`555f2bc`)
- chore: Scope panic lint allows in hash crates to tests and generated
code (#13810) (`e901550`)
- perf: Use binary search for resolution states (#13986) (`6a7f1c6`)
- perf: Use dense membership for task graph pruning (#13987) (`4ffbaa9`)
- perf: Throttle TUI tick cadence (#13988) (`b74be22`)
- perf: Fast-path package-only filter selectors with --only (#13990)
(`8059b91`)
- perf: Avoid materializing npm's legacy dependency tree (#13993)
(`acd35c8`)
- perf: Stream custom repository downloads to disk (#13994) (`a6b88ee`)
- perf: Copy shared file dependencies once per destination during prune
(#13995) (`efbe558`)
- perf: Index npm workspace links during subgraph extraction (#13997)
(`996a0bb`)
- perf: Cache Turbo config reads across ESLint rule invocations (#13998)
(`c02f97e`)
- perf: Scope untracked-file discovery to filtered runs (#13991)
(`ead0e19`)
- perf: Limit turbo.json preloading to required task scope (#13992)
(`f788cd8`)
- ci: Restrict release signing to main (#13985) (`2258541`)
- perf: Coalesce glob-watcher invalidation snapshots (#13996)
(`3fec2fe`)
- perf: Reuse resolver inference during file tracing (#13999)
(`596ea4c`)
- chore: Release Turborepo 2.10.13-canary.2 (#14000) (`ebfc808`)
- chore: Exclude turbo and @turbo/* from minimum release age (#14005)
(`5897420`)
- perf: Binary search boundaries comments before each import (#14003)
(`6a95c81`)
- perf: Fetch only npm dist tags in the binary version endpoint (#14007)
(`4db9ca0`)
- perf: Compute Devtools graph depths without rescanning every edge
(#14001) (`ef46772`)
- perf: Reuse package manager detection during create startup (#14006)
(`06f5900`)
- perf: Borrow workspace entries during dependency lookup (#14002)
(`ba822e1`)
- perf: Cache LSP task index and dedupe identities in constant time
(#14008) (`77f6232`)
- perf: Deduplicate recursive glob prefixes before walking (#14004)
(`90fd2d6`)
- perf: Batch boundaries progress updates (#14009) (`3862f3e`)
- perf: Reuse archive anchor during cache creation (#14010) (`f01afa9`)
- perf: Bound remote-cache transfer memory instead of retaining whole
artifacts (#14011) (`470ffb9`)
- perf: Build cache archives once for local and remote writes (#14012)
(`f0a0d77`)
- perf: Make VS Code binary discovery and LSP probes nonblocking
(#14015) (`8cc0c42`)
- perf: Avoid serializing ASTs for path-only file dependency queries
(#14016) (`96712c9`)
- perf: Share source text across boundaries diagnostics instead of
copying it per error (#14014) (`5223bd6`)
- perf: Parse the lockfile once when opening a native Workspace with its
graph (#14017) (`23ee440`)
- docs: Document a focused Cargo build for CLI-only development (#14018)
(`d21277e`)
- perf: Run the docs MDX generator once per quality task graph (#14019)
(`f7b030b`)
- perf: Keep package bundling inside a cacheable build boundary (#14020)
(`f3ae66f`)
- perf: Skip speculative content hashing for size-changed unnormalized
tracked files (#14021) (`a8b4ac2`)
- perf: Move synchronous cache archiving off Tokio runtime workers
(#14013) (`22b6577`)
- perf: Index package directories for changed-file ownership lookups
(#14022) (`05f16eb`)
- perf: Bound TUI raw-output retention independently of scrollback
(#14024) (`0cb6d58`)
- perf: Coalesce package rediscovery while a scan is already running
(#14023) (`c6eac09`)
- perf: Replace repeated deferred-hash scans with dependency-driven
readiness (#14025) (`9a98e64`)
- perf: Read child output in bounded chunks instead of per-line (#14026)
(`f6214c8`)
- perf: Share one repo index across same-package spec rehashes in watch
mode (#14027) (`171a0a3`)
- test: Deflake rediscovery_coalesces_during_in_flight_scan (#14029)
(`d41369b`)
- perf: Reuse the package graph across partial watch reruns (#14028)
(`9a42fe3`)
- test: Deflake Go watch CI (#14031) (`0af9b4f`)
- chore: Release Turborepo 2.10.13-canary.3 (#14032) (`cfd82d2`)
- docs: Group experimental languages and link the Go RFC (#14034)
(`6e8f7fe`)
- chore: Update with-docker example (#14035) (`25fe817`)
- perf: Avoid cloning package list in turbo ls (#14036) (`f3b0fa9`)
- fix: Restore leading flags for implicit run commands (#14037)
(`3235ec5`)
- fix: Include experimentalCI in task hashes (#14038) (`b8c7370`)
- chore: Release Turborepo 2.10.13-canary.4 (#14039) (`17b358a`)
- docs: Explain circular package dependencies in boundaries (#14042)
(`895337e`)
- docs: Document circular dependencies in boundaries (#14041)
(`3821e42`)
- fix: Preserve Yarn resolution declaration order (#14045) (`54b74a7`)
- fix: Avoid duplicate interrupts during task shutdown (#14046)
(`f9fa885`)
- fix: Preserve nested Bun package keys (#14050) (`b647afc`)
- chore: Update with-mcp-servers example (#14049) (`2c11c4f`)
- chore: Release Turborepo 2.10.13-canary.5 (#14051) (`cc1caca`)
- fix: Preserve native task dependencies across entrypoints (#14047)
(`ce4f045`)
- fix: Pass through LOCALAPPDATA by default (#14056) (`258a08d`)
- chore: Release Turborepo 2.10.13-canary.6 (#14057) (`bea9b6c`)
- docs: Fix some typos (#14058) (`6a3b4c1`)
- feat: Add Remix inference and `NUXT_ENV_*` wildcard (#14060)
(`2167e74`)
- fix: Return resolved package names for aliases (#14061) (`83f3ee1`)
- chore: Release Turbo repository packages 0.0.1-canary.28 (#14062)
(`e5094c7`)
- feat: Add NEXT_DEPLOYMENT_ID to Next.js framework inference (#14065)
(`36383cb`)

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
github-actions Bot added a commit that referenced this pull request Sep 18, 2026
## Release v2.11.0

> [!CAUTION]
> Versioned docs aliasing FAILED. [View
logs](https://github.com/vercel/turborepo/actions/runs/35366297249)

### Changes

- feat: Add durable Factory workspaces (#13804) (`ccd79d3`)
- feat: Stream Factory sandbox as terminal (#13807) (`33d8b24`)
- fix: Restore Factory workspace creation (#13812) (`fd72cca`)
- fix: Update Factory session network policy (#13814) (`c579fec`)
- fix: Improve Factory terminal line spacing (#13815) (`a88e39b`)
- fix: Install Factory publishing skill (#13817) (`7b8cb14`)
- chore: Route Factory publishing through Eve (#13816) (`e05b81c`)
- feat: Standardize Factory meta titles to Turborepo suffix (#13819)
(`fd593b5`)
- perf: Skip Factory chat verification (#13820) (`39137a6`)
- fix: Restore Factory workspaces (#13823) (`0afd4b2`)
- docs: Fix inconsistent Yarn command in basic example (#13825)
(`3dd49d1`)
- chore: Update non-monorepo example (#13808) (`d2a673f`)
- perf: Batch package detail queries (#13809) (`331183e`)
- chore: Update basic example (#13824) (`f06836d`)
- fix: Include virtual tasks in affected query (#13805) (`89a9b78`)
- fix: Add workspace approval controls (#13827) (`02dfd21`)
- fix: Prevent chat SSH command overflow (#13828) (`d9eaff5`)
- fix: Update Factory pull request branches (#13831) (`b670754`)
- chore: Add operator chat model selector (#13833) (`bb2fcb3`)
- fix: Move model selector to workspace creation (#13835) (`72805d7`)
- chore: Skip redundant Factory PR approval (#13837) (`bbe5406`)
- chore: Use geistdocs 1.23.1 (#13834) (`3787c06`)
- chore: Handle feedback on Factory pull requests (#13836) (`a76330b`)
- fix: Escape ampersands in RSS feed enclosure URLs (#13839) (`7107f26`)
- chore: Add automatic issue handling (#13840) (`e1674e4`)
- chore: Alert Slack for low-confidence issues (#13841) (`f153cda`)
- feat: Require high confidence for issue fixes (#13842) (`c97782b`)
- fix: Run pnpm directly on Windows (#13843) (`9d2b03b`)
- chore: Release Turborepo 2.10.12 (#13844) (`32748f5`)
- fix: Remove unsupported remote cache environment variable (#13845)
(`b4c2eed`)
- fix: Copy TUI selections locally over SSH (#13847) (`03df632`)
- feat: Use uv workspace metadata (#13848) (`fa1ca7d`)
- feat: Support Python virtual environments (#13849) (`7f66dbd`)
- fix: Scope uv lockfile affectedness (#13850) (`1e074f3`)
- test: Isolate uv prune configuration (#13851) (`9f2fd33`)
- fix: Explain disabled uv task caching (#13852) (`0f59d11`)
- fix: Explain uv identity probe failures (#13853) (`eabe73a`)
- fix: Explain uncached Cargo library builds (#13855) (`35ce2fa`)
- fix: Explain disabled Cargo task caching (#13854) (`39821f6`)
- fix: Keep Cargo tasks runnable without compiler identity (#13857)
(`31645fb`)
- chore: Release Turborepo 2.10.13-canary.1 (#13858) (`5ac6ea4`)
- feat: Support Cargo root packages (#13856) (`e732034`)
- feat(repository): Expose flat lockfile package list for metrics
(#13859) (`935ee2c`)
- chore: Release Turbo repository packages 0.0.1-canary.25 (#13860)
(`b0d4c71`)
- docs: Upgrade Geistdocs to 1.25.1 (#13861) (`81b0414`)
- feat: Expand repository lockfile package metadata (#13862) (`2c84c66`)
- chore: Release Turbo repository packages 0.0.1-canary.26 (#13863)
(`69e394b`)
- fix: Restrict Factory to review comments (#13864) (`1a34319`)
- fix: Pluralize package count in run prelude (#13865) (`a175bd9`)
- chore: Update with-vite example (#13866) (`0e1ff63`)
- chore: Add searchable workspace model picker (#13870) (`73b6268`)
- fix: Restore docs client navigation (#13872) (`2995e17`)
- feat: Improve Factory workspace statuses (#13869) (`35f03fa`)
- chore: Clarify Factory pull request descriptions (#13871) (`5df4cb3`)
- fix: Refresh Factory workspaces from main (#13873) (`efa4ae0`)
- perf: Speed up plain package listings (#13868) (`f68d214`)
- fix: Detect package-level turbo.jsonc (#13875) (`e945403`)
- fix: Format Slack pull request notifications (#13877) (`15c15f3`)
- feat: Link workspaces to pull requests (#13878) (`ae25f97`)
- chore: Upgrade repository to pnpm 12 (#13879) (`4e11bad`)
- chore: Update with-vite-react example (#13880) (`54cf466`)
- chore: Improve Factory chat streaming (#13881) (`eebf1b0`)
- fix: Show workspace failure details (#13884) (`c7661b8`)
- chore: Add selectable Factory coding harnesses (#13887) (`6b5ca16`)
- fix: Gracefully handle native lockfile failures (#13886) (`463a292`)
- chore: Update merged PR Slack messages (#13888) (`66ebcac`)
- fix: Show native tasks in task listings (#13889) (`7e4d9d3`)
- docs: Clarify turbo ls stability in Agent Skill (#13892) (`8ee758c`)
- chore: Resume workspace chat on refocus (#13894) (`7026627`)
- chore: Preserve HarnessAgent bridge assets (#13896) (`26f3160`)
- fix: Deduplicate multi-language watch hashes (#13897) (`5ade89b`)
- fix: Normalize multi-language cache environment inputs (#13898)
(`cfca6f2`)
- chore: Add workspace diff view (#13900) (`813d54a`)
- refactor: Migrate CLI parser to usage-rs (#13890) (`712e0e4`)
- fix: Update --filter help links to canonical docs URL (#13891)
(`6cf116d`)
- chore: Update with-vue-nuxt example (#13901) (`d10e3e0`)
- docs: Document missing reference flags and fix query typo (#13902)
(`1f2acc5`)
- docs: Align CONTRIBUTING Node and pnpm versions (#13883) (`a3bda61`)
- perf: Skip Cargo resolution for workspace-only queries (#13903)
(`b928ecc`)
- fix: Bound memory usage for streamed task output (#13908) (`7f85401`)
- fix: Clarify generator action reporting (#13910) (`7fe0201`)
- fix: Bump tar to 7.5.22 in @turbo/releaser (CVE-2026-73566) (#13911)
(`aba64e9`)
- fix: Correct devtools --port default in CLI help (#13905) (`11f7ee6`)
- fix: Resolve lint errors (#13912) (`d06cf32`)
- fix: Stabilize Rust builds on macOS (#13913) (`7d14df2`)
- docs: Clean up Rust docs (#13914) (`3225cee`)
- fix: Preserve task metadata for command overrides (#13915) (`54bbf8a`)
- perf: Resolve Git SCM state in one process (#13882) (`7c993ef`)
- fix: Only treat files literally named .gitignore as ignore files in
the untracked walk (#13916) (`ac32a79`)
- fix: Pass merge_base and allow_unknown_objects in signature order for
task-level filter ranges (#13917) (`48f64e1`)
- fix: Hash deferred inputs after dependencies (#13919) (`4cc80f7`)
- test: Make Cargo hash fixtures hermetic (#13920) (`32ff2f3`)
- fix: Allow release versioning with pending changes (#13921)
(`5114901`)
- chore: Update to Rust 1.98.0 (#13821) (`ebef942`)
- chore: Upgrade Factory to Fable 5.1 (#13924) (`a57476f`)
- docs: Align Python guide with Rust guide (#13927) (`f166370`)
- fix: Give the package changes watcher the future flags so root inputs
reach the task filter (#13926) (`e5ccf55`)
- fix: Support pnpm 6 single-package lockfiles (#13928) (`a3d52a6`)
- feat: Add skipPackageGraph option to @turbo/repository Workspace.find
(#13929) (`99b5a00`)
- fix: Use pnpm 12 in library release containers (#13930) (`0b6aaf9`)
- fix: Upgrade repository N-API build tooling (#13931) (`dd6c1c6`)
- fix: Use Node 20 for musl library builds (#13933) (`61b1635`)
- fix: Bootstrap musl builds with sh (#13934) (`f9ac0c9`)
- fix: Use static library bootstrap shell (#13935) (`f819dca`)
- fix: Allow unclean tree in bump-version (#13936) (`28562e7`)
- fix: Skip git commit in bump-version (#13937) (`ea4ba17`)
- fix: Expect napi 3 artifact paths (#13938) (`6b5eea3`)
- chore: Release Turbo repository packages 0.0.1-canary.27 (#13939)
(`5c54e50`)
- perf: Batch package detail queries (#13923) (`c8347b1`)
- docs: Touch-ups for Python and Rust docs (#13940) (`f20b415`)
- chore: Update basic example (#13922) (`b40dd07`)
- fix: Avoid oxlint false positive on Workspace.find options (#13941)
(`3125eb1`)
- chore: Update kitchen-sink example (#13945) (`fd8dc59`)
- fix: Hash native workspace task inputs (#13947) (`17d0940`)
- chore: Update with-angular example (#13951) (`3770d4c`)
- fix: Recompute eager hashing flag after prepending global inputs
(#13949) (`9cea33b`)
- refactor: Generalize daemon repository discovery (#13946) (`350bd41`)
- feat: Make daemon discovery toolchain generic (#13952) (`d65c615`)
- feat: Add experimental Go workspace graph foundation (#13953)
(`6687fa8`)
- feat: Add native Go task tables (#13954) (`dccc890`)
- feat: Add Go task input and output contracts (#13955) (`8501ce7`)
- test: Cover native Go execution end to end (#13956) (`48d4322`)
- feat: Add Go external resolution fingerprints (#13957) (`f6d5f18`)
- feat: Fingerprint Go toolchain environment (#13958) (`ec18363`)
- feat: Add Go change observations (#13959) (`5256ecc`)
- test: Cover Go query and summary surfaces (#13960) (`a24ea48`)
- feat: Add Go-aware prune planning (#13961) (`026d7fb`)
- test: Add end-to-end Go prune and cache coverage (#13962) (`a1cbfaa`)
- docs: Document experimental native Go workspaces (#13963) (`7f36a42`)
- fix: Harden Go workspace diagnostics (#13964) (`8a6b0f7`)
- fix: Correct Go workspace resolution and task caching (#13966)
(`8ef6aaf`)
- chore: Add Factory thinking controls and message queue (#13967)
(`77e975c`)
- chore: Remove ARCHITECTURE.md docs (#13969) (`4f8e693`)
- fix: Add slug to OPTIONS request (#13943) (`63797e4`)
- perf: Parse CLI exits before starting worker pools (#13971)
(`6888882`)
- perf: Reuse compiled workspace matchers (#13970) (`7aaf7cb`)
- chore: Revert bundled startup optimizations (#13982) (`c11e327`)
- perf: Fast-path numeric package manager versions (#13973) (`3b28640`)
- perf: Stop inference after selecting a workspace root (#13980)
(`a3c5b9c`)
- perf: Reuse compiled workspace matchers (#13984) (`eb80d6f`)
- perf: Skip unnecessary glob normalization (#13979) (`1840e84`)
- perf: Cache workspace configuration lookups (#13975) (`f59661a`)
- perf: Avoid regexes for simple environment matching (#13974)
(`7e5d793`)
- perf: Reuse canonical paths during repository discovery (#13976)
(`2ba3e6e`)
- perf: Skip work for disabled telemetry (#13972) (`267ed73`)
- perf: Defer filesystem checks for absent configs (#13977) (`f7db9df`)
- perf: Compile workspace glob combinators directly (#13978) (`223fa9f`)
- docs(skills): fix the dependencies-only filter caret position (#13965)
(`73ac1fa`)
- chore: Update with-biome example (#13983) (`bd331cf`)
- fix: Normalize bare directory outputs when filtering dependencyOutputs
hashes (#13932) (`555f2bc`)
- chore: Scope panic lint allows in hash crates to tests and generated
code (#13810) (`e901550`)
- perf: Use binary search for resolution states (#13986) (`6a7f1c6`)
- perf: Use dense membership for task graph pruning (#13987) (`4ffbaa9`)
- perf: Throttle TUI tick cadence (#13988) (`b74be22`)
- perf: Fast-path package-only filter selectors with --only (#13990)
(`8059b91`)
- perf: Avoid materializing npm's legacy dependency tree (#13993)
(`acd35c8`)
- perf: Stream custom repository downloads to disk (#13994) (`a6b88ee`)
- perf: Copy shared file dependencies once per destination during prune
(#13995) (`efbe558`)
- perf: Index npm workspace links during subgraph extraction (#13997)
(`996a0bb`)
- perf: Cache Turbo config reads across ESLint rule invocations (#13998)
(`c02f97e`)
- perf: Scope untracked-file discovery to filtered runs (#13991)
(`ead0e19`)
- perf: Limit turbo.json preloading to required task scope (#13992)
(`f788cd8`)
- ci: Restrict release signing to main (#13985) (`2258541`)
- perf: Coalesce glob-watcher invalidation snapshots (#13996)
(`3fec2fe`)
- perf: Reuse resolver inference during file tracing (#13999)
(`596ea4c`)
- chore: Release Turborepo 2.10.13-canary.2 (#14000) (`ebfc808`)
- chore: Exclude turbo and @turbo/* from minimum release age (#14005)
(`5897420`)
- perf: Binary search boundaries comments before each import (#14003)
(`6a95c81`)
- perf: Fetch only npm dist tags in the binary version endpoint (#14007)
(`4db9ca0`)
- perf: Compute Devtools graph depths without rescanning every edge
(#14001) (`ef46772`)
- perf: Reuse package manager detection during create startup (#14006)
(`06f5900`)
- perf: Borrow workspace entries during dependency lookup (#14002)
(`ba822e1`)
- perf: Cache LSP task index and dedupe identities in constant time
(#14008) (`77f6232`)
- perf: Deduplicate recursive glob prefixes before walking (#14004)
(`90fd2d6`)
- perf: Batch boundaries progress updates (#14009) (`3862f3e`)
- perf: Reuse archive anchor during cache creation (#14010) (`f01afa9`)
- perf: Bound remote-cache transfer memory instead of retaining whole
artifacts (#14011) (`470ffb9`)
- perf: Build cache archives once for local and remote writes (#14012)
(`f0a0d77`)
- perf: Make VS Code binary discovery and LSP probes nonblocking
(#14015) (`8cc0c42`)
- perf: Avoid serializing ASTs for path-only file dependency queries
(#14016) (`96712c9`)
- perf: Share source text across boundaries diagnostics instead of
copying it per error (#14014) (`5223bd6`)
- perf: Parse the lockfile once when opening a native Workspace with its
graph (#14017) (`23ee440`)
- docs: Document a focused Cargo build for CLI-only development (#14018)
(`d21277e`)
- perf: Run the docs MDX generator once per quality task graph (#14019)
(`f7b030b`)
- perf: Keep package bundling inside a cacheable build boundary (#14020)
(`f3ae66f`)
- perf: Skip speculative content hashing for size-changed unnormalized
tracked files (#14021) (`a8b4ac2`)
- perf: Move synchronous cache archiving off Tokio runtime workers
(#14013) (`22b6577`)
- perf: Index package directories for changed-file ownership lookups
(#14022) (`05f16eb`)
- perf: Bound TUI raw-output retention independently of scrollback
(#14024) (`0cb6d58`)
- perf: Coalesce package rediscovery while a scan is already running
(#14023) (`c6eac09`)
- perf: Replace repeated deferred-hash scans with dependency-driven
readiness (#14025) (`9a98e64`)
- perf: Read child output in bounded chunks instead of per-line (#14026)
(`f6214c8`)
- perf: Share one repo index across same-package spec rehashes in watch
mode (#14027) (`171a0a3`)
- test: Deflake rediscovery_coalesces_during_in_flight_scan (#14029)
(`d41369b`)
- perf: Reuse the package graph across partial watch reruns (#14028)
(`9a42fe3`)
- test: Deflake Go watch CI (#14031) (`0af9b4f`)
- chore: Release Turborepo 2.10.13-canary.3 (#14032) (`cfd82d2`)
- docs: Group experimental languages and link the Go RFC (#14034)
(`6e8f7fe`)
- chore: Update with-docker example (#14035) (`25fe817`)
- perf: Avoid cloning package list in turbo ls (#14036) (`f3b0fa9`)
- fix: Restore leading flags for implicit run commands (#14037)
(`3235ec5`)
- fix: Include experimentalCI in task hashes (#14038) (`b8c7370`)
- chore: Release Turborepo 2.10.13-canary.4 (#14039) (`17b358a`)
- docs: Explain circular package dependencies in boundaries (#14042)
(`895337e`)
- docs: Document circular dependencies in boundaries (#14041)
(`3821e42`)
- fix: Preserve Yarn resolution declaration order (#14045) (`54b74a7`)
- fix: Avoid duplicate interrupts during task shutdown (#14046)
(`f9fa885`)
- fix: Preserve nested Bun package keys (#14050) (`b647afc`)
- chore: Update with-mcp-servers example (#14049) (`2c11c4f`)
- chore: Release Turborepo 2.10.13-canary.5 (#14051) (`cc1caca`)
- fix: Preserve native task dependencies across entrypoints (#14047)
(`ce4f045`)
- fix: Pass through LOCALAPPDATA by default (#14056) (`258a08d`)
- chore: Release Turborepo 2.10.13-canary.6 (#14057) (`bea9b6c`)
- docs: Fix some typos (#14058) (`6a3b4c1`)
- feat: Add Remix inference and `NUXT_ENV_*` wildcard (#14060)
(`2167e74`)
- fix: Return resolved package names for aliases (#14061) (`83f3ee1`)
- chore: Release Turbo repository packages 0.0.1-canary.28 (#14062)
(`e5094c7`)
- feat: Add NEXT_DEPLOYMENT_ID to Next.js framework inference (#14065)
(`36383cb`)
- chore: Release Turborepo 2.10.13 (#14066) (`05a1d4b`)
- fix: Fall back to the published tag when the dogfooded turbo version
is unpublished (#14067) (`4d13cb5`)
- feat: Expose compact task planning through turbo query (#14068)
(`1e9336e`)
- chore: Release Turborepo 2.10.14-canary.1 (#14069) (`9077648`)
- fix: Discover native workspace metadata lazily (#14053) (`30e0250`)
- fix: Run Go workspace formatting per module (#14070) (`81d62ff`)
- fix: Run Go verification per module (#14072) (`e1eb388`)
- fix: Use pnpm for non-monorepo deployments (#14071) (`53dadbe`)
- chore: Update with-nestjs example (#14064) (`a534c7e`)
- docs: Document per-toolchain task commands (#14073) (`bc9017a`)
- fix: Infer all co-located packages from cwd (#14074) (`46d0fd6`)
- fix: Preserve all co-located package change owners (#14075)
(`064d74a`)
- fix: Isolate task logs for co-located packages (#14077) (`16b312f`)
- chore: Make filesystem watch cleanup idempotent (#14078) (`441f205`)
- fix: Follow Go default binary output paths (#14079) (`a1ab64a`)
- chore: Release Turborepo 2.10.14-canary.2 (#14080) (`c2ddd13`)
- feat: Make package queries and pruning task-aware (#14081) (`012b091`)
- chore: Release Turborepo 2.10.14-canary.3 (#14082) (`7b2abd7`)
- chore: Update with-npm example (#14083) (`d7f89ba`)
- feat: Expose static repository discovery and safe affected candidates
(#14085) (`22a201d`)
- fix: Preserve task env mode when pruning (#14087) (`7eda8d5`)
- feat: Derive short names for Go workspace packages (#14086)
(`b3cfa86`)
- chore: Release Turbo repository packages 0.0.1-canary.29 (#14088)
(`15830dc`)
- chore: Release Turborepo 2.10.14-canary.4 (#14089) (`b66c30d`)
- feat: Infer Cargo and uv affectedness from static package inputs
(#14090) (`728a79d`)
- chore: Release Turbo repository packages 0.0.1-canary.30 (#14091)
(`438c45b`)
- perf: Cache Windows archive anchor (#14093) (`0c3bc42`)
- fix: Harden cache archive restoration (#14095) (`7e7ab44`)
- fix: Defer dependency output validation for lazy scopes (#14097)
(`d804909`)
- chore: Release Turborepo 2.10.14-canary.5 (#14098) (`613b3ba`)
- test: Fix Windows cache restore test (#14099) (`2c49c23`)
- chore: Update with-prisma example (#14101) (`f21d73f`)

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
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