pnpm 11.7 ajoute `frozenStore` pour les systèmes de fichiers en lecture seule, délègue la résolution à pacquet, et corrige un path-traversal dans le lockfile

pnpm 11.7 ajoute `frozenStore` pour les systèmes de fichiers en lecture seule, délègue la résolution à pacquet, et corrige un path-traversal dans le lockfile

lschvn

pnpm 11.7.0 est sorti le 15 juin 2026, quatre jours après le release de sécurité 11.6.0 qui a corrigé la vulnérabilité d'expansion de variables d'environnement dans .npmrc (GHSA-3qhv-2rgh-x77r). La ligne 11.7 reprend là où 11.6 s'était arrêtée sur le sujet du durcissement de la chaîne d'approvisionnement et ajoute trois features qui changent la façon dont les équipes utilisent pnpm dans des environnements conteneurisés et de builds reproductibles : un mode d'install --frozen-store pour les systèmes de fichiers en lecture seule, la délégation complète de la résolution des dépendances au port Rust pacquet, et un mode batch opt-in pour pnpm publish --recursive. Il y a aussi un vrai fix de sécurité dans le lockfile qui ferme un cas limite de path-traversal que la rétrospective de l'attaque de la chaîne d'approvisionnement npm de juin 2026 avait identifié comme une classe récurrente de bug dans tout l'écosystème.

frozenStore : installs contre un store en lecture seule

La feature phare de 11.7 est frozenStore (clé de config) et --frozen-store (flag CLI), un mode d'install pour les environnements où le store de packages est sur un système de fichiers en lecture seule : un store Nix, une couche d'image OCI, un montage read-only, ou un rootfs dm-verity. L'index.db SQLite du store est ouvert avec l'URI immutable=1, ce qui contourne la création du sidecar WAL/-shm qui échouerait sinon avec EROFS sur un répertoire en lecture seule. Tout chemin d'écriture dans le store est supprimé : le writer index.db, l'écriture du registre de projet, le cache d'effets de bord, et le chmod qui rend normalement un bin exécutable quand il franchit une frontière read/write.

Le pairing prévu est --offline --frozen-lockfile --frozen-store contre un store entièrement peuplé. Sous le global virtual store (le défaut depuis la 9.x), les répertoires de packages vivent à l'intérieur du store, donc si le store manque le build output d'un package dont les scripts de cycle de vie sont approuvés (ou qui a un patch pnpm appliqué), pnpm échoue en amont avec ERR_PNPM_FROZEN_STORE_NEEDS_BUILD plutôt que de crasher en milieu de build sur une écriture read-only. Si le store manque son répertoire de contenu entièrement, l'install échoue rapidement avec ERR_PNPM_FROZEN_STORE_INCOMPLETE plutôt que de tenter de l'initialiser.

Il y a deux contraintes dures à connaître. L'URI immutable=1 requiert Node.js 22.15.0, 23.11.0, ou 24.0.0 ou ultérieur ; sur des runtimes plus anciens, --frozen-store échoue avec une erreur claire ERR_PNPM_FROZEN_STORE_UNSUPPORTED_NODE. Et --frozen-store est incompatible avec --force et avec un serveur pnpr configuré, puisque les deux écrivent dans le store. Le bin-linking tolère aussi un store read-only : sous le global virtual store, la source d'un bin d'un package vit dans le store, donc le chmod qui le rend exécutable serait refusé. Avec EPERM/EACCES ou avec EROFS sur un système de fichiers vraiment read-only, pnpm saute maintenant le chmod quand la source du bin est déjà exécutable et a un shebang normalisé, et sinon erreur toujours. Le chmod est redondant quand le seed livre déjà ses bins exécutables.

