Release Notes
Minor Changes
The first release of a package now publishes the version written in its manifest verbatim, instead of bumping off it.
pnpm version -randpnpm change statuscheck the registry for each release's current version; when that version is not yet published, the package debuts at it and its pending changesets apply only from the next release. A newly added package seeded at1100.0.0with aminorchangeset is therefore published as1100.0.0rather than skipping straight to1100.1.0.pnpm versionnow supports the npm-style bump forms:pnpm version <major|minor|patch|premajor|preminor|prepatch|prerelease>andpnpm version <exact-version>(also recursively with-r), with--preid,--allow-same-version,--message,--no-git-tag-version,--no-commit-hooks,--sign-git-tag,--tag-version-prefix, and--json. The bump runs thepreversion/version/postversionlifecycle scripts and records the new version as a git commit and tag.Added recursive workspace support to
pnpm outdated.pnpm listandpnpm llnow inspect all workspace projects by default, matching the TypeScript CLI.Made recursive
pnpm rebuildhonor workspace filters with shared and dedicated lockfiles.Made
pnpm whyandpnpm peersrecursive by default in workspaces. Recursive peer checks now honor workspace filters, and recursivewhycan inspect the active project when a workspace uses dedicated lockfiles.Added a
--changesetflag topnpm update. Setupdate.changesettotrueinpnpm-workspace.yamlto enable this behavior by default, and use--no-changesetto override the setting for one update. After the update completes, pnpm writes a.changeset/pnpm-update-<suffix>.mdfile declaring a patch bump for every workspace package whosedependenciesoroptionalDependencieswere changed by the update and a major bump whenpeerDependencieschanged, including packages that consume an updated catalog entry via thecatalog:protocol. Private packages, packages without a name, and packages listed in theignorearray of.changeset/config.jsonare skipped. If.changeset/config.jsondoes not exist, a warning is printed and no changeset is generated.Added GitHub Actions dependencies to
pnpm outdatedand interactivepnpm update. Non-interactive updates can include them with--include-github-actionsor by settingupdate.githubActionstotrueinpnpm-workspace.yaml. Updated actions are pinned to exact commit hashes with their release tags preserved in comments.
Patch Changes
Fixed
pnpm installrewriting unrelatedpnpm-lock.yamlentries after a small manifest change — for example, removing one dev dependency could bump other packages' open-range dependencies (such as jest's@types/node: '*') to their newest versions pnpm/pnpm#13193. Three resolution-reuse gaps caused still-satisfied lockfile entries to be re-resolved from the registry:- Direct dependencies using the
catalog:protocol were compared against the lockfile in their resolved-range form, so every catalog-managed dependency looked changed on every install, and any package depending on one was re-resolved. - Auto-installed (hoisted) peer dependencies were also treated as changed direct dependencies on every install.
- When a package had to resolve freshly but landed on the version the lockfile already recorded, its dependency subtree was still re-resolved instead of being reused, drifting open ranges pinned by the lockfile.
- Direct dependencies using the
pnpm install,pnpm add,pnpm update, andpnpm removenow support recursive (-r) and filtered (--filter) execution in workspaces configured with one lockfile per project (sharedWorkspaceLockfile: false), instead of failing withERR_PNPM_RECURSIVE_SHARED_LOCKFILE_UNSUPPORTED. Each selected project is installed independently against its ownpnpm-lock.yaml,node_modules, and virtual store, matching pnpm.Global commands (
pnpm add -g,pnpm runtime set -g, ...) now create a missing global bin directory instead of failing withERR_PNPM_PNPM_DIR_NOT_WRITABLE, and the universal--silent/-sshorthands for--reporter=silent(e.g.pnpm store path --silent) are supported again.pnpm unlinknow reinstalls through the selection-aware install pipeline, matching pnpm: it honors-r/--filter, installs recursively by default inside a workspace, and supports both a shared workspace lockfile and one lockfile per project (sharedWorkspaceLockfile: false). Previously it always reinstalled only the active project.Added
updateandauditsettings sections topnpm-workspace.yaml, superseding the awkwardly namedupdateConfig,auditConfig, and top-levelauditLevelsettings:update: ignoreDeps: # was updateConfig.ignoreDependencies - webpack - "@babel/*" audit: level: high # was auditLevel ignore: # was auditConfig.ignoreGhsas - GHSA-xxxx-yyyy-zzzzupdate.ignoreDepslists dependency name patterns thatpnpm updateandpnpm outdatedshould skip.audit.levelandaudit.ignoretunepnpm audit.The deprecated
updateConfig,auditConfig, andauditLevelsettings keep working until the next major version. When both a new section value and its deprecated counterpart are set, the new section takes precedence and a warning is printed. Both the TypeScript CLI and the Rust config surface (pacquet) recognize the new sections.