Minor Changes
-
Added a new
pnpm pack-appcommand that packs a CommonJS entry file into a standalone executable for one or more target platforms, using the Node.js Single Executable Applications API under the hood. Targets are specified as<os>-<arch>[-<libc>](e.g.linux-x64,linux-x64-musl,macos-arm64,win-x64) and each produces an executable underdist-app/<target>/by default. Requires Node.js v25.5+ to perform the injection; an older host downloads Node.js v25 automatically. -
pnpm audit --fixnow respects theauditLevelsetting and supports a new interactive mode via--interactive/-i. Previously,pnpm audit --fixwould fix all vulnerabilities regardless of the configuredauditLevel, whilepnpm audit(without--fix) correctly filtered by severity. Now both commands consistently filter advisories by theauditLevelsetting, and you can usepnpm audit --fix -ito review and select which vulnerabilities to fix interactively.Overrides emitted by
pnpm audit --fixnow use a caret range (^X.Y.Z) instead of an open-ended>=X.Y.Z, so applying a security fix can no longer silently promote a dependency across a major version boundary. -
Added a new setting
minimumReleaseAgeIgnoreMissingTime, which istrueby default. When enabled, pnpm skips theminimumReleaseAgematurity check if the registry metadata does not include thetimefield. Set tofalseto fail resolution instead. -
Fixed and expanded
pnpm versionto match npm behavior:- Accept an explicit semver version (e.g.
pnpm version 1.2.3) in addition to bump types. - Recognize
--no-commit-hooks,--no-git-tag-version,--sign-git-tag, and--message. - Fix
--no-git-checkswhich was previously parsed incorrectly. - Create a git commit and annotated tag for the version bump when running inside a git repository (unless
--no-git-tag-versionis used).--messagesupports%sreplacement with the new version, and--tag-version-prefixcontrols the tag prefix (defaults tov). Git commits and tags are always skipped in recursive mode since multiple packages may be bumped to different versions in a single run #11271.
- Accept an explicit semver version (e.g.
-
Renamed the platform-specific optional dependencies of
@pnpm/exeto the new@pnpm/exe.<platform>-<arch>[-<libc>]scheme, usingprocess.platformvalues (linux,darwin,win32) for the OS segment. The umbrella package@pnpm/exeitself is unchanged so existingnpm i -g @pnpm/exeandpnpm self-updateflows keep working.before after @pnpm/linux-x64@pnpm/exe.linux-x64@pnpm/linux-arm64@pnpm/exe.linux-arm64@pnpm/linuxstatic-x64@pnpm/exe.linux-x64-musl@pnpm/linuxstatic-arm64@pnpm/exe.linux-arm64-musl@pnpm/macos-x64@pnpm/exe.darwin-x64@pnpm/macos-arm64@pnpm/exe.darwin-arm64@pnpm/win-x64@pnpm/exe.win32-x64@pnpm/win-arm64@pnpm/exe.win32-arm64GitHub release asset filenames follow the same scheme —
pnpm-linuxstatic-x64.tar.gzbecomespnpm-linux-x64-musl.tar.gz,pnpm-macos-*becomespnpm-darwin-*,pnpm-win-*becomespnpm-win32-*. Anyone downloading releases directly needs to use the new filenames;get.pnpm.io/install.shandinstall.ps1will be updated in lockstep to accept both schemes based on the requested version.Resolves #11314.
Patch Changes
- Do not print the
Cannot use both "packageManager" and "devEngines.packageManager" in package.json. "packageManager" will be ignoredwarning when the two fields specify the exact same package manager name and version string. This lets projects keep both fields during the migration frompackageManagertodevEngines.packageManagerwithout a noisy warning #11301. - Fix installing a directory dependency (
file:<dir>) from an absolute path on a different drive on Windows. The directory fetcher was joining the stored directory ontolockfileDir, which on Windows concatenates an absolute cross-drive path literally (path.join('D:\\...', 'C:\\Users\\...')→'D:\\...\\C:\\Users\\...'). Usepath.resolveso absolute paths are respected. This surfaced as an ENOENT duringpnpm setupin CI whenPNPM_HOMEand the OS temp directory were on different drives. - Fixed
pnpm sbomandpnpm licensesfailing to resolve license information for git-sourced dependencies (git+https://,git+ssh://,github:shorthand). These commands now correctly read the package manifest from the content-addressable store fortype: 'git'resolutions #11260. - Fix
ERR_PNPM_OUTDATED_LOCKFILEwhen approving builds during a global install. Theapprove-buildsflow called bypnpm add -gpassed the global packages directory to the subsequent install asworkspaceDir, which caused sibling install directories (such as those left behind bypnpm self-update) to be picked up as workspace projects and fail the frozen-lockfile check. - Restore the peer suffix encoding used by pnpm 10 for linked dependency paths. A
filenamifyupgrade changed how leading./and../segments were normalized, producing peer suffixes like(b@+packages+b)instead of(b@packages+b)for linked packages outside the workspace root, causing lockfile churn #11272. - Fix: different platform variants of the same runtime (e.g.
node@runtime:25.9.0glibc vs. musl) no longer share a single global-virtual-store entry. The virtual store path now incorporates the selected variant's integrity, so installs with different--os/--cpu/--libcend up in separate directories andpnpm add --libc=musl node@runtime:<v>reliably fetches the musl binary even when the glibc variant is already cached. pnpm sbomnow detects licenses declared via the deprecatedlicensesarray inpackage.json(e.g.busboy,streamsearch,limiter) and falls back to scanning on-diskLICENSEfiles — mirroring the resolution logic ofpnpm licenses. Previously these packages were reported asNOASSERTION. Shared license resolution (manifest parsing + LICENSE-file fallback) lives in the new@pnpm/deps.compliance.license-resolverpackage. When a manifest sets bothlicenseandlicenses, the modernlicensefield now takes precedence for both commands (previouslypnpm licensespreferredlicenses) #11248.
Platinum Sponsors
|
|
Gold Sponsors
|
|
|
|
|
|
|
|
|
|
|