Changelog

pnpm/pnpm · · 22 commits

Major Python and runtime installs land

Python work dominates: interpreters, shared/store environments, sdists, filters, overrides, plus task concurrency groups and a tarball cache fix.

Task concurrency groups add machine-wide run limits (zkochanaa8d0ab)

Tasks in pnpm-workspace.yaml can now opt into named concurrency groups with per-group limits enforced across all pnpm processes on the machine. That gives workspace authors a way to cap parallel task fanout globally, not just within one invocation.

Python installs can fetch missing interpreters (zkochan338ac4d)

pnpm now installs a Python interpreter when the machine lacks one that satisfies the project, using python-build-standalone releases. This turns previously blocking installs into successful ones and adds mirror/download controls for environments that need them.

Python environments move into the store (zkochan46125ed)

Python project environments are now stored centrally under the pnpm store instead of each project carrying its own .pnpm/python-envs tree. That reduces per-repo duplication and changes .venv into a link to the current generation, with migration/relinking support for existing setups.

Python workspaces can share a single environment (zkochanf9af3e7)

A uv workspace can opt into one shared Python environment for all members via shared-environment = true. pnpm now resolves the workspace as a single graph into one lockfile and one root .venv, which matters for repositories that want a unified environment by default.

Python installs now honor filtered selections (zkochan181e1f6)

pnpm install --filter now scopes Python project installation to the selected projects instead of pulling in the whole workspace. The change also makes Python add/install behave correctly when a Python project shares a directory with an npm workspace project.

Python overrides accept PyPI PURLs (zkochanfc5a6c3)

Python override entries can now use pkg:pypi/<distribution>[@<version>] identifiers. pnpm normalizes those into existing dependency requirements at the config boundary, making ecosystem overrides easier to express without changing override semantics.

Python installs can build source distributions (zkochan854138e)

pnpm can now install a Python release from its source distribution when no compatible wheel exists. The resolver also reports why it found no installable version, which should make Python dependency failures much easier to diagnose.

Python runtime fallback is controlled by runtimeOnFail (zkochan1d9186b)

Interpreter installation now respects runtimeOnFail, aligning Python with the existing Node/Deno/Bun behavior for missing runtimes. That closes a gap between Python support and the rest of pnpm’s runtime-install logic.

Tarball cache keys now include expected integrity (zkochana1f1b1b)

The tarball in-memory cache is now keyed by expected integrity, not just URL and projection. That fixes a corruption bug where two resolutions for the same tarball URL but different hashes could share a slot and serve the wrong bytes.

Custom resolvers without manifests now read tarball metadata (zkochan0ba8e4f)

When a pnpmfile resolver returns a tarball resolution without a manifest, pnpm now reads the package manifest from the archive instead of treating it as identity-only. That restores dependency installation for custom resolvers that omit manifest data.

Audit path pruning handles saturated graphs better (zkochan0163063)

The audit path logic was refactored to collapse cycles and propagate removals through a strongly connected-component view of the dependency graph. This should make saturated audit findings more accurate and keep the traversal linear in graph size.

Other misc changes

  • supportedArchitectures now accepts named platforms instead of only os/cpu/libc axes (zkochan4d58dae)
  • Python interpreter selection now compares workspace paths canonically and only reads declared workspaces where appropriate (zkochanbb6696a)
  • Tarball cache identity cleanup/refactor (zkochan1972e84)
  • Fix reading manifests for tarball-backed custom resolvers (zkochan0ba8e4f)
  • Cargo weak feature dependency locking fix (zkochan2c04b22)
  • Metadata snapshot now rejects FIFOs/named pipes instead of hanging (zkochan17162f0)
  • Docs and repository workflow updates (zkochan44502ee, zkochane241237)
  • Review/automation skill and hook refactors, plus Rust command wrapper updates (zkochanc8c818c, zkochan40677ef, zkochanaa8d0ab)
  • Dependency/config/test-only changes across the Python and Rust suites