Le résultat est une install entièrement reproductible qui peut être cachée comme un artefact unique et réutilisée à travers la CI, le dev local et la production sans aucun accès en écriture au store. Pour les utilisateurs de Nix et OCI, c'est la pièce manquante : pnpm 11.6 était déjà utilisable dans ces environnements, mais chaque install tentait un chmod WAL ou une écriture shm sidecar qui soit échouait, soit tombait en fallback sur un chemin de code plus lent. 11.7 fait du cas read-only le mode explicite et supporté.

pacquet résout désormais les dépendances, pas seulement la matérialisation

La deuxième feature est un jalon pour le port Rust pacquet de pnpm : la résolution des dépendances rejoint la matérialisation dans l'ensemble des opérations que pacquet peut faire de bout en bout. Le nouveau comportement est opt-in via configDependencies : quand pacquet est déclaré dans configDependencies et que la version installée est au moins 0.11.7, une install par défaut non-frozen (nodeLinker isolé, pnpm install simple) est déléguée à pacquet en une seule passe. pacquet lit les manifestes, écrit pnpm-lock.yaml, et crée node_modules. pnpm détecte la capacité à partir de la version de pacquet installée ; les versions plus anciennes conservent la séparation résolution puis matérialisation.

pnpm add, pnpm update et pnpm remove continuent de résoudre dans pnpm lui-même, parce que ces commandes doivent muter les manifestes avant toute résolution. Après la mutation du manifeste, pacquet matérialise. Le format du lockfile ne change pas. Cela reste un opt-in preview du moteur d'install Rust, suivi sous #11723. Pour les projets qui font déjà tourner pacquet en mode frozen-install, le changement est invisible : la résolution et la matérialisation sont déjà une seule invocation pacquet. Pour les projets qui tournent encore sur le moteur d'install Node.js, la mise à jour est un no-op tant que pacquet n'est pas dans configDependencies.

Rejet des alias de path-traversal et des alias réservés du lockfile

Le troisième point principal est un fix de sécurité dans le vérificateur de lockfile. Avant 11.7, un attaquant qui pouvait contrôler une entrée du lockfile (un postinstall malveillant, un artefact CI altéré, un resolved spec de peer dependency empoisonnée) pouvait définir un alias de dépendance comme une chaîne de path-traversal (../../../escape) ou un nom réservé (.bin, .pnpm, node_modules). Sous nodeLinker: hoisted, l'alias était joint directement sous node_modules, permettant d'écrire des fichiers de packages hors de la racine d'install ou d'écraser le layout pnpm. La classe d'exploit est la même que celle que le path-traversal Windows d'esbuild 0.28.1 (GHSA-g7r4-m6w7-qqqr) et l'attaque de la chaîne d'approvisionnement npm d'Axios de mars 2026 ont chacun surfaced dans un outil différent.

Le fix 11.7 ajoute deux couches. Le constructeur de graphe hoisted valide maintenant chaque alias au sink du répertoire (safeJoinModulesDir), ce qui correspond à la validation que pnpm effectuait déjà pour les alias provenant des manifestes. Et la porte de vérification du lockfile (verifyLockfileResolutions) exécute une vérification toujours active, indépendante de toute policy, qui rejette tout alias de dépendance d'importer ou de snapshot qui n'est pas un nom de package valide, faisant échouer l'install tôt, avant tout fetch ou travail sur le système de fichiers, pour chaque node linker en même temps. La vérification est conservatrice : tout alias qui n'est pas syntaxiquement un nom de package valide (pas de /, pas de .., pas de segments réservés) est rejeté avec une erreur claire.

Pour un projet normal, l'effet pratique est qu'un lockfile existant continue de s'installer comme avant, et un lockfile avec un alias de path-traversal ou un alias réservé (ce qui serait une attaque craftée, pas une entrée normale) fait maintenant échouer l'install avec une erreur claire. Le fix ne change pas le format du lockfile. C'est le genre de défense en profondeur qu'incarnait déjà l'advisory .npmrc de 11.6.0 : un projet qui fait déjà confiance à la source de son lockfile bénéficie quand même du vérificateur, parce que le vérificateur protège contre les bugs du générateur de lockfile et contre la corruption partielle.

