vercel

turborepo

Build system optimized for JavaScript and TypeScript, written in Rust

by vercel

Rust

Rust81.8%
TypeScript9.9%
MDX6.2%
JavaScript1.7%
PowerShell0.1%
Shell0.1%
Other0.1%

Commit activity

Last 12 weeks · 1052 commits

Full graph →

Community health

5 of 6 standards met

Community profile →
100
✓README✓License✓Contributing✓Code of Conduct○Issue Template✓PR Template

Recent PRs & issues

Active · Last activity 6m ago
See all on GitHub →
anthonyshew

Why Remove the experimental policy from . Repositories can use managed tools or skip tool setup without a separate PATH-verification mode. What changed Remove system-tool probes, lock variants, runtime activation branches, and capability advertising. Require installed tools and trusted setup records for managed activation. Reject old verification locks with migration guidance, and deactivate shell environments that still reference them. Scope Preserve managed and bundled tools, clone-local setup, and native package-manager configuration. Leave exec handoff timeouts unchanged. Native Windows execution was not checked locally. Tradeoffs Old verification locks require local regeneration rather than automatic conversion. Version ranges can resolve newer releases when the lock is regenerated. Musl hosts lose the system-tool verification path and must opt out of managed setup or use a supported host. Blast radius This changes setup, managed run and exec, shell activation, and prune when they encounter the removed policy or lock kind. Existing managed and bundled lock formats remain unchanged. Verification Rechecked exec handoff against the current binary with copied executables warmed before the capability query. Argument, exit-code, terminal, and signal-parity cases passed without changing the production timeout. The unwarmed signal-parity case still reproduces the startup failure found on the original clean-main baseline.

anthonyshew · 6m ago
anthonyshew

Why Vercel is removing Remote Cache write access from tokens that and put on developer laptops. Those tokens will still be able to read, and that's the intended experience, not an error. Today, if an upload is rejected, turbo can turn off the remote cache for reads too for the rest of the run. It also prints warnings, including for read-only access the user chose with . This makes read-only access quiet and visible in the run header, and makes an unexpected upload rejection stop only uploads. Behavior is an optional field, defaulting to ; unknown fields are still ignored. Nothing ever turns uploads back on. Servers that never send the field behave exactly as before, including self-hosted caches.

anthonyshew · 10m ago
PedroRosalba

Description After a local cache restore, writes the restore manifest on a detached thread that is never joined. turbo often exits before that thread finishes, so the manifest on disk still describes the files as they were at , and a partial is left behind. Every later hit of that hash then fails the fast path and rewrites every output file. It never heals, because each later restore loses the write again. This fails safe (it never gives a wrong hit), but it costs time on every run and rewrites files under file watchers. It shows up on outputs above roughly 2.5k files that were restored locally, for example after a branch switch or a clean. Remote hits are not affected: writes its sidecars synchronously. Repro One task whose output is a real published build tree. Put, delete the output, restore it from the local cache, then run again with nothing changed. Released 2.11.9: Every run that loses the write also leaves a 0.4–2.3 MB behind. Fix Write the manifest before returns. This only costs anything on restores that write files: about 1 ms at 5k entries and 7 ms at 32k (release build). The write was made asynchronous in #12209 so that cache misses pay no overhead. This code only runs on hits, so misses are unaffected either way. Testing Instructions : restores 2,000 files, then checks that the next lookup takes the fast path and that no is left. With the detached thread put back, it fails 20 of 20 runs. Tested on macOS (Apple Silicon) only; Linux and Windows not tested.

PedroRosalba · 14m ago
anthonyshew

Description Fixes the fixture cleanup race behind this JS test failure. and both use the fixture group. Their fixture directories have unique names, but each suite's deletes the shared parent. One suite can delete another suite's files during fixture copying, causing . Give each invocation its own parent directory: Add a deterministic regression test with real Jest hooks for named and unnamed fixture groups. Testing Instructions Manually reproduced the collision with the actual fixture helper: finishing one suite deleted another suite's active fixture, and failed with . With a per-suite parent, the active fixture survived the same teardown. Also confirmed that the new regression fails before the fix and passes afterward.

anthonyshew · 6m ago
PedroRosalba

Description pnpm 10.8 and later read from ahead of , and pnpm 11 reads it only from (its changelog: " is auth/registry only"). turbo decided whether a repository uses per-workspace lockfiles only from . A repository that sets in was therefore treated as using a shared lockfile: every workspace's is empty, with a "Workspace not found in lockfile" warning; a lockfile-only bump in a workspace gives a stale cache hit when don't include that lockfile; leaves the workspace lockfiles out of , and the install there fails with . On pnpm 11 and 12, is the only place this setting can live, so this affects every repository using per-workspace lockfiles on current pnpm. Repro in , , a lockfile-only bump in (ms 2.1.2 → 2.1.3), then : Fix reads the setting from first, then , and defaults to shared, the same order turbo already uses for . The lockfile reader and prune both call it, so they can't disagree. The yaml value is read untyped, so an unexpected value can't fail parsing of the whole file (workspace globs, catalogs). covers every pnpm from 9 on, so turbo also reads the yaml key on pnpm 9 and 10.0–10.7, which ignore it. On pnpm 9.15.9 with the key in , hashes and output are identical to , and the pruned output installs frozen. Testing Instructions : (precedence per pnpm version), , and (lockfiles written by pnpm). : , the existing per-workspace fixture with the setting moved to . Tested on macOS (Apple Silicon) only; Linux and Windows not tested.

PedroRosalba · 14m ago
PedroRosalba

Description Yarn applies a dependency from a package extension only when the package doesn't already declare that dependency. Berry pruning didn't apply that rule, which breaks pruned output in two ways: Built-in extension. Prune kept whenever any was reachable, even when every reachable parser declares itself. Yarn drops that entry, so in fails with YN0028 ("The lockfile would have been modified"). Project . Prune kept every extension dependency for every matching package, with the same YN0028 result. When every matching package already declares the dependency (an extension that a package fixed upstream; Yarn warns YN0069), Yarn never resolves the extension's range, and the prune fails with . That hard error started in 2.10.6 (#13425). Repro The new fixture (written by Yarn 4.13.0): On hyperdx (Yarn 4.13.0), 2 of 6 prune targets install with on and 6 of 6 with this PR, including . Fix checks whether a package already lists a dependency. The two places that decide which extension dependencies to keep now use it: The built-in is kept only when a reachable doesn't declare . A project extension dependency is kept only when some reachable package matching the selector doesn't declare it. Not covered here: an extension whose range is rewritten by root or a entry still fails with , as on , because turbo looks the extension range up without applying the resolution. Skipping that error would silently drop a dependency that Yarn installs, so it needs its own fix. Testing Instructions : and , both on lockfiles trimmed from Yarn 4.13.0 output. With always returning false, both fail. : the fixture fails 3 of 6 targets on and passes 6 of 6 here. Tested on macOS (Apple Silicon) only; Linux and Windows not tested.

PedroRosalba · 14m ago
Structured data for AI agents

Repository: vercel/turborepo. Description: Build system optimized for JavaScript and TypeScript, written in Rust Stars: 31222, Forks: 2471. Primary language: Rust. Languages: Rust (81.8%), TypeScript (9.9%), MDX (6.2%), JavaScript (1.7%), PowerShell (0.1%). License: MIT. Homepage: https://turborepo.dev Topics: build-system, build-tool, javascript, monorepo, typescript. Latest release: v2.11.10 (32m ago). Open PRs: 29, open issues: 9. Last activity: 6m ago. Community health: 100%. Top contributors: anthonyshew, sokra, github-actions[bot], jaredpalmer, chris-olszewski, mehulkar, tknickman, NicholasLYang, nathanhammond, kdy1 and others.