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-zzzz
update.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.