Turborepo v2.10.3 est sorti le 2026-07-03 comme la huitième release depuis la release de fonctionnalité Turborepo 2.10 du 2026-06-24. Le patch est le premier orchestrateur de tâches de monorepo mainstream à ajouter le support de première classe pour nub et aube, deux nouveaux gestionnaires de paquets Node.js en Rust qui ont émergé au printemps et à l'été 2026. nub est écrit par Colin McDonnell (colinhacks), créateur de Zod (43k étoiles), et aube par Jeff Dickey (jdx), créateur de mise. colinhacks a ouvert la PR nub (#13120) le 2026-06-30, avec les suivis #13187 et #13189. anthonyshew a ouvert la PR aube (#13183). Les deux s'intègrent au champ packageManager existant dans package.json et à devEngines.packageManager.
Le signal principal n'est pas la release patch elle-même: c'est que deux des builders les plus respectés du toolchain JS livrent désormais des gestionnaires de paquets qui s'appuient sur Node stock au lieu de le remplacer, et que Turborepo (l'orchestrateur de tâches de monorepo de facto de Vercel, utilisé dans Next.js, la CLI Vercel, et la plupart des monorepos hébergés chez Vercel) est le premier orchestrateur de tâches mainstream à formaliser les deux. La release apporte aussi une surface TUI refondue, le support natif du lockfile lock.yaml de nub et de Bun lockfile v2, la normalisation des versions packageManager entre package.json et devEngines, --production sur turbo prune, et la toolchain TypeScript du workspace passe à 7.0.1-rc.
nub: l'augmentation Node.js TypeScript-first par colinhacks
nub (@nubjs/nub, v0.2.10, 2,6k étoiles GitHub, créé le 2026-06-03) se positionne comme « une DX façon Bun sur du node stock, écrite en Rust ». Le repo appartient à nubjs sur GitHub, et le mainteneur derrière est colinhacks, surtout connu comme l'auteur de Zod (43k étoiles) et comme committer Turborepo (il a écrit la PR de reconnaissance de nub, le suivi des tweaks nub, et le fix de plages semver pour devEngines.packageManager.version). La release v0.2.10 est sortie le 2026-06-30 avec trois corrections: une fuite d'erreur non gérée sur les Worker threads qui correspond désormais aux sémantiques fatal-on-error de node:worker_threads, une fuite de boundary de marque sur le chemin de fichier de config user/project d'aube sous nub (nub ne lit désormais que .npmrc plus les variables d'env NUB_*, jamais ~/.config/aube/config.toml), et un passage de cibles nub watch -- qui correspond au comportement de node et de pnpm 10.
Le toolkit livre sept commandes:
| Commande | Remplace | Gain revendiqué |
|---|---|---|
nub <file> | node, tsx, ts-node, dotenv-cli | Exécution TypeScript-first sur node stock |
nub run <script> | npm run, pnpm run, yarn run | 24x plus rapide que pnpm run |
nubx <bin> | npx, pnpm dlx, pnpm exec, yarn dlx | 19x plus rapide que npx |
nub install | npm, pnpm, yarn | Compatible pnpm, fait des allers-retours avec les lockfiles npm/pnpm/bun |
nub watch | nodemon, node --watch, tsx watch | Piloté par le graphe de dépendances, surveille .env* et tsconfig.json |
nub pm | corepack | Gestionnaire de shims intégré |
nub node | nvm, fnm, n, volta | Provisionne Node depuis nodejs.org à la demande |
Il n'y a pas de nouveau runtime à adopter. Chaque augmentation s'appuie sur les surfaces d'extension propres à Node (worker_threads, node:fs, node:vm, l'API des loader hooks). Le gestionnaire de paquets fait des allers-retours avec le lockfile existant du projet: un projet nub qui livre un pnpm-lock.yaml garde ce lockfile, et nub install réécrit dans le même fichier. Yarn est en lecture seule. Le chemin d'install est @nubjs/nub sur npm, brew install nubjs/tap/nub sur Homebrew, mise use -g nub, ou l'Action GitHub officielle nubjs/setup-nub.
Le framing que nub choisit est le même que celui que Bun avait choisi en 2023 (« all-in-one, drop-in, fast »), mais sans le swap de runtime. Le gain de 24x de nub run dev vs pnpm run est une vraie amélioration UX pour les monorepos à forte intensité de scripts package.json, et nubx prisma generate à 19x plus rapide que npx est le genre de gain qui transforme une attente de 4 secondes en un blip à peine remarqué.
aube: gestion de paquets Node.js compatible lockfile par jdx
aube (@endevco/aube, v1.25.2, 1,6k étoiles GitHub, créé le 2026-04-18) est un gestionnaire de paquets Node.js en Rust de Jeff Dickey (jdx), le créateur de mise (le successeur d'asdf). Le projet est sponsorisé par entire.io et 37signals. Le nom signifie « aube » en français, prononcé /ob/. Le tagline est « Never forget to install »: le runner aubr test fait l'install en premier quand les dépendances sont périmées, puis saute ce travail quand rien n'a changé, ce qui est le même pitch UX que mise a eu pendant des années mais appliqué au chemin d'install.
Le chiffre principal est le benchmark d'install à chaud sur un fixture réel de 1400 paquets, mesuré avec hyperfine dans des conditions identiques et regénéré pour la dernière fois le 2026-07-02:
| Gestionnaire de paquets | Install à chaud | Install à froid | install && run test |
|---|---|---|---|
| aube 1.25.2 | 319 ms | 14,63 s | 10 ms |
| bun 1.3.14 | 1,49 s | 5,10 s | 66 ms |
| deno 2.9.1 | 1,44 s | 9,15 s | 81 ms |
| pnpm 11.9.0 | 2,44 s | 12,99 s | 388 ms |
| npm 11.9.0 | 7,19 s | 10,89 s | 825 ms |
| yarn 4.17.0 | 8,49 s | 13,18 s | 1,82 s |
aube est 7,7x plus rapide que pnpm et 4,7x plus rapide que Bun sur les installs à chaud, et ~80x plus rapide que npm sur le chemin install && run test. Le mécanisme est le même que celui que pnpm a inauguré: un store global adressable par contenu plus un store virtuel par projet. pnpm supporte un store virtuel global similaire, mais le laisse désactivé par défaut; aube l'active par défaut, ce qui est toute la raison du gap à l'install à chaud.
L'histoire du lockfile est la partie qui compte pour l'adoption. aube lit et écrit pnpm-lock.yaml, package-lock.json, npm-shrinkwrap.json, yarn.lock et bun.lock en place. Une équipe qui installe aube dans un projet pnpm n'a pas besoin de régénérer pnpm-lock.yaml ni de mettre à jour la CI; aube lit le lockfile existant, lie au store global, et réécrit le même lockfile. Le champ packageManager dans package.json bascule de "pnpm@11.9.0" à "aube@1.25.2", et le reste du toolchain ne voit aucune différence.
L'histoire de la sécurité est ce qui distingue aube du « pnpm rapide ». La config par défaut est le bundle strict: les scripts de cycle de vie (preinstall, install, postinstall) attendent une approbation par défaut, les dépendances transitives exotiques sont bloquées, les downgrades de trust échouent au resolve, et les nouvelles releases passent par une fenêtre de refroidissement de 24h. Le switch paranoid: true transforme chaque soft gate en hard fail: jailBuilds = true (la seule jail de scripts de cycle de vie dans n'importe quel gestionnaire de paquets Node.js), strictStoreIntegrity = true (échec quand un tarball arrive sans dist.integrity au lieu d'un warning), strictDepBuilds = true (échec quand une dépendance a des scripts de build non relus), advisoryCheck = required (échec quand OSV est injoignable), minimumReleaseAgeStrict = true, et trustPolicy = no-downgrade. Pour les installs sensibles à la supply chain, paranoid: true est le défaut conservateur.
La série v1.25 a ajouté: v1.25.0 l'activation shell et les shims (de sorte que les commandes node, pnpm, yarn, et la famille npm passent par le resolver d'aube), v1.25.1 un refresh des benchmarks, et v1.25.2 un fix pour une race de chevauchement d'écriture de lockfile à l'install à froid. Le chevauchement d'écriture de lockfile est le genre de bug qui ne mord que sur de la CI parallèle, et le fait qu'il ait été détecté et corrigé dans la fenêtre de merge Turborepo 2.10.3 est un bon signal pour la qualité globale du code d'aube.
Ce que Turborepo 2.10.3 a réellement changé
Le support de nub et aube est le titre, mais le patch est large. Le changelog complet (v2.10.2 to v2.10.3) porte 41 commits. Les huit qui comptent le plus pour l'usage quotidien:
- Toggle logs-streamés / TUI (#13203). La liste de tâches TUI introduite dans Turborepo 2.4 est désormais toggleable contre la vue logs-streamés legacy au runtime, plus seulement au lancement. Les équipes qui veulent la vue de progression structurée en CI mais le texte brut dans leur éditeur peuvent basculer sans redémarrer.
- Sélection de tâches au clic dans la liste TUI (#13206). La TUI accepte désormais les clics de souris sur les lignes de tâches pour sélectionner un sous-ensemble de tâches à exécuter, au lieu de filtrer avec les inputs clavier. Les release notes signalent ça comme le premier pas vers des workflows « click-to-run » où l'utilisateur choisit les tâches dans la TUI comme il le ferait dans un dashboard CI.
- Copie automatique des sélections TUI au presse-papiers au relâchement de la souris (#13208). Une petite victoire UX qui ferme la boucle « sélectionner du texte dans la TUI, le copier » sans raccourci clavier.
--productionsurturbo prune(#13190). Pruner vers un sous-ensemble déployable et exclure les devDependencies en un flag, ce qui simplifie les couches Docker pour les déploiements de production.- Guide de récupération token-exchange (#13192). Quand la récupération binaire de la plateforme Turborepo tombe sur un token expiré ou malformé, l'erreur pointe maintenant l'utilisateur vers la commande de récupération au lieu d'échouer avec un message
unauthorizedgénérique. - TypeScript 7.0.1-rc comme toolchain de workspace (#13144). Le repo Turborepo lui-même est désormais construit contre TypeScript 7.0.1-rc, le release candidate du compilateur natif (Go) TypeScript 7. Le move raccourcit la boucle de « on livre une feature dans Turborepo » à « on livre une feature dans Turborepo et on la prouve sur le compilateur TS de nouvelle génération ».
- Thin LTO +
codegen-units=1pour les builds de release (#13160). Les binaires Rust de release utilisent désormais thin LTO et un seul codegen unit, ce qui est la recette Rust standard pour des binaires de release plus petits, légèrement plus longs à builder. Les chiffres ne sont pas dans la PR, mais un changement comparable dans le toolchain oxc a retiré ~10-15% de la taille des binaires de release. - Corrections de perf sur le cache-hashing (#13209, #13211, #13210). Trois commits suppriment les deep clones du cache de fermeture de lockfile, de la racine du graphe de paquets, et du matcher d'env-wildcard. L'étape de hash est le travail le plus répété dans
turbo run, et retirer des clones dessus se voit sur chaque invocation deturbo run builddans un gros monorepo.
L'histoire du lockfile dans 2.10.3 est aussi notable au-delà du support de nub et aube. La PR #13119 (tsushanth) fait que Turborepo accepte Bun lockfile v2, qui est le nouveau format arrivé dans Bun 1.3.x. La PR #13191 fait que les checks de boundaries skip node_modules, ce qui ferme une classe d'erreurs « dependency boundary violated » en faux positif qui apparaissait dans les monorepos avec des dépendances vendored. La PR #13198 transforme le JSON malformé dans turbo.json de panic en erreur typée. La PR #13199 améliore le message d'erreur quand la récupération du binaire spécifique à la plateforme échoue (le chemin « avez-vous oublié d'installer turbo pour cette plateforme »).
Pourquoi ça compte pour les utilisateurs de monorepos
Les deux fils d'actualité (l'adoption de nub et aube; le travail TUI et perf) sont connectés par un seul shift: le toolchain JS se consolide sur le modèle « augmenter Node stock » plutôt que sur le modèle « remplacer Node par un nouveau runtime ». Bun et Deno ont parié sur un nouveau runtime, et le pari a payé en performance mais a coûté une migration à l'écosystème. nub et aube prennent la DX façon Bun et la livrent par-dessus du node stock, ce qui signifie qu'une équipe peut adopter l'un ou l'autre sans changer ce qui tourne en production. Turborepo est le premier orchestrateur de tâches mainstream à formaliser cette position: quand le champ packageManager pointe vers nub ou aube, l'orchestrateur de monorepo sait quoi faire avec les étapes d'install, prune, generate, et cache-hashing sans que l'équipe écrive de logique de détection custom.
Pour les utilisateurs de monorepos, le takeaway pratique est une fenêtre plus tranquille pour npx @turbo/codemod migrate ou bunx @turbo/codemod migrate ce week-end. La release est additive: les monorepos 2.10.x existants continuent de fonctionner, la TUI est un défaut qui peut être annulé avec TURBO_TUI=0 ou le toggle logs-streamés, et la détection nub/aube ne s'active que quand le champ packageManager pointe vers l'un des deux. Le travail de perf (thin LTO, codegen-units=1, suppression des clones de lockfile et de graphe de paquets) apparaît comme une amélioration petite mais mesurable sur chaque turbo run build dans un gros monorepo, sans changement de config visible côté utilisateur.
Le signal long terme est le pairing d'auteurs. colinhacks (Zod, 43k étoiles, validation de schéma TypeScript-first) est la même personne qui a écrit nub. jdx (mise, le successeur d'asdf) est la même personne qui a écrit aube. L'auteur de Zod qui parie sur un toolchain Node stock et l'auteur de mise qui parie sur un chemin d'install façon Bun sur du Node stock est un signal fort que le consensus du toolchain JS s'éloigne du pari « nouveau runtime » et va vers « faire que le runtime existant se sente aussi rapide que Bun, sans la migration ».