--batch pour pnpm publish --recursive

La quatrième feature est petite mais pratique : pnpm publish --recursive --batch envoie tous les packages sélectionnés au registre dans une seule requête PUT /-/pnpm/v1/publish au lieu d'une requête par package. Le registre cible doit implémenter l'endpoint de publish en batch (pnpr le fait) ; les registres qui ne le font pas sont signalés avec une erreur claire ERR_PNPM_BATCH_PUBLISH_UNSUPPORTED. Le batch est traité en tout-ou-rien par pnpr : si un package du batch échoue à la validation, aucun des packages n'est publié. Pour les monorepos qui publient N packages par release, le gain en temps réel sur pnpm publish --recursive est grossièrement Nx.

Autres fixes qui affectent le travail au quotidien

La release 11.7 corrige aussi plusieurs bugs de correction et de régression ouverts depuis 11.6. Le plus notable est une régression Windows dans pnpm add qui produisait Cannot destructure property 'manifest' of 'manifestsByPath[rootDir]' as it is undefined quand on tournait hors d'un workspace ; la cause racine était selectProjectByDir qui keyait le ProjectsGraph par opts.dir au lieu de project.rootDir, donc les lookups manifestsByPath en aval manquaient quand les deux chemins se normalisaient différemment (typiquement la casse de la lettre de lecteur). La commande pnpm patch-remove ne supprime plus les fichiers hors du répertoire de patches configuré. pnpm publish respecte maintenant strictSsl: false pour les certificats auto-signés de la même manière que pnpm install. Les dépendances Git qui pointent vers un sous-répertoire d'un repository (repo#commit&path:/sub/dir) conservent leur path dans le lockfile à nouveau après une régression de pin d'intégrité en 11.6. Et la résolution des packages enfants partagés est désormais déterministe quand le même package est atteint par plusieurs contextes, corrigeant une classe de rapports « missing peer » (#12358) où le timing de la requête déterminait le contexte enfant.

Les prompts interactifs de pnpm update -i et pnpm audit --fix -i ont aussi reçu un fix UX : la ligne de résumé après avoir pressé Enter imprimait auparavant la ligne complète du tableau pour chaque choix sélectionné (label, versions courante/cible, workspace, URL) jointes par des virgules, produisant un mur de texte. Le résumé liste maintenant uniquement les noms de packages sélectionnés (ou les clés de vulnérabilité). C'est un petit détail, mais c'est le genre de polish qui sépare un minor release 11.7 d'un patch 11.6.

Questions fréquentes

Astro 7.0.0-beta.4 fait de Sätteri le processeur Markdown par défaut et promeut le routage avancé, le logger personnalisé et le rendu en flux en stable

Astro 7.0.0-beta.4 (15 juin 2026) active par défaut le pipeline Markdown Rust Sätteri, retire le drapeau expérimental du routage avancé, du logger personnalisé et du nouveau moteur de rendu, supprime les commandes CLI obsolètes astro db/login/logout/link/init, et intègre en standard le mode serveur de développement en arrière-plan ajouté en alpha.2.

L'Open Knowledge Format de Google Cloud est un standard, pas un produit : plongée dans OKF v0.1

Le 12 juin 2026, Google Cloud a publié l'Open Knowledge Format (OKF), une spécification ouverte qui formalise le pattern LLM-wiki en format portable et interopérable : un répertoire de fichiers markdown avec frontmatter YAML, un seul champ obligatoire (type), cinq recommandés, et zéro outillage requis. Le tweet de Google Cloud Tech du 16 juin a généré 117 000 vues en 24 heures et a fait de la spec l'annonce de format de connaissance la plus discutée de l'année. Cette longue lecture parcourt la spec v0.1 section par section, les choix de design qui la rendent délibérément minimale, ce que Google livre avec (un agent d'enrichissement pour BigQuery, un visualiseur HTML statique, trois bundles d'exemple, et une intégration native au Knowledge Catalog BigQuery), et la question ouverte que tout constructeur d'agents IA et toute équipe plateforme de données devraient suivre sur les six prochains mois.

Articles connexes

Plus de couverture avec des sujets et tags en commun.

Bug Claude Code #74066 : Des Utilisateurs Signalent une Fuite de Contexte Entre Workspaces sur Sonnet 5, Anthropic N'a Pas Encore Répondu
security

Bug Claude Code #74066 : Des Utilisateurs Signalent une Fuite de Contexte Entre Workspaces sur Sonnet 5, Anthropic N'a Pas Encore Répondu

Un bug ouvert déposé contre Claude Code le 2026-07-04 par un utilisateur [Enterprise ZDR](https://docs.anthropic.com/en/docs/build-with-claude/zero-data-retention) décrit une session de travail sur Sonnet 5 qui commence soudainement à faire référence à une construction de temple Minecraft non liée, puis persiste dans la mauvaise tâche dans son récapitulatif. Le rapporteur (GitHub : [@milesrichardson-edb](https://github.com/milesrichardson-edb), issue [anthropics/claude-code#74066](https://github.com/anthropics/claude-code/issues/74066)) est sur Enterprise Zero Data Retention, le niveau qu'Anthropic présente spécifiquement comme isolé par session. Le triage sur le JSONL de session locale du rapporteur à `~/.claude/projects/<encoded-cwd>/<session-id>.jsonl` montre que le texte fuité n'est pas dans la transcription, ce qui exclut une fuite de contexte locale par chevauchement de fichier. Quatre autres utilisateurs dans les commentaires (avec des historiques de travail remontant à l'an dernier) décrivent un comportement quasi identique sur Claude Code, Claude Mobile et Claude deep research. Le fit architectural le plus plausible est un état de cache KV partagé dans l'inférence ([selon @yv3nne dans les commentaires](https://github.com/anthropics/claude-code/issues/74066#issuecomment-4880448776)), mais aucun ingénieur d'Anthropic n'a commenté l'issue dans les 22 heures depuis son dépôt, et l'issue a atteint le sommet de [Hacker News](https://news.ycombinator.com/item?id=42481789) le 2026-07-04. Le ton dans le fil est partagé : la moitié suspectant une vraie réutilisation de cache plateforme, l'autre moitié suspectant une [hallucination spécifique à Sonnet 5 déclenchée par un lexer Pygments](https://github.com/anthropics/claude-code/issues/74066#issuecomment-4880334711). Les deux lectures sont crédibles.
Oxlint v1.72 et Oxfmt v0.57 livrent le cycle crates v0.138, unifient l'AstBuilder et retirent le repli Prettier pour CSS/GraphQL
tooling

Oxlint v1.72 et Oxfmt v0.57 livrent le cycle crates v0.138, unifient l'AstBuilder et retirent le repli Prettier pour CSS/GraphQL

Oxlint apps_v1.72.0 et oxfmt apps_v0.57.0, tous deux publiés le 2026-06-29, clôturent le cycle v0.138 prédit dans les [notes de version v1.71](/articles/2026-06-23--oxlint-v1-71-oxfmt-v0-56). La version crates (crates_v0.138.0, aussi 2026-06-29) unifie les anciennes et nouvelles API AstBuilder (#23876, #23834, #23831, avec les méthodes héritées marquées `#[deprecated]`), renomme `AllocatorAccessor` en `GetAllocator` et fait prendre `&self` à sa méthode `allocator` (#23675, #23676), fait prendre `&GetAllocator` aux méthodes `Str` et `Ident` (#23781), ajoute `transformer_plugins: Support typeof define keys` pour vue-i18n et macros similaires (#23605, Alexander Lichter), et livre l'entrée de perf phare du cycle : `minifier: memoize value_type to remove its O(n^2) re-walk on long binary chains` (#23929, Dunqing), qui transforme une chaîne d'addition arithmétique de 20 000 termes de 6 118 ms à 4,7 ms (≈1300x) et le bundle antd.js réel de 78,1 ms à 65,4 ms. Oxlint v1.72.0 livre 3 fonctionnalités (suggestion React pour `no-unknown-property` #23936, unification AstBuilder #23875, schéma pour `eslint/no-restricted-import` #23642), 18 corrections de bugs, et 23 entrées de performance. Oxfmt v0.57.0 comporte deux changements BREAKING qui retirent le repli Prettier pour les fichiers CSS/LESS/SCSS et GraphQL : `Format parser:css,less,scss files + css-in-js by oxc_formatter_css` (#23321, leaysgur) et `Support draft syntax with removing prettier fallback` (#23326, leaysgur), tous deux construits sur les nouveaux crates `oxc_formatter_css` (#23320) et `oxc_formatter_graphql` (#23317).
Deno 2.9 livre un démarrage à froid 1,98x plus rapide, 2,2 à 3,1x moins de RSS en charge, le minimum-release-age npm activé par défaut, la politique de confiance no-downgrade et les tests par snapshot natifs
security

Deno 2.9 livre un démarrage à froid 1,98x plus rapide, 2,2 à 3,1x moins de RSS en charge, le minimum-release-age npm activé par défaut, la politique de confiance no-downgrade et les tests par snapshot natifs

Deno 2.9 (Bartek Iwańczuk, publié le 2026-06-25 sur deno.com/blog/v2.9) est la plus grande release Deno du cycle. Le démarrage à froid passe de 34,2 ms à 17,3 ms (1,98x), le pic RSS sur la charge realworld de Deno.serve baisse d'un facteur 2,2 (142 Mo → 64 Mo) et de 3,1x sur les corps de 1 Mio (197 Mo → 63 Mo), et le débit Deno.serve grimpe de 1,27x en realworld (56,8k → 72,4k req/s), 1,11x en plaintext, et 1,18x sur les corps de 1 Mio. Durcissement supply chain : le npm minimum-release-age est activé par défaut avec une fenêtre de 24h (PR #35458), et une nouvelle politique de confiance opt-in no-downgrade (PR #34927) refuse de résoudre toute version dont la preuve de confiance (publication échelonnée, trusted publishing, attestation de provenance) est plus faible que la meilleure preuve sur toute version précédemment publiée du même paquet. Parité du runner de tests : t.assertSnapshot() natif (#35139), Deno.test.each (#34938), --shard pour fan-out CI (#35057), retry et repeats (#35053), sélection change-aware --changed et --related (#35199), et seuils de coverage (#35056). Interop lockfile : deno install seed deno.lock depuis package-lock.json, pnpm-lock.yaml, yarn.lock ou bun.lock (#34296, #35330, #35346, #35350, #35394), pnpm-workspace.yaml auto-migre vers deno.json / package.json (#34993), et les marqueurs de conflit de fusion git dans deno.lock se résolvent automatiquement (#34726). Plus : deno desktop sort de l'expérimental (PR #33441 du 16 juin), sous-commandes deno link / deno unlink / deno list / deno watch, --unsafe-proto stable (#34738), Web Locks API (#31166), Happy Eyeballs v2 (RFC 8305) (#31726), navigator.userAgentData (#34743), la proposition WebCrypto Modern Algorithms (ML-KEM, ML-DSA, SLH-DSA, ChaCha20-Poly1305, famille SHA-3, KMAC, Argon2) (#34447, #34448, #34914, #35223), compat Node 26.3.0 (#34746, #34747), Node-API v10 (#35270), et imports de modules CSS sous --unstable-raw-imports (#35093). Plus de 165 PRs mergent dans ce cycle.

Commentaires

Connexion Connectez-vous pour participer à la conversation.

Pas encore de commentaires. Soyez le premier à partager vos pensées.