Skip to content

fix(sh): escape /C so MSYS doesn't drop the cmd switch#55

Merged
zkochan merged 3 commits into
mainfrom
fix/msys-path-conv
May 11, 2026
Merged

fix(sh): escape /C so MSYS doesn't drop the cmd switch#55
zkochan merged 3 commits into
mainfrom
fix/msys-path-conv

Conversation

@zkochan
Copy link
Copy Markdown
Member

@zkochan zkochan commented May 11, 2026

Summary

The sh shim generated for a .cmd / .bat target runs the script via:

exec cmd /C "<path>" "$@"

Under Git Bash (MSYS), the path-conversion layer that runs when bash spawns a native Win32 process rewrites arguments matching POSIX-path heuristics. A bare /C is treated as a path and rewritten to C:\. cmd.exe then never sees the /C flag — it starts interactively and reads the remainder of the calling script as input until EOF.

Prefixing with // is the MSYS escape: //C survives the translation and reaches cmd.exe as /C. The cmd shim is unaffected (cmd.exe doesn't path-translate its own args), so the change is scoped to generateShShim.

Repro

In a Git Bash shell on Windows after this PR is reverted, any cmd-shim-wrapped batch script reproduces the bug. Concretely, in a pnpm Windows CI run:

# pn is a sh shim that does: exec cmd /C "...pn.cmd" "$@"
$ pn exec node -v
Microsoft Windows [Version 10.0.26100.32690]
(c) Microsoft Corporation. All rights reserved.

D:\a\pnpm\pnpm>

(That's cmd.exe's interactive banner and prompt. The next line of the calling script is then fed to cmd as input.)

After live-patching the shim with sed 's,/C ,//C ,', the same call returns v22.13.0 as expected. Full diagnostic + proof: https://github.com/pnpm/pnpm/actions/runs/25701484608/job/75462777365

Test plan

  • Existing unit/e2e tests pass (node --test test/test.js test/e2e.test.js, 58/58)
  • Snapshot updated to reflect the /C → //C change on the two relevant sh-shim lines (no other snapshots touched)
  • End-to-end validated on Windows CI by patching the live shim with sedpn exec node -v returns the expected version after the patch
  • Once released, bump @zkochan/cmd-shim in pnpm and re-run the Windows test job

Context

Bug introduced in #46 (which added the /C switch). #48 expanded MSYS detection in the same shim but didn't touch the args. Affects any .cmd / .bat target invoked via the sh shim from Git Bash / MSYS / Cygwin.


Written by an agent (Claude Code, claude-opus-4-7).

Summary by CodeRabbit

  • Bug Fixes

    • Ensure shims preserve cmd.exe switches under MSYS/Git Bash by escaping bare /C and /K when targeting cmd, so wrapped commands run reliably.
  • Tests

    • Updated snapshots to reflect escaped switch behavior.
    • Added a Windows/Git Bash regression test to verify shims preserve cmd switches and produce expected output.

Review Change Stack

The sh shim generated for a `.cmd` / `.bat` target runs the script via
`exec cmd /C "<path>" "$@"`. Under Git Bash (MSYS), the path-conversion
layer that runs when bash launches a native Win32 process rewrites
arguments matching POSIX-path heuristics — a bare `/C` is treated as a
path and rewritten to `C:\`. cmd.exe then never sees the `/C` flag,
starts interactively, and reads the rest of the calling script as input
until it hits EOF.

Prefixing with `//` is the MSYS escape: `//C` survives the translation
and reaches cmd.exe as `/C`. The cmd shim is unaffected (`%*` argument
passing in cmd.exe doesn't get this treatment), so the change is scoped
to `generateShShim`.

Bug introduced in #46; manifests as cmd.exe banner output when invoking
any cmd-shim-wrapped `.cmd` from Git Bash.

---
Written by an agent (Claude Code, claude-opus-4-7).
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 11, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: f86a2a60-e366-40b2-82c4-4ecdbdb35fa7

📥 Commits

Reviewing files that changed from the base of the PR and between 47c17a8 and 51031bb.

📒 Files selected for processing (1)
  • src/index.ts
📜 Recent review details
🔇 Additional comments (2)
src/index.ts (2)

327-334: Solid MSYS switch-escape helper.

This correctly targets bare /C and /K tokens while preserving surrounding spacing, so it fixes MSYS translation without altering unrelated args.


445-455: Good runtime scoping for escape application.

Conditioning the rewrite on cmd/cmd.exe keeps the Git Bash fix in place while avoiding argument mutation for non-cmd shims.


📝 Walkthrough

Walkthrough

Adds MSYS/Git Bash escaping for cmd.exe switches: a new helper rewrites /C and /K to //C///K, integrates it into sh shim generation, and updates snapshot and e2e tests to verify behavior under Bash/MSYS.

Changes

MSYS Command Switch Escaping

Layer / File(s) Summary
MSYS Command Switch Escaping Helper
src/index.ts
New escapeMsysCmdSwitches(args) applies a regex to prefix standalone /C and /K with an extra / producing //C///K.
Shell Shim Argument Processing
src/index.ts
generateShShim now derives args by applying escapeMsysCmdSwitches to opts.args instead of using raw opts.args directly.
Snapshot Test Verification
test/test.js.snapshot
bat.shim snapshot updated to show //C instead of /C in cmd invocation for both "$basedir/cmd" and fallback cmd paths.
E2E Test Import
test/e2e.test.js
Adds spawnSync import from node:child_process.
Windows / Git Bash Regression Test
test/e2e.test.js
Adds a regression test that runs the shim in Git Bash, asserts the wrapped .cmd output (HELLO_FROM_CMD) is present and that the interactive cmd.exe banner is not emitted.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

A rabbit hops through bash and shell,
I add a slash so switches dwell,
From /C to //C they safely pass,
No MSYS trick will drop the task,
Hooray—no more lost flags! 🐇

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main fix: escaping the /C switch to prevent MSYS from dropping it in cmd.exe invocations from sh shims.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/msys-path-conv

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/index.ts`:
- Around line 445-452: The code currently calls escapeMsysCmdSwitches(opts.args
|| '') unconditionally, which can rewrite legitimate non-cmd arguments; change
this so escaping is only applied when we are actually invoking a cmd-style
runtime (e.g. .cmd/.bat shims or cmd.exe). Concretely, detect the cmd runtime
before escaping (for example via the resolved shim/target extension or an
existing runtime indicator) and only call escapeMsysCmdSwitches when that check
is true; leave args as opts.args otherwise. Reference escapeMsysCmdSwitches,
opts.args, and the sh/runtime determination (e.g. shNodePath /
normalizePathEnvVar or the code path that identifies .cmd/.bat targets) to
locate where to insert the conditional.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 4afe6277-acad-4dd4-9c0b-bd8cd61a6692

📥 Commits

Reviewing files that changed from the base of the PR and between 902cd8a and ae1c082.

📒 Files selected for processing (2)
  • src/index.ts
  • test/test.js.snapshot
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: test (windows-latest, 22)
  • GitHub Check: test (windows-latest, 24)
🔇 Additional comments (2)
src/index.ts (1)

327-334: MSYS switch escaping helper looks correct

Nice addition — the token-level replacement for bare /C and /K is clear and matches the intended MSYS passthrough behavior.

test/test.js.snapshot (1)

15-17: Snapshot update matches the sh-shim behavior change

The /C//C expectations here correctly reflect the new MSYS-safe sh shim output.

Comment thread src/index.ts Outdated
Generates an sh shim wrapping a `.cmd` target and invokes it via Git
Bash. Asserts the script's output appears (proving the `/C` switch
reached cmd.exe) and that cmd.exe's interactive banner did not (proving
the bug — where MSYS rewrote `/C` to `C:\` — is not present).

Windows-only; the suite is skipped elsewhere.

---
Written by an agent (Claude Code, claude-opus-4-7).
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
test/e2e.test.js (1)

46-49: ⚡ Quick win

Add a timeout to spawnSync to avoid potential CI hangs.

At Line 46, this test exercises a path that can become interactive on regression. A timeout keeps the suite from stalling indefinitely.

Proposed patch
     const r = spawnSync(bash, ['--noprofile', '--norc', shim], {
       encoding: 'utf8',
       stdio: ['ignore', 'pipe', 'pipe'],
+      timeout: 15_000,
+      killSignal: 'SIGKILL',
     })
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/e2e.test.js` around lines 46 - 49, The spawnSync invocation may hang in
CI; update the options passed to spawnSync (the call creating r with variables
spawnSync, bash, shim) to include a timeout (e.g., timeout in milliseconds) so
the child is forcibly terminated after a reasonable period and the test fails
fast; add the timeout property to the options object (and optionally set
killSignal if desired) so the synchronous spawn cannot block the test runner
indefinitely.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@test/e2e.test.js`:
- Around line 46-49: The spawnSync invocation may hang in CI; update the options
passed to spawnSync (the call creating r with variables spawnSync, bash, shim)
to include a timeout (e.g., timeout in milliseconds) so the child is forcibly
terminated after a reasonable period and the test fails fast; add the timeout
property to the options object (and optionally set killSignal if desired) so the
synchronous spawn cannot block the test runner indefinitely.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9a53b34c-040d-4f22-bfb1-509c917e6a20

📥 Commits

Reviewing files that changed from the base of the PR and between ae1c082 and 47c17a8.

📒 Files selected for processing (1)
  • test/e2e.test.js
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: test (windows-latest, 22)
  • GitHub Check: test (windows-latest, 24)
🔇 Additional comments (1)
test/e2e.test.js (1)

51-57: Nice regression assertions.

The positive check for HELLO_FROM_CMD plus the negative check for the interactive cmd banner gives a clear signal that the MSYS switch escaping is working.

Apply the /C → //C rewrite only when opts.prog is 'cmd' (the runtime
inferred for .cmd/.bat targets). Avoids mangling legitimate /C-like args
from shebang-derived configurations on non-MSYS systems, where the
program would see //C verbatim.

Addresses review feedback on #55.
@zkochan zkochan merged commit 39d6a04 into main May 11, 2026
5 of 7 checks passed
@zkochan zkochan deleted the fix/msys-path-conv branch May 11, 2026 23:01
@coderabbitai coderabbitai Bot mentioned this pull request May 11, 2026
zkochan added a commit to pnpm/pnpm that referenced this pull request May 12, 2026
Picks up the MSYS path-translation fix from pnpm/cmd-shim#55: the sh shim
written for `.cmd` / `.bat` targets now escapes the `/C` switch as `//C`
so Git Bash passes it through to cmd.exe unchanged. Without this, a bare
`/C` was rewritten to `C:\` before reaching cmd.exe — cmd started
interactively and the calling script saw cmd's banner instead of the
wrapped command's output. Affects any cmd-shim-wrapped batch script
invoked from Git Bash / MSYS / Cygwin on Windows.
renovate Bot added a commit to Gashmob/Website that referenced this pull request May 12, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`11.1.0` →
`11.1.1`](https://renovatebot.com/diffs/npm/pnpm/11.1.0/11.1.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.1.0/11.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Gashmob/Website).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzMuNiIsInVwZGF0ZWRJblZlciI6IjQzLjE3My42IiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbXX0=-->
renovate Bot added a commit to Johannes-Andersen/CyberTipline-Tools that referenced this pull request May 12, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`11.1.0` →
`11.1.1`](https://renovatebot.com/diffs/npm/pnpm/11.1.0/11.1.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.1.0/11.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Oslo)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Johannes-Andersen/CyberTipline-Tools).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzMuNiIsInVwZGF0ZWRJblZlciI6IjQzLjE3My42IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJ0eXBlL2RlcGVuZGVuY2llcyJdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
dubzzz added a commit to dubzzz/pure-rand that referenced this pull request May 12, 2026
> ℹ️ **Note**
> 
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`10.33.0` →
`11.1.1`](https://renovatebot.com/diffs/npm/pnpm/10.33.0/11.1.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/10.33.0/11.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

###
[`v11.1.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1110)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.9...v11.1.0)

##### Minor Changes

- Added `pnpm audit signatures` to verify ECDSA registry signatures for
installed packages against keys from `/-/npm/v1/keys`
[#&#8203;7909](https://redirect.github.com/pnpm/pnpm/issues/7909).
Scoped registries are respected, and registries without signing keys are
skipped.

- Added support for installing packages from the [GitHub Packages npm
registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry)
via a built-in `gh:` prefix (e.g. `pnpm add gh:@&#8203;acme/private`),
and, more broadly, for arbitrary named registries in the style of [vlt's
named-registry aliases](https://docs.vlt.sh/cli/registries).
Authentication is picked up from the existing per-URL `.npmrc` entries
(e.g. `//npm.pkg.github.com/:_authToken=...`), so no separate auth
mechanism is required.

Additional aliases — or an override for the built-in `gh` alias, for
GitHub Enterprise Server — can be configured under `namedRegistries` in
`pnpm-workspace.yaml`:

  ```yaml
  namedRegistries:
    gh: https://npm.pkg.github.example.com/
    work: https://npm.work.example.com/
  ```

With this, `work:@&#8203;corp/lib@^2.0.0` resolves against
`https://npm.work.example.com/`.
[#&#8203;8941](https://redirect.github.com/pnpm/pnpm/issues/8941).

- Allow setting sbom spec version using `--sbom-spec-version`
[#&#8203;11389](https://redirect.github.com/pnpm/pnpm/pull/11389).

- Add `--no-runtime` flag (config: `runtime=false`) to skip installing
runtime entries (e.g. Node.js downloaded via `devEngines.runtime`)
without modifying the lockfile. The lockfile keeps the runtime entry so
frozen-lockfile validation still passes; only the runtime fetch and
`.bin` linking are skipped. Useful in CI matrices where the runtime is
provisioned externally (e.g. via `pnpm runtime -g set node <version>`)
before `pnpm install` runs.

- Added the `pnpm bugs` command that opens a package's bug tracker URL
in the browser. With no arguments, it reads the current project's
`package.json`; with one or more package names, it fetches each
package's metadata from the registry and opens its bug tracker. Falls
back to `<repository>/issues` when the `bugs` field is missing
[#&#8203;11279](https://redirect.github.com/pnpm/pnpm/pull/11279).

- Added `pnpm owner` command to manage package owners on the registry.

##### Patch Changes

- Added "published X ago by Y" information to the `pnpm view` command
output, similar to `npm view`. This is useful when comparing against
`minimumReleaseAge`.

  For example, `pnpm view pnpm` now shows:

  ```
  published 17 hours ago by GitHub Actions
  ```

- `pnpm publish` now honors the configured HTTP/HTTPS proxy (including
`https_proxy`/`http_proxy`/`no_proxy` environment variables) when
polling the registry's `doneUrl` during the web-based authentication
flow. Previously the poll bypassed the proxy, causing the registry to
respond `403` from a different source IP and the login to never complete
[#&#8203;11561](https://redirect.github.com/pnpm/pnpm/issues/11561).

- `pnpm add -g` now installs each space-separated package into its own
isolated directory by default. To bundle multiple packages into the same
isolated install (so that they share dependencies and are removed
together), pass them as a comma-separated list. For example:

- `pnpm add -g foo bar` installs `foo` and `bar` as two independent
globals — removing one does not affect the other.
- `pnpm add -g foo,bar qar` bundles `foo` and `bar` into a single
isolated install while `qar` is installed on its own.

Related:
[#&#8203;11587](https://redirect.github.com/pnpm/pnpm/issues/11587).

- `pnpm runtime set <name> <version>` no longer fails in the root of a
multi-package workspace with the `ADDING_TO_ROOT` error. Installing the
workspace root is a valid target for a runtime, so the command now
bypasses that safety check.

- Fix `pnpm --version` hanging for the lifetime of the worker pool after
the version was printed. `main.ts`'s `--version` short-circuit returned
before reaching the command-handler `finally` that calls
`finishWorkers()`, so the worker pool that `switchCliVersion` had
spawned during integrity resolution stayed alive and held the Node event
loop open. The CLI entry now runs `finishWorkers()` from its own
`finally`, so every exit path tears the pool down.

Repro: `pnpm --version` in a workspace whose `devEngines.packageManager`
version already matches the running pnpm + `onFail: "download"`.
`switchCliVersion` resolves the integrity (spawning workers), finds
nothing to swap, returns. The version prints, then the process hangs.

###
[`v11.0.9`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1109)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.8...v11.0.9)

##### Patch Changes

- Fixed installation of GitLab-hosted dependencies. pnpm now downloads
the tarball from
`https://gitlab.com/<user>/<project>/-/archive/<sha>/<project>-<sha>.tar.gz`
instead of the GitLab API endpoint that contained an encoded slash
(`%2F`) between user and project. The encoded slash both triggered `406
Not Acceptable` responses from GitLab and produced virtual store
directory names that Node refused to import
(`ERR_INVALID_MODULE_SPECIFIER`)
[#&#8203;11533](https://redirect.github.com/pnpm/pnpm/issues/11533).
- Honor `NPM_CONFIG_USERCONFIG` (and its lowercase
`npm_config_userconfig` form) as a low-priority fallback when locating
the user-level `.npmrc`. This restores compatibility with environments
that point npm at a custom auth file via that env var — most notably
`actions/setup-node`, which writes registry credentials to
`${runner.temp}/.npmrc` and exports `NPM_CONFIG_USERCONFIG` to reference
it. Without this, GitHub Actions workflows using `actions/setup-node` to
authenticate to private registries broke after upgrading to pnpm v11.
PNPM-prefixed env vars and `npmrcAuthFile` from the global `config.yaml`
continue to take precedence
[#&#8203;11539](https://redirect.github.com/pnpm/pnpm/issues/11539).
- Fix `pnpm pack` not bundling dependencies listed in
`bundleDependencies` (or `bundledDependencies`). The npm-packlist
upgrade in pnpm 11 changed its API to require the caller to pre-populate
the dependency tree, which the wrapper was not doing —
`bundleDependencies` were silently dropped from the tarball
[#&#8203;11519](https://redirect.github.com/pnpm/pnpm/issues/11519).
- Fixed the pnpm CLI crashing with a confusing `SyntaxError: Invalid
regular expression flags` instead of printing a clear "requires Node.js
v22.13" error when launched on an unsupported Node.js version. The
Node.js version check in `bin/pnpm.mjs` was effectively dead code
because the static `import` of the bundled `dist/pnpm.mjs` was hoisted
by the ES module loader and parsed before the check could run
[#&#8203;11546](https://redirect.github.com/pnpm/pnpm/issues/11546).
- Fixed `pnpm --prefix=<dir> install` overwriting the existing
`pnpm-workspace.yaml` in `<dir>` with `set this to true or false`
placeholders. The renamed `--prefix` option (which maps to `dir`) was
not honored when locating the workspace root, so the workspace
manifest's `allowBuilds` settings were not loaded into config and got
clobbered when ignored builds were auto-populated
[#&#8203;11535](https://redirect.github.com/pnpm/pnpm/issues/11535).
- Fixed `pnpm publish --provenance` failing with a 422 from the registry
when the package version contained semver build metadata (e.g.
`1.0.0-canary.0+abc1234`). The `+<build>` segment is now stripped before
packing so that the version embedded in the tarball, the metadata sent
to the registry, and the sigstore provenance subject all agree
[#&#8203;11518](https://redirect.github.com/pnpm/pnpm/issues/11518).

###
[`v11.0.8`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1108)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.7...v11.0.8)

##### Patch Changes

- Restored the heuristic that preserves tarball URLs in `pnpm-lock.yaml`
when they cannot be derived from name+version+registry, even with the
default `lockfileIncludeTarballUrl: false`. Without this, `pnpm install
--frozen-lockfile` from an empty store fails with `ERR_PNPM_FETCH_404`
for packages on registries that serve tarballs from a non-standard path
— most notably GitHub Packages
(`https://npm.pkg.github.com/download/<scope>/<name>/<version>/<hash>`)
and JSR. `lockfileIncludeTarballUrl: true` continues to force the URL
into the lockfile for every package
[#&#8203;11276](https://redirect.github.com/pnpm/pnpm/issues/11276).
- Run `preversion`, `version`, and `postversion` lifecycle scripts for
`pnpm version`.
- Fixed `ERR_PNPM_BAD_TARBALL_SIZE` when a registry serves tarballs with
an end-to-end `Content-Encoding` (e.g. `gzip`). Tarballs are already
compressed, so the fetcher now requests them with `Accept-Encoding:
identity` (matching pnpm v10's effective behavior) and, as defense in
depth against misbehaving servers, no longer enforces the strict
`Content-Length` check when the response declares a `Content-Encoding` —
`Content-Length` in that case refers to the encoded payload, not the
decoded bytes the fetch implementation yields
[#&#8203;11506](https://redirect.github.com/pnpm/pnpm/issues/11506).

###
[`v11.0.7`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1107)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.6...v11.0.7)

##### Patch Changes

- Restore the execute bit on the `node-gyp` shims packed inside
`@pnpm/exe` (`dist/node-gyp-bin/node-gyp`,
`dist/node-gyp-bin/node-gyp.cmd`, and
`dist/node_modules/node-gyp/bin/node-gyp.js`). Without this,
`pnpm/action-setup`'s standalone path (used on runners with Node.js <
22.13) failed any install whose lifecycle script invoked `node-gyp
rebuild` with `sh: 1: node-gyp: Permission denied`
[#&#8203;11483](https://redirect.github.com/pnpm/pnpm/issues/11483).

- Fixed the `pn`, `pnpx`, and `pnx` aliases failing in Git Bash / MSYS2
on Windows when pnpm was installed via `@pnpm/exe` (or after `pnpm
self-update`)
[#&#8203;11486](https://redirect.github.com/pnpm/pnpm/issues/11486).
Running `pnpx` (or `pnx`) printed the cmd.exe banner and dropped the
user into an interactive command prompt instead of running `pnpm dlx`.
The `bin` field rewrite on Windows was pointing those aliases at `.cmd`
files; cmd-shim's Bash shim for a `.cmd` target wraps it in `exec cmd /C
...`, and MSYS2 mangles `/C` into a Windows path before cmd.exe sees it.
The aliases are now `.exe` hardlinks of the SEA binary, which detects
which name it was launched as via `process.execPath` and prepends `dlx`
for `pnpx` / `pnx`.

- Fix `pnpm install` recreating `node_modules` after `pnpm fetch`. `pnpm
fetch` records empty `hoistPattern` and `publicHoistPattern` in
`.modules.yaml`; since v11 removed the explicit-config gate, the
follow-up install treated those as a hoist-pattern change and purged the
modules directory. The fetch step now flags the modules manifest with
`virtualStoreOnly: true` so the next install skips the hoist-pattern
comparison and completes the missing post-import linking in place
[#&#8203;11488](https://redirect.github.com/pnpm/pnpm/issues/11488).

- Pin the integrity of git-hosted tarballs (codeload.github.com,
gitlab.com, bitbucket.org) in the lockfile so that subsequent installs
detect a tampered or substituted tarball and refuse to install it.
Previously the lockfile only stored the tarball URL for git
dependencies, so a compromised git host or a man-in-the-middle could
serve arbitrary code on later installs without lockfile changes.

A new `gitHosted: true` field is recorded on git-hosted tarball
resolutions in the lockfile, letting every reader/writer route them by a
single typed check instead of pattern-matching the tarball URL in each
call site. Lockfiles written by older pnpm versions are enriched on load
(URL fallback) so the field can be relied on uniformly across the
codebase.

- Allow user-level preferences in the global `config.yaml`. The
following settings can now be set in `~/.config/pnpm/config.yaml` (or
via `pnpm config set --location global`) instead of being restricted to
`pnpm-workspace.yaml`: `agent`, `globalVirtualStoreDir`,
`initPackageManager`, `initType`, `registrySupportsTimeField`,
`scriptShell`, `shellEmulator`, `sideEffectsCache`,
`sideEffectsCacheReadonly`, `stateDir`, `strictDepBuilds`,
`trustPolicy`, `trustPolicyExclude`, `trustPolicyIgnoreAfter`,
`updateNotifier`, `useStderr`, `verifyDepsBeforeRun`,
`verifyStoreIntegrity`, `virtualStoreDir`, `virtualStoreDirMaxLength`
[#&#8203;11474](https://redirect.github.com/pnpm/pnpm/issues/11474).

- Make trusted publishing (OIDC) take precedence over a configured
static `_authToken` in `pnpm publish`, mirroring the npm CLI's behavior.
When OIDC succeeds, the OIDC-derived token overrides any pre-configured
`_authToken`; when OIDC is not applicable (no CI environment, exchange
fails, registry has no trusted publisher configured), the static token
is used as a fallback. This applies on every package during recursive
publish, so each workspace package independently attempts trusted
publishing.

Additionally, the `NPM_ID_TOKEN` env var is now honored as a CI-agnostic
injection point for an OIDC ID token. Previously OIDC was only attempted
on GitHub Actions or GitLab; now any CI provider that exposes its own
OIDC mechanism (e.g. CircleCI's `CIRCLE_OIDC_TOKEN_V2`, Buildkite, etc.)
can forward its token via `NPM_ID_TOKEN` and trusted publishing will
work without pnpm needing to recognize the provider explicitly.

- `--pm-on-fail=ignore` (and other universal options like `--loglevel`,
`--reporter`) is now honored when combined with `--help` or `--version`.
Previously the CLI argument parser short-circuited those flags before
universal options were preserved, so `pnpm audit --pm-on-fail=ignore
--help` and `pnpm --pm-on-fail=ignore --version` reported the strict
packageManager mismatch instead of running the requested action
[#&#8203;11487](https://redirect.github.com/pnpm/pnpm/issues/11487).

- Fix a regression where `pnpm --recursive --filter '!<pkg>'
run/exec/test/add` would include the workspace root in the matched
projects. The workspace root is now correctly excluded by default when
only negative `--filter` arguments are provided, matching the
[documented behavior](https://pnpm.io/cli/recursive). To include the
root, pass `--include-workspace-root`
[#&#8203;11341](https://redirect.github.com/pnpm/pnpm/issues/11341).

- Restore npm-CLI-compatible `--json` stdout output for `pnpm publish`
([#&#8203;11476](https://redirect.github.com/pnpm/pnpm/issues/11476)).
pnpm 11 reimplemented publish natively
([#&#8203;10591](https://redirect.github.com/pnpm/pnpm/pull/10591)) and
inadvertently dropped the per-package JSON object that pnpm 10 emitted
transitively via the npm CLI, silently breaking downstream tooling —
most notably `nx release publish`, which parses stdout JSON to confirm
success
([nrwl/nx#35575](https://redirect.github.com/nrwl/nx/issues/35575)). On
success, the output is now:

- `pnpm publish --json` → single object `{ id, name, version, size,
unpackedSize, shasum, integrity, filename, files, entryCount, bundled
}`, mirroring `npm publish --json`.
- `pnpm publish -r --json` → array of those objects, mirroring `pnpm
pack --json`'s shape choice.
- `pnpm publish -r --report-summary` → existing
`pnpm-publish-summary.json` envelope `{ publishedPackages: [...] }` is
preserved, but each entry is upgraded to the same per-package shape
(additive — `name` and `version` are still present).

- `pnpm config get @&#8203;<scope>:registry` now reports the same URL
that `pnpm publish` and the resolvers actually use. Previously, `config
get` only consulted `.npmrc`, while `publish`/install used the merged
map that includes `pnpm-workspace.yaml`'s `registries` block — so the
two could diverge silently and a publish could go to the wrong registry
[#&#8203;11492](https://redirect.github.com/pnpm/pnpm/issues/11492).

###
[`v11.0.6`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1106)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.5...v11.0.6)

##### Patch Changes

- Fix `pnpm_config_npmrc_auth_file` and `pnpm_config_userconfig` env
vars not actually loading the custom `.npmrc`. The env vars were parsed
and assigned to the resolved config, but only after `loadNpmrcConfig`
had already read the default `~/.npmrc` — so the custom file path was
set but never read. The relevant env vars are now consulted before the
user-level `.npmrc` is loaded
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).
- Preserve the original key order in `pnpm-workspace.yaml` when updating
it. Existing keys keep their position, and new keys are inserted in
alphabetical position when the existing keys are already sorted (with a
leading `packages` key allowed) or appended at the end otherwise.
- Fixed `pnpm self-update` on installations originally set up by pnpm
v10. v10 added `PNPM_HOME` directly to PATH and wrote a `pnpm` bootstrap
shim there. v11 setup writes shims under `PNPM_HOME/bin` instead, so
when a v10 user upgrades to v11 the legacy shim at `PNPM_HOME` keeps
pointing into the old `.tools/<version>` install — `pnpm --version`
continues to report the pre-update version even though the new version
was installed under `global/v11`. Self-update now detects this layout,
refreshes the legacy shims so the upgrade actually takes effect, and
prints a hint suggesting `pnpm setup` to migrate PATH to the v11 layout.
[#&#8203;11464](https://redirect.github.com/pnpm/pnpm/issues/11464).
- Print a warning when settings that are not allowed in the global
config file (e.g. `nodeLinker`, `hoistPattern`) are present in
`config.yaml` and silently ignored. Previously these settings were
dropped without any feedback, leaving users unsure why their global
configuration had no effect. The warning suggests moving those settings
to a project-level `pnpm-workspace.yaml`, or sharing them across
projects via [config
dependencies](https://pnpm.io/11.x/config-dependencies).
- Throw a pnpm error when `overrides` has an invalid shape or contains a
non-string value.
- Validate all `readPackage` dependency map fields, including
`devDependencies`, and reject falsy non-object invalid values instead of
silently accepting them.
- Prevent crashes during `pnpm config`, `pnpm set`, and `pnpm get` by
tolerating `configDependencies` install failures. For these commands, a
failure to install `configDependencies` (for example because the
registry auth token has not been written yet) is now logged at debug
level and the command proceeds. All other commands still surface the
install error
[#&#8203;10684](https://redirect.github.com/pnpm/pnpm/issues/10684).
- Treat `allowBuilds` as an install-state input and clear previously
ignored builds when they are explicitly disallowed.
- Fixes
[#&#8203;10594](https://redirect.github.com/pnpm/pnpm/issues/10594),
catalogs not being read from the workspace when using the `catalog:`
protocol with the `pnpm dlx` / `pnpx` command, resulting in a catalog
entry not found error.
- Accept `PNPM_CONFIG_*` (uppercase) environment variables in addition
to `pnpm_config_*`. Previously, only the lowercase form was honored, so
env vars renamed per the v11 migration guide (e.g.
`PNPM_CONFIG_USERCONFIG`) silently had no effect on case-sensitive
systems like macOS and Linux
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).

###
[`v11.0.5`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1105)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.4...v11.0.5)

##### Patch Changes

- Drop the `darwin-x64` artifact from `@pnpm/exe` and from the GitHub
release page. The Node.js SEA mechanism `pnpm pack-app` uses produces a
binary that segfaults at startup on Intel Macs because of an upstream
Node.js bug
([nodejs/node#62893](https://redirect.github.com/nodejs/node/issues/62893),
tracked alongside
[#&#8203;59553](https://redirect.github.com/nodejs/node/issues/59553);
the Node.js team has [opted not to fix
it](https://redirect.github.com/nodejs/node/pull/60250) on the grounds
that x64 macOS is being phased out). Re-signing with `codesign` or
`ldid` doesn't help — the corruption is in LIEF's Mach-O surgery, before
signing.

Intel Mac users should install pnpm via `npm install -g pnpm` (uses the
system Node.js, no SEA), or stay on pnpm 10.x. `@pnpm/exe`'s preinstall
on Intel Mac now exits with a clear error pointing at these
alternatives.

Closes
[#&#8203;11423](https://redirect.github.com/pnpm/pnpm/issues/11423).

- `pnpm dlx` (and `pnpx`/`pnx`/`pnpm create`) now runs the same
interactive `approve-builds` prompt as `pnpm add -g` when the package
being launched depends on transitive packages with install scripts.
Previously, the v11 `strictDepBuilds` default made dlx fail with
`ERR_PNPM_IGNORED_BUILDS` and required users to re-run with
`--allow-build=<pkg>` for every offending dependency. dlx also now
removes the partially-populated cache directory when the install fails,
so a subsequent run starts clean instead of reusing a broken install
whose builds were silently skipped
[#&#8203;11444](https://redirect.github.com/pnpm/pnpm/issues/11444).

- [`72629fc`](https://redirect.github.com/pnpm/pnpm/commit/72629fc): Fix
`pnpm -g ls --json` and `pnpm -g ls --parseable` so they emit valid JSON
and parseable output respectively, matching pnpm 10 behavior. Since the
isolated global packages refactor in pnpm 11, the global list command
had a custom path that always printed plain text and ignored
`--json`/`--parseable`, which broke tools like `npm-check-updates` that
parse the JSON output
[#&#8203;11440](https://redirect.github.com/pnpm/pnpm/issues/11440).

`pnpm -g ls --depth=<n>` (with n > 0) now errors when more than one
isolated global install would be involved, since each install has its
own lockfile and merging their transitive trees would be incoherent.
When the request can be narrowed to a single install group, the regular
`list` flow is used and the full dependency tree is shown.

- Fixed `pnpm publish` to honor `publishConfig.registry` from
`package.json` when publishing a single package. The native publish flow
introduced in v11 was reading the registry from `.npmrc` only, ignoring
the per-package override
[#&#8203;11419](https://redirect.github.com/pnpm/pnpm/issues/11419).

- When `strictPeerDependencies` is `true`, the
`ERR_PNPM_PEER_DEP_ISSUES` error once again renders the peer dependency
issues inline using the same format as `pnpm peers check`, so users (and
CI tools like Renovate) can see what failed without running `pnpm peers
check` separately
[#&#8203;11439](https://redirect.github.com/pnpm/pnpm/issues/11439).

- The `WARN` and error code labels in pnpm's output now wrap in brackets
(`[WARN]`, `[ERR_PNPM_FOO]`). Previously the labels relied entirely on a
colored background to stand out, which meant they blended into the
surrounding text in terminals without color (e.g. when `NO_COLOR` is set
or output is piped). The brackets are painted in the same color as the
badge background, so they appear as ordinary padding in color-capable
terminals — only the no-color rendering changes.

###
[`v11.0.4`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1104)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.3...v11.0.4)

##### Patch Changes

- Fixed `pnpm ci` not reinstalling workspace package `node_modules`
directories after the clean step
[#&#8203;11427](https://redirect.github.com/pnpm/pnpm/issues/11427).
- Remove pnpm's workspace state file when cleaning node\_modules so
`pnpm ci` performs a fresh install after the clean step.
- Do not remove `pnpm-lock.yaml` during `pnpm clean` when `lockfile:
true` is configured in `pnpm-workspace.yaml`. The lockfile is only
removed when the `--lockfile` option is passed to `pnpm clean`.
- `pnpm self-update` (with no version argument) no longer downgrades
pnpm when the registry's `latest` dist-tag points to an older release
than the currently active version. Run `pnpm self-update latest` to
force a downgrade
[#&#8203;11418](https://redirect.github.com/pnpm/pnpm/issues/11418).
- `minimumReleaseAgeStrict` now defaults to `true` whenever the user
explicitly sets `minimumReleaseAge` (via `pnpm-workspace.yaml`, the
global `config.yaml`, the CLI, or `pnpm_config_*` env vars).

###
[`v11.0.3`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1103)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.2...v11.0.3)

##### Patch Changes

- Fix too many open files error sometimes happening on Windows, when
creating command shims in `node_modules/.bin`
[#&#8203;11412](https://redirect.github.com/pnpm/pnpm/issues/11412).
- Fix `ERR_PNPM_FETCH_404` when installing a project whose lockfile
depends on a `file:` tarball. The previous behavior dropped the
`tarball` field from `file:` and git-hosted resolutions when
`lockfile-include-tarball-url=false` (the default), even though those
URLs cannot be reconstructed from the package name, version, and
registry
[#&#8203;11407](https://redirect.github.com/pnpm/pnpm/issues/11407).

###
[`v11.0.2`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1102)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.1...v11.0.2)

##### Patch Changes

- Fix `ENOENT` symlink failure when `pnpm add -g` triggers the
approve-builds prompt. The global add flow used to forward an absolute
`modulesDir` (`<installDir>/node_modules`) into the install run by
`approve-builds`. The install layer treated `modulesDir` as a path
relative to `lockfileDir` and joined it again, producing a doubled path
on Windows because `path.join` does not collapse an embedded absolute
path. The hoist step then tried to `mkdir` and symlink under
`<installDir>\<installDir>\node_modules\.pnpm\node_modules\...` and
failed with `ENOENT`
[#&#8203;11403](https://redirect.github.com/pnpm/pnpm/issues/11403).
- Fixed `packageManagerDependencies` going stale when pnpm is invoked
through corepack. The lockfile sync (and the `devEngines.packageManager`
version check) previously ran only when pnpm was invoked directly; under
corepack the entire block was skipped, so a stale entry would persist
even after the running pnpm version changed. The lockfile sync now runs
regardless of how pnpm was invoked, while the pnpm-managed version
switch (`onFail: 'download'`) remains skipped under corepack so it
doesn't fight corepack's own version selection
[#&#8203;11397](https://redirect.github.com/pnpm/pnpm/issues/11397).
- Fix recursive publish summaries to report the manifest from
`publishConfig.directory` when packages publish from a generated
directory
[#&#8203;11239](https://redirect.github.com/pnpm/pnpm/issues/11239).
- Fix negated `os` / `cpu` entries (e.g. `["!win32"]`) being incorrectly
rejected when `supportedArchitectures` expands to multiple platforms
[#&#8203;11375](https://redirect.github.com/pnpm/pnpm/pull/11375).

###
[`v11.0.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1101)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.0...v11.0.1)

##### Patch Changes

- Report unknown top-level options before falling back to implicit `pnpm
run` scripts.
- Reject `null` named catalogs in workspace manifests with
`InvalidWorkspaceManifestError` instead of crashing with a raw
`TypeError`.
- Populate download location for git-sourced dependencies in SBOM
output. Previously `pnpm sbom` emitted `NOASSERTION` (SPDX) and omitted
the distribution reference (CycloneDX) for git dependencies. Now emits
the git URL with commit hash, e.g.
`git+https://github.com/user/repo.git#commit`.
- `pnpm self-update` now keeps `package.json`'s `packageManager` and
`devEngines.packageManager` in sync. When the legacy `packageManager`
field pins pnpm, both fields are rewritten to the new exact pnpm version
on update — `packageManager` to `pnpm@<version>` (without an integrity
hash), and `devEngines.packageManager.version` to the same exact
`<version>` (dropping any range operator). When only
`devEngines.packageManager` is declared, the existing range-preserving
behavior is unchanged
[#&#8203;11388](https://redirect.github.com/pnpm/pnpm/issues/11388).
- Sort the keys of the overrides object returned by `pnpm audit --fix`
so that the log output order matches the order written to
`pnpm-workspace.yaml`.
- Update the env lockfile's `packageManagerDependencies` entry when
`devEngines.packageManager` declares a pnpm version that the lockfile no
longer satisfies. Previously, the stale entry was kept even though the
running pnpm matched the declared version, silently breaking the
integrity record
[#&#8203;11387](https://redirect.github.com/pnpm/pnpm/issues/11387).

###
[`v11.0.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1100)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v10.33.4...v11.0.0)

##### Highlights

##### Major

- **Node.js 22+ required** — support for Node 18, 19, 20, and 21 is
dropped, pnpm itself is now pure ESM, and the standalone exe requires
glibc 2.27.
- **Supply-chain protection on by default** — `minimumReleaseAge`
defaults to 1 day (newly published packages are not resolved for 24h)
and `blockExoticSubdeps` defaults to `true`.
- **`allowBuilds` replaces the old build-dependency settings** —
`onlyBuiltDependencies`, `onlyBuiltDependenciesFile`,
`neverBuiltDependencies`, `ignoredBuiltDependencies`, and
`ignoreDepScripts` have been removed.
- **Global installs are isolated and use the global virtual store by
default** — each `pnpm add -g` gets its own directory with its own
`package.json`, `node_modules`, and lockfile.
- **New SQLite-backed store index** (store v11) with bundled manifests
and hex digests, reducing filesystem syscalls and speeding up
installation.
- **Native publish flow** — [`pnpm
publish`](https://pnpm.io/11.x/cli/publish),
[`login`](https://pnpm.io/11.x/cli/login),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`view`](https://pnpm.io/11.x/cli/view),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) no longer delegate to the
npm CLI, and the remaining npm passthrough commands now throw "not
implemented".
- **[`pnpm audit`](https://pnpm.io/11.x/cli/audit) uses npm's bulk
advisories endpoint** — the legacy `/security/audits` endpoints are
gone. CVE-based filtering has been replaced with GHSA-based filtering:
migrate `auditConfig.ignoreCves` entries to `auditConfig.ignoreGhsas`.
- **`.npmrc` is auth/registry only** — all other settings must live in
`pnpm-workspace.yaml` or the new global `config.yaml`, and environment
variables use the `pnpm_config_*` prefix.
- **Runtime installs are slimmer** — installing a Node.js runtime via
`node@runtime:<version>` no longer extracts the bundled `npm`, `npx`,
and `corepack`, roughly halving the files pnpm has to hash, write, and
link.

##### Minor

- **New commands:** [`pnpm ci`](https://pnpm.io/11.x/cli/ci), [`pnpm
sbom`](https://pnpm.io/11.x/cli/sbom), [`pnpm
clean`](https://pnpm.io/11.x/cli/clean), [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers), [`pnpm runtime
set`](https://pnpm.io/11.x/cli/runtime), [`pnpm
docs`](https://pnpm.io/11.x/cli/docs)/`home`, [`pnpm
ping`](https://pnpm.io/11.x/cli/ping), [`pnpm
search`](https://pnpm.io/11.x/cli/search), [`pnpm
star`](https://pnpm.io/11.x/cli/star)/`unstar`/`stars`, [`pnpm
whoami`](https://pnpm.io/11.x/cli/whoami), [`pnpm
with`](https://pnpm.io/11.x/cli/with), and [`pnpm
pack-app`](https://pnpm.io/11.x/cli/pack-app), plus
`pn`/[`pnx`](https://pnpm.io/11.x/cli/pnx) short aliases.
- **ESM pnpmfiles** via `.pnpmfile.mjs`, which takes priority over
`.pnpmfile.cjs` when present.
- **[`pnpm audit --fix=update`](https://pnpm.io/11.x/cli/audit)** fixes
vulnerabilities by updating packages in the lockfile instead of adding
overrides, and `pnpm audit --fix --interactive` lets you select which
advisories to fix.
- **[`pnpm pack-app`](https://pnpm.io/11.x/cli/pack-app)** packs a
CommonJS entry into a standalone executable for one or more target
platforms using Node.js Single Executable Applications.
- **Faster HTTP and I/O** — undici with Happy Eyeballs, direct-to-CAS
writes, skipped staging directory, pre-allocated tarball downloads, and
an NDJSON metadata cache.

##### Major Changes

##### Requirements

- pnpm is now distributed as pure ESM.
- Dropped support for Node.js v18, 19, 20, and 21.
- The standalone exe version of pnpm requires at least glibc 2.27.

##### Security & Build Defaults

- Changed default values: `optimisticRepeatInstall` is now `true`,
`verifyDepsBeforeRun` is now `install`, `minimumReleaseAge` is now
`1440` (1 day), and `minimumReleaseAgeStrict` is `false`. Newly
published packages will not be resolved until they are at least 1 day
old. This protects against supply chain attacks by giving the community
time to detect and remove compromised versions. To opt out, set
`minimumReleaseAge: 0` in `pnpm-workspace.yaml`
[#&#8203;11158](https://redirect.github.com/pnpm/pnpm/pull/11158).

- `strictDepBuilds` is `true` by default.

- `blockExoticSubdeps` is `true` by default.

- Removed deprecated build dependency settings: `onlyBuiltDependencies`,
`onlyBuiltDependenciesFile`, `neverBuiltDependencies`,
`ignoredBuiltDependencies`, and `ignoreDepScripts`
[#&#8203;11220](https://redirect.github.com/pnpm/pnpm/pull/11220).

Use the `allowBuilds` setting instead. It is a map where keys are
package name patterns and values are booleans:

  - `true` means the package is allowed to run build scripts
- `false` means the package is explicitly denied from running build
scripts

Same as before, by default, none of the packages in the dependencies are
allowed to run scripts. If a package has postinstall scripts and it
isn't declared in `allowBuilds`, an error is printed.

  Before:

  ```yaml
  onlyBuiltDependencies:
    - electron
  onlyBuiltDependenciesFile: "allowed-builds.json"
  neverBuiltDependencies:
    - core-js
  ignoredBuiltDependencies:
    - esbuild
  ```

  After:

  ```yaml
  allowBuilds:
    electron: true
    core-js: false
    esbuild: false
  ```

- Removed `allowNonAppliedPatches` in favor of `allowUnusedPatches`.

- Removed `ignorePatchFailures`; patch application failures now throw an
error.

##### Store

- Runtime dependencies are always linked from the global virtual store
[#&#8203;10233](https://redirect.github.com/pnpm/pnpm/pull/10233).
- Optimized index file format to store the hash algorithm once per file
instead of repeating it for every file entry. Each file entry now stores
only the hex digest instead of the full integrity string
(`<algo>-<digest>`). Using hex format improves performance since file
paths in the content-addressable store use hex representation,
eliminating base64-to-hex conversion during path lookups.
- Store version bumped to v11.
- The bundled manifest (name, version, bin, engines, scripts, etc.) is
now stored directly in the package index file, eliminating the need to
read `package.json` from the content-addressable store during resolution
and installation. This reduces I/O and speeds up repeat installs
[#&#8203;10473](https://redirect.github.com/pnpm/pnpm/pull/10473).
- The package index in the content-addressable store is now backed by
SQLite. Instead of individual JSON files under `$STORE/index/`, package
metadata is stored in a single SQLite database at `$STORE/index.db` with
MessagePack-encoded values. This reduces filesystem syscall overhead,
improves space efficiency for small metadata entries, and enables
concurrent access via SQLite's WAL mode. Packages missing from the new
index are re-fetched on demand
[#&#8203;10500](https://redirect.github.com/pnpm/pnpm/pull/10500)
[#&#8203;10826](https://redirect.github.com/pnpm/pnpm/issues/10826).

##### Global Packages

- Global installs (`pnpm add -g pkg`) and `pnx` now use the global
virtual store by default. Packages are stored at `{storeDir}/links`
instead of per-project `.pnpm` directories. This can be disabled by
setting `enableGlobalVirtualStore: false`
[#&#8203;10694](https://redirect.github.com/pnpm/pnpm/pull/10694).

- Isolated global packages. Each globally installed package (or group of
packages installed together) now gets its own isolated installation
directory with its own `package.json`, `node_modules/`, and lockfile.
This prevents global packages from interfering with each other through
peer dependency conflicts, hoisting changes, or version resolution
shifts.

  Key changes:

- `pnpm add -g <pkg>` creates an isolated installation in
`{pnpmHomeDir}/global/v11/{hash}/`
- `pnpm remove -g <pkg>` removes the entire installation group
containing the package
- `pnpm update -g [pkg]` re-installs packages in new isolated
directories
- `pnpm list -g` scans isolated directories to show all installed global
packages
- `pnpm install -g` (no args) is no longer supported; use `pnpm add -g
<pkg>` instead

- Globally installed binaries are now stored in a `bin` subdirectory of
`PNPM_HOME` instead of directly in `PNPM_HOME`. This prevents internal
directories like `global/` and `store/` from polluting shell
autocompletion when `PNPM_HOME` is on PATH
[#&#8203;10986](https://redirect.github.com/pnpm/pnpm/issues/10986).
After upgrading, run `pnpm setup` to update your shell configuration.

- Breaking changes to `pnpm link`:

- `pnpm link <pkg-name>` no longer resolves packages from the global
store. Only relative or absolute paths are accepted. For example, use
`pnpm link ./foo` instead of `pnpm link foo`.
- `pnpm link --global` is removed. Use `pnpm add -g .` to register a
local package's bins globally.
- `pnpm link` (no arguments) is removed. Use `pnpm link <dir>` with an
explicit path instead.

##### Configuration

- pnpm no longer reads all settings from `.npmrc`. Only auth and
registry settings are read from `.npmrc` files. All other settings (like
`hoistPattern`, `nodeLinker`, `shamefullyHoist`, etc.) must be
configured in `pnpm-workspace.yaml` or the global
`~/.config/pnpm/config.yaml`
[#&#8203;11189](https://redirect.github.com/pnpm/pnpm/pull/11189).

- Network settings (`httpProxy`, `httpsProxy`, `noProxy`,
`localAddress`, `strictSsl`, `gitShallowHosts`) are now written to
`config.yaml` (global) or `pnpm-workspace.yaml` (local) instead of
`.npmrc`/`auth.ini`. They are still readable from `.npmrc` for easier
migration from the npm CLI
[#&#8203;11209](https://redirect.github.com/pnpm/pnpm/pull/11209).

pnpm no longer reads `npm_config_*` environment variables. Use
`pnpm_config_*` environment variables instead (e.g.,
`pnpm_config_registry` instead of `npm_config_registry`).

  pnpm no longer reads the npm global config at `$PREFIX/etc/npmrc`.

  `pnpm login` writes auth tokens to `~/.config/pnpm/auth.ini`.

  New `registries` setting in `pnpm-workspace.yaml`:

  ```yaml
  registries:
    default: https://registry.npmjs.org/
    "@&#8203;my-org": https://private.example.com/
    "@&#8203;internal": https://nexus.corp.com/
  ```

Auth tokens in `~/.npmrc` still work — pnpm continues to read `~/.npmrc`
as a fallback for registry authentication. The new `npmrcAuthFile`
setting can be used to point to a different file instead of `~/.npmrc`.

- Replace workspace project specific `.npmrc` with `packageConfigs` in
`pnpm-workspace.yaml`.

  A workspace manifest with `packageConfigs` looks something like this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    "project-1":
      saveExact: true
    "project-2":
      savePrefix: "~"
  ```

  Or this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    - match: ["project-1", "project-2"]
      modulesDir: "node_modules"
      saveExact: true
  ```

- pnpm no longer reads settings from the `pnpm` field of `package.json`.
Settings should be defined in `pnpm-workspace.yaml`
[#&#8203;10086](https://redirect.github.com/pnpm/pnpm/pull/10086).

- `pnpm config get` (without `--json`) no longer prints INI formatted
text. Instead, it prints JSON for objects and arrays, and raw strings
for strings, numbers, booleans, and nulls. `pnpm config get --json`
still prints all types of values as JSON, as before.

- `pnpm config get <array>` now prints a JSON array.

- `pnpm config list` now prints a JSON object instead of INI formatted
text.

- `pnpm config list` and `pnpm config get` (without argument) now hide
auth-related settings.

- `pnpm config list` and `pnpm config get` (without argument) now show
top-level keys as camelCase. Exception: keys that start with `@` or `//`
are preserved (their cases don't change).

- `pnpm config get` and `pnpm config list` no longer load non-camelCase
options from the workspace manifest (`pnpm-workspace.yaml`).

##### Removed Commands & npm Passthrough

- pnpm no longer falls back to the npm CLI. Commands that were
previously passed through to npm (`access`, `bugs`, `docs`, `edit`,
`find`, `home`, `issues`, `owner`, `ping`, `prefix`, `profile`, `pkg`,
`repo`, `search`, `set-script`, `star`, `stars`, `team`, `token`,
`unstar`, `whoami`, `xmas`) and their aliases (`s`, `se`) now throw a
"not implemented" error, with a suggestion to use the npm CLI directly
[#&#8203;10642](https://redirect.github.com/pnpm/pnpm/pull/10642). Other
previously passed-through commands —
[`view`](https://pnpm.io/11.x/cli/view) (`info`, `show`, `v`),
[`login`](https://pnpm.io/11.x/cli/login) (`adduser`),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) — have been reimplemented
natively in pnpm (see New Commands below).

- [`pnpm publish`](https://pnpm.io/11.x/cli/publish) now works without
the `npm` CLI.

The One-time Password feature now reads from `PNPM_CONFIG_OTP` instead
of `NPM_CONFIG_OTP`:

  ```sh
  export PNPM_CONFIG_OTP='<your OTP here>'
  pnpm publish --no-git-checks
  ```

If the registry requests OTP and the user has not provided it via the
`PNPM_CONFIG_OTP` environment variable or the `--otp` flag, pnpm will
prompt the user directly for an OTP code.

If the registry requests web-based authentication, pnpm will print a
scannable QR code along with the URL.

Since the new `pnpm publish` no longer calls `npm publish`, some
undocumented features may have been unknowingly dropped. If you rely on
a feature that is now gone, please open an issue at
<https://github.com/pnpm/pnpm/issues>. In the meantime, you can use
`pnpm pack && npm publish *.tgz` as a workaround.

- Removed the `pnpm server` command
[#&#8203;10463](https://redirect.github.com/pnpm/pnpm/pull/10463).

- Removed support for the `useNodeVersion` and
`executionEnv.nodeVersion` fields. `devEngines.runtime` and
`engines.runtime` should be used instead
[#&#8203;10373](https://redirect.github.com/pnpm/pnpm/pull/10373).

- Removed support for `hooks.fetchers`. We now have a new API for custom
fetchers and resolvers via the `fetchers` field of `pnpmfile`.

##### Lifecycle Scripts

- pnpm no longer populates `npm_config_*` environment variables from the
pnpm config during lifecycle scripts. Only well-known `npm_*` env vars
are now set, matching Yarn's behavior
[#&#8203;11116](https://redirect.github.com/pnpm/pnpm/pull/11116).

##### CLI Output

- Cleaner output for script execution: pnpm now prints `$ command`
instead of `> pkg@version stage path\n> command`, and shows project name
and path only when running in a different directory. The `$ command`
line is printed to stderr to keep stdout clean for piping
[#&#8203;11132](https://redirect.github.com/pnpm/pnpm/pull/11132).
- During install, instead of rendering the full peer dependency issues
tree, pnpm now suggests running [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers) to view the issues
[#&#8203;11133](https://redirect.github.com/pnpm/pnpm/pull/11133).

##### Lockfile

- Simplified `patchedDependencies` lockfile format from `Record<string,
{ path: string, hash: string }>` to `Record<string, string>` (selector
to hash). Existing lockfiles with the old format are automatically
migrated
[#&#8203;10911](https://redirect.github.com/pnpm/pnpm/pull/10911).

##### Other

- The default value of the `type` field in the `package.json` file of
the project initialized by `pnpm init` command has been changed to
`module`.

- Added support for lowercase options in `pnpm add`: `-d`, `-p`, `-o`,
`-e` [#&#8203;9197](https://redirect.github.com/pnpm/pnpm/issues/9197).

  When using the `pnpm add` command only:

  - `-p` is now an alias for `--save-prod` instead of `--parseable`
  - `-d` is now an alias for `--save-dev` instead of `--loglevel=info`

- The root workspace project is no longer excluded when it is explicitly
selected via a filter
[#&#8203;10465](https://redirect.github.com/pnpm/pnpm/pull/10465).

##### Audit

- [`pnpm audit`](https://pnpm.io/11.x/cli/audit) now calls npm's
`/-/npm/v1/security/advisories/bulk` endpoint. The legacy
`/-/npm/v1/security/audits{,/quick}` endpoints have been retired by the
registry, so the legacy request/response contract is no longer
supported.

The bulk endpoint does not return CVE identifiers. CVE-based filtering
has been replaced with GitHub advisory ID (GHSA) filtering:

- `auditConfig.ignoreCves` → `auditConfig.ignoreGhsas` (the previous key
is no longer recognized)
- `pnpm audit --ignore <id>` / `pnpm audit --ignore-unfixable` now read
and write GHSAs instead of CVEs
- GHSAs are derived from each advisory's `url`
(`https://github.com/advisories/GHSA-xxxx-xxxx-xxxx`)

To migrate: replace each `CVE-YYYY-NNNNN` entry in your
`auditConfig.ignoreCves` with the corresponding `GHSA-xxxx-xxxx-xxxx`
value (visible in the `More info` column of `pnpm audit` output) and
move it under `auditConfig.ignoreGhsas`.

##### Package Manager Settings

- **Breaking:** removed the `managePackageManagerVersions`,
`packageManagerStrict`, and `packageManagerStrictVersion` settings. They
existed only to derive the `onFail` behavior for the legacy
`packageManager` field, and the `pmOnFail` setting introduced alongside
[`pnpm with`](https://pnpm.io/11.x/cli/with) subsumes all three — it
directly sets the `onFail` behavior of both `packageManager` and
`devEngines.packageManager`. The `COREPACK_ENABLE_STRICT` environment
variable is no longer honored (it only gated `packageManagerStrict`);
use `pmOnFail` instead.

  Migration:

| Removed setting | Replace with |
| ------------------------------------- | ------------------------------
|
| `managePackageManagerVersions: true` | `pmOnFail: download` (default)
|
| `managePackageManagerVersions: false` | `pmOnFail: ignore` |
| `packageManagerStrict: false` | `pmOnFail: warn` |
| `packageManagerStrictVersion: true` | `pmOnFail: error` |
| `COREPACK_ENABLE_STRICT=0` | `pmOnFail: warn` |

##### Runtime Installs

- Installing a Node.js runtime via `node@runtime:<version>` (including
`pnpm env use` and `pnpm runtime set node`) no longer extracts the
bundled `npm`, `npx`, and `corepack` from the Node.js archive. This cuts
roughly half of the files pnpm has to hash, write to the CAS, and link
during installation, making runtime installs noticeably faster. Users
who still need `npm` can install it as a separate package.

##### Minor Changes

##### New Commands

- Added native [`pnpm view`](https://pnpm.io/11.x/cli/view) (`info`,
`show`, `v`) command for viewing package metadata from the registry
[#&#8203;11064](https://redirect.github.com/pnpm/pnpm/pull/11064).
- Added [`pnpm login`](https://pnpm.io/11.x/cli/login) (and `pnpm
adduser` alias) command for authenticating with npm registries. Supports
web-based login with QR code as well as classic username/password login
[#&#8203;11094](https://redirect.github.com/pnpm/pnpm/pull/11094).
- Added [`pnpm logout`](https://pnpm.io/11.x/cli/logout) command for
logging out of npm registries. Revokes the authentication token on the
registry and removes it from the local auth config file
[#&#8203;11213](https://redirect.github.com/pnpm/pnpm/pull/11213).
- Added native [`pnpm deprecate`](https://pnpm.io/11.x/cli/deprecate)
and `pnpm undeprecate` commands for setting and removing deprecation
messages on package versions without delegating to the npm CLI
[#&#8203;11120](https://redirect.github.com/pnpm/pnpm/pull/11120).
- Added native [`pnpm unpublish`](https://pnpm.io/11.x/cli/unpublish)
command. Supports unpublishing specific versions, version ranges via
semver, and entire packages with `--force`
[#&#8203;11128](https://redirect.github.com/pnpm/pnpm/pull/11128).
- Added native [`pnpm dist-tag`](https://pnpm.io/11.x/cli/dist-tag)
command (`ls`, `add`, `rm` subcommands)
[#&#8203;11218](https://redirect.github.com/pnpm/pnpm/pull/11218).
- Added [`pnpm sbom`](https://pnpm.io/11.x/cli/sbom) command for
generating Software Bill of Materials in CycloneDX 1.7 and SPDX 2.3 JSON
formats
[#&#8203;9088](https://redirect.github.com/pnpm/pnpm/issues/9088).
- Added [`pnpm clean`](https://pnpm.io/11.x/cli/clean) command that
safely removes `node_modules` directories from all workspace projects
[#&#8203;10707](https://redirect.github.com/pnpm/pnpm/issues/10707). Use
`--lockfile` to also remove `pnpm-lock.yaml` files.
- Added a new command [`pnpm runtime set <runtime name> <runtime version
spec> [-g]`](https://pnpm.io/11.x/cli/runtime) for installing runtimes.
Deprecated `pnpm env use` in favor of the new command.
- Added the ability to fix vulnerabilities by updating packages in the
lockfile instead of adding overrides. Use [`pnpm audit
--fix=update`](https://pnpm.io/11.x/cli/audit)
[#&#8203;10341](https://redirect.github.com/pnpm/pnpm/pull/10341).
- Added [`pnpm ci`](https://pnpm.io/11.x/cli/ci) command for clean
installs
[#&#8203;6100](https://redirect.github.com/pnpm/pnpm/issues/6100). The
command runs `pnpm clean` followed by `pnpm install --frozen-lockfile`.
Designed for CI/CD environments where reproducible builds are critical.
Aliases: `pnpm clean-install`, `pnpm ic`, `pnpm install-clean`
[#&#8203;11003](https://redirect.github.com/pnpm/pnpm/pull/11003).
- Added [`pnpm peers check`](https://pnpm.io/11.x/cli/peers) command
that checks for unmet and missing peer dependency issues by reading the
lockfile
[#&#8203;7087](https://redirect.github.com/pnpm/pnpm/issues/7087).
- Implemented the [`version`](https://pnpm.io/11.x/cli/version) command
natively in pnpm to support workspaces and `workspace:` protocols
correctly. The new command allows bumping package versions (major,
minor, patch, etc.) with full workspace support and git integration
[#&#8203;10879](https://redirect.github.com/pnpm/pnpm/pull/10879).
- [`pnpm audit --fix`](https://pnpm.io/11.x/cli/audit) now supports a
new interactive mode via `--interactive`/`-i`.
- Added the [`pnpm docs`](https://pnpm.io/11.x/cli/docs) command and its
alias `pnpm home`. This command opens the package documentation or
homepage in the browser. When the package has no valid homepage, it
falls back to `https://npmx.dev/package/<name>`.
- Added native [`pnpm ping`](https://pnpm.io/11.x/cli/ping) command to
test registry connectivity. Provides a simple way to verify connectivity
to the configured registry without requiring external tools.
- Implemented native [`search`](https://pnpm.io/11.x/cli/search) command
and its aliases (`s`, `se`, `find`).
- Implemented native [`star`, `unstar`,
`stars`](https://pnpm.io/11.x/cli/star), and
[`whoami`](https://pnpm.io/11.x/cli/whoami) commands.
- Add [`pnpm with <version|current>
<args...>`](https://pnpm.io/11.x/cli/with) command. Runs pnpm at a
specific version (or the currently active one) for a single invocation,
bypassing the project's `packageManager` and `devEngines.packageManager`
pins.
- Added a new [`pnpm pack-app`](https://pnpm.io/11.x/cli/pack-app)
command that packs a CommonJS entry file into a standalone executable
for one or more target platforms, using the [Node.js Single Executable
Applications](https://nodejs.org/api/single-executable-applications.html)
API under the hood.

##### Configuration

- Added support for a global YAML config file named `config.yaml`.

  Configuration is now split into two categories:

- Registry and auth settings, which can be stored in INI files such as
the global `rc` file and local `.npmrc`.
- pnpm-specific settings, which can only be loaded from YAML files such
as the global `config.yaml` and local `pnpm-workspace.yaml`.

- Added support for loading environment variables whose names start with
`pnpm_config_` into config. These environment variables override
settings from `pnpm-workspace.yaml` but not CLI arguments.

- Added support for reading `allowBuilds` from `pnpm-workspace.yaml` in
the global package directory for global installs.

- Added support for `pnpm config get globalconfig` to retrieve the
global config file path
[#&#8203;9977](https://redirect.github.com/pnpm/pnpm/issues/9977).

- Added a new setting `virtualStoreOnly` that populates the virtual
store without creating importer symlinks, hoisting, bin links, or
running lifecycle scripts. This is useful for pre-populating a store
(e.g., in Nix builds) without creating unnecessary project-level
artifacts. `pnpm fetch` now uses this mode internally
[#&#8203;10840](https://redirect.github.com/pnpm/pnpm/issues/10840).

- Added support for specifying the pnpm version via
`devEngines.packageManager` in `package.json`. Unlike the
`packageManager` field, this supports version ranges. The resolved
version is stored in `pnpm-lock.yaml` and reused if it still satisfies
the range
[#&#8203;10932](https://redirect.github.com/pnpm/pnpm/pull/10932).

- Added a new `dedupePeers` setting that reduces peer dependency
duplication. When enabled, peer dependency suffixes use version-only
identifiers (`name@version`) instead of full dep paths, el

> ✂ **Note**
> 
> PR body was truncated to here.


</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/dubzzz/pure-rand).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzMuNiIsInVwZGF0ZWRJblZlciI6IjQzLjE3My42IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Nicolas DUBIEN <dubzzz@users.noreply.github.com>
Co-authored-by: Nicolas DUBIEN <github@dubien.org>
renovate Bot added a commit to Johannes-Andersen/Johannes that referenced this pull request May 12, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`11.1.0` →
`11.1.1`](https://renovatebot.com/diffs/npm/pnpm/11.1.0/11.1.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.1.0/11.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Oslo)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Johannes-Andersen/Johannes).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzMuNiIsInVwZGF0ZWRJblZlciI6IjQzLjE3My42IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJ0eXBlL2RlcGVuZGVuY2llcyJdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
dubzzz added a commit to dubzzz/fast-check that referenced this pull request May 12, 2026
> ℹ️ **Note**
> 
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`10.33.4` →
`11.1.1`](https://renovatebot.com/diffs/npm/pnpm/10.33.4/11.1.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/10.33.4/11.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

###
[`v11.1.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1110)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.9...v11.1.0)

##### Minor Changes

- Added `pnpm audit signatures` to verify ECDSA registry signatures for
installed packages against keys from `/-/npm/v1/keys`
[#&#8203;7909](https://redirect.github.com/pnpm/pnpm/issues/7909).
Scoped registries are respected, and registries without signing keys are
skipped.

- Added support for installing packages from the [GitHub Packages npm
registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry)
via a built-in `gh:` prefix (e.g. `pnpm add gh:@&#8203;acme/private`),
and, more broadly, for arbitrary named registries in the style of [vlt's
named-registry aliases](https://docs.vlt.sh/cli/registries).
Authentication is picked up from the existing per-URL `.npmrc` entries
(e.g. `//npm.pkg.github.com/:_authToken=...`), so no separate auth
mechanism is required.

Additional aliases — or an override for the built-in `gh` alias, for
GitHub Enterprise Server — can be configured under `namedRegistries` in
`pnpm-workspace.yaml`:

  ```yaml
  namedRegistries:
    gh: https://npm.pkg.github.example.com/
    work: https://npm.work.example.com/
  ```

With this, `work:@&#8203;corp/lib@^2.0.0` resolves against
`https://npm.work.example.com/`.
[#&#8203;8941](https://redirect.github.com/pnpm/pnpm/issues/8941).

- Allow setting sbom spec version using `--sbom-spec-version`
[#&#8203;11389](https://redirect.github.com/pnpm/pnpm/pull/11389).

- Add `--no-runtime` flag (config: `runtime=false`) to skip installing
runtime entries (e.g. Node.js downloaded via `devEngines.runtime`)
without modifying the lockfile. The lockfile keeps the runtime entry so
frozen-lockfile validation still passes; only the runtime fetch and
`.bin` linking are skipped. Useful in CI matrices where the runtime is
provisioned externally (e.g. via `pnpm runtime -g set node <version>`)
before `pnpm install` runs.

- Added the `pnpm bugs` command that opens a package's bug tracker URL
in the browser. With no arguments, it reads the current project's
`package.json`; with one or more package names, it fetches each
package's metadata from the registry and opens its bug tracker. Falls
back to `<repository>/issues` when the `bugs` field is missing
[#&#8203;11279](https://redirect.github.com/pnpm/pnpm/pull/11279).

- Added `pnpm owner` command to manage package owners on the registry.

##### Patch Changes

- Added "published X ago by Y" information to the `pnpm view` command
output, similar to `npm view`. This is useful when comparing against
`minimumReleaseAge`.

  For example, `pnpm view pnpm` now shows:

  ```
  published 17 hours ago by GitHub Actions
  ```

- `pnpm publish` now honors the configured HTTP/HTTPS proxy (including
`https_proxy`/`http_proxy`/`no_proxy` environment variables) when
polling the registry's `doneUrl` during the web-based authentication
flow. Previously the poll bypassed the proxy, causing the registry to
respond `403` from a different source IP and the login to never complete
[#&#8203;11561](https://redirect.github.com/pnpm/pnpm/issues/11561).

- `pnpm add -g` now installs each space-separated package into its own
isolated directory by default. To bundle multiple packages into the same
isolated install (so that they share dependencies and are removed
together), pass them as a comma-separated list. For example:

- `pnpm add -g foo bar` installs `foo` and `bar` as two independent
globals — removing one does not affect the other.
- `pnpm add -g foo,bar qar` bundles `foo` and `bar` into a single
isolated install while `qar` is installed on its own.

Related:
[#&#8203;11587](https://redirect.github.com/pnpm/pnpm/issues/11587).

- `pnpm runtime set <name> <version>` no longer fails in the root of a
multi-package workspace with the `ADDING_TO_ROOT` error. Installing the
workspace root is a valid target for a runtime, so the command now
bypasses that safety check.

- Fix `pnpm --version` hanging for the lifetime of the worker pool after
the version was printed. `main.ts`'s `--version` short-circuit returned
before reaching the command-handler `finally` that calls
`finishWorkers()`, so the worker pool that `switchCliVersion` had
spawned during integrity resolution stayed alive and held the Node event
loop open. The CLI entry now runs `finishWorkers()` from its own
`finally`, so every exit path tears the pool down.

Repro: `pnpm --version` in a workspace whose `devEngines.packageManager`
version already matches the running pnpm + `onFail: "download"`.
`switchCliVersion` resolves the integrity (spawning workers), finds
nothing to swap, returns. The version prints, then the process hangs.

###
[`v11.0.9`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1109)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.8...v11.0.9)

##### Patch Changes

- Fixed installation of GitLab-hosted dependencies. pnpm now downloads
the tarball from
`https://gitlab.com/<user>/<project>/-/archive/<sha>/<project>-<sha>.tar.gz`
instead of the GitLab API endpoint that contained an encoded slash
(`%2F`) between user and project. The encoded slash both triggered `406
Not Acceptable` responses from GitLab and produced virtual store
directory names that Node refused to import
(`ERR_INVALID_MODULE_SPECIFIER`)
[#&#8203;11533](https://redirect.github.com/pnpm/pnpm/issues/11533).
- Honor `NPM_CONFIG_USERCONFIG` (and its lowercase
`npm_config_userconfig` form) as a low-priority fallback when locating
the user-level `.npmrc`. This restores compatibility with environments
that point npm at a custom auth file via that env var — most notably
`actions/setup-node`, which writes registry credentials to
`${runner.temp}/.npmrc` and exports `NPM_CONFIG_USERCONFIG` to reference
it. Without this, GitHub Actions workflows using `actions/setup-node` to
authenticate to private registries broke after upgrading to pnpm v11.
PNPM-prefixed env vars and `npmrcAuthFile` from the global `config.yaml`
continue to take precedence
[#&#8203;11539](https://redirect.github.com/pnpm/pnpm/issues/11539).
- Fix `pnpm pack` not bundling dependencies listed in
`bundleDependencies` (or `bundledDependencies`). The npm-packlist
upgrade in pnpm 11 changed its API to require the caller to pre-populate
the dependency tree, which the wrapper was not doing —
`bundleDependencies` were silently dropped from the tarball
[#&#8203;11519](https://redirect.github.com/pnpm/pnpm/issues/11519).
- Fixed the pnpm CLI crashing with a confusing `SyntaxError: Invalid
regular expression flags` instead of printing a clear "requires Node.js
v22.13" error when launched on an unsupported Node.js version. The
Node.js version check in `bin/pnpm.mjs` was effectively dead code
because the static `import` of the bundled `dist/pnpm.mjs` was hoisted
by the ES module loader and parsed before the check could run
[#&#8203;11546](https://redirect.github.com/pnpm/pnpm/issues/11546).
- Fixed `pnpm --prefix=<dir> install` overwriting the existing
`pnpm-workspace.yaml` in `<dir>` with `set this to true or false`
placeholders. The renamed `--prefix` option (which maps to `dir`) was
not honored when locating the workspace root, so the workspace
manifest's `allowBuilds` settings were not loaded into config and got
clobbered when ignored builds were auto-populated
[#&#8203;11535](https://redirect.github.com/pnpm/pnpm/issues/11535).
- Fixed `pnpm publish --provenance` failing with a 422 from the registry
when the package version contained semver build metadata (e.g.
`1.0.0-canary.0+abc1234`). The `+<build>` segment is now stripped before
packing so that the version embedded in the tarball, the metadata sent
to the registry, and the sigstore provenance subject all agree
[#&#8203;11518](https://redirect.github.com/pnpm/pnpm/issues/11518).

###
[`v11.0.8`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1108)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.7...v11.0.8)

##### Patch Changes

- Restored the heuristic that preserves tarball URLs in `pnpm-lock.yaml`
when they cannot be derived from name+version+registry, even with the
default `lockfileIncludeTarballUrl: false`. Without this, `pnpm install
--frozen-lockfile` from an empty store fails with `ERR_PNPM_FETCH_404`
for packages on registries that serve tarballs from a non-standard path
— most notably GitHub Packages
(`https://npm.pkg.github.com/download/<scope>/<name>/<version>/<hash>`)
and JSR. `lockfileIncludeTarballUrl: true` continues to force the URL
into the lockfile for every package
[#&#8203;11276](https://redirect.github.com/pnpm/pnpm/issues/11276).
- Run `preversion`, `version`, and `postversion` lifecycle scripts for
`pnpm version`.
- Fixed `ERR_PNPM_BAD_TARBALL_SIZE` when a registry serves tarballs with
an end-to-end `Content-Encoding` (e.g. `gzip`). Tarballs are already
compressed, so the fetcher now requests them with `Accept-Encoding:
identity` (matching pnpm v10's effective behavior) and, as defense in
depth against misbehaving servers, no longer enforces the strict
`Content-Length` check when the response declares a `Content-Encoding` —
`Content-Length` in that case refers to the encoded payload, not the
decoded bytes the fetch implementation yields
[#&#8203;11506](https://redirect.github.com/pnpm/pnpm/issues/11506).

###
[`v11.0.7`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1107)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.6...v11.0.7)

##### Patch Changes

- Restore the execute bit on the `node-gyp` shims packed inside
`@pnpm/exe` (`dist/node-gyp-bin/node-gyp`,
`dist/node-gyp-bin/node-gyp.cmd`, and
`dist/node_modules/node-gyp/bin/node-gyp.js`). Without this,
`pnpm/action-setup`'s standalone path (used on runners with Node.js <
22.13) failed any install whose lifecycle script invoked `node-gyp
rebuild` with `sh: 1: node-gyp: Permission denied`
[#&#8203;11483](https://redirect.github.com/pnpm/pnpm/issues/11483).

- Fixed the `pn`, `pnpx`, and `pnx` aliases failing in Git Bash / MSYS2
on Windows when pnpm was installed via `@pnpm/exe` (or after `pnpm
self-update`)
[#&#8203;11486](https://redirect.github.com/pnpm/pnpm/issues/11486).
Running `pnpx` (or `pnx`) printed the cmd.exe banner and dropped the
user into an interactive command prompt instead of running `pnpm dlx`.
The `bin` field rewrite on Windows was pointing those aliases at `.cmd`
files; cmd-shim's Bash shim for a `.cmd` target wraps it in `exec cmd /C
...`, and MSYS2 mangles `/C` into a Windows path before cmd.exe sees it.
The aliases are now `.exe` hardlinks of the SEA binary, which detects
which name it was launched as via `process.execPath` and prepends `dlx`
for `pnpx` / `pnx`.

- Fix `pnpm install` recreating `node_modules` after `pnpm fetch`. `pnpm
fetch` records empty `hoistPattern` and `publicHoistPattern` in
`.modules.yaml`; since v11 removed the explicit-config gate, the
follow-up install treated those as a hoist-pattern change and purged the
modules directory. The fetch step now flags the modules manifest with
`virtualStoreOnly: true` so the next install skips the hoist-pattern
comparison and completes the missing post-import linking in place
[#&#8203;11488](https://redirect.github.com/pnpm/pnpm/issues/11488).

- Pin the integrity of git-hosted tarballs (codeload.github.com,
gitlab.com, bitbucket.org) in the lockfile so that subsequent installs
detect a tampered or substituted tarball and refuse to install it.
Previously the lockfile only stored the tarball URL for git
dependencies, so a compromised git host or a man-in-the-middle could
serve arbitrary code on later installs without lockfile changes.

A new `gitHosted: true` field is recorded on git-hosted tarball
resolutions in the lockfile, letting every reader/writer route them by a
single typed check instead of pattern-matching the tarball URL in each
call site. Lockfiles written by older pnpm versions are enriched on load
(URL fallback) so the field can be relied on uniformly across the
codebase.

- Allow user-level preferences in the global `config.yaml`. The
following settings can now be set in `~/.config/pnpm/config.yaml` (or
via `pnpm config set --location global`) instead of being restricted to
`pnpm-workspace.yaml`: `agent`, `globalVirtualStoreDir`,
`initPackageManager`, `initType`, `registrySupportsTimeField`,
`scriptShell`, `shellEmulator`, `sideEffectsCache`,
`sideEffectsCacheReadonly`, `stateDir`, `strictDepBuilds`,
`trustPolicy`, `trustPolicyExclude`, `trustPolicyIgnoreAfter`,
`updateNotifier`, `useStderr`, `verifyDepsBeforeRun`,
`verifyStoreIntegrity`, `virtualStoreDir`, `virtualStoreDirMaxLength`
[#&#8203;11474](https://redirect.github.com/pnpm/pnpm/issues/11474).

- Make trusted publishing (OIDC) take precedence over a configured
static `_authToken` in `pnpm publish`, mirroring the npm CLI's behavior.
When OIDC succeeds, the OIDC-derived token overrides any pre-configured
`_authToken`; when OIDC is not applicable (no CI environment, exchange
fails, registry has no trusted publisher configured), the static token
is used as a fallback. This applies on every package during recursive
publish, so each workspace package independently attempts trusted
publishing.

Additionally, the `NPM_ID_TOKEN` env var is now honored as a CI-agnostic
injection point for an OIDC ID token. Previously OIDC was only attempted
on GitHub Actions or GitLab; now any CI provider that exposes its own
OIDC mechanism (e.g. CircleCI's `CIRCLE_OIDC_TOKEN_V2`, Buildkite, etc.)
can forward its token via `NPM_ID_TOKEN` and trusted publishing will
work without pnpm needing to recognize the provider explicitly.

- `--pm-on-fail=ignore` (and other universal options like `--loglevel`,
`--reporter`) is now honored when combined with `--help` or `--version`.
Previously the CLI argument parser short-circuited those flags before
universal options were preserved, so `pnpm audit --pm-on-fail=ignore
--help` and `pnpm --pm-on-fail=ignore --version` reported the strict
packageManager mismatch instead of running the requested action
[#&#8203;11487](https://redirect.github.com/pnpm/pnpm/issues/11487).

- Fix a regression where `pnpm --recursive --filter '!<pkg>'
run/exec/test/add` would include the workspace root in the matched
projects. The workspace root is now correctly excluded by default when
only negative `--filter` arguments are provided, matching the
[documented behavior](https://pnpm.io/cli/recursive). To include the
root, pass `--include-workspace-root`
[#&#8203;11341](https://redirect.github.com/pnpm/pnpm/issues/11341).

- Restore npm-CLI-compatible `--json` stdout output for `pnpm publish`
([#&#8203;11476](https://redirect.github.com/pnpm/pnpm/issues/11476)).
pnpm 11 reimplemented publish natively
([#&#8203;10591](https://redirect.github.com/pnpm/pnpm/pull/10591)) and
inadvertently dropped the per-package JSON object that pnpm 10 emitted
transitively via the npm CLI, silently breaking downstream tooling —
most notably `nx release publish`, which parses stdout JSON to confirm
success
([nrwl/nx#35575](https://redirect.github.com/nrwl/nx/issues/35575)). On
success, the output is now:

- `pnpm publish --json` → single object `{ id, name, version, size,
unpackedSize, shasum, integrity, filename, files, entryCount, bundled
}`, mirroring `npm publish --json`.
- `pnpm publish -r --json` → array of those objects, mirroring `pnpm
pack --json`'s shape choice.
- `pnpm publish -r --report-summary` → existing
`pnpm-publish-summary.json` envelope `{ publishedPackages: [...] }` is
preserved, but each entry is upgraded to the same per-package shape
(additive — `name` and `version` are still present).

- `pnpm config get @&#8203;<scope>:registry` now reports the same URL
that `pnpm publish` and the resolvers actually use. Previously, `config
get` only consulted `.npmrc`, while `publish`/install used the merged
map that includes `pnpm-workspace.yaml`'s `registries` block — so the
two could diverge silently and a publish could go to the wrong registry
[#&#8203;11492](https://redirect.github.com/pnpm/pnpm/issues/11492).

###
[`v11.0.6`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1106)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.5...v11.0.6)

##### Patch Changes

- Fix `pnpm_config_npmrc_auth_file` and `pnpm_config_userconfig` env
vars not actually loading the custom `.npmrc`. The env vars were parsed
and assigned to the resolved config, but only after `loadNpmrcConfig`
had already read the default `~/.npmrc` — so the custom file path was
set but never read. The relevant env vars are now consulted before the
user-level `.npmrc` is loaded
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).
- Preserve the original key order in `pnpm-workspace.yaml` when updating
it. Existing keys keep their position, and new keys are inserted in
alphabetical position when the existing keys are already sorted (with a
leading `packages` key allowed) or appended at the end otherwise.
- Fixed `pnpm self-update` on installations originally set up by pnpm
v10. v10 added `PNPM_HOME` directly to PATH and wrote a `pnpm` bootstrap
shim there. v11 setup writes shims under `PNPM_HOME/bin` instead, so
when a v10 user upgrades to v11 the legacy shim at `PNPM_HOME` keeps
pointing into the old `.tools/<version>` install — `pnpm --version`
continues to report the pre-update version even though the new version
was installed under `global/v11`. Self-update now detects this layout,
refreshes the legacy shims so the upgrade actually takes effect, and
prints a hint suggesting `pnpm setup` to migrate PATH to the v11 layout.
[#&#8203;11464](https://redirect.github.com/pnpm/pnpm/issues/11464).
- Print a warning when settings that are not allowed in the global
config file (e.g. `nodeLinker`, `hoistPattern`) are present in
`config.yaml` and silently ignored. Previously these settings were
dropped without any feedback, leaving users unsure why their global
configuration had no effect. The warning suggests moving those settings
to a project-level `pnpm-workspace.yaml`, or sharing them across
projects via [config
dependencies](https://pnpm.io/11.x/config-dependencies).
- Throw a pnpm error when `overrides` has an invalid shape or contains a
non-string value.
- Validate all `readPackage` dependency map fields, including
`devDependencies`, and reject falsy non-object invalid values instead of
silently accepting them.
- Prevent crashes during `pnpm config`, `pnpm set`, and `pnpm get` by
tolerating `configDependencies` install failures. For these commands, a
failure to install `configDependencies` (for example because the
registry auth token has not been written yet) is now logged at debug
level and the command proceeds. All other commands still surface the
install error
[#&#8203;10684](https://redirect.github.com/pnpm/pnpm/issues/10684).
- Treat `allowBuilds` as an install-state input and clear previously
ignored builds when they are explicitly disallowed.
- Fixes
[#&#8203;10594](https://redirect.github.com/pnpm/pnpm/issues/10594),
catalogs not being read from the workspace when using the `catalog:`
protocol with the `pnpm dlx` / `pnpx` command, resulting in a catalog
entry not found error.
- Accept `PNPM_CONFIG_*` (uppercase) environment variables in addition
to `pnpm_config_*`. Previously, only the lowercase form was honored, so
env vars renamed per the v11 migration guide (e.g.
`PNPM_CONFIG_USERCONFIG`) silently had no effect on case-sensitive
systems like macOS and Linux
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).

###
[`v11.0.5`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1105)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.4...v11.0.5)

##### Patch Changes

- Drop the `darwin-x64` artifact from `@pnpm/exe` and from the GitHub
release page. The Node.js SEA mechanism `pnpm pack-app` uses produces a
binary that segfaults at startup on Intel Macs because of an upstream
Node.js bug
([nodejs/node#62893](https://redirect.github.com/nodejs/node/issues/62893),
tracked alongside
[#&#8203;59553](https://redirect.github.com/nodejs/node/issues/59553);
the Node.js team has [opted not to fix
it](https://redirect.github.com/nodejs/node/pull/60250) on the grounds
that x64 macOS is being phased out). Re-signing with `codesign` or
`ldid` doesn't help — the corruption is in LIEF's Mach-O surgery, before
signing.

Intel Mac users should install pnpm via `npm install -g pnpm` (uses the
system Node.js, no SEA), or stay on pnpm 10.x. `@pnpm/exe`'s preinstall
on Intel Mac now exits with a clear error pointing at these
alternatives.

Closes
[#&#8203;11423](https://redirect.github.com/pnpm/pnpm/issues/11423).

- `pnpm dlx` (and `pnpx`/`pnx`/`pnpm create`) now runs the same
interactive `approve-builds` prompt as `pnpm add -g` when the package
being launched depends on transitive packages with install scripts.
Previously, the v11 `strictDepBuilds` default made dlx fail with
`ERR_PNPM_IGNORED_BUILDS` and required users to re-run with
`--allow-build=<pkg>` for every offending dependency. dlx also now
removes the partially-populated cache directory when the install fails,
so a subsequent run starts clean instead of reusing a broken install
whose builds were silently skipped
[#&#8203;11444](https://redirect.github.com/pnpm/pnpm/issues/11444).

- [`72629fc`](https://redirect.github.com/pnpm/pnpm/commit/72629fc): Fix
`pnpm -g ls --json` and `pnpm -g ls --parseable` so they emit valid JSON
and parseable output respectively, matching pnpm 10 behavior. Since the
isolated global packages refactor in pnpm 11, the global list command
had a custom path that always printed plain text and ignored
`--json`/`--parseable`, which broke tools like `npm-check-updates` that
parse the JSON output
[#&#8203;11440](https://redirect.github.com/pnpm/pnpm/issues/11440).

`pnpm -g ls --depth=<n>` (with n > 0) now errors when more than one
isolated global install would be involved, since each install has its
own lockfile and merging their transitive trees would be incoherent.
When the request can be narrowed to a single install group, the regular
`list` flow is used and the full dependency tree is shown.

- Fixed `pnpm publish` to honor `publishConfig.registry` from
`package.json` when publishing a single package. The native publish flow
introduced in v11 was reading the registry from `.npmrc` only, ignoring
the per-package override
[#&#8203;11419](https://redirect.github.com/pnpm/pnpm/issues/11419).

- When `strictPeerDependencies` is `true`, the
`ERR_PNPM_PEER_DEP_ISSUES` error once again renders the peer dependency
issues inline using the same format as `pnpm peers check`, so users (and
CI tools like Renovate) can see what failed without running `pnpm peers
check` separately
[#&#8203;11439](https://redirect.github.com/pnpm/pnpm/issues/11439).

- The `WARN` and error code labels in pnpm's output now wrap in brackets
(`[WARN]`, `[ERR_PNPM_FOO]`). Previously the labels relied entirely on a
colored background to stand out, which meant they blended into the
surrounding text in terminals without color (e.g. when `NO_COLOR` is set
or output is piped). The brackets are painted in the same color as the
badge background, so they appear as ordinary padding in color-capable
terminals — only the no-color rendering changes.

###
[`v11.0.4`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1104)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.3...v11.0.4)

##### Patch Changes

- Fixed `pnpm ci` not reinstalling workspace package `node_modules`
directories after the clean step
[#&#8203;11427](https://redirect.github.com/pnpm/pnpm/issues/11427).
- Remove pnpm's workspace state file when cleaning node\_modules so
`pnpm ci` performs a fresh install after the clean step.
- Do not remove `pnpm-lock.yaml` during `pnpm clean` when `lockfile:
true` is configured in `pnpm-workspace.yaml`. The lockfile is only
removed when the `--lockfile` option is passed to `pnpm clean`.
- `pnpm self-update` (with no version argument) no longer downgrades
pnpm when the registry's `latest` dist-tag points to an older release
than the currently active version. Run `pnpm self-update latest` to
force a downgrade
[#&#8203;11418](https://redirect.github.com/pnpm/pnpm/issues/11418).
- `minimumReleaseAgeStrict` now defaults to `true` whenever the user
explicitly sets `minimumReleaseAge` (via `pnpm-workspace.yaml`, the
global `config.yaml`, the CLI, or `pnpm_config_*` env vars).

###
[`v11.0.3`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1103)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.2...v11.0.3)

##### Patch Changes

- Fix too many open files error sometimes happening on Windows, when
creating command shims in `node_modules/.bin`
[#&#8203;11412](https://redirect.github.com/pnpm/pnpm/issues/11412).
- Fix `ERR_PNPM_FETCH_404` when installing a project whose lockfile
depends on a `file:` tarball. The previous behavior dropped the
`tarball` field from `file:` and git-hosted resolutions when
`lockfile-include-tarball-url=false` (the default), even though those
URLs cannot be reconstructed from the package name, version, and
registry
[#&#8203;11407](https://redirect.github.com/pnpm/pnpm/issues/11407).

###
[`v11.0.2`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1102)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.1...v11.0.2)

##### Patch Changes

- Fix `ENOENT` symlink failure when `pnpm add -g` triggers the
approve-builds prompt. The global add flow used to forward an absolute
`modulesDir` (`<installDir>/node_modules`) into the install run by
`approve-builds`. The install layer treated `modulesDir` as a path
relative to `lockfileDir` and joined it again, producing a doubled path
on Windows because `path.join` does not collapse an embedded absolute
path. The hoist step then tried to `mkdir` and symlink under
`<installDir>\<installDir>\node_modules\.pnpm\node_modules\...` and
failed with `ENOENT`
[#&#8203;11403](https://redirect.github.com/pnpm/pnpm/issues/11403).
- Fixed `packageManagerDependencies` going stale when pnpm is invoked
through corepack. The lockfile sync (and the `devEngines.packageManager`
version check) previously ran only when pnpm was invoked directly; under
corepack the entire block was skipped, so a stale entry would persist
even after the running pnpm version changed. The lockfile sync now runs
regardless of how pnpm was invoked, while the pnpm-managed version
switch (`onFail: 'download'`) remains skipped under corepack so it
doesn't fight corepack's own version selection
[#&#8203;11397](https://redirect.github.com/pnpm/pnpm/issues/11397).
- Fix recursive publish summaries to report the manifest from
`publishConfig.directory` when packages publish from a generated
directory
[#&#8203;11239](https://redirect.github.com/pnpm/pnpm/issues/11239).
- Fix negated `os` / `cpu` entries (e.g. `["!win32"]`) being incorrectly
rejected when `supportedArchitectures` expands to multiple platforms
[#&#8203;11375](https://redirect.github.com/pnpm/pnpm/pull/11375).

###
[`v11.0.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1101)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.0...v11.0.1)

##### Patch Changes

- Report unknown top-level options before falling back to implicit `pnpm
run` scripts.
- Reject `null` named catalogs in workspace manifests with
`InvalidWorkspaceManifestError` instead of crashing with a raw
`TypeError`.
- Populate download location for git-sourced dependencies in SBOM
output. Previously `pnpm sbom` emitted `NOASSERTION` (SPDX) and omitted
the distribution reference (CycloneDX) for git dependencies. Now emits
the git URL with commit hash, e.g.
`git+https://github.com/user/repo.git#commit`.
- `pnpm self-update` now keeps `package.json`'s `packageManager` and
`devEngines.packageManager` in sync. When the legacy `packageManager`
field pins pnpm, both fields are rewritten to the new exact pnpm version
on update — `packageManager` to `pnpm@<version>` (without an integrity
hash), and `devEngines.packageManager.version` to the same exact
`<version>` (dropping any range operator). When only
`devEngines.packageManager` is declared, the existing range-preserving
behavior is unchanged
[#&#8203;11388](https://redirect.github.com/pnpm/pnpm/issues/11388).
- Sort the keys of the overrides object returned by `pnpm audit --fix`
so that the log output order matches the order written to
`pnpm-workspace.yaml`.
- Update the env lockfile's `packageManagerDependencies` entry when
`devEngines.packageManager` declares a pnpm version that the lockfile no
longer satisfies. Previously, the stale entry was kept even though the
running pnpm matched the declared version, silently breaking the
integrity record
[#&#8203;11387](https://redirect.github.com/pnpm/pnpm/issues/11387).

###
[`v11.0.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1100)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v10.33.4...v11.0.0)

##### Highlights

##### Major

- **Node.js 22+ required** — support for Node 18, 19, 20, and 21 is
dropped, pnpm itself is now pure ESM, and the standalone exe requires
glibc 2.27.
- **Supply-chain protection on by default** — `minimumReleaseAge`
defaults to 1 day (newly published packages are not resolved for 24h)
and `blockExoticSubdeps` defaults to `true`.
- **`allowBuilds` replaces the old build-dependency settings** —
`onlyBuiltDependencies`, `onlyBuiltDependenciesFile`,
`neverBuiltDependencies`, `ignoredBuiltDependencies`, and
`ignoreDepScripts` have been removed.
- **Global installs are isolated and use the global virtual store by
default** — each `pnpm add -g` gets its own directory with its own
`package.json`, `node_modules`, and lockfile.
- **New SQLite-backed store index** (store v11) with bundled manifests
and hex digests, reducing filesystem syscalls and speeding up
installation.
- **Native publish flow** — [`pnpm
publish`](https://pnpm.io/11.x/cli/publish),
[`login`](https://pnpm.io/11.x/cli/login),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`view`](https://pnpm.io/11.x/cli/view),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) no longer delegate to the
npm CLI, and the remaining npm passthrough commands now throw "not
implemented".
- **[`pnpm audit`](https://pnpm.io/11.x/cli/audit) uses npm's bulk
advisories endpoint** — the legacy `/security/audits` endpoints are
gone. CVE-based filtering has been replaced with GHSA-based filtering:
migrate `auditConfig.ignoreCves` entries to `auditConfig.ignoreGhsas`.
- **`.npmrc` is auth/registry only** — all other settings must live in
`pnpm-workspace.yaml` or the new global `config.yaml`, and environment
variables use the `pnpm_config_*` prefix.
- **Runtime installs are slimmer** — installing a Node.js runtime via
`node@runtime:<version>` no longer extracts the bundled `npm`, `npx`,
and `corepack`, roughly halving the files pnpm has to hash, write, and
link.

##### Minor

- **New commands:** [`pnpm ci`](https://pnpm.io/11.x/cli/ci), [`pnpm
sbom`](https://pnpm.io/11.x/cli/sbom), [`pnpm
clean`](https://pnpm.io/11.x/cli/clean), [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers), [`pnpm runtime
set`](https://pnpm.io/11.x/cli/runtime), [`pnpm
docs`](https://pnpm.io/11.x/cli/docs)/`home`, [`pnpm
ping`](https://pnpm.io/11.x/cli/ping), [`pnpm
search`](https://pnpm.io/11.x/cli/search), [`pnpm
star`](https://pnpm.io/11.x/cli/star)/`unstar`/`stars`, [`pnpm
whoami`](https://pnpm.io/11.x/cli/whoami), [`pnpm
with`](https://pnpm.io/11.x/cli/with), and [`pnpm
pack-app`](https://pnpm.io/11.x/cli/pack-app), plus
`pn`/[`pnx`](https://pnpm.io/11.x/cli/pnx) short aliases.
- **ESM pnpmfiles** via `.pnpmfile.mjs`, which takes priority over
`.pnpmfile.cjs` when present.
- **[`pnpm audit --fix=update`](https://pnpm.io/11.x/cli/audit)** fixes
vulnerabilities by updating packages in the lockfile instead of adding
overrides, and `pnpm audit --fix --interactive` lets you select which
advisories to fix.
- **[`pnpm pack-app`](https://pnpm.io/11.x/cli/pack-app)** packs a
CommonJS entry into a standalone executable for one or more target
platforms using Node.js Single Executable Applications.
- **Faster HTTP and I/O** — undici with Happy Eyeballs, direct-to-CAS
writes, skipped staging directory, pre-allocated tarball downloads, and
an NDJSON metadata cache.

##### Major Changes

##### Requirements

- pnpm is now distributed as pure ESM.
- Dropped support for Node.js v18, 19, 20, and 21.
- The standalone exe version of pnpm requires at least glibc 2.27.

##### Security & Build Defaults

- Changed default values: `optimisticRepeatInstall` is now `true`,
`verifyDepsBeforeRun` is now `install`, `minimumReleaseAge` is now
`1440` (1 day), and `minimumReleaseAgeStrict` is `false`. Newly
published packages will not be resolved until they are at least 1 day
old. This protects against supply chain attacks by giving the community
time to detect and remove compromised versions. To opt out, set
`minimumReleaseAge: 0` in `pnpm-workspace.yaml`
[#&#8203;11158](https://redirect.github.com/pnpm/pnpm/pull/11158).

- `strictDepBuilds` is `true` by default.

- `blockExoticSubdeps` is `true` by default.

- Removed deprecated build dependency settings: `onlyBuiltDependencies`,
`onlyBuiltDependenciesFile`, `neverBuiltDependencies`,
`ignoredBuiltDependencies`, and `ignoreDepScripts`
[#&#8203;11220](https://redirect.github.com/pnpm/pnpm/pull/11220).

Use the `allowBuilds` setting instead. It is a map where keys are
package name patterns and values are booleans:

  - `true` means the package is allowed to run build scripts
- `false` means the package is explicitly denied from running build
scripts

Same as before, by default, none of the packages in the dependencies are
allowed to run scripts. If a package has postinstall scripts and it
isn't declared in `allowBuilds`, an error is printed.

  Before:

  ```yaml
  onlyBuiltDependencies:
    - electron
  onlyBuiltDependenciesFile: "allowed-builds.json"
  neverBuiltDependencies:
    - core-js
  ignoredBuiltDependencies:
    - esbuild
  ```

  After:

  ```yaml
  allowBuilds:
    electron: true
    core-js: false
    esbuild: false
  ```

- Removed `allowNonAppliedPatches` in favor of `allowUnusedPatches`.

- Removed `ignorePatchFailures`; patch application failures now throw an
error.

##### Store

- Runtime dependencies are always linked from the global virtual store
[#&#8203;10233](https://redirect.github.com/pnpm/pnpm/pull/10233).
- Optimized index file format to store the hash algorithm once per file
instead of repeating it for every file entry. Each file entry now stores
only the hex digest instead of the full integrity string
(`<algo>-<digest>`). Using hex format improves performance since file
paths in the content-addressable store use hex representation,
eliminating base64-to-hex conversion during path lookups.
- Store version bumped to v11.
- The bundled manifest (name, version, bin, engines, scripts, etc.) is
now stored directly in the package index file, eliminating the need to
read `package.json` from the content-addressable store during resolution
and installation. This reduces I/O and speeds up repeat installs
[#&#8203;10473](https://redirect.github.com/pnpm/pnpm/pull/10473).
- The package index in the content-addressable store is now backed by
SQLite. Instead of individual JSON files under `$STORE/index/`, package
metadata is stored in a single SQLite database at `$STORE/index.db` with
MessagePack-encoded values. This reduces filesystem syscall overhead,
improves space efficiency for small metadata entries, and enables
concurrent access via SQLite's WAL mode. Packages missing from the new
index are re-fetched on demand
[#&#8203;10500](https://redirect.github.com/pnpm/pnpm/pull/10500)
[#&#8203;10826](https://redirect.github.com/pnpm/pnpm/issues/10826).

##### Global Packages

- Global installs (`pnpm add -g pkg`) and `pnx` now use the global
virtual store by default. Packages are stored at `{storeDir}/links`
instead of per-project `.pnpm` directories. This can be disabled by
setting `enableGlobalVirtualStore: false`
[#&#8203;10694](https://redirect.github.com/pnpm/pnpm/pull/10694).

- Isolated global packages. Each globally installed package (or group of
packages installed together) now gets its own isolated installation
directory with its own `package.json`, `node_modules/`, and lockfile.
This prevents global packages from interfering with each other through
peer dependency conflicts, hoisting changes, or version resolution
shifts.

  Key changes:

- `pnpm add -g <pkg>` creates an isolated installation in
`{pnpmHomeDir}/global/v11/{hash}/`
- `pnpm remove -g <pkg>` removes the entire installation group
containing the package
- `pnpm update -g [pkg]` re-installs packages in new isolated
directories
- `pnpm list -g` scans isolated directories to show all installed global
packages
- `pnpm install -g` (no args) is no longer supported; use `pnpm add -g
<pkg>` instead

- Globally installed binaries are now stored in a `bin` subdirectory of
`PNPM_HOME` instead of directly in `PNPM_HOME`. This prevents internal
directories like `global/` and `store/` from polluting shell
autocompletion when `PNPM_HOME` is on PATH
[#&#8203;10986](https://redirect.github.com/pnpm/pnpm/issues/10986).
After upgrading, run `pnpm setup` to update your shell configuration.

- Breaking changes to `pnpm link`:

- `pnpm link <pkg-name>` no longer resolves packages from the global
store. Only relative or absolute paths are accepted. For example, use
`pnpm link ./foo` instead of `pnpm link foo`.
- `pnpm link --global` is removed. Use `pnpm add -g .` to register a
local package's bins globally.
- `pnpm link` (no arguments) is removed. Use `pnpm link <dir>` with an
explicit path instead.

##### Configuration

- pnpm no longer reads all settings from `.npmrc`. Only auth and
registry settings are read from `.npmrc` files. All other settings (like
`hoistPattern`, `nodeLinker`, `shamefullyHoist`, etc.) must be
configured in `pnpm-workspace.yaml` or the global
`~/.config/pnpm/config.yaml`
[#&#8203;11189](https://redirect.github.com/pnpm/pnpm/pull/11189).

- Network settings (`httpProxy`, `httpsProxy`, `noProxy`,
`localAddress`, `strictSsl`, `gitShallowHosts`) are now written to
`config.yaml` (global) or `pnpm-workspace.yaml` (local) instead of
`.npmrc`/`auth.ini`. They are still readable from `.npmrc` for easier
migration from the npm CLI
[#&#8203;11209](https://redirect.github.com/pnpm/pnpm/pull/11209).

pnpm no longer reads `npm_config_*` environment variables. Use
`pnpm_config_*` environment variables instead (e.g.,
`pnpm_config_registry` instead of `npm_config_registry`).

  pnpm no longer reads the npm global config at `$PREFIX/etc/npmrc`.

  `pnpm login` writes auth tokens to `~/.config/pnpm/auth.ini`.

  New `registries` setting in `pnpm-workspace.yaml`:

  ```yaml
  registries:
    default: https://registry.npmjs.org/
    "@&#8203;my-org": https://private.example.com/
    "@&#8203;internal": https://nexus.corp.com/
  ```

Auth tokens in `~/.npmrc` still work — pnpm continues to read `~/.npmrc`
as a fallback for registry authentication. The new `npmrcAuthFile`
setting can be used to point to a different file instead of `~/.npmrc`.

- Replace workspace project specific `.npmrc` with `packageConfigs` in
`pnpm-workspace.yaml`.

  A workspace manifest with `packageConfigs` looks something like this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    "project-1":
      saveExact: true
    "project-2":
      savePrefix: "~"
  ```

  Or this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    - match: ["project-1", "project-2"]
      modulesDir: "node_modules"
      saveExact: true
  ```

- pnpm no longer reads settings from the `pnpm` field of `package.json`.
Settings should be defined in `pnpm-workspace.yaml`
[#&#8203;10086](https://redirect.github.com/pnpm/pnpm/pull/10086).

- `pnpm config get` (without `--json`) no longer prints INI formatted
text. Instead, it prints JSON for objects and arrays, and raw strings
for strings, numbers, booleans, and nulls. `pnpm config get --json`
still prints all types of values as JSON, as before.

- `pnpm config get <array>` now prints a JSON array.

- `pnpm config list` now prints a JSON object instead of INI formatted
text.

- `pnpm config list` and `pnpm config get` (without argument) now hide
auth-related settings.

- `pnpm config list` and `pnpm config get` (without argument) now show
top-level keys as camelCase. Exception: keys that start with `@` or `//`
are preserved (their cases don't change).

- `pnpm config get` and `pnpm config list` no longer load non-camelCase
options from the workspace manifest (`pnpm-workspace.yaml`).

##### Removed Commands & npm Passthrough

- pnpm no longer falls back to the npm CLI. Commands that were
previously passed through to npm (`access`, `bugs`, `docs`, `edit`,
`find`, `home`, `issues`, `owner`, `ping`, `prefix`, `profile`, `pkg`,
`repo`, `search`, `set-script`, `star`, `stars`, `team`, `token`,
`unstar`, `whoami`, `xmas`) and their aliases (`s`, `se`) now throw a
"not implemented" error, with a suggestion to use the npm CLI directly
[#&#8203;10642](https://redirect.github.com/pnpm/pnpm/pull/10642). Other
previously passed-through commands —
[`view`](https://pnpm.io/11.x/cli/view) (`info`, `show`, `v`),
[`login`](https://pnpm.io/11.x/cli/login) (`adduser`),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) — have been reimplemented
natively in pnpm (see New Commands below).

- [`pnpm publish`](https://pnpm.io/11.x/cli/publish) now works without
the `npm` CLI.

The One-time Password feature now reads from `PNPM_CONFIG_OTP` instead
of `NPM_CONFIG_OTP`:

  ```sh
  export PNPM_CONFIG_OTP='<your OTP here>'
  pnpm publish --no-git-checks
  ```

If the registry requests OTP and the user has not provided it via the
`PNPM_CONFIG_OTP` environment variable or the `--otp` flag, pnpm will
prompt the user directly for an OTP code.

If the registry requests web-based authentication, pnpm will print a
scannable QR code along with the URL.

Since the new `pnpm publish` no longer calls `npm publish`, some
undocumented features may have been unknowingly dropped. If you rely on
a feature that is now gone, please open an issue at
<https://github.com/pnpm/pnpm/issues>. In the meantime, you can use
`pnpm pack && npm publish *.tgz` as a workaround.

- Removed the `pnpm server` command
[#&#8203;10463](https://redirect.github.com/pnpm/pnpm/pull/10463).

- Removed support for the `useNodeVersion` and
`executionEnv.nodeVersion` fields. `devEngines.runtime` and
`engines.runtime` should be used instead
[#&#8203;10373](https://redirect.github.com/pnpm/pnpm/pull/10373).

- Removed support for `hooks.fetchers`. We now have a new API for custom
fetchers and resolvers via the `fetchers` field of `pnpmfile`.

##### Lifecycle Scripts

- pnpm no longer populates `npm_config_*` environment variables from the
pnpm config during lifecycle scripts. Only well-known `npm_*` env vars
are now set, matching Yarn's behavior
[#&#8203;11116](https://redirect.github.com/pnpm/pnpm/pull/11116).

##### CLI Output

- Cleaner output for script execution: pnpm now prints `$ command`
instead of `> pkg@version stage path\n> command`, and shows project name
and path only when running in a different directory. The `$ command`
line is printed to stderr to keep stdout clean for piping
[#&#8203;11132](https://redirect.github.com/pnpm/pnpm/pull/11132).
- During install, instead of rendering the full peer dependency issues
tree, pnpm now suggests running [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers) to view the issues
[#&#8203;11133](https://redirect.github.com/pnpm/pnpm/pull/11133).

##### Lockfile

- Simplified `patchedDependencies` lockfile format from `Record<string,
{ path: string, hash: string }>` to `Record<string, string>` (selector
to hash). Existing lockfiles with the old format are automatically
migrated
[#&#8203;10911](https://redirect.github.com/pnpm/pnpm/pull/10911).

##### Other

- The default value of the `type` field in the `package.json` file of
the project initialized by `pnpm init` command has been changed to
`module`.

- Added support for lowercase options in `pnpm add`: `-d`, `-p`, `-o`,
`-e` [#&#8203;9197](https://redirect.github.com/pnpm/pnpm/issues/9197).

  When using the `pnpm add` command only:

  - `-p` is now an alias for `--save-prod` instead of `--parseable`
  - `-d` is now an alias for `--save-dev` instead of `--loglevel=info`

- The root workspace project is no longer excluded when it is explicitly
selected via a filter
[#&#8203;10465](https://redirect.github.com/pnpm/pnpm/pull/10465).

##### Audit

- [`pnpm audit`](https://pnpm.io/11.x/cli/audit) now calls npm's
`/-/npm/v1/security/advisories/bulk` endpoint. The legacy
`/-/npm/v1/security/audits{,/quick}` endpoints have been retired by the
registry, so the legacy request/response contract is no longer
supported.

The bulk endpoint does not return CVE identifiers. CVE-based filtering
has been replaced with GitHub advisory ID (GHSA) filtering:

- `auditConfig.ignoreCves` → `auditConfig.ignoreGhsas` (the previous key
is no longer recognized)
- `pnpm audit --ignore <id>` / `pnpm audit --ignore-unfixable` now read
and write GHSAs instead of CVEs
- GHSAs are derived from each advisory's `url`
(`https://github.com/advisories/GHSA-xxxx-xxxx-xxxx`)

To migrate: replace each `CVE-YYYY-NNNNN` entry in your
`auditConfig.ignoreCves` with the corresponding `GHSA-xxxx-xxxx-xxxx`
value (visible in the `More info` column of `pnpm audit` output) and
move it under `auditConfig.ignoreGhsas`.

##### Package Manager Settings

- **Breaking:** removed the `managePackageManagerVersions`,
`packageManagerStrict`, and `packageManagerStrictVersion` settings. They
existed only to derive the `onFail` behavior for the legacy
`packageManager` field, and the `pmOnFail` setting introduced alongside
[`pnpm with`](https://pnpm.io/11.x/cli/with) subsumes all three — it
directly sets the `onFail` behavior of both `packageManager` and
`devEngines.packageManager`. The `COREPACK_ENABLE_STRICT` environment
variable is no longer honored (it only gated `packageManagerStrict`);
use `pmOnFail` instead.

  Migration:

| Removed setting | Replace with |
| ------------------------------------- | ------------------------------
|
| `managePackageManagerVersions: true` | `pmOnFail: download` (default)
|
| `managePackageManagerVersions: false` | `pmOnFail: ignore` |
| `packageManagerStrict: false` | `pmOnFail: warn` |
| `packageManagerStrictVersion: true` | `pmOnFail: error` |
| `COREPACK_ENABLE_STRICT=0` | `pmOnFail: warn` |

##### Runtime Installs

- Installing a Node.js runtime via `node@runtime:<version>` (including
`pnpm env use` and `pnpm runtime set node`) no longer extracts the
bundled `npm`, `npx`, and `corepack` from the Node.js archive. This cuts
roughly half of the files pnpm has to hash, write to the CAS, and link
during installation, making runtime installs noticeably faster. Users
who still need `npm` can install it as a separate package.

##### Minor Changes

##### New Commands

- Added native [`pnpm view`](https://pnpm.io/11.x/cli/view) (`info`,
`show`, `v`) command for viewing package metadata from the registry
[#&#8203;11064](https://redirect.github.com/pnpm/pnpm/pull/11064).
- Added [`pnpm login`](https://pnpm.io/11.x/cli/login) (and `pnpm
adduser` alias) command for authenticating with npm registries. Supports
web-based login with QR code as well as classic username/password login
[#&#8203;11094](https://redirect.github.com/pnpm/pnpm/pull/11094).
- Added [`pnpm logout`](https://pnpm.io/11.x/cli/logout) command for
logging out of npm registries. Revokes the authentication token on the
registry and removes it from the local auth config file
[#&#8203;11213](https://redirect.github.com/pnpm/pnpm/pull/11213).
- Added native [`pnpm deprecate`](https://pnpm.io/11.x/cli/deprecate)
and `pnpm undeprecate` commands for setting and removing deprecation
messages on package versions without delegating to the npm CLI
[#&#8203;11120](https://redirect.github.com/pnpm/pnpm/pull/11120).
- Added native [`pnpm unpublish`](https://pnpm.io/11.x/cli/unpublish)
command. Supports unpublishing specific versions, version ranges via
semver, and entire packages with `--force`
[#&#8203;11128](https://redirect.github.com/pnpm/pnpm/pull/11128).
- Added native [`pnpm dist-tag`](https://pnpm.io/11.x/cli/dist-tag)
command (`ls`, `add`, `rm` subcommands)
[#&#8203;11218](https://redirect.github.com/pnpm/pnpm/pull/11218).
- Added [`pnpm sbom`](https://pnpm.io/11.x/cli/sbom) command for
generating Software Bill of Materials in CycloneDX 1.7 and SPDX 2.3 JSON
formats
[#&#8203;9088](https://redirect.github.com/pnpm/pnpm/issues/9088).
- Added [`pnpm clean`](https://pnpm.io/11.x/cli/clean) command that
safely removes `node_modules` directories from all workspace projects
[#&#8203;10707](https://redirect.github.com/pnpm/pnpm/issues/10707). Use
`--lockfile` to also remove `pnpm-lock.yaml` files.
- Added a new command [`pnpm runtime set <runtime name> <runtime version
spec> [-g]`](https://pnpm.io/11.x/cli/runtime) for installing runtimes.
Deprecated `pnpm env use` in favor of the new command.
- Added the ability to fix vulnerabilities by updating packages in the
lockfile instead of adding overrides. Use [`pnpm audit
--fix=update`](https://pnpm.io/11.x/cli/audit)
[#&#8203;10341](https://redirect.github.com/pnpm/pnpm/pull/10341).
- Added [`pnpm ci`](https://pnpm.io/11.x/cli/ci) command for clean
installs
[#&#8203;6100](https://redirect.github.com/pnpm/pnpm/issues/6100). The
command runs `pnpm clean` followed by `pnpm install --frozen-lockfile`.
Designed for CI/CD environments where reproducible builds are critical.
Aliases: `pnpm clean-install`, `pnpm ic`, `pnpm install-clean`
[#&#8203;11003](https://redirect.github.com/pnpm/pnpm/pull/11003).
- Added [`pnpm peers check`](https://pnpm.io/11.x/cli/peers) command
that checks for unmet and missing peer dependency issues by reading the
lockfile
[#&#8203;7087](https://redirect.github.com/pnpm/pnpm/issues/7087).
- Implemented the [`version`](https://pnpm.io/11.x/cli/version) command
natively in pnpm to support workspaces and `workspace:` protocols
correctly. The new command allows bumping package versions (major,
minor, patch, etc.) with full workspace support and git integration
[#&#8203;10879](https://redirect.github.com/pnpm/pnpm/pull/10879).
- [`pnpm audit --fix`](https://pnpm.io/11.x/cli/audit) now supports a
new interactive mode via `--interactive`/`-i`.
- Added the [`pnpm docs`](https://pnpm.io/11.x/cli/docs) command and its
alias `pnpm home`. This command opens the package documentation or
homepage in the browser. When the package has no valid homepage, it
falls back to `https://npmx.dev/package/<name>`.
- Added native [`pnpm ping`](https://pnpm.io/11.x/cli/ping) command to
test registry connectivity. Provides a simple way to verify connectivity
to the configured registry without requiring external tools.
- Implemented native [`search`](https://pnpm.io/11.x/cli/search) command
and its aliases (`s`, `se`, `find`).
- Implemented native [`star`, `unstar`,
`stars`](https://pnpm.io/11.x/cli/star), and
[`whoami`](https://pnpm.io/11.x/cli/whoami) commands.
- Add [`pnpm with <version|current>
<args...>`](https://pnpm.io/11.x/cli/with) command. Runs pnpm at a
specific version (or the currently active one) for a single invocation,
bypassing the project's `packageManager` and `devEngines.packageManager`
pins.
- Added a new [`pnpm pack-app`](https://pnpm.io/11.x/cli/pack-app)
command that packs a CommonJS entry file into a standalone executable
for one or more target platforms, using the [Node.js Single Executable
Applications](https://nodejs.org/api/single-executable-applications.html)
API under the hood.

##### Configuration

- Added support for a global YAML config file named `config.yaml`.

  Configuration is now split into two categories:

- Registry and auth settings, which can be stored in INI files such as
the global `rc` file and local `.npmrc`.
- pnpm-specific settings, which can only be loaded from YAML files such
as the global `config.yaml` and local `pnpm-workspace.yaml`.

- Added support for loading environment variables whose names start with
`pnpm_config_` into config. These environment variables override
settings from `pnpm-workspace.yaml` but not CLI arguments.

- Added support for reading `allowBuilds` from `pnpm-workspace.yaml` in
the global package directory for global installs.

- Added support for `pnpm config get globalconfig` to retrieve the
global config file path
[#&#8203;9977](https://redirect.github.com/pnpm/pnpm/issues/9977).

- Added a new setting `virtualStoreOnly` that populates the virtual
store without creating importer symlinks, hoisting, bin links, or
running lifecycle scripts. This is useful for pre-populating a store
(e.g., in Nix builds) without creating unnecessary project-level
artifacts. `pnpm fetch` now uses this mode internally
[#&#8203;10840](https://redirect.github.com/pnpm/pnpm/issues/10840).

- Added support for specifying the pnpm version via
`devEngines.packageManager` in `package.json`. Unlike the
`packageManager` field, this supports version ranges. The resolved
version is stored in `pnpm-lock.yaml` and reused if it still satisfies
the range
[#&#8203;10932](https://redirect.github.com/pnpm/pnpm/pull/10932).

- Added a new `dedupePeers` setting that reduces peer dependency
duplication. When enabled, peer dependency suffixes use version-only
identifiers (`name@version`) instead of full dep paths, e

> ✂ **Note**
> 
> PR body was truncated to here.


</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/dubzzz/fast-check).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNTkuMiIsInVwZGF0ZWRJblZlciI6IjQzLjE3My42IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: claude[bot] <claude[bot]@users.noreply.github.com>
Co-authored-by: Nicolas DUBIEN <dubzzz@users.noreply.github.com>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Johannes-Andersen pushed a commit to Johannes-Andersen/Hjertestarterregister2OSM that referenced this pull request May 13, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`11.1.0` →
`11.1.1`](https://renovatebot.com/diffs/npm/pnpm/11.1.0/11.1.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.1.0/11.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Oslo)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Johannes-Andersen/Hjertestarterregister2OSM).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzMuNiIsInVwZGF0ZWRJblZlciI6IjQzLjE3My42IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
pull Bot pushed a commit to Patlukat/authelia that referenced this pull request May 13, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`11.1.0` →
`11.1.1`](https://renovatebot.com/diffs/npm/pnpm/11.1.0/11.1.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.1.0/11.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&authelia#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&authelia#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&authelia#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/authelia/authelia).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzMuNiIsInVwZGF0ZWRJblZlciI6IjQzLjE3My42IiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyIsImphdmFzY3JpcHQiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Automaat added a commit to Automaat/flip that referenced this pull request May 13, 2026
> ℹ️ **Note**
> 
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`10.33.4` →
`11.1.1`](https://renovatebot.com/diffs/npm/pnpm/10.33.4/11.1.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/10.33.4/11.1.1?slim=true)
|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) | `10`
→ `11` |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/10.33.4/11.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

###
[`v11.1.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1110)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.9...v11.1.0)

##### Minor Changes

- Added `pnpm audit signatures` to verify ECDSA registry signatures for
installed packages against keys from `/-/npm/v1/keys`
[#&#8203;7909](https://redirect.github.com/pnpm/pnpm/issues/7909).
Scoped registries are respected, and registries without signing keys are
skipped.

- Added support for installing packages from the [GitHub Packages npm
registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry)
via a built-in `gh:` prefix (e.g. `pnpm add gh:@&#8203;acme/private`),
and, more broadly, for arbitrary named registries in the style of [vlt's
named-registry aliases](https://docs.vlt.sh/cli/registries).
Authentication is picked up from the existing per-URL `.npmrc` entries
(e.g. `//npm.pkg.github.com/:_authToken=...`), so no separate auth
mechanism is required.

Additional aliases — or an override for the built-in `gh` alias, for
GitHub Enterprise Server — can be configured under `namedRegistries` in
`pnpm-workspace.yaml`:

  ```yaml
  namedRegistries:
    gh: https://npm.pkg.github.example.com/
    work: https://npm.work.example.com/
  ```

With this, `work:@&#8203;corp/lib@^2.0.0` resolves against
`https://npm.work.example.com/`.
[#&#8203;8941](https://redirect.github.com/pnpm/pnpm/issues/8941).

- Allow setting sbom spec version using `--sbom-spec-version`
[#&#8203;11389](https://redirect.github.com/pnpm/pnpm/pull/11389).

- Add `--no-runtime` flag (config: `runtime=false`) to skip installing
runtime entries (e.g. Node.js downloaded via `devEngines.runtime`)
without modifying the lockfile. The lockfile keeps the runtime entry so
frozen-lockfile validation still passes; only the runtime fetch and
`.bin` linking are skipped. Useful in CI matrices where the runtime is
provisioned externally (e.g. via `pnpm runtime -g set node <version>`)
before `pnpm install` runs.

- Added the `pnpm bugs` command that opens a package's bug tracker URL
in the browser. With no arguments, it reads the current project's
`package.json`; with one or more package names, it fetches each
package's metadata from the registry and opens its bug tracker. Falls
back to `<repository>/issues` when the `bugs` field is missing
[#&#8203;11279](https://redirect.github.com/pnpm/pnpm/pull/11279).

- Added `pnpm owner` command to manage package owners on the registry.

##### Patch Changes

- Added "published X ago by Y" information to the `pnpm view` command
output, similar to `npm view`. This is useful when comparing against
`minimumReleaseAge`.

  For example, `pnpm view pnpm` now shows:

  ```
  published 17 hours ago by GitHub Actions
  ```

- `pnpm publish` now honors the configured HTTP/HTTPS proxy (including
`https_proxy`/`http_proxy`/`no_proxy` environment variables) when
polling the registry's `doneUrl` during the web-based authentication
flow. Previously the poll bypassed the proxy, causing the registry to
respond `403` from a different source IP and the login to never complete
[#&#8203;11561](https://redirect.github.com/pnpm/pnpm/issues/11561).

- `pnpm add -g` now installs each space-separated package into its own
isolated directory by default. To bundle multiple packages into the same
isolated install (so that they share dependencies and are removed
together), pass them as a comma-separated list. For example:

- `pnpm add -g foo bar` installs `foo` and `bar` as two independent
globals — removing one does not affect the other.
- `pnpm add -g foo,bar qar` bundles `foo` and `bar` into a single
isolated install while `qar` is installed on its own.

Related:
[#&#8203;11587](https://redirect.github.com/pnpm/pnpm/issues/11587).

- `pnpm runtime set <name> <version>` no longer fails in the root of a
multi-package workspace with the `ADDING_TO_ROOT` error. Installing the
workspace root is a valid target for a runtime, so the command now
bypasses that safety check.

- Fix `pnpm --version` hanging for the lifetime of the worker pool after
the version was printed. `main.ts`'s `--version` short-circuit returned
before reaching the command-handler `finally` that calls
`finishWorkers()`, so the worker pool that `switchCliVersion` had
spawned during integrity resolution stayed alive and held the Node event
loop open. The CLI entry now runs `finishWorkers()` from its own
`finally`, so every exit path tears the pool down.

Repro: `pnpm --version` in a workspace whose `devEngines.packageManager`
version already matches the running pnpm + `onFail: "download"`.
`switchCliVersion` resolves the integrity (spawning workers), finds
nothing to swap, returns. The version prints, then the process hangs.

###
[`v11.0.9`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1109)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.8...v11.0.9)

##### Patch Changes

- Fixed installation of GitLab-hosted dependencies. pnpm now downloads
the tarball from
`https://gitlab.com/<user>/<project>/-/archive/<sha>/<project>-<sha>.tar.gz`
instead of the GitLab API endpoint that contained an encoded slash
(`%2F`) between user and project. The encoded slash both triggered `406
Not Acceptable` responses from GitLab and produced virtual store
directory names that Node refused to import
(`ERR_INVALID_MODULE_SPECIFIER`)
[#&#8203;11533](https://redirect.github.com/pnpm/pnpm/issues/11533).
- Honor `NPM_CONFIG_USERCONFIG` (and its lowercase
`npm_config_userconfig` form) as a low-priority fallback when locating
the user-level `.npmrc`. This restores compatibility with environments
that point npm at a custom auth file via that env var — most notably
`actions/setup-node`, which writes registry credentials to
`${runner.temp}/.npmrc` and exports `NPM_CONFIG_USERCONFIG` to reference
it. Without this, GitHub Actions workflows using `actions/setup-node` to
authenticate to private registries broke after upgrading to pnpm v11.
PNPM-prefixed env vars and `npmrcAuthFile` from the global `config.yaml`
continue to take precedence
[#&#8203;11539](https://redirect.github.com/pnpm/pnpm/issues/11539).
- Fix `pnpm pack` not bundling dependencies listed in
`bundleDependencies` (or `bundledDependencies`). The npm-packlist
upgrade in pnpm 11 changed its API to require the caller to pre-populate
the dependency tree, which the wrapper was not doing —
`bundleDependencies` were silently dropped from the tarball
[#&#8203;11519](https://redirect.github.com/pnpm/pnpm/issues/11519).
- Fixed the pnpm CLI crashing with a confusing `SyntaxError: Invalid
regular expression flags` instead of printing a clear "requires Node.js
v22.13" error when launched on an unsupported Node.js version. The
Node.js version check in `bin/pnpm.mjs` was effectively dead code
because the static `import` of the bundled `dist/pnpm.mjs` was hoisted
by the ES module loader and parsed before the check could run
[#&#8203;11546](https://redirect.github.com/pnpm/pnpm/issues/11546).
- Fixed `pnpm --prefix=<dir> install` overwriting the existing
`pnpm-workspace.yaml` in `<dir>` with `set this to true or false`
placeholders. The renamed `--prefix` option (which maps to `dir`) was
not honored when locating the workspace root, so the workspace
manifest's `allowBuilds` settings were not loaded into config and got
clobbered when ignored builds were auto-populated
[#&#8203;11535](https://redirect.github.com/pnpm/pnpm/issues/11535).
- Fixed `pnpm publish --provenance` failing with a 422 from the registry
when the package version contained semver build metadata (e.g.
`1.0.0-canary.0+abc1234`). The `+<build>` segment is now stripped before
packing so that the version embedded in the tarball, the metadata sent
to the registry, and the sigstore provenance subject all agree
[#&#8203;11518](https://redirect.github.com/pnpm/pnpm/issues/11518).

###
[`v11.0.8`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1108)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.7...v11.0.8)

##### Patch Changes

- Restored the heuristic that preserves tarball URLs in `pnpm-lock.yaml`
when they cannot be derived from name+version+registry, even with the
default `lockfileIncludeTarballUrl: false`. Without this, `pnpm install
--frozen-lockfile` from an empty store fails with `ERR_PNPM_FETCH_404`
for packages on registries that serve tarballs from a non-standard path
— most notably GitHub Packages
(`https://npm.pkg.github.com/download/<scope>/<name>/<version>/<hash>`)
and JSR. `lockfileIncludeTarballUrl: true` continues to force the URL
into the lockfile for every package
[#&#8203;11276](https://redirect.github.com/pnpm/pnpm/issues/11276).
- Run `preversion`, `version`, and `postversion` lifecycle scripts for
`pnpm version`.
- Fixed `ERR_PNPM_BAD_TARBALL_SIZE` when a registry serves tarballs with
an end-to-end `Content-Encoding` (e.g. `gzip`). Tarballs are already
compressed, so the fetcher now requests them with `Accept-Encoding:
identity` (matching pnpm v10's effective behavior) and, as defense in
depth against misbehaving servers, no longer enforces the strict
`Content-Length` check when the response declares a `Content-Encoding` —
`Content-Length` in that case refers to the encoded payload, not the
decoded bytes the fetch implementation yields
[#&#8203;11506](https://redirect.github.com/pnpm/pnpm/issues/11506).

###
[`v11.0.7`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1107)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.6...v11.0.7)

##### Patch Changes

- Restore the execute bit on the `node-gyp` shims packed inside
`@pnpm/exe` (`dist/node-gyp-bin/node-gyp`,
`dist/node-gyp-bin/node-gyp.cmd`, and
`dist/node_modules/node-gyp/bin/node-gyp.js`). Without this,
`pnpm/action-setup`'s standalone path (used on runners with Node.js <
22.13) failed any install whose lifecycle script invoked `node-gyp
rebuild` with `sh: 1: node-gyp: Permission denied`
[#&#8203;11483](https://redirect.github.com/pnpm/pnpm/issues/11483).

- Fixed the `pn`, `pnpx`, and `pnx` aliases failing in Git Bash / MSYS2
on Windows when pnpm was installed via `@pnpm/exe` (or after `pnpm
self-update`)
[#&#8203;11486](https://redirect.github.com/pnpm/pnpm/issues/11486).
Running `pnpx` (or `pnx`) printed the cmd.exe banner and dropped the
user into an interactive command prompt instead of running `pnpm dlx`.
The `bin` field rewrite on Windows was pointing those aliases at `.cmd`
files; cmd-shim's Bash shim for a `.cmd` target wraps it in `exec cmd /C
...`, and MSYS2 mangles `/C` into a Windows path before cmd.exe sees it.
The aliases are now `.exe` hardlinks of the SEA binary, which detects
which name it was launched as via `process.execPath` and prepends `dlx`
for `pnpx` / `pnx`.

- Fix `pnpm install` recreating `node_modules` after `pnpm fetch`. `pnpm
fetch` records empty `hoistPattern` and `publicHoistPattern` in
`.modules.yaml`; since v11 removed the explicit-config gate, the
follow-up install treated those as a hoist-pattern change and purged the
modules directory. The fetch step now flags the modules manifest with
`virtualStoreOnly: true` so the next install skips the hoist-pattern
comparison and completes the missing post-import linking in place
[#&#8203;11488](https://redirect.github.com/pnpm/pnpm/issues/11488).

- Pin the integrity of git-hosted tarballs (codeload.github.com,
gitlab.com, bitbucket.org) in the lockfile so that subsequent installs
detect a tampered or substituted tarball and refuse to install it.
Previously the lockfile only stored the tarball URL for git
dependencies, so a compromised git host or a man-in-the-middle could
serve arbitrary code on later installs without lockfile changes.

A new `gitHosted: true` field is recorded on git-hosted tarball
resolutions in the lockfile, letting every reader/writer route them by a
single typed check instead of pattern-matching the tarball URL in each
call site. Lockfiles written by older pnpm versions are enriched on load
(URL fallback) so the field can be relied on uniformly across the
codebase.

- Allow user-level preferences in the global `config.yaml`. The
following settings can now be set in `~/.config/pnpm/config.yaml` (or
via `pnpm config set --location global`) instead of being restricted to
`pnpm-workspace.yaml`: `agent`, `globalVirtualStoreDir`,
`initPackageManager`, `initType`, `registrySupportsTimeField`,
`scriptShell`, `shellEmulator`, `sideEffectsCache`,
`sideEffectsCacheReadonly`, `stateDir`, `strictDepBuilds`,
`trustPolicy`, `trustPolicyExclude`, `trustPolicyIgnoreAfter`,
`updateNotifier`, `useStderr`, `verifyDepsBeforeRun`,
`verifyStoreIntegrity`, `virtualStoreDir`, `virtualStoreDirMaxLength`
[#&#8203;11474](https://redirect.github.com/pnpm/pnpm/issues/11474).

- Make trusted publishing (OIDC) take precedence over a configured
static `_authToken` in `pnpm publish`, mirroring the npm CLI's behavior.
When OIDC succeeds, the OIDC-derived token overrides any pre-configured
`_authToken`; when OIDC is not applicable (no CI environment, exchange
fails, registry has no trusted publisher configured), the static token
is used as a fallback. This applies on every package during recursive
publish, so each workspace package independently attempts trusted
publishing.

Additionally, the `NPM_ID_TOKEN` env var is now honored as a CI-agnostic
injection point for an OIDC ID token. Previously OIDC was only attempted
on GitHub Actions or GitLab; now any CI provider that exposes its own
OIDC mechanism (e.g. CircleCI's `CIRCLE_OIDC_TOKEN_V2`, Buildkite, etc.)
can forward its token via `NPM_ID_TOKEN` and trusted publishing will
work without pnpm needing to recognize the provider explicitly.

- `--pm-on-fail=ignore` (and other universal options like `--loglevel`,
`--reporter`) is now honored when combined with `--help` or `--version`.
Previously the CLI argument parser short-circuited those flags before
universal options were preserved, so `pnpm audit --pm-on-fail=ignore
--help` and `pnpm --pm-on-fail=ignore --version` reported the strict
packageManager mismatch instead of running the requested action
[#&#8203;11487](https://redirect.github.com/pnpm/pnpm/issues/11487).

- Fix a regression where `pnpm --recursive --filter '!<pkg>'
run/exec/test/add` would include the workspace root in the matched
projects. The workspace root is now correctly excluded by default when
only negative `--filter` arguments are provided, matching the
[documented behavior](https://pnpm.io/cli/recursive). To include the
root, pass `--include-workspace-root`
[#&#8203;11341](https://redirect.github.com/pnpm/pnpm/issues/11341).

- Restore npm-CLI-compatible `--json` stdout output for `pnpm publish`
([#&#8203;11476](https://redirect.github.com/pnpm/pnpm/issues/11476)).
pnpm 11 reimplemented publish natively
([#&#8203;10591](https://redirect.github.com/pnpm/pnpm/pull/10591)) and
inadvertently dropped the per-package JSON object that pnpm 10 emitted
transitively via the npm CLI, silently breaking downstream tooling —
most notably `nx release publish`, which parses stdout JSON to confirm
success
([nrwl/nx#35575](https://redirect.github.com/nrwl/nx/issues/35575)). On
success, the output is now:

- `pnpm publish --json` → single object `{ id, name, version, size,
unpackedSize, shasum, integrity, filename, files, entryCount, bundled
}`, mirroring `npm publish --json`.
- `pnpm publish -r --json` → array of those objects, mirroring `pnpm
pack --json`'s shape choice.
- `pnpm publish -r --report-summary` → existing
`pnpm-publish-summary.json` envelope `{ publishedPackages: [...] }` is
preserved, but each entry is upgraded to the same per-package shape
(additive — `name` and `version` are still present).

- `pnpm config get @&#8203;<scope>:registry` now reports the same URL
that `pnpm publish` and the resolvers actually use. Previously, `config
get` only consulted `.npmrc`, while `publish`/install used the merged
map that includes `pnpm-workspace.yaml`'s `registries` block — so the
two could diverge silently and a publish could go to the wrong registry
[#&#8203;11492](https://redirect.github.com/pnpm/pnpm/issues/11492).

###
[`v11.0.6`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1106)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.5...v11.0.6)

##### Patch Changes

- Fix `pnpm_config_npmrc_auth_file` and `pnpm_config_userconfig` env
vars not actually loading the custom `.npmrc`. The env vars were parsed
and assigned to the resolved config, but only after `loadNpmrcConfig`
had already read the default `~/.npmrc` — so the custom file path was
set but never read. The relevant env vars are now consulted before the
user-level `.npmrc` is loaded
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).
- Preserve the original key order in `pnpm-workspace.yaml` when updating
it. Existing keys keep their position, and new keys are inserted in
alphabetical position when the existing keys are already sorted (with a
leading `packages` key allowed) or appended at the end otherwise.
- Fixed `pnpm self-update` on installations originally set up by pnpm
v10. v10 added `PNPM_HOME` directly to PATH and wrote a `pnpm` bootstrap
shim there. v11 setup writes shims under `PNPM_HOME/bin` instead, so
when a v10 user upgrades to v11 the legacy shim at `PNPM_HOME` keeps
pointing into the old `.tools/<version>` install — `pnpm --version`
continues to report the pre-update version even though the new version
was installed under `global/v11`. Self-update now detects this layout,
refreshes the legacy shims so the upgrade actually takes effect, and
prints a hint suggesting `pnpm setup` to migrate PATH to the v11 layout.
[#&#8203;11464](https://redirect.github.com/pnpm/pnpm/issues/11464).
- Print a warning when settings that are not allowed in the global
config file (e.g. `nodeLinker`, `hoistPattern`) are present in
`config.yaml` and silently ignored. Previously these settings were
dropped without any feedback, leaving users unsure why their global
configuration had no effect. The warning suggests moving those settings
to a project-level `pnpm-workspace.yaml`, or sharing them across
projects via [config
dependencies](https://pnpm.io/11.x/config-dependencies).
- Throw a pnpm error when `overrides` has an invalid shape or contains a
non-string value.
- Validate all `readPackage` dependency map fields, including
`devDependencies`, and reject falsy non-object invalid values instead of
silently accepting them.
- Prevent crashes during `pnpm config`, `pnpm set`, and `pnpm get` by
tolerating `configDependencies` install failures. For these commands, a
failure to install `configDependencies` (for example because the
registry auth token has not been written yet) is now logged at debug
level and the command proceeds. All other commands still surface the
install error
[#&#8203;10684](https://redirect.github.com/pnpm/pnpm/issues/10684).
- Treat `allowBuilds` as an install-state input and clear previously
ignored builds when they are explicitly disallowed.
- Fixes
[#&#8203;10594](https://redirect.github.com/pnpm/pnpm/issues/10594),
catalogs not being read from the workspace when using the `catalog:`
protocol with the `pnpm dlx` / `pnpx` command, resulting in a catalog
entry not found error.
- Accept `PNPM_CONFIG_*` (uppercase) environment variables in addition
to `pnpm_config_*`. Previously, only the lowercase form was honored, so
env vars renamed per the v11 migration guide (e.g.
`PNPM_CONFIG_USERCONFIG`) silently had no effect on case-sensitive
systems like macOS and Linux
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).

###
[`v11.0.5`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1105)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.4...v11.0.5)

##### Patch Changes

- Drop the `darwin-x64` artifact from `@pnpm/exe` and from the GitHub
release page. The Node.js SEA mechanism `pnpm pack-app` uses produces a
binary that segfaults at startup on Intel Macs because of an upstream
Node.js bug
([nodejs/node#62893](https://redirect.github.com/nodejs/node/issues/62893),
tracked alongside
[#&#8203;59553](https://redirect.github.com/nodejs/node/issues/59553);
the Node.js team has [opted not to fix
it](https://redirect.github.com/nodejs/node/pull/60250) on the grounds
that x64 macOS is being phased out). Re-signing with `codesign` or
`ldid` doesn't help — the corruption is in LIEF's Mach-O surgery, before
signing.

Intel Mac users should install pnpm via `npm install -g pnpm` (uses the
system Node.js, no SEA), or stay on pnpm 10.x. `@pnpm/exe`'s preinstall
on Intel Mac now exits with a clear error pointing at these
alternatives.

Closes
[#&#8203;11423](https://redirect.github.com/pnpm/pnpm/issues/11423).

- `pnpm dlx` (and `pnpx`/`pnx`/`pnpm create`) now runs the same
interactive `approve-builds` prompt as `pnpm add -g` when the package
being launched depends on transitive packages with install scripts.
Previously, the v11 `strictDepBuilds` default made dlx fail with
`ERR_PNPM_IGNORED_BUILDS` and required users to re-run with
`--allow-build=<pkg>` for every offending dependency. dlx also now
removes the partially-populated cache directory when the install fails,
so a subsequent run starts clean instead of reusing a broken install
whose builds were silently skipped
[#&#8203;11444](https://redirect.github.com/pnpm/pnpm/issues/11444).

- [`72629fc`](https://redirect.github.com/pnpm/pnpm/commit/72629fc): Fix
`pnpm -g ls --json` and `pnpm -g ls --parseable` so they emit valid JSON
and parseable output respectively, matching pnpm 10 behavior. Since the
isolated global packages refactor in pnpm 11, the global list command
had a custom path that always printed plain text and ignored
`--json`/`--parseable`, which broke tools like `npm-check-updates` that
parse the JSON output
[#&#8203;11440](https://redirect.github.com/pnpm/pnpm/issues/11440).

`pnpm -g ls --depth=<n>` (with n > 0) now errors when more than one
isolated global install would be involved, since each install has its
own lockfile and merging their transitive trees would be incoherent.
When the request can be narrowed to a single install group, the regular
`list` flow is used and the full dependency tree is shown.

- Fixed `pnpm publish` to honor `publishConfig.registry` from
`package.json` when publishing a single package. The native publish flow
introduced in v11 was reading the registry from `.npmrc` only, ignoring
the per-package override
[#&#8203;11419](https://redirect.github.com/pnpm/pnpm/issues/11419).

- When `strictPeerDependencies` is `true`, the
`ERR_PNPM_PEER_DEP_ISSUES` error once again renders the peer dependency
issues inline using the same format as `pnpm peers check`, so users (and
CI tools like Renovate) can see what failed without running `pnpm peers
check` separately
[#&#8203;11439](https://redirect.github.com/pnpm/pnpm/issues/11439).

- The `WARN` and error code labels in pnpm's output now wrap in brackets
(`[WARN]`, `[ERR_PNPM_FOO]`). Previously the labels relied entirely on a
colored background to stand out, which meant they blended into the
surrounding text in terminals without color (e.g. when `NO_COLOR` is set
or output is piped). The brackets are painted in the same color as the
badge background, so they appear as ordinary padding in color-capable
terminals — only the no-color rendering changes.

###
[`v11.0.4`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1104)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.3...v11.0.4)

##### Patch Changes

- Fixed `pnpm ci` not reinstalling workspace package `node_modules`
directories after the clean step
[#&#8203;11427](https://redirect.github.com/pnpm/pnpm/issues/11427).
- Remove pnpm's workspace state file when cleaning node\_modules so
`pnpm ci` performs a fresh install after the clean step.
- Do not remove `pnpm-lock.yaml` during `pnpm clean` when `lockfile:
true` is configured in `pnpm-workspace.yaml`. The lockfile is only
removed when the `--lockfile` option is passed to `pnpm clean`.
- `pnpm self-update` (with no version argument) no longer downgrades
pnpm when the registry's `latest` dist-tag points to an older release
than the currently active version. Run `pnpm self-update latest` to
force a downgrade
[#&#8203;11418](https://redirect.github.com/pnpm/pnpm/issues/11418).
- `minimumReleaseAgeStrict` now defaults to `true` whenever the user
explicitly sets `minimumReleaseAge` (via `pnpm-workspace.yaml`, the
global `config.yaml`, the CLI, or `pnpm_config_*` env vars).

###
[`v11.0.3`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1103)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.2...v11.0.3)

##### Patch Changes

- Fix too many open files error sometimes happening on Windows, when
creating command shims in `node_modules/.bin`
[#&#8203;11412](https://redirect.github.com/pnpm/pnpm/issues/11412).
- Fix `ERR_PNPM_FETCH_404` when installing a project whose lockfile
depends on a `file:` tarball. The previous behavior dropped the
`tarball` field from `file:` and git-hosted resolutions when
`lockfile-include-tarball-url=false` (the default), even though those
URLs cannot be reconstructed from the package name, version, and
registry
[#&#8203;11407](https://redirect.github.com/pnpm/pnpm/issues/11407).

###
[`v11.0.2`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1102)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.1...v11.0.2)

##### Patch Changes

- Fix `ENOENT` symlink failure when `pnpm add -g` triggers the
approve-builds prompt. The global add flow used to forward an absolute
`modulesDir` (`<installDir>/node_modules`) into the install run by
`approve-builds`. The install layer treated `modulesDir` as a path
relative to `lockfileDir` and joined it again, producing a doubled path
on Windows because `path.join` does not collapse an embedded absolute
path. The hoist step then tried to `mkdir` and symlink under
`<installDir>\<installDir>\node_modules\.pnpm\node_modules\...` and
failed with `ENOENT`
[#&#8203;11403](https://redirect.github.com/pnpm/pnpm/issues/11403).
- Fixed `packageManagerDependencies` going stale when pnpm is invoked
through corepack. The lockfile sync (and the `devEngines.packageManager`
version check) previously ran only when pnpm was invoked directly; under
corepack the entire block was skipped, so a stale entry would persist
even after the running pnpm version changed. The lockfile sync now runs
regardless of how pnpm was invoked, while the pnpm-managed version
switch (`onFail: 'download'`) remains skipped under corepack so it
doesn't fight corepack's own version selection
[#&#8203;11397](https://redirect.github.com/pnpm/pnpm/issues/11397).
- Fix recursive publish summaries to report the manifest from
`publishConfig.directory` when packages publish from a generated
directory
[#&#8203;11239](https://redirect.github.com/pnpm/pnpm/issues/11239).
- Fix negated `os` / `cpu` entries (e.g. `["!win32"]`) being incorrectly
rejected when `supportedArchitectures` expands to multiple platforms
[#&#8203;11375](https://redirect.github.com/pnpm/pnpm/pull/11375).

###
[`v11.0.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1101)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.0...v11.0.1)

##### Patch Changes

- Report unknown top-level options before falling back to implicit `pnpm
run` scripts.
- Reject `null` named catalogs in workspace manifests with
`InvalidWorkspaceManifestError` instead of crashing with a raw
`TypeError`.
- Populate download location for git-sourced dependencies in SBOM
output. Previously `pnpm sbom` emitted `NOASSERTION` (SPDX) and omitted
the distribution reference (CycloneDX) for git dependencies. Now emits
the git URL with commit hash, e.g.
`git+https://github.com/user/repo.git#commit`.
- `pnpm self-update` now keeps `package.json`'s `packageManager` and
`devEngines.packageManager` in sync. When the legacy `packageManager`
field pins pnpm, both fields are rewritten to the new exact pnpm version
on update — `packageManager` to `pnpm@<version>` (without an integrity
hash), and `devEngines.packageManager.version` to the same exact
`<version>` (dropping any range operator). When only
`devEngines.packageManager` is declared, the existing range-preserving
behavior is unchanged
[#&#8203;11388](https://redirect.github.com/pnpm/pnpm/issues/11388).
- Sort the keys of the overrides object returned by `pnpm audit --fix`
so that the log output order matches the order written to
`pnpm-workspace.yaml`.
- Update the env lockfile's `packageManagerDependencies` entry when
`devEngines.packageManager` declares a pnpm version that the lockfile no
longer satisfies. Previously, the stale entry was kept even though the
running pnpm matched the declared version, silently breaking the
integrity record
[#&#8203;11387](https://redirect.github.com/pnpm/pnpm/issues/11387).

###
[`v11.0.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1100)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v10.33.4...v11.0.0)

##### Highlights

##### Major

- **Node.js 22+ required** — support for Node 18, 19, 20, and 21 is
dropped, pnpm itself is now pure ESM, and the standalone exe requires
glibc 2.27.
- **Supply-chain protection on by default** — `minimumReleaseAge`
defaults to 1 day (newly published packages are not resolved for 24h)
and `blockExoticSubdeps` defaults to `true`.
- **`allowBuilds` replaces the old build-dependency settings** —
`onlyBuiltDependencies`, `onlyBuiltDependenciesFile`,
`neverBuiltDependencies`, `ignoredBuiltDependencies`, and
`ignoreDepScripts` have been removed.
- **Global installs are isolated and use the global virtual store by
default** — each `pnpm add -g` gets its own directory with its own
`package.json`, `node_modules`, and lockfile.
- **New SQLite-backed store index** (store v11) with bundled manifests
and hex digests, reducing filesystem syscalls and speeding up
installation.
- **Native publish flow** — [`pnpm
publish`](https://pnpm.io/11.x/cli/publish),
[`login`](https://pnpm.io/11.x/cli/login),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`view`](https://pnpm.io/11.x/cli/view),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) no longer delegate to the
npm CLI, and the remaining npm passthrough commands now throw "not
implemented".
- **[`pnpm audit`](https://pnpm.io/11.x/cli/audit) uses npm's bulk
advisories endpoint** — the legacy `/security/audits` endpoints are
gone. CVE-based filtering has been replaced with GHSA-based filtering:
migrate `auditConfig.ignoreCves` entries to `auditConfig.ignoreGhsas`.
- **`.npmrc` is auth/registry only** — all other settings must live in
`pnpm-workspace.yaml` or the new global `config.yaml`, and environment
variables use the `pnpm_config_*` prefix.
- **Runtime installs are slimmer** — installing a Node.js runtime via
`node@runtime:<version>` no longer extracts the bundled `npm`, `npx`,
and `corepack`, roughly halving the files pnpm has to hash, write, and
link.

##### Minor

- **New commands:** [`pnpm ci`](https://pnpm.io/11.x/cli/ci), [`pnpm
sbom`](https://pnpm.io/11.x/cli/sbom), [`pnpm
clean`](https://pnpm.io/11.x/cli/clean), [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers), [`pnpm runtime
set`](https://pnpm.io/11.x/cli/runtime), [`pnpm
docs`](https://pnpm.io/11.x/cli/docs)/`home`, [`pnpm
ping`](https://pnpm.io/11.x/cli/ping), [`pnpm
search`](https://pnpm.io/11.x/cli/search), [`pnpm
star`](https://pnpm.io/11.x/cli/star)/`unstar`/`stars`, [`pnpm
whoami`](https://pnpm.io/11.x/cli/whoami), [`pnpm
with`](https://pnpm.io/11.x/cli/with), and [`pnpm
pack-app`](https://pnpm.io/11.x/cli/pack-app), plus
`pn`/[`pnx`](https://pnpm.io/11.x/cli/pnx) short aliases.
- **ESM pnpmfiles** via `.pnpmfile.mjs`, which takes priority over
`.pnpmfile.cjs` when present.
- **[`pnpm audit --fix=update`](https://pnpm.io/11.x/cli/audit)** fixes
vulnerabilities by updating packages in the lockfile instead of adding
overrides, and `pnpm audit --fix --interactive` lets you select which
advisories to fix.
- **[`pnpm pack-app`](https://pnpm.io/11.x/cli/pack-app)** packs a
CommonJS entry into a standalone executable for one or more target
platforms using Node.js Single Executable Applications.
- **Faster HTTP and I/O** — undici with Happy Eyeballs, direct-to-CAS
writes, skipped staging directory, pre-allocated tarball downloads, and
an NDJSON metadata cache.

##### Major Changes

##### Requirements

- pnpm is now distributed as pure ESM.
- Dropped support for Node.js v18, 19, 20, and 21.
- The standalone exe version of pnpm requires at least glibc 2.27.

##### Security & Build Defaults

- Changed default values: `optimisticRepeatInstall` is now `true`,
`verifyDepsBeforeRun` is now `install`, `minimumReleaseAge` is now
`1440` (1 day), and `minimumReleaseAgeStrict` is `false`. Newly
published packages will not be resolved until they are at least 1 day
old. This protects against supply chain attacks by giving the community
time to detect and remove compromised versions. To opt out, set
`minimumReleaseAge: 0` in `pnpm-workspace.yaml`
[#&#8203;11158](https://redirect.github.com/pnpm/pnpm/pull/11158).

- `strictDepBuilds` is `true` by default.

- `blockExoticSubdeps` is `true` by default.

- Removed deprecated build dependency settings: `onlyBuiltDependencies`,
`onlyBuiltDependenciesFile`, `neverBuiltDependencies`,
`ignoredBuiltDependencies`, and `ignoreDepScripts`
[#&#8203;11220](https://redirect.github.com/pnpm/pnpm/pull/11220).

Use the `allowBuilds` setting instead. It is a map where keys are
package name patterns and values are booleans:

  - `true` means the package is allowed to run build scripts
- `false` means the package is explicitly denied from running build
scripts

Same as before, by default, none of the packages in the dependencies are
allowed to run scripts. If a package has postinstall scripts and it
isn't declared in `allowBuilds`, an error is printed.

  Before:

  ```yaml
  onlyBuiltDependencies:
    - electron
  onlyBuiltDependenciesFile: "allowed-builds.json"
  neverBuiltDependencies:
    - core-js
  ignoredBuiltDependencies:
    - esbuild
  ```

  After:

  ```yaml
  allowBuilds:
    electron: true
    core-js: false
    esbuild: false
  ```

- Removed `allowNonAppliedPatches` in favor of `allowUnusedPatches`.

- Removed `ignorePatchFailures`; patch application failures now throw an
error.

##### Store

- Runtime dependencies are always linked from the global virtual store
[#&#8203;10233](https://redirect.github.com/pnpm/pnpm/pull/10233).
- Optimized index file format to store the hash algorithm once per file
instead of repeating it for every file entry. Each file entry now stores
only the hex digest instead of the full integrity string
(`<algo>-<digest>`). Using hex format improves performance since file
paths in the content-addressable store use hex representation,
eliminating base64-to-hex conversion during path lookups.
- Store version bumped to v11.
- The bundled manifest (name, version, bin, engines, scripts, etc.) is
now stored directly in the package index file, eliminating the need to
read `package.json` from the content-addressable store during resolution
and installation. This reduces I/O and speeds up repeat installs
[#&#8203;10473](https://redirect.github.com/pnpm/pnpm/pull/10473).
- The package index in the content-addressable store is now backed by
SQLite. Instead of individual JSON files under `$STORE/index/`, package
metadata is stored in a single SQLite database at `$STORE/index.db` with
MessagePack-encoded values. This reduces filesystem syscall overhead,
improves space efficiency for small metadata entries, and enables
concurrent access via SQLite's WAL mode. Packages missing from the new
index are re-fetched on demand
[#&#8203;10500](https://redirect.github.com/pnpm/pnpm/pull/10500)
[#&#8203;10826](https://redirect.github.com/pnpm/pnpm/issues/10826).

##### Global Packages

- Global installs (`pnpm add -g pkg`) and `pnx` now use the global
virtual store by default. Packages are stored at `{storeDir}/links`
instead of per-project `.pnpm` directories. This can be disabled by
setting `enableGlobalVirtualStore: false`
[#&#8203;10694](https://redirect.github.com/pnpm/pnpm/pull/10694).

- Isolated global packages. Each globally installed package (or group of
packages installed together) now gets its own isolated installation
directory with its own `package.json`, `node_modules/`, and lockfile.
This prevents global packages from interfering with each other through
peer dependency conflicts, hoisting changes, or version resolution
shifts.

  Key changes:

- `pnpm add -g <pkg>` creates an isolated installation in
`{pnpmHomeDir}/global/v11/{hash}/`
- `pnpm remove -g <pkg>` removes the entire installation group
containing the package
- `pnpm update -g [pkg]` re-installs packages in new isolated
directories
- `pnpm list -g` scans isolated directories to show all installed global
packages
- `pnpm install -g` (no args) is no longer supported; use `pnpm add -g
<pkg>` instead

- Globally installed binaries are now stored in a `bin` subdirectory of
`PNPM_HOME` instead of directly in `PNPM_HOME`. This prevents internal
directories like `global/` and `store/` from polluting shell
autocompletion when `PNPM_HOME` is on PATH
[#&#8203;10986](https://redirect.github.com/pnpm/pnpm/issues/10986).
After upgrading, run `pnpm setup` to update your shell configuration.

- Breaking changes to `pnpm link`:

- `pnpm link <pkg-name>` no longer resolves packages from the global
store. Only relative or absolute paths are accepted. For example, use
`pnpm link ./foo` instead of `pnpm link foo`.
- `pnpm link --global` is removed. Use `pnpm add -g .` to register a
local package's bins globally.
- `pnpm link` (no arguments) is removed. Use `pnpm link <dir>` with an
explicit path instead.

##### Configuration

- pnpm no longer reads all settings from `.npmrc`. Only auth and
registry settings are read from `.npmrc` files. All other settings (like
`hoistPattern`, `nodeLinker`, `shamefullyHoist`, etc.) must be
configured in `pnpm-workspace.yaml` or the global
`~/.config/pnpm/config.yaml`
[#&#8203;11189](https://redirect.github.com/pnpm/pnpm/pull/11189).

- Network settings (`httpProxy`, `httpsProxy`, `noProxy`,
`localAddress`, `strictSsl`, `gitShallowHosts`) are now written to
`config.yaml` (global) or `pnpm-workspace.yaml` (local) instead of
`.npmrc`/`auth.ini`. They are still readable from `.npmrc` for easier
migration from the npm CLI
[#&#8203;11209](https://redirect.github.com/pnpm/pnpm/pull/11209).

pnpm no longer reads `npm_config_*` environment variables. Use
`pnpm_config_*` environment variables instead (e.g.,
`pnpm_config_registry` instead of `npm_config_registry`).

  pnpm no longer reads the npm global config at `$PREFIX/etc/npmrc`.

  `pnpm login` writes auth tokens to `~/.config/pnpm/auth.ini`.

  New `registries` setting in `pnpm-workspace.yaml`:

  ```yaml
  registries:
    default: https://registry.npmjs.org/
    "@&#8203;my-org": https://private.example.com/
    "@&#8203;internal": https://nexus.corp.com/
  ```

Auth tokens in `~/.npmrc` still work — pnpm continues to read `~/.npmrc`
as a fallback for registry authentication. The new `npmrcAuthFile`
setting can be used to point to a different file instead of `~/.npmrc`.

- Replace workspace project specific `.npmrc` with `packageConfigs` in
`pnpm-workspace.yaml`.

  A workspace manifest with `packageConfigs` looks something like this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    "project-1":
      saveExact: true
    "project-2":
      savePrefix: "~"
  ```

  Or this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    - match: ["project-1", "project-2"]
      modulesDir: "node_modules"
      saveExact: true
  ```

- pnpm no longer reads settings from the `pnpm` field of `package.json`.
Settings should be defined in `pnpm-workspace.yaml`
[#&#8203;10086](https://redirect.github.com/pnpm/pnpm/pull/10086).

- `pnpm config get` (without `--json`) no longer prints INI formatted
text. Instead, it prints JSON for objects and arrays, and raw strings
for strings, numbers, booleans, and nulls. `pnpm config get --json`
still prints all types of values as JSON, as before.

- `pnpm config get <array>` now prints a JSON array.

- `pnpm config list` now prints a JSON object instead of INI formatted
text.

- `pnpm config list` and `pnpm config get` (without argument) now hide
auth-related settings.

- `pnpm config list` and `pnpm config get` (without argument) now show
top-level keys as camelCase. Exception: keys that start with `@` or `//`
are preserved (their cases don't change).

- `pnpm config get` and `pnpm config list` no longer load non-camelCase
options from the workspace manifest (`pnpm-workspace.yaml`).

##### Removed Commands & npm Passthrough

- pnpm no longer falls back to the npm CLI. Commands that were
previously passed through to npm (`access`, `bugs`, `docs`, `edit`,
`find`, `home`, `issues`, `owner`, `ping`, `prefix`, `profile`, `pkg`,
`repo`, `search`, `set-script`, `star`, `stars`, `team`, `token`,
`unstar`, `whoami`, `xmas`) and their aliases (`s`, `se`) now throw a
"not implemented" error, with a suggestion to use the npm CLI directly
[#&#8203;10642](https://redirect.github.com/pnpm/pnpm/pull/10642). Other
previously passed-through commands —
[`view`](https://pnpm.io/11.x/cli/view) (`info`, `show`, `v`),
[`login`](https://pnpm.io/11.x/cli/login) (`adduser`),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) — have been reimplemented
natively in pnpm (see New Commands below).

- [`pnpm publish`](https://pnpm.io/11.x/cli/publish) now works without
the `npm` CLI.

The One-time Password feature now reads from `PNPM_CONFIG_OTP` instead
of `NPM_CONFIG_OTP`:

  ```sh
  export PNPM_CONFIG_OTP='<your OTP here>'
  pnpm publish --no-git-checks
  ```

If the registry requests OTP and the user has not provided it via the
`PNPM_CONFIG_OTP` environment variable or the `--otp` flag, pnpm will
prompt the user directly for an OTP code.

If the registry requests web-based authentication, pnpm will print a
scannable QR code along with the URL.

Since the new `pnpm publish` no longer calls `npm publish`, some
undocumented features may have been unknowingly dropped. If you rely on
a feature that is now gone, please open an issue at
<https://github.com/pnpm/pnpm/issues>. In the meantime, you can use
`pnpm pack && npm publish *.tgz` as a workaround.

- Removed the `pnpm server` command
[#&#8203;10463](https://redirect.github.com/pnpm/pnpm/pull/10463).

- Removed support for the `useNodeVersion` and
`executionEnv.nodeVersion` fields. `devEngines.runtime` and
`engines.runtime` should be used instead
[#&#8203;10373](https://redirect.github.com/pnpm/pnpm/pull/10373).

- Removed support for `hooks.fetchers`. We now have a new API for custom
fetchers and resolvers via the `fetchers` field of `pnpmfile`.

##### Lifecycle Scripts

- pnpm no longer populates `npm_config_*` environment variables from the
pnpm config during lifecycle scripts. Only well-known `npm_*` env vars
are now set, matching Yarn's behavior
[#&#8203;11116](https://redirect.github.com/pnpm/pnpm/pull/11116).

##### CLI Output

- Cleaner output for script execution: pnpm now prints `$ command`
instead of `> pkg@version stage path\n> command`, and shows project name
and path only when running in a different directory. The `$ command`
line is printed to stderr to keep stdout clean for piping
[#&#8203;11132](https://redirect.github.com/pnpm/pnpm/pull/11132).
- During install, instead of rendering the full peer dependency issues
tree, pnpm now suggests running [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers) to view the issues
[#&#8203;11133](https://redirect.github.com/pnpm/pnpm/pull/11133).

##### Lockfile

- Simplified `patchedDependencies` lockfile format from `Record<string,
{ path: string, hash: string }>` to `Record<string, string>` (selector
to hash). Existing lockfiles with the old format are automatically
migrated
[#&#8203;10911](https://redirect.github.com/pnpm/pnpm/pull/10911).

##### Other

- The default value of the `type` field in the `package.json` file of
the project initialized by `pnpm init` command has been changed to
`module`.

- Added support for lowercase options in `pnpm add`: `-d`, `-p`, `-o`,
`-e` [#&#8203;9197](https://redirect.github.com/pnpm/pnpm/issues/9197).

  When using the `pnpm add` command only:

  - `-p` is now an alias for `--save-prod` instead of `--parseable`
  - `-d` is now an alias for `--save-dev` instead of `--loglevel=info`

- The root workspace project is no longer excluded when it is explicitly
selected via a filter
[#&#8203;10465](https://redirect.github.com/pnpm/pnpm/pull/10465).

##### Audit

- [`pnpm audit`](https://pnpm.io/11.x/cli/audit) now calls npm's
`/-/npm/v1/security/advisories/bulk` endpoint. The legacy
`/-/npm/v1/security/audits{,/quick}` endpoints have been retired by the
registry, so the legacy request/response contract is no longer
supported.

The bulk endpoint does not return CVE identifiers. CVE-based filtering
has been replaced with GitHub advisory ID (GHSA) filtering:

- `auditConfig.ignoreCves` → `auditConfig.ignoreGhsas` (the previous key
is no longer recognized)
- `pnpm audit --ignore <id>` / `pnpm audit --ignore-unfixable` now read
and write GHSAs instead of CVEs
- GHSAs are derived from each advisory's `url`
(`https://github.com/advisories/GHSA-xxxx-xxxx-xxxx`)

To migrate: replace each `CVE-YYYY-NNNNN` entry in your
`auditConfig.ignoreCves` with the corresponding `GHSA-xxxx-xxxx-xxxx`
value (visible in the `More info` column of `pnpm audit` output) and
move it under `auditConfig.ignoreGhsas`.

##### Package Manager Settings

- **Breaking:** removed the `managePackageManagerVersions`,
`packageManagerStrict`, and `packageManagerStrictVersion` settings. They
existed only to derive the `onFail` behavior for the legacy
`packageManager` field, and the `pmOnFail` setting introduced alongside
[`pnpm with`](https://pnpm.io/11.x/cli/with) subsumes all three — it
directly sets the `onFail` behavior of both `packageManager` and
`devEngines.packageManager`. The `COREPACK_ENABLE_STRICT` environment
variable is no longer honored (it only gated `packageManagerStrict`);
use `pmOnFail` instead.

  Migration:

| Removed setting | Replace with |
| ------------------------------------- | ------------------------------
|
| `managePackageManagerVersions: true` | `pmOnFail: download` (default)
|
| `managePackageManagerVersions: false` | `pmOnFail: ignore` |
| `packageManagerStrict: false` | `pmOnFail: warn` |
| `packageManagerStrictVersion: true` | `pmOnFail: error` |
| `COREPACK_ENABLE_STRICT=0` | `pmOnFail: warn` |

##### Runtime Installs

- Installing a Node.js runtime via `node@runtime:<version>` (including
`pnpm env use` and `pnpm runtime set node`) no longer extracts the
bundled `npm`, `npx`, and `corepack` from the Node.js archive. This cuts
roughly half of the files pnpm has to hash, write to the CAS, and link
during installation, making runtime installs noticeably faster. Users
who still need `npm` can install it as a separate package.

##### Minor Changes

##### New Commands

- Added native [`pnpm view`](https://pnpm.io/11.x/cli/view) (`info`,
`show`, `v`) command for viewing package metadata from the registry
[#&#8203;11064](https://redirect.github.com/pnpm/pnpm/pull/11064).
- Added [`pnpm login`](https://pnpm.io/11.x/cli/login) (and `pnpm
adduser` alias) command for authenticating with npm registries. Supports
web-based login with QR code as well as classic username/password login
[#&#8203;11094](https://redirect.github.com/pnpm/pnpm/pull/11094).
- Added [`pnpm logout`](https://pnpm.io/11.x/cli/logout) command for
logging out of npm registries. Revokes the authentication token on the
registry and removes it from the local auth config file
[#&#8203;11213](https://redirect.github.com/pnpm/pnpm/pull/11213).
- Added native [`pnpm deprecate`](https://pnpm.io/11.x/cli/deprecate)
and `pnpm undeprecate` commands for setting and removing deprecation
messages on package versions without delegating to the npm CLI
[#&#8203;11120](https://redirect.github.com/pnpm/pnpm/pull/11120).
- Added native [`pnpm unpublish`](https://pnpm.io/11.x/cli/unpublish)
command. Supports unpublishing specific versions, version ranges via
semver, and entire packages with `--force`
[#&#8203;11128](https://redirect.github.com/pnpm/pnpm/pull/11128).
- Added native [`pnpm dist-tag`](https://pnpm.io/11.x/cli/dist-tag)
command (`ls`, `add`, `rm` subcommands)
[#&#8203;11218](https://redirect.github.com/pnpm/pnpm/pull/11218).
- Added [`pnpm sbom`](https://pnpm.io/11.x/cli/sbom) command for
generating Software Bill of Materials in CycloneDX 1.7 and SPDX 2.3 JSON
formats
[#&#8203;9088](https://redirect.github.com/pnpm/pnpm/issues/9088).
- Added [`pnpm clean`](https://pnpm.io/11.x/cli/clean) command that
safely removes `node_modules` directories from all workspace projects
[#&#8203;10707](https://redirect.github.com/pnpm/pnpm/issues/10707). Use
`--lockfile` to also remove `pnpm-lock.yaml` files.
- Added a new command [`pnpm runtime set <runtime name> <runtime version
spec> [-g]`](https://pnpm.io/11.x/cli/runtime) for installing runtimes.
Deprecated `pnpm env use` in favor of the new command.
- Added the ability to fix vulnerabilities by updating packages in the
lockfile instead of adding overrides. Use [`pnpm audit
--fix=update`](https://pnpm.io/11.x/cli/audit)
[#&#8203;10341](https://redirect.github.com/pnpm/pnpm/pull/10341).
- Added [`pnpm ci`](https://pnpm.io/11.x/cli/ci) command for clean
installs
[#&#8203;6100](https://redirect.github.com/pnpm/pnpm/issues/6100). The
command runs `pnpm clean` followed by `pnpm install --frozen-lockfile`.
Designed for CI/CD environments where reproducible builds are critical.
Aliases: `pnpm clean-install`, `pnpm ic`, `pnpm install-clean`
[#&#8203;11003](https://redirect.github.com/pnpm/pnpm/pull/11003).
- Added [`pnpm peers check`](https://pnpm.io/11.x/cli/peers) command
that checks for unmet and missing peer dependency issues by reading the
lockfile
[#&#8203;7087](https://redirect.github.com/pnpm/pnpm/issues/7087).
- Implemented the [`version`](https://pnpm.io/11.x/cli/version) command
natively in pnpm to support workspaces and `workspace:` protocols
correctly. The new command allows bumping package versions (major,
minor, patch, etc.) with full workspace support and git integration
[#&#8203;10879](https://redirect.github.com/pnpm/pnpm/pull/10879).
- [`pnpm audit --fix`](https://pnpm.io/11.x/cli/audit) now supports a
new interactive mode via `--interactive`/`-i`.
- Added the [`pnpm docs`](https://pnpm.io/11.x/cli/docs) command and its
alias `pnpm home`. This command opens the package documentation or
homepage in the browser. When the package has no valid homepage, it
falls back to `https://npmx.dev/package/<name>`.
- Added native [`pnpm ping`](https://pnpm.io/11.x/cli/ping) command to
test registry connectivity. Provides a simple way to verify connectivity
to the configured registry without requiring external tools.
- Implemented native [`search`](https://pnpm.io/11.x/cli/search) command
and its aliases (`s`, `se`, `find`).
- Implemented native [`star`, `unstar`,
`stars`](https://pnpm.io/11.x/cli/star), and
[`whoami`](https://pnpm.io/11.x/cli/whoami) commands.
- Add [`pnpm with <version|current>
<args...>`](https://pnpm.io/11.x/cli/with) command. Runs pnpm at a
specific version (or the currently active one) for a single invocation,
bypassing the project's `packageManager` and `devEngines.packageManager`
pins.
- Added a new [`pnpm pack-app`](https://pnpm.io/11.x/cli/pack-app)
command that packs a CommonJS entry file into a standalone executable
for one or more target platforms, using the [Node.js Single Executable
Applications](https://nodejs.org/api/single-executable-applications.html)
API under the hood.

##### Configuration

- Added support for a global YAML config file named `config.yaml`.

  Configuration is now split into two categories:

- Registry and auth settings, which can be stored in INI files such as
the global `rc` file and local `.npmrc`.
- pnpm-specific settings, which can only be loaded from YAML files such
as the global `config.yaml` and local `pnpm-workspace.yaml`.

- Added support for loading environment variables whose names start with
`pnpm_config_` into config. These environment variables override
settings from `pnpm-workspace.yaml` but not CLI arguments.

- Added support for reading `allowBuilds` from `pnpm-workspace.yaml` in
the global package directory for global installs.

- Added support for `pnpm config get globalconfig` to retrieve the
global config file path
[#&#8203;9977](https://redirect.github.com/pnpm/pnpm/issues/9977).

- Added a new setting `virtualStoreOnly` that populates the virtual
store without creating importer symlinks, hoisting, bin links, or
running lifecycle scripts. This is useful for pre-populating a store
(e.g., in Nix builds) without creating unnecessary project-level
artifacts. `pnpm fetch` now uses this mode internally
[#&#8203;10840](https://redirect.github.com/pnpm/pnpm/issues/10840).

- Added support for specifying the pnpm version via
`devEngines.packageManager` in `package.json`. Unlike the
`packageManager` field, this supports version ranges. The resolved
version is stored in `pnpm-lock.yaml` and reused if it still satisfies
th

> ✂ **Note**
> 
> PR body was truncated to here.


</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Automaat/flip).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzMuNiIsInVwZGF0ZWRJblZlciI6IjQzLjE3My42IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

---------

Signed-off-by: Marcin Skalski <skalskimarcin33@gmail.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Marcin Skalski <skalskimarcin33@gmail.com>
garrappachc added a commit to tf2pickup-org/tf2pickup that referenced this pull request May 13, 2026
> ℹ️ **Note**
> 
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
`10.33.4` → `11.1.1` |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/10.33.4/11.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

###
[`v11.1.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1110)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.9...v11.1.0)

##### Minor Changes

- Added `pnpm audit signatures` to verify ECDSA registry signatures for
installed packages against keys from `/-/npm/v1/keys`
[#&#8203;7909](https://redirect.github.com/pnpm/pnpm/issues/7909).
Scoped registries are respected, and registries without signing keys are
skipped.

- Added support for installing packages from the [GitHub Packages npm
registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry)
via a built-in `gh:` prefix (e.g. `pnpm add gh:@&#8203;acme/private`),
and, more broadly, for arbitrary named registries in the style of [vlt's
named-registry aliases](https://docs.vlt.sh/cli/registries).
Authentication is picked up from the existing per-URL `.npmrc` entries
(e.g. `//npm.pkg.github.com/:_authToken=...`), so no separate auth
mechanism is required.

Additional aliases — or an override for the built-in `gh` alias, for
GitHub Enterprise Server — can be configured under `namedRegistries` in
`pnpm-workspace.yaml`:

  ```yaml
  namedRegistries:
    gh: https://npm.pkg.github.example.com/
    work: https://npm.work.example.com/
  ```

With this, `work:@&#8203;corp/lib@^2.0.0` resolves against
`https://npm.work.example.com/`.
[#&#8203;8941](https://redirect.github.com/pnpm/pnpm/issues/8941).

- Allow setting sbom spec version using `--sbom-spec-version`
[#&#8203;11389](https://redirect.github.com/pnpm/pnpm/pull/11389).

- Add `--no-runtime` flag (config: `runtime=false`) to skip installing
runtime entries (e.g. Node.js downloaded via `devEngines.runtime`)
without modifying the lockfile. The lockfile keeps the runtime entry so
frozen-lockfile validation still passes; only the runtime fetch and
`.bin` linking are skipped. Useful in CI matrices where the runtime is
provisioned externally (e.g. via `pnpm runtime -g set node <version>`)
before `pnpm install` runs.

- Added the `pnpm bugs` command that opens a package's bug tracker URL
in the browser. With no arguments, it reads the current project's
`package.json`; with one or more package names, it fetches each
package's metadata from the registry and opens its bug tracker. Falls
back to `<repository>/issues` when the `bugs` field is missing
[#&#8203;11279](https://redirect.github.com/pnpm/pnpm/pull/11279).

- Added `pnpm owner` command to manage package owners on the registry.

##### Patch Changes

- Added "published X ago by Y" information to the `pnpm view` command
output, similar to `npm view`. This is useful when comparing against
`minimumReleaseAge`.

  For example, `pnpm view pnpm` now shows:

  ```
  published 17 hours ago by GitHub Actions
  ```

- `pnpm publish` now honors the configured HTTP/HTTPS proxy (including
`https_proxy`/`http_proxy`/`no_proxy` environment variables) when
polling the registry's `doneUrl` during the web-based authentication
flow. Previously the poll bypassed the proxy, causing the registry to
respond `403` from a different source IP and the login to never complete
[#&#8203;11561](https://redirect.github.com/pnpm/pnpm/issues/11561).

- `pnpm add -g` now installs each space-separated package into its own
isolated directory by default. To bundle multiple packages into the same
isolated install (so that they share dependencies and are removed
together), pass them as a comma-separated list. For example:

- `pnpm add -g foo bar` installs `foo` and `bar` as two independent
globals — removing one does not affect the other.
- `pnpm add -g foo,bar qar` bundles `foo` and `bar` into a single
isolated install while `qar` is installed on its own.

Related:
[#&#8203;11587](https://redirect.github.com/pnpm/pnpm/issues/11587).

- `pnpm runtime set <name> <version>` no longer fails in the root of a
multi-package workspace with the `ADDING_TO_ROOT` error. Installing the
workspace root is a valid target for a runtime, so the command now
bypasses that safety check.

- Fix `pnpm --version` hanging for the lifetime of the worker pool after
the version was printed. `main.ts`'s `--version` short-circuit returned
before reaching the command-handler `finally` that calls
`finishWorkers()`, so the worker pool that `switchCliVersion` had
spawned during integrity resolution stayed alive and held the Node event
loop open. The CLI entry now runs `finishWorkers()` from its own
`finally`, so every exit path tears the pool down.

Repro: `pnpm --version` in a workspace whose `devEngines.packageManager`
version already matches the running pnpm + `onFail: "download"`.
`switchCliVersion` resolves the integrity (spawning workers), finds
nothing to swap, returns. The version prints, then the process hangs.

###
[`v11.0.9`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1109)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.8...v11.0.9)

##### Patch Changes

- Fixed installation of GitLab-hosted dependencies. pnpm now downloads
the tarball from
`https://gitlab.com/<user>/<project>/-/archive/<sha>/<project>-<sha>.tar.gz`
instead of the GitLab API endpoint that contained an encoded slash
(`%2F`) between user and project. The encoded slash both triggered `406
Not Acceptable` responses from GitLab and produced virtual store
directory names that Node refused to import
(`ERR_INVALID_MODULE_SPECIFIER`)
[#&#8203;11533](https://redirect.github.com/pnpm/pnpm/issues/11533).
- Honor `NPM_CONFIG_USERCONFIG` (and its lowercase
`npm_config_userconfig` form) as a low-priority fallback when locating
the user-level `.npmrc`. This restores compatibility with environments
that point npm at a custom auth file via that env var — most notably
`actions/setup-node`, which writes registry credentials to
`${runner.temp}/.npmrc` and exports `NPM_CONFIG_USERCONFIG` to reference
it. Without this, GitHub Actions workflows using `actions/setup-node` to
authenticate to private registries broke after upgrading to pnpm v11.
PNPM-prefixed env vars and `npmrcAuthFile` from the global `config.yaml`
continue to take precedence
[#&#8203;11539](https://redirect.github.com/pnpm/pnpm/issues/11539).
- Fix `pnpm pack` not bundling dependencies listed in
`bundleDependencies` (or `bundledDependencies`). The npm-packlist
upgrade in pnpm 11 changed its API to require the caller to pre-populate
the dependency tree, which the wrapper was not doing —
`bundleDependencies` were silently dropped from the tarball
[#&#8203;11519](https://redirect.github.com/pnpm/pnpm/issues/11519).
- Fixed the pnpm CLI crashing with a confusing `SyntaxError: Invalid
regular expression flags` instead of printing a clear "requires Node.js
v22.13" error when launched on an unsupported Node.js version. The
Node.js version check in `bin/pnpm.mjs` was effectively dead code
because the static `import` of the bundled `dist/pnpm.mjs` was hoisted
by the ES module loader and parsed before the check could run
[#&#8203;11546](https://redirect.github.com/pnpm/pnpm/issues/11546).
- Fixed `pnpm --prefix=<dir> install` overwriting the existing
`pnpm-workspace.yaml` in `<dir>` with `set this to true or false`
placeholders. The renamed `--prefix` option (which maps to `dir`) was
not honored when locating the workspace root, so the workspace
manifest's `allowBuilds` settings were not loaded into config and got
clobbered when ignored builds were auto-populated
[#&#8203;11535](https://redirect.github.com/pnpm/pnpm/issues/11535).
- Fixed `pnpm publish --provenance` failing with a 422 from the registry
when the package version contained semver build metadata (e.g.
`1.0.0-canary.0+abc1234`). The `+<build>` segment is now stripped before
packing so that the version embedded in the tarball, the metadata sent
to the registry, and the sigstore provenance subject all agree
[#&#8203;11518](https://redirect.github.com/pnpm/pnpm/issues/11518).

###
[`v11.0.8`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1108)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.7...v11.0.8)

##### Patch Changes

- Restored the heuristic that preserves tarball URLs in `pnpm-lock.yaml`
when they cannot be derived from name+version+registry, even with the
default `lockfileIncludeTarballUrl: false`. Without this, `pnpm install
--frozen-lockfile` from an empty store fails with `ERR_PNPM_FETCH_404`
for packages on registries that serve tarballs from a non-standard path
— most notably GitHub Packages
(`https://npm.pkg.github.com/download/<scope>/<name>/<version>/<hash>`)
and JSR. `lockfileIncludeTarballUrl: true` continues to force the URL
into the lockfile for every package
[#&#8203;11276](https://redirect.github.com/pnpm/pnpm/issues/11276).
- Run `preversion`, `version`, and `postversion` lifecycle scripts for
`pnpm version`.
- Fixed `ERR_PNPM_BAD_TARBALL_SIZE` when a registry serves tarballs with
an end-to-end `Content-Encoding` (e.g. `gzip`). Tarballs are already
compressed, so the fetcher now requests them with `Accept-Encoding:
identity` (matching pnpm v10's effective behavior) and, as defense in
depth against misbehaving servers, no longer enforces the strict
`Content-Length` check when the response declares a `Content-Encoding` —
`Content-Length` in that case refers to the encoded payload, not the
decoded bytes the fetch implementation yields
[#&#8203;11506](https://redirect.github.com/pnpm/pnpm/issues/11506).

###
[`v11.0.7`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1107)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.6...v11.0.7)

##### Patch Changes

- Restore the execute bit on the `node-gyp` shims packed inside
`@pnpm/exe` (`dist/node-gyp-bin/node-gyp`,
`dist/node-gyp-bin/node-gyp.cmd`, and
`dist/node_modules/node-gyp/bin/node-gyp.js`). Without this,
`pnpm/action-setup`'s standalone path (used on runners with Node.js <
22.13) failed any install whose lifecycle script invoked `node-gyp
rebuild` with `sh: 1: node-gyp: Permission denied`
[#&#8203;11483](https://redirect.github.com/pnpm/pnpm/issues/11483).

- Fixed the `pn`, `pnpx`, and `pnx` aliases failing in Git Bash / MSYS2
on Windows when pnpm was installed via `@pnpm/exe` (or after `pnpm
self-update`)
[#&#8203;11486](https://redirect.github.com/pnpm/pnpm/issues/11486).
Running `pnpx` (or `pnx`) printed the cmd.exe banner and dropped the
user into an interactive command prompt instead of running `pnpm dlx`.
The `bin` field rewrite on Windows was pointing those aliases at `.cmd`
files; cmd-shim's Bash shim for a `.cmd` target wraps it in `exec cmd /C
...`, and MSYS2 mangles `/C` into a Windows path before cmd.exe sees it.
The aliases are now `.exe` hardlinks of the SEA binary, which detects
which name it was launched as via `process.execPath` and prepends `dlx`
for `pnpx` / `pnx`.

- Fix `pnpm install` recreating `node_modules` after `pnpm fetch`. `pnpm
fetch` records empty `hoistPattern` and `publicHoistPattern` in
`.modules.yaml`; since v11 removed the explicit-config gate, the
follow-up install treated those as a hoist-pattern change and purged the
modules directory. The fetch step now flags the modules manifest with
`virtualStoreOnly: true` so the next install skips the hoist-pattern
comparison and completes the missing post-import linking in place
[#&#8203;11488](https://redirect.github.com/pnpm/pnpm/issues/11488).

- Pin the integrity of git-hosted tarballs (codeload.github.com,
gitlab.com, bitbucket.org) in the lockfile so that subsequent installs
detect a tampered or substituted tarball and refuse to install it.
Previously the lockfile only stored the tarball URL for git
dependencies, so a compromised git host or a man-in-the-middle could
serve arbitrary code on later installs without lockfile changes.

A new `gitHosted: true` field is recorded on git-hosted tarball
resolutions in the lockfile, letting every reader/writer route them by a
single typed check instead of pattern-matching the tarball URL in each
call site. Lockfiles written by older pnpm versions are enriched on load
(URL fallback) so the field can be relied on uniformly across the
codebase.

- Allow user-level preferences in the global `config.yaml`. The
following settings can now be set in `~/.config/pnpm/config.yaml` (or
via `pnpm config set --location global`) instead of being restricted to
`pnpm-workspace.yaml`: `agent`, `globalVirtualStoreDir`,
`initPackageManager`, `initType`, `registrySupportsTimeField`,
`scriptShell`, `shellEmulator`, `sideEffectsCache`,
`sideEffectsCacheReadonly`, `stateDir`, `strictDepBuilds`,
`trustPolicy`, `trustPolicyExclude`, `trustPolicyIgnoreAfter`,
`updateNotifier`, `useStderr`, `verifyDepsBeforeRun`,
`verifyStoreIntegrity`, `virtualStoreDir`, `virtualStoreDirMaxLength`
[#&#8203;11474](https://redirect.github.com/pnpm/pnpm/issues/11474).

- Make trusted publishing (OIDC) take precedence over a configured
static `_authToken` in `pnpm publish`, mirroring the npm CLI's behavior.
When OIDC succeeds, the OIDC-derived token overrides any pre-configured
`_authToken`; when OIDC is not applicable (no CI environment, exchange
fails, registry has no trusted publisher configured), the static token
is used as a fallback. This applies on every package during recursive
publish, so each workspace package independently attempts trusted
publishing.

Additionally, the `NPM_ID_TOKEN` env var is now honored as a CI-agnostic
injection point for an OIDC ID token. Previously OIDC was only attempted
on GitHub Actions or GitLab; now any CI provider that exposes its own
OIDC mechanism (e.g. CircleCI's `CIRCLE_OIDC_TOKEN_V2`, Buildkite, etc.)
can forward its token via `NPM_ID_TOKEN` and trusted publishing will
work without pnpm needing to recognize the provider explicitly.

- `--pm-on-fail=ignore` (and other universal options like `--loglevel`,
`--reporter`) is now honored when combined with `--help` or `--version`.
Previously the CLI argument parser short-circuited those flags before
universal options were preserved, so `pnpm audit --pm-on-fail=ignore
--help` and `pnpm --pm-on-fail=ignore --version` reported the strict
packageManager mismatch instead of running the requested action
[#&#8203;11487](https://redirect.github.com/pnpm/pnpm/issues/11487).

- Fix a regression where `pnpm --recursive --filter '!<pkg>'
run/exec/test/add` would include the workspace root in the matched
projects. The workspace root is now correctly excluded by default when
only negative `--filter` arguments are provided, matching the
[documented behavior](https://pnpm.io/cli/recursive). To include the
root, pass `--include-workspace-root`
[#&#8203;11341](https://redirect.github.com/pnpm/pnpm/issues/11341).

- Restore npm-CLI-compatible `--json` stdout output for `pnpm publish`
([#&#8203;11476](https://redirect.github.com/pnpm/pnpm/issues/11476)).
pnpm 11 reimplemented publish natively
([#&#8203;10591](https://redirect.github.com/pnpm/pnpm/pull/10591)) and
inadvertently dropped the per-package JSON object that pnpm 10 emitted
transitively via the npm CLI, silently breaking downstream tooling —
most notably `nx release publish`, which parses stdout JSON to confirm
success
([nrwl/nx#35575](https://redirect.github.com/nrwl/nx/issues/35575)). On
success, the output is now:

- `pnpm publish --json` → single object `{ id, name, version, size,
unpackedSize, shasum, integrity, filename, files, entryCount, bundled
}`, mirroring `npm publish --json`.
- `pnpm publish -r --json` → array of those objects, mirroring `pnpm
pack --json`'s shape choice.
- `pnpm publish -r --report-summary` → existing
`pnpm-publish-summary.json` envelope `{ publishedPackages: [...] }` is
preserved, but each entry is upgraded to the same per-package shape
(additive — `name` and `version` are still present).

- `pnpm config get @&#8203;<scope>:registry` now reports the same URL
that `pnpm publish` and the resolvers actually use. Previously, `config
get` only consulted `.npmrc`, while `publish`/install used the merged
map that includes `pnpm-workspace.yaml`'s `registries` block — so the
two could diverge silently and a publish could go to the wrong registry
[#&#8203;11492](https://redirect.github.com/pnpm/pnpm/issues/11492).

###
[`v11.0.6`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1106)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.5...v11.0.6)

##### Patch Changes

- Fix `pnpm_config_npmrc_auth_file` and `pnpm_config_userconfig` env
vars not actually loading the custom `.npmrc`. The env vars were parsed
and assigned to the resolved config, but only after `loadNpmrcConfig`
had already read the default `~/.npmrc` — so the custom file path was
set but never read. The relevant env vars are now consulted before the
user-level `.npmrc` is loaded
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).
- Preserve the original key order in `pnpm-workspace.yaml` when updating
it. Existing keys keep their position, and new keys are inserted in
alphabetical position when the existing keys are already sorted (with a
leading `packages` key allowed) or appended at the end otherwise.
- Fixed `pnpm self-update` on installations originally set up by pnpm
v10. v10 added `PNPM_HOME` directly to PATH and wrote a `pnpm` bootstrap
shim there. v11 setup writes shims under `PNPM_HOME/bin` instead, so
when a v10 user upgrades to v11 the legacy shim at `PNPM_HOME` keeps
pointing into the old `.tools/<version>` install — `pnpm --version`
continues to report the pre-update version even though the new version
was installed under `global/v11`. Self-update now detects this layout,
refreshes the legacy shims so the upgrade actually takes effect, and
prints a hint suggesting `pnpm setup` to migrate PATH to the v11 layout.
[#&#8203;11464](https://redirect.github.com/pnpm/pnpm/issues/11464).
- Print a warning when settings that are not allowed in the global
config file (e.g. `nodeLinker`, `hoistPattern`) are present in
`config.yaml` and silently ignored. Previously these settings were
dropped without any feedback, leaving users unsure why their global
configuration had no effect. The warning suggests moving those settings
to a project-level `pnpm-workspace.yaml`, or sharing them across
projects via [config
dependencies](https://pnpm.io/11.x/config-dependencies).
- Throw a pnpm error when `overrides` has an invalid shape or contains a
non-string value.
- Validate all `readPackage` dependency map fields, including
`devDependencies`, and reject falsy non-object invalid values instead of
silently accepting them.
- Prevent crashes during `pnpm config`, `pnpm set`, and `pnpm get` by
tolerating `configDependencies` install failures. For these commands, a
failure to install `configDependencies` (for example because the
registry auth token has not been written yet) is now logged at debug
level and the command proceeds. All other commands still surface the
install error
[#&#8203;10684](https://redirect.github.com/pnpm/pnpm/issues/10684).
- Treat `allowBuilds` as an install-state input and clear previously
ignored builds when they are explicitly disallowed.
- Fixes
[#&#8203;10594](https://redirect.github.com/pnpm/pnpm/issues/10594),
catalogs not being read from the workspace when using the `catalog:`
protocol with the `pnpm dlx` / `pnpx` command, resulting in a catalog
entry not found error.
- Accept `PNPM_CONFIG_*` (uppercase) environment variables in addition
to `pnpm_config_*`. Previously, only the lowercase form was honored, so
env vars renamed per the v11 migration guide (e.g.
`PNPM_CONFIG_USERCONFIG`) silently had no effect on case-sensitive
systems like macOS and Linux
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).

###
[`v11.0.5`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1105)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.4...v11.0.5)

##### Patch Changes

- Drop the `darwin-x64` artifact from `@pnpm/exe` and from the GitHub
release page. The Node.js SEA mechanism `pnpm pack-app` uses produces a
binary that segfaults at startup on Intel Macs because of an upstream
Node.js bug
([nodejs/node#62893](https://redirect.github.com/nodejs/node/issues/62893),
tracked alongside
[#&#8203;59553](https://redirect.github.com/nodejs/node/issues/59553);
the Node.js team has [opted not to fix
it](https://redirect.github.com/nodejs/node/pull/60250) on the grounds
that x64 macOS is being phased out). Re-signing with `codesign` or
`ldid` doesn't help — the corruption is in LIEF's Mach-O surgery, before
signing.

Intel Mac users should install pnpm via `npm install -g pnpm` (uses the
system Node.js, no SEA), or stay on pnpm 10.x. `@pnpm/exe`'s preinstall
on Intel Mac now exits with a clear error pointing at these
alternatives.

Closes
[#&#8203;11423](https://redirect.github.com/pnpm/pnpm/issues/11423).

- `pnpm dlx` (and `pnpx`/`pnx`/`pnpm create`) now runs the same
interactive `approve-builds` prompt as `pnpm add -g` when the package
being launched depends on transitive packages with install scripts.
Previously, the v11 `strictDepBuilds` default made dlx fail with
`ERR_PNPM_IGNORED_BUILDS` and required users to re-run with
`--allow-build=<pkg>` for every offending dependency. dlx also now
removes the partially-populated cache directory when the install fails,
so a subsequent run starts clean instead of reusing a broken install
whose builds were silently skipped
[#&#8203;11444](https://redirect.github.com/pnpm/pnpm/issues/11444).

- [`72629fc`](https://redirect.github.com/pnpm/pnpm/commit/72629fc): Fix
`pnpm -g ls --json` and `pnpm -g ls --parseable` so they emit valid JSON
and parseable output respectively, matching pnpm 10 behavior. Since the
isolated global packages refactor in pnpm 11, the global list command
had a custom path that always printed plain text and ignored
`--json`/`--parseable`, which broke tools like `npm-check-updates` that
parse the JSON output
[#&#8203;11440](https://redirect.github.com/pnpm/pnpm/issues/11440).

`pnpm -g ls --depth=<n>` (with n > 0) now errors when more than one
isolated global install would be involved, since each install has its
own lockfile and merging their transitive trees would be incoherent.
When the request can be narrowed to a single install group, the regular
`list` flow is used and the full dependency tree is shown.

- Fixed `pnpm publish` to honor `publishConfig.registry` from
`package.json` when publishing a single package. The native publish flow
introduced in v11 was reading the registry from `.npmrc` only, ignoring
the per-package override
[#&#8203;11419](https://redirect.github.com/pnpm/pnpm/issues/11419).

- When `strictPeerDependencies` is `true`, the
`ERR_PNPM_PEER_DEP_ISSUES` error once again renders the peer dependency
issues inline using the same format as `pnpm peers check`, so users (and
CI tools like Renovate) can see what failed without running `pnpm peers
check` separately
[#&#8203;11439](https://redirect.github.com/pnpm/pnpm/issues/11439).

- The `WARN` and error code labels in pnpm's output now wrap in brackets
(`[WARN]`, `[ERR_PNPM_FOO]`). Previously the labels relied entirely on a
colored background to stand out, which meant they blended into the
surrounding text in terminals without color (e.g. when `NO_COLOR` is set
or output is piped). The brackets are painted in the same color as the
badge background, so they appear as ordinary padding in color-capable
terminals — only the no-color rendering changes.

###
[`v11.0.4`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1104)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.3...v11.0.4)

##### Patch Changes

- Fixed `pnpm ci` not reinstalling workspace package `node_modules`
directories after the clean step
[#&#8203;11427](https://redirect.github.com/pnpm/pnpm/issues/11427).
- Remove pnpm's workspace state file when cleaning node\_modules so
`pnpm ci` performs a fresh install after the clean step.
- Do not remove `pnpm-lock.yaml` during `pnpm clean` when `lockfile:
true` is configured in `pnpm-workspace.yaml`. The lockfile is only
removed when the `--lockfile` option is passed to `pnpm clean`.
- `pnpm self-update` (with no version argument) no longer downgrades
pnpm when the registry's `latest` dist-tag points to an older release
than the currently active version. Run `pnpm self-update latest` to
force a downgrade
[#&#8203;11418](https://redirect.github.com/pnpm/pnpm/issues/11418).
- `minimumReleaseAgeStrict` now defaults to `true` whenever the user
explicitly sets `minimumReleaseAge` (via `pnpm-workspace.yaml`, the
global `config.yaml`, the CLI, or `pnpm_config_*` env vars).

###
[`v11.0.3`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1103)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.2...v11.0.3)

##### Patch Changes

- Fix too many open files error sometimes happening on Windows, when
creating command shims in `node_modules/.bin`
[#&#8203;11412](https://redirect.github.com/pnpm/pnpm/issues/11412).
- Fix `ERR_PNPM_FETCH_404` when installing a project whose lockfile
depends on a `file:` tarball. The previous behavior dropped the
`tarball` field from `file:` and git-hosted resolutions when
`lockfile-include-tarball-url=false` (the default), even though those
URLs cannot be reconstructed from the package name, version, and
registry
[#&#8203;11407](https://redirect.github.com/pnpm/pnpm/issues/11407).

###
[`v11.0.2`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1102)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.1...v11.0.2)

##### Patch Changes

- Fix `ENOENT` symlink failure when `pnpm add -g` triggers the
approve-builds prompt. The global add flow used to forward an absolute
`modulesDir` (`<installDir>/node_modules`) into the install run by
`approve-builds`. The install layer treated `modulesDir` as a path
relative to `lockfileDir` and joined it again, producing a doubled path
on Windows because `path.join` does not collapse an embedded absolute
path. The hoist step then tried to `mkdir` and symlink under
`<installDir>\<installDir>\node_modules\.pnpm\node_modules\...` and
failed with `ENOENT`
[#&#8203;11403](https://redirect.github.com/pnpm/pnpm/issues/11403).
- Fixed `packageManagerDependencies` going stale when pnpm is invoked
through corepack. The lockfile sync (and the `devEngines.packageManager`
version check) previously ran only when pnpm was invoked directly; under
corepack the entire block was skipped, so a stale entry would persist
even after the running pnpm version changed. The lockfile sync now runs
regardless of how pnpm was invoked, while the pnpm-managed version
switch (`onFail: 'download'`) remains skipped under corepack so it
doesn't fight corepack's own version selection
[#&#8203;11397](https://redirect.github.com/pnpm/pnpm/issues/11397).
- Fix recursive publish summaries to report the manifest from
`publishConfig.directory` when packages publish from a generated
directory
[#&#8203;11239](https://redirect.github.com/pnpm/pnpm/issues/11239).
- Fix negated `os` / `cpu` entries (e.g. `["!win32"]`) being incorrectly
rejected when `supportedArchitectures` expands to multiple platforms
[#&#8203;11375](https://redirect.github.com/pnpm/pnpm/pull/11375).

###
[`v11.0.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1101)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.0...v11.0.1)

##### Patch Changes

- Report unknown top-level options before falling back to implicit `pnpm
run` scripts.
- Reject `null` named catalogs in workspace manifests with
`InvalidWorkspaceManifestError` instead of crashing with a raw
`TypeError`.
- Populate download location for git-sourced dependencies in SBOM
output. Previously `pnpm sbom` emitted `NOASSERTION` (SPDX) and omitted
the distribution reference (CycloneDX) for git dependencies. Now emits
the git URL with commit hash, e.g.
`git+https://github.com/user/repo.git#commit`.
- `pnpm self-update` now keeps `package.json`'s `packageManager` and
`devEngines.packageManager` in sync. When the legacy `packageManager`
field pins pnpm, both fields are rewritten to the new exact pnpm version
on update — `packageManager` to `pnpm@<version>` (without an integrity
hash), and `devEngines.packageManager.version` to the same exact
`<version>` (dropping any range operator). When only
`devEngines.packageManager` is declared, the existing range-preserving
behavior is unchanged
[#&#8203;11388](https://redirect.github.com/pnpm/pnpm/issues/11388).
- Sort the keys of the overrides object returned by `pnpm audit --fix`
so that the log output order matches the order written to
`pnpm-workspace.yaml`.
- Update the env lockfile's `packageManagerDependencies` entry when
`devEngines.packageManager` declares a pnpm version that the lockfile no
longer satisfies. Previously, the stale entry was kept even though the
running pnpm matched the declared version, silently breaking the
integrity record
[#&#8203;11387](https://redirect.github.com/pnpm/pnpm/issues/11387).

###
[`v11.0.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1100)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v10.33.4...v11.0.0)

##### Highlights

##### Major

- **Node.js 22+ required** — support for Node 18, 19, 20, and 21 is
dropped, pnpm itself is now pure ESM, and the standalone exe requires
glibc 2.27.
- **Supply-chain protection on by default** — `minimumReleaseAge`
defaults to 1 day (newly published packages are not resolved for 24h)
and `blockExoticSubdeps` defaults to `true`.
- **`allowBuilds` replaces the old build-dependency settings** —
`onlyBuiltDependencies`, `onlyBuiltDependenciesFile`,
`neverBuiltDependencies`, `ignoredBuiltDependencies`, and
`ignoreDepScripts` have been removed.
- **Global installs are isolated and use the global virtual store by
default** — each `pnpm add -g` gets its own directory with its own
`package.json`, `node_modules`, and lockfile.
- **New SQLite-backed store index** (store v11) with bundled manifests
and hex digests, reducing filesystem syscalls and speeding up
installation.
- **Native publish flow** — [`pnpm
publish`](https://pnpm.io/11.x/cli/publish),
[`login`](https://pnpm.io/11.x/cli/login),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`view`](https://pnpm.io/11.x/cli/view),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) no longer delegate to the
npm CLI, and the remaining npm passthrough commands now throw "not
implemented".
- **[`pnpm audit`](https://pnpm.io/11.x/cli/audit) uses npm's bulk
advisories endpoint** — the legacy `/security/audits` endpoints are
gone. CVE-based filtering has been replaced with GHSA-based filtering:
migrate `auditConfig.ignoreCves` entries to `auditConfig.ignoreGhsas`.
- **`.npmrc` is auth/registry only** — all other settings must live in
`pnpm-workspace.yaml` or the new global `config.yaml`, and environment
variables use the `pnpm_config_*` prefix.
- **Runtime installs are slimmer** — installing a Node.js runtime via
`node@runtime:<version>` no longer extracts the bundled `npm`, `npx`,
and `corepack`, roughly halving the files pnpm has to hash, write, and
link.

##### Minor

- **New commands:** [`pnpm ci`](https://pnpm.io/11.x/cli/ci), [`pnpm
sbom`](https://pnpm.io/11.x/cli/sbom), [`pnpm
clean`](https://pnpm.io/11.x/cli/clean), [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers), [`pnpm runtime
set`](https://pnpm.io/11.x/cli/runtime), [`pnpm
docs`](https://pnpm.io/11.x/cli/docs)/`home`, [`pnpm
ping`](https://pnpm.io/11.x/cli/ping), [`pnpm
search`](https://pnpm.io/11.x/cli/search), [`pnpm
star`](https://pnpm.io/11.x/cli/star)/`unstar`/`stars`, [`pnpm
whoami`](https://pnpm.io/11.x/cli/whoami), [`pnpm
with`](https://pnpm.io/11.x/cli/with), and [`pnpm
pack-app`](https://pnpm.io/11.x/cli/pack-app), plus
`pn`/[`pnx`](https://pnpm.io/11.x/cli/pnx) short aliases.
- **ESM pnpmfiles** via `.pnpmfile.mjs`, which takes priority over
`.pnpmfile.cjs` when present.
- **[`pnpm audit --fix=update`](https://pnpm.io/11.x/cli/audit)** fixes
vulnerabilities by updating packages in the lockfile instead of adding
overrides, and `pnpm audit --fix --interactive` lets you select which
advisories to fix.
- **[`pnpm pack-app`](https://pnpm.io/11.x/cli/pack-app)** packs a
CommonJS entry into a standalone executable for one or more target
platforms using Node.js Single Executable Applications.
- **Faster HTTP and I/O** — undici with Happy Eyeballs, direct-to-CAS
writes, skipped staging directory, pre-allocated tarball downloads, and
an NDJSON metadata cache.

##### Major Changes

##### Requirements

- pnpm is now distributed as pure ESM.
- Dropped support for Node.js v18, 19, 20, and 21.
- The standalone exe version of pnpm requires at least glibc 2.27.

##### Security & Build Defaults

- Changed default values: `optimisticRepeatInstall` is now `true`,
`verifyDepsBeforeRun` is now `install`, `minimumReleaseAge` is now
`1440` (1 day), and `minimumReleaseAgeStrict` is `false`. Newly
published packages will not be resolved until they are at least 1 day
old. This protects against supply chain attacks by giving the community
time to detect and remove compromised versions. To opt out, set
`minimumReleaseAge: 0` in `pnpm-workspace.yaml`
[#&#8203;11158](https://redirect.github.com/pnpm/pnpm/pull/11158).

- `strictDepBuilds` is `true` by default.

- `blockExoticSubdeps` is `true` by default.

- Removed deprecated build dependency settings: `onlyBuiltDependencies`,
`onlyBuiltDependenciesFile`, `neverBuiltDependencies`,
`ignoredBuiltDependencies`, and `ignoreDepScripts`
[#&#8203;11220](https://redirect.github.com/pnpm/pnpm/pull/11220).

Use the `allowBuilds` setting instead. It is a map where keys are
package name patterns and values are booleans:

  - `true` means the package is allowed to run build scripts
- `false` means the package is explicitly denied from running build
scripts

Same as before, by default, none of the packages in the dependencies are
allowed to run scripts. If a package has postinstall scripts and it
isn't declared in `allowBuilds`, an error is printed.

  Before:

  ```yaml
  onlyBuiltDependencies:
    - electron
  onlyBuiltDependenciesFile: "allowed-builds.json"
  neverBuiltDependencies:
    - core-js
  ignoredBuiltDependencies:
    - esbuild
  ```

  After:

  ```yaml
  allowBuilds:
    electron: true
    core-js: false
    esbuild: false
  ```

- Removed `allowNonAppliedPatches` in favor of `allowUnusedPatches`.

- Removed `ignorePatchFailures`; patch application failures now throw an
error.

##### Store

- Runtime dependencies are always linked from the global virtual store
[#&#8203;10233](https://redirect.github.com/pnpm/pnpm/pull/10233).
- Optimized index file format to store the hash algorithm once per file
instead of repeating it for every file entry. Each file entry now stores
only the hex digest instead of the full integrity string
(`<algo>-<digest>`). Using hex format improves performance since file
paths in the content-addressable store use hex representation,
eliminating base64-to-hex conversion during path lookups.
- Store version bumped to v11.
- The bundled manifest (name, version, bin, engines, scripts, etc.) is
now stored directly in the package index file, eliminating the need to
read `package.json` from the content-addressable store during resolution
and installation. This reduces I/O and speeds up repeat installs
[#&#8203;10473](https://redirect.github.com/pnpm/pnpm/pull/10473).
- The package index in the content-addressable store is now backed by
SQLite. Instead of individual JSON files under `$STORE/index/`, package
metadata is stored in a single SQLite database at `$STORE/index.db` with
MessagePack-encoded values. This reduces filesystem syscall overhead,
improves space efficiency for small metadata entries, and enables
concurrent access via SQLite's WAL mode. Packages missing from the new
index are re-fetched on demand
[#&#8203;10500](https://redirect.github.com/pnpm/pnpm/pull/10500)
[#&#8203;10826](https://redirect.github.com/pnpm/pnpm/issues/10826).

##### Global Packages

- Global installs (`pnpm add -g pkg`) and `pnx` now use the global
virtual store by default. Packages are stored at `{storeDir}/links`
instead of per-project `.pnpm` directories. This can be disabled by
setting `enableGlobalVirtualStore: false`
[#&#8203;10694](https://redirect.github.com/pnpm/pnpm/pull/10694).

- Isolated global packages. Each globally installed package (or group of
packages installed together) now gets its own isolated installation
directory with its own `package.json`, `node_modules/`, and lockfile.
This prevents global packages from interfering with each other through
peer dependency conflicts, hoisting changes, or version resolution
shifts.

  Key changes:

- `pnpm add -g <pkg>` creates an isolated installation in
`{pnpmHomeDir}/global/v11/{hash}/`
- `pnpm remove -g <pkg>` removes the entire installation group
containing the package
- `pnpm update -g [pkg]` re-installs packages in new isolated
directories
- `pnpm list -g` scans isolated directories to show all installed global
packages
- `pnpm install -g` (no args) is no longer supported; use `pnpm add -g
<pkg>` instead

- Globally installed binaries are now stored in a `bin` subdirectory of
`PNPM_HOME` instead of directly in `PNPM_HOME`. This prevents internal
directories like `global/` and `store/` from polluting shell
autocompletion when `PNPM_HOME` is on PATH
[#&#8203;10986](https://redirect.github.com/pnpm/pnpm/issues/10986).
After upgrading, run `pnpm setup` to update your shell configuration.

- Breaking changes to `pnpm link`:

- `pnpm link <pkg-name>` no longer resolves packages from the global
store. Only relative or absolute paths are accepted. For example, use
`pnpm link ./foo` instead of `pnpm link foo`.
- `pnpm link --global` is removed. Use `pnpm add -g .` to register a
local package's bins globally.
- `pnpm link` (no arguments) is removed. Use `pnpm link <dir>` with an
explicit path instead.

##### Configuration

- pnpm no longer reads all settings from `.npmrc`. Only auth and
registry settings are read from `.npmrc` files. All other settings (like
`hoistPattern`, `nodeLinker`, `shamefullyHoist`, etc.) must be
configured in `pnpm-workspace.yaml` or the global
`~/.config/pnpm/config.yaml`
[#&#8203;11189](https://redirect.github.com/pnpm/pnpm/pull/11189).

- Network settings (`httpProxy`, `httpsProxy`, `noProxy`,
`localAddress`, `strictSsl`, `gitShallowHosts`) are now written to
`config.yaml` (global) or `pnpm-workspace.yaml` (local) instead of
`.npmrc`/`auth.ini`. They are still readable from `.npmrc` for easier
migration from the npm CLI
[#&#8203;11209](https://redirect.github.com/pnpm/pnpm/pull/11209).

pnpm no longer reads `npm_config_*` environment variables. Use
`pnpm_config_*` environment variables instead (e.g.,
`pnpm_config_registry` instead of `npm_config_registry`).

  pnpm no longer reads the npm global config at `$PREFIX/etc/npmrc`.

  `pnpm login` writes auth tokens to `~/.config/pnpm/auth.ini`.

  New `registries` setting in `pnpm-workspace.yaml`:

  ```yaml
  registries:
    default: https://registry.npmjs.org/
    "@&#8203;my-org": https://private.example.com/
    "@&#8203;internal": https://nexus.corp.com/
  ```

Auth tokens in `~/.npmrc` still work — pnpm continues to read `~/.npmrc`
as a fallback for registry authentication. The new `npmrcAuthFile`
setting can be used to point to a different file instead of `~/.npmrc`.

- Replace workspace project specific `.npmrc` with `packageConfigs` in
`pnpm-workspace.yaml`.

  A workspace manifest with `packageConfigs` looks something like this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    "project-1":
      saveExact: true
    "project-2":
      savePrefix: "~"
  ```

  Or this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    - match: ["project-1", "project-2"]
      modulesDir: "node_modules"
      saveExact: true
  ```

- pnpm no longer reads settings from the `pnpm` field of `package.json`.
Settings should be defined in `pnpm-workspace.yaml`
[#&#8203;10086](https://redirect.github.com/pnpm/pnpm/pull/10086).

- `pnpm config get` (without `--json`) no longer prints INI formatted
text. Instead, it prints JSON for objects and arrays, and raw strings
for strings, numbers, booleans, and nulls. `pnpm config get --json`
still prints all types of values as JSON, as before.

- `pnpm config get <array>` now prints a JSON array.

- `pnpm config list` now prints a JSON object instead of INI formatted
text.

- `pnpm config list` and `pnpm config get` (without argument) now hide
auth-related settings.

- `pnpm config list` and `pnpm config get` (without argument) now show
top-level keys as camelCase. Exception: keys that start with `@` or `//`
are preserved (their cases don't change).

- `pnpm config get` and `pnpm config list` no longer load non-camelCase
options from the workspace manifest (`pnpm-workspace.yaml`).

##### Removed Commands & npm Passthrough

- pnpm no longer falls back to the npm CLI. Commands that were
previously passed through to npm (`access`, `bugs`, `docs`, `edit`,
`find`, `home`, `issues`, `owner`, `ping`, `prefix`, `profile`, `pkg`,
`repo`, `search`, `set-script`, `star`, `stars`, `team`, `token`,
`unstar`, `whoami`, `xmas`) and their aliases (`s`, `se`) now throw a
"not implemented" error, with a suggestion to use the npm CLI directly
[#&#8203;10642](https://redirect.github.com/pnpm/pnpm/pull/10642). Other
previously passed-through commands —
[`view`](https://pnpm.io/11.x/cli/view) (`info`, `show`, `v`),
[`login`](https://pnpm.io/11.x/cli/login) (`adduser`),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) — have been reimplemented
natively in pnpm (see New Commands below).

- [`pnpm publish`](https://pnpm.io/11.x/cli/publish) now works without
the `npm` CLI.

The One-time Password feature now reads from `PNPM_CONFIG_OTP` instead
of `NPM_CONFIG_OTP`:

  ```sh
  export PNPM_CONFIG_OTP='<your OTP here>'
  pnpm publish --no-git-checks
  ```

If the registry requests OTP and the user has not provided it via the
`PNPM_CONFIG_OTP` environment variable or the `--otp` flag, pnpm will
prompt the user directly for an OTP code.

If the registry requests web-based authentication, pnpm will print a
scannable QR code along with the URL.

Since the new `pnpm publish` no longer calls `npm publish`, some
undocumented features may have been unknowingly dropped. If you rely on
a feature that is now gone, please open an issue at
<https://github.com/pnpm/pnpm/issues>. In the meantime, you can use
`pnpm pack && npm publish *.tgz` as a workaround.

- Removed the `pnpm server` command
[#&#8203;10463](https://redirect.github.com/pnpm/pnpm/pull/10463).

- Removed support for the `useNodeVersion` and
`executionEnv.nodeVersion` fields. `devEngines.runtime` and
`engines.runtime` should be used instead
[#&#8203;10373](https://redirect.github.com/pnpm/pnpm/pull/10373).

- Removed support for `hooks.fetchers`. We now have a new API for custom
fetchers and resolvers via the `fetchers` field of `pnpmfile`.

##### Lifecycle Scripts

- pnpm no longer populates `npm_config_*` environment variables from the
pnpm config during lifecycle scripts. Only well-known `npm_*` env vars
are now set, matching Yarn's behavior
[#&#8203;11116](https://redirect.github.com/pnpm/pnpm/pull/11116).

##### CLI Output

- Cleaner output for script execution: pnpm now prints `$ command`
instead of `> pkg@version stage path\n> command`, and shows project name
and path only when running in a different directory. The `$ command`
line is printed to stderr to keep stdout clean for piping
[#&#8203;11132](https://redirect.github.com/pnpm/pnpm/pull/11132).
- During install, instead of rendering the full peer dependency issues
tree, pnpm now suggests running [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers) to view the issues
[#&#8203;11133](https://redirect.github.com/pnpm/pnpm/pull/11133).

##### Lockfile

- Simplified `patchedDependencies` lockfile format from `Record<string,
{ path: string, hash: string }>` to `Record<string, string>` (selector
to hash). Existing lockfiles with the old format are automatically
migrated
[#&#8203;10911](https://redirect.github.com/pnpm/pnpm/pull/10911).

##### Other

- The default value of the `type` field in the `package.json` file of
the project initialized by `pnpm init` command has been changed to
`module`.

- Added support for lowercase options in `pnpm add`: `-d`, `-p`, `-o`,
`-e` [#&#8203;9197](https://redirect.github.com/pnpm/pnpm/issues/9197).

  When using the `pnpm add` command only:

  - `-p` is now an alias for `--save-prod` instead of `--parseable`
  - `-d` is now an alias for `--save-dev` instead of `--loglevel=info`

- The root workspace project is no longer excluded when it is explicitly
selected via a filter
[#&#8203;10465](https://redirect.github.com/pnpm/pnpm/pull/10465).

##### Audit

- [`pnpm audit`](https://pnpm.io/11.x/cli/audit) now calls npm's
`/-/npm/v1/security/advisories/bulk` endpoint. The legacy
`/-/npm/v1/security/audits{,/quick}` endpoints have been retired by the
registry, so the legacy request/response contract is no longer
supported.

The bulk endpoint does not return CVE identifiers. CVE-based filtering
has been replaced with GitHub advisory ID (GHSA) filtering:

- `auditConfig.ignoreCves` → `auditConfig.ignoreGhsas` (the previous key
is no longer recognized)
- `pnpm audit --ignore <id>` / `pnpm audit --ignore-unfixable` now read
and write GHSAs instead of CVEs
- GHSAs are derived from each advisory's `url`
(`https://github.com/advisories/GHSA-xxxx-xxxx-xxxx`)

To migrate: replace each `CVE-YYYY-NNNNN` entry in your
`auditConfig.ignoreCves` with the corresponding `GHSA-xxxx-xxxx-xxxx`
value (visible in the `More info` column of `pnpm audit` output) and
move it under `auditConfig.ignoreGhsas`.

##### Package Manager Settings

- **Breaking:** removed the `managePackageManagerVersions`,
`packageManagerStrict`, and `packageManagerStrictVersion` settings. They
existed only to derive the `onFail` behavior for the legacy
`packageManager` field, and the `pmOnFail` setting introduced alongside
[`pnpm with`](https://pnpm.io/11.x/cli/with) subsumes all three — it
directly sets the `onFail` behavior of both `packageManager` and
`devEngines.packageManager`. The `COREPACK_ENABLE_STRICT` environment
variable is no longer honored (it only gated `packageManagerStrict`);
use `pmOnFail` instead.

  Migration:

| Removed setting | Replace with |
| ------------------------------------- | ------------------------------
|
| `managePackageManagerVersions: true` | `pmOnFail: download` (default)
|
| `managePackageManagerVersions: false` | `pmOnFail: ignore` |
| `packageManagerStrict: false` | `pmOnFail: warn` |
| `packageManagerStrictVersion: true` | `pmOnFail: error` |
| `COREPACK_ENABLE_STRICT=0` | `pmOnFail: warn` |

##### Runtime Installs

- Installing a Node.js runtime via `node@runtime:<version>` (including
`pnpm env use` and `pnpm runtime set node`) no longer extracts the
bundled `npm`, `npx`, and `corepack` from the Node.js archive. This cuts
roughly half of the files pnpm has to hash, write to the CAS, and link
during installation, making runtime installs noticeably faster. Users
who still need `npm` can install it as a separate package.

##### Minor Changes

##### New Commands

- Added native [`pnpm view`](https://pnpm.io/11.x/cli/view) (`info`,
`show`, `v`) command for viewing package metadata from the registry
[#&#8203;11064](https://redirect.github.com/pnpm/pnpm/pull/11064).
- Added [`pnpm login`](https://pnpm.io/11.x/cli/login) (and `pnpm
adduser` alias) command for authenticating with npm registries. Supports
web-based login with QR code as well as classic username/password login
[#&#8203;11094](https://redirect.github.com/pnpm/pnpm/pull/11094).
- Added [`pnpm logout`](https://pnpm.io/11.x/cli/logout) command for
logging out of npm registries. Revokes the authentication token on the
registry and removes it from the local auth config file
[#&#8203;11213](https://redirect.github.com/pnpm/pnpm/pull/11213).
- Added native [`pnpm deprecate`](https://pnpm.io/11.x/cli/deprecate)
and `pnpm undeprecate` commands for setting and removing deprecation
messages on package versions without delegating to the npm CLI
[#&#8203;11120](https://redirect.github.com/pnpm/pnpm/pull/11120).
- Added native [`pnpm unpublish`](https://pnpm.io/11.x/cli/unpublish)
command. Supports unpublishing specific versions, version ranges via
semver, and entire packages with `--force`
[#&#8203;11128](https://redirect.github.com/pnpm/pnpm/pull/11128).
- Added native [`pnpm dist-tag`](https://pnpm.io/11.x/cli/dist-tag)
command (`ls`, `add`, `rm` subcommands)
[#&#8203;11218](https://redirect.github.com/pnpm/pnpm/pull/11218).
- Added [`pnpm sbom`](https://pnpm.io/11.x/cli/sbom) command for
generating Software Bill of Materials in CycloneDX 1.7 and SPDX 2.3 JSON
formats
[#&#8203;9088](https://redirect.github.com/pnpm/pnpm/issues/9088).
- Added [`pnpm clean`](https://pnpm.io/11.x/cli/clean) command that
safely removes `node_modules` directories from all workspace projects
[#&#8203;10707](https://redirect.github.com/pnpm/pnpm/issues/10707). Use
`--lockfile` to also remove `pnpm-lock.yaml` files.
- Added a new command [`pnpm runtime set <runtime name> <runtime version
spec> [-g]`](https://pnpm.io/11.x/cli/runtime) for installing runtimes.
Deprecated `pnpm env use` in favor of the new command.
- Added the ability to fix vulnerabilities by updating packages in the
lockfile instead of adding overrides. Use [`pnpm audit
--fix=update`](https://pnpm.io/11.x/cli/audit)
[#&#8203;10341](https://redirect.github.com/pnpm/pnpm/pull/10341).
- Added [`pnpm ci`](https://pnpm.io/11.x/cli/ci) command for clean
installs
[#&#8203;6100](https://redirect.github.com/pnpm/pnpm/issues/6100). The
command runs `pnpm clean` followed by `pnpm install --frozen-lockfile`.
Designed for CI/CD environments where reproducible builds are critical.
Aliases: `pnpm clean-install`, `pnpm ic`, `pnpm install-clean`
[#&#8203;11003](https://redirect.github.com/pnpm/pnpm/pull/11003).
- Added [`pnpm peers check`](https://pnpm.io/11.x/cli/peers) command
that checks for unmet and missing peer dependency issues by reading the
lockfile
[#&#8203;7087](https://redirect.github.com/pnpm/pnpm/issues/7087).
- Implemented the [`version`](https://pnpm.io/11.x/cli/version) command
natively in pnpm to support workspaces and `workspace:` protocols
correctly. The new command allows bumping package versions (major,
minor, patch, etc.) with full workspace support and git integration
[#&#8203;10879](https://redirect.github.com/pnpm/pnpm/pull/10879).
- [`pnpm audit --fix`](https://pnpm.io/11.x/cli/audit) now supports a
new interactive mode via `--interactive`/`-i`.
- Added the [`pnpm docs`](https://pnpm.io/11.x/cli/docs) command and its
alias `pnpm home`. This command opens the package documentation or
homepage in the browser. When the package has no valid homepage, it
falls back to `https://npmx.dev/package/<name>`.
- Added native [`pnpm ping`](https://pnpm.io/11.x/cli/ping) command to
test registry connectivity. Provides a simple way to verify connectivity
to the configured registry without requiring external tools.
- Implemented native [`search`](https://pnpm.io/11.x/cli/search) command
and its aliases (`s`, `se`, `find`).
- Implemented native [`star`, `unstar`,
`stars`](https://pnpm.io/11.x/cli/star), and
[`whoami`](https://pnpm.io/11.x/cli/whoami) commands.
- Add [`pnpm with <version|current>
<args...>`](https://pnpm.io/11.x/cli/with) command. Runs pnpm at a
specific version (or the currently active one) for a single invocation,
bypassing the project's `packageManager` and `devEngines.packageManager`
pins.
- Added a new [`pnpm pack-app`](https://pnpm.io/11.x/cli/pack-app)
command that packs a CommonJS entry file into a standalone executable
for one or more target platforms, using the [Node.js Single Executable
Applications](https://nodejs.org/api/single-executable-applications.html)
API under the hood.

##### Configuration

- Added support for a global YAML config file named `config.yaml`.

  Configuration is now split into two categories:

- Registry and auth settings, which can be stored in INI files such as
the global `rc` file and local `.npmrc`.
- pnpm-specific settings, which can only be loaded from YAML files such
as the global `config.yaml` and local `pnpm-workspace.yaml`.

- Added support for loading environment variables whose names start with
`pnpm_config_` into config. These environment variables override
settings from `pnpm-workspace.yaml` but not CLI arguments.

- Added support for reading `allowBuilds` from `pnpm-workspace.yaml` in
the global package directory for global installs.

- Added support for `pnpm config get globalconfig` to retrieve the
global config file path
[#&#8203;9977](https://redirect.github.com/pnpm/pnpm/issues/9977).

- Added a new setting `virtualStoreOnly` that populates the virtual
store without creating importer symlinks, hoisting, bin links, or
running lifecycle scripts. This is useful for pre-populating a store
(e.g., in Nix builds) without creating unnecessary project-level
artifacts. `pnpm fetch` now uses this mode internally
[#&#8203;10840](https://redirect.github.com/pnpm/pnpm/issues/10840).

- Added support for specifying the pnpm version via
`devEngines.packageManager` in `package.json`. Unlike the
`packageManager` field, this supports version ranges. The resolved
version is stored in `pnpm-lock.yaml` and reused if it still satisfies
the range
[#&#8203;10932](https://redirect.github.com/pnpm/pnpm/pull/10932).

- Added a new `dedupePeers` setting that reduces peer dependency
duplication. When enabled, peer dependency suffixes use version-only
identifiers (`name@version`) instead of full dep paths, eliminating
nested suffixes like `(foo@1.0.0(bar@2.0.

> ✂ **Note**
> 
> PR body was truncated to here.


</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/tf2pickup-org/tf2pickup).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNTkuMiIsInVwZGF0ZWRJblZlciI6IjQzLjE3My42IiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbInJlbm92YXRlIl19-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michał Garapich <michal@garapich.pl>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
mergify Bot pushed a commit to capic2/dashboard-parapente that referenced this pull request May 13, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io) ([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) | [`11.0.9` → `11.1.1`](https://renovatebot.com/diffs/npm/pnpm/11.0.9/11.1.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.0.9/11.1.1?slim=true) |

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

### [`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in `checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status check called `findWorkspaceProjects`, which validates each project's `engines` and `os`/`cpu`/`libc` and warns about useless fields in non-root manifests — work that the install pipeline already performs. With no `nodeVersion` threaded through, the engine check also fell back to the system Node from `PATH` and emitted spurious "Unsupported engine" warnings before scripts ran. Status-only callers now use `findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local resolver was claiming any specifier containing `/` as a local directory, so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under `namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/` instead of resolving from the configured registry. The local resolver now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd` / `.bat` targets now escapes the `/C` switch as `//C`, so it survives the path translation Git Bash applies when launching `cmd.exe`. Without this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the switch was dropped, cmd started interactively, and the calling script saw the cmd banner instead of the wrapped command's output. Affects any cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on Windows. See [pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

### [`v11.1.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1110)

[Compare Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.9...v11.1.0)

##### Minor Changes

- Added `pnpm audit signatures` to verify ECDSA registry signatures for installed packages against keys from `/-/npm/v1/keys` [#&#8203;7909](https://redirect.github.com/pnpm/pnpm/issues/7909). Scoped registries are respected, and registries without signing keys are skipped.

- Added support for installing packages from the [GitHub Packages npm registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry) via a built-in `gh:` prefix (e.g. `pnpm add gh:@&#8203;acme/private`), and, more broadly, for arbitrary named registries in the style of [vlt's named-registry aliases](https://docs.vlt.sh/cli/registries). Authentication is picked up from the existing per-URL `.npmrc` entries (e.g. `//npm.pkg.github.com/:_authToken=...`), so no separate auth mechanism is required.

  Additional aliases — or an override for the built-in `gh` alias, for GitHub Enterprise Server — can be configured under `namedRegistries` in `pnpm-workspace.yaml`:

  ```yaml
  namedRegistries:
    gh: https://npm.pkg.github.example.com/
    work: https://npm.work.example.com/
  ```

  With this, `work:@&#8203;corp/lib@^2.0.0` resolves against `https://npm.work.example.com/`. [#&#8203;8941](https://redirect.github.com/pnpm/pnpm/issues/8941).

- Allow setting sbom spec version using `--sbom-spec-version` [#&#8203;11389](https://redirect.github.com/pnpm/pnpm/pull/11389).

- Add `--no-runtime` flag (config: `runtime=false`) to skip installing runtime entries (e.g. Node.js downloaded via `devEngines.runtime`) without modifying the lockfile. The lockfile keeps the runtime entry so frozen-lockfile validation still passes; only the runtime fetch and `.bin` linking are skipped. Useful in CI matrices where the runtime is provisioned externally (e.g. via `pnpm runtime -g set node <version>`) before `pnpm install` runs.

- Added the `pnpm bugs` command that opens a package's bug tracker URL in the browser. With no arguments, it reads the current project's `package.json`; with one or more package names, it fetches each package's metadata from the registry and opens its bug tracker. Falls back to `<repository>/issues` when the `bugs` field is missing [#&#8203;11279](https://redirect.github.com/pnpm/pnpm/pull/11279).

- Added `pnpm owner` command to manage package owners on the registry.

##### Patch Changes

- Added "published X ago by Y" information to the `pnpm view` command output, similar to `npm view`. This is useful when comparing against `minimumReleaseAge`.

  For example, `pnpm view pnpm` now shows:

  ```
  published 17 hours ago by GitHub Actions
  ```

- `pnpm publish` now honors the configured HTTP/HTTPS proxy (including `https_proxy`/`http_proxy`/`no_proxy` environment variables) when polling the registry's `doneUrl` during the web-based authentication flow. Previously the poll bypassed the proxy, causing the registry to respond `403` from a different source IP and the login to never complete [#&#8203;11561](https://redirect.github.com/pnpm/pnpm/issues/11561).

- `pnpm add -g` now installs each space-separated package into its own isolated directory by default. To bundle multiple packages into the same isolated install (so that they share dependencies and are removed together), pass them as a comma-separated list. For example:

  - `pnpm add -g foo bar` installs `foo` and `bar` as two independent globals — removing one does not affect the other.
  - `pnpm add -g foo,bar qar` bundles `foo` and `bar` into a single isolated install while `qar` is installed on its own.

  Related: [#&#8203;11587](https://redirect.github.com/pnpm/pnpm/issues/11587).

- `pnpm runtime set <name> <version>` no longer fails in the root of a multi-package workspace with the `ADDING_TO_ROOT` error. Installing the workspace root is a valid target for a runtime, so the command now bypasses that safety check.

- Fix `pnpm --version` hanging for the lifetime of the worker pool after the version was printed. `main.ts`'s `--version` short-circuit returned before reaching the command-handler `finally` that calls `finishWorkers()`, so the worker pool that `switchCliVersion` had spawned during integrity resolution stayed alive and held the Node event loop open. The CLI entry now runs `finishWorkers()` from its own `finally`, so every exit path tears the pool down.

  Repro: `pnpm --version` in a workspace whose `devEngines.packageManager` version already matches the running pnpm + `onFail: "download"`. `switchCliVersion` resolves the integrity (spawning workers), finds nothing to swap, returns. The version prints, then the process hangs.

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/capic2/dashboard-parapente).
renovate Bot added a commit to solve4it/mycollections that referenced this pull request May 14, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) | Type |
Update |
|---|---|---|---|---|---|
| [@astrojs/starlight](https://starlight.astro.build)
([source](https://redirect.github.com/withastro/starlight/tree/HEAD/packages/starlight))
| [`^0.39.1` →
`^0.39.2`](https://renovatebot.com/diffs/npm/@astrojs%2fstarlight/0.39.1/0.39.2)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@astrojs%2fstarlight/0.39.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@astrojs%2fstarlight/0.39.1/0.39.2?slim=true)
| dependencies | patch |
| [@biomejs/biome](https://biomejs.dev)
([source](https://redirect.github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome))
| [`^2.4.14` →
`^2.4.15`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.4.14/2.4.15)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@biomejs%2fbiome/2.4.15?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@biomejs%2fbiome/2.4.14/2.4.15?slim=true)
| devDependencies | patch |
| [@commitlint/cli](https://commitlint.js.org/)
([source](https://redirect.github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli))
| [`^21.0.0` →
`^21.0.1`](https://renovatebot.com/diffs/npm/@commitlint%2fcli/21.0.0/21.0.1)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@commitlint%2fcli/21.0.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@commitlint%2fcli/21.0.0/21.0.1?slim=true)
| devDependencies | patch |
| [@commitlint/config-conventional](https://commitlint.js.org/)
([source](https://redirect.github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional))
| [`^21.0.0` →
`^21.0.1`](https://renovatebot.com/diffs/npm/@commitlint%2fconfig-conventional/21.0.0/21.0.1)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@commitlint%2fconfig-conventional/21.0.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@commitlint%2fconfig-conventional/21.0.0/21.0.1?slim=true)
| devDependencies | patch |
| [lint-staged](https://redirect.github.com/lint-staged/lint-staged) |
[`^17.0.3` →
`^17.0.4`](https://renovatebot.com/diffs/npm/lint-staged/17.0.3/17.0.4)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/lint-staged/17.0.4?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/lint-staged/17.0.3/17.0.4?slim=true)
| devDependencies | patch |
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`11.0.8` →
`11.1.1`](https://renovatebot.com/diffs/npm/pnpm/11.0.8/11.1.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.0.8/11.1.1?slim=true)
| packageManager | minor |
| [pnpm/action-setup](https://redirect.github.com/pnpm/action-setup) |
`v6.0.5` → `v6.0.8` |
![age](https://developer.mend.io/api/mc/badges/age/github-tags/pnpm%2faction-setup/v6.0.8?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/pnpm%2faction-setup/v6.0.5/v6.0.8?slim=true)
| action | patch |
| [turbo](https://turborepo.dev)
([source](https://redirect.github.com/vercel/turborepo)) | [`^2.9.10` →
`^2.9.12`](https://renovatebot.com/diffs/npm/turbo/2.9.10/2.9.12) |
![age](https://developer.mend.io/api/mc/badges/age/npm/turbo/2.9.12?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/turbo/2.9.10/2.9.12?slim=true)
| devDependencies | patch |
| [vitest](https://vitest.dev)
([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest))
| [`^4.1.5` →
`^4.1.6`](https://renovatebot.com/diffs/npm/vitest/4.1.5/4.1.6) |
![age](https://developer.mend.io/api/mc/badges/age/npm/vitest/4.1.6?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vitest/4.1.5/4.1.6?slim=true)
| devDependencies | patch |

---

### Release Notes

<details>
<summary>withastro/starlight (@&#8203;astrojs/starlight)</summary>

###
[`v0.39.2`](https://redirect.github.com/withastro/starlight/blob/HEAD/packages/starlight/CHANGELOG.md#0392)

[Compare
Source](https://redirect.github.com/withastro/starlight/compare/@astrojs/starlight@0.39.1...@astrojs/starlight@0.39.2)

##### Patch Changes

-
[#&#8203;3890](https://redirect.github.com/withastro/starlight/pull/3890)
[`2d05e18`](https://redirect.github.com/withastro/starlight/commit/2d05e1802ac81f1db1220fc7a2c775e0c0bba9bc)
Thanks [@&#8203;tats-u](https://redirect.github.com/tats-u)! - Fixes CSS
selector for `text-autospace` styles in Chromium browsers

</details>

<details>
<summary>biomejs/biome (@&#8203;biomejs/biome)</summary>

###
[`v2.4.15`](https://redirect.github.com/biomejs/biome/blob/HEAD/packages/@&#8203;biomejs/biome/CHANGELOG.md#2415)

[Compare
Source](https://redirect.github.com/biomejs/biome/compare/@biomejs/biome@2.4.14...@biomejs/biome@2.4.15)

##### Patch Changes

- [#&#8203;9394](https://redirect.github.com/biomejs/biome/pull/9394)
[`ba3480e`](https://redirect.github.com/biomejs/biome/commit/ba3480e62da6ac7f0f9d99126f1459a72306368b)
Thanks [@&#8203;dyc3](https://redirect.github.com/dyc3)! - Added the
nursery rule
[`useTestHooksInOrder`](https://biomejs.dev/linter/rules/use-test-hooks-in-order)
in the `test` domain. The rule enforces that Jest/Vitest lifecycle hooks
(`beforeAll`, `beforeEach`, `afterEach`, `afterAll`) are declared in the
order they execute, making test setup and teardown easier to reason
about.

- [#&#8203;10254](https://redirect.github.com/biomejs/biome/pull/10254)
[`e0a54cc`](https://redirect.github.com/biomejs/biome/commit/e0a54ccc0a0c892fff2270ae772bcecf0d34e79a)
Thanks [@&#8203;dyc3](https://redirect.github.com/dyc3)! - Added a new
nursery rule
[`useVueNextTickPromise`](https://biomejs.dev/linter/rules/use-vue-next-tick-promise/),
which enforces Promise syntax when using Vue `nextTick`.

  For example, the following snippet triggers the rule:

  ```js
  import { nextTick } from "vue";

  nextTick(() => {
    updateDom();
  });
  ```

- [#&#8203;10219](https://redirect.github.com/biomejs/biome/pull/10219)
[`64aee45`](https://redirect.github.com/biomejs/biome/commit/64aee454ac2db2ade31089c1438dd761c94a8d57)
Thanks [@&#8203;dyc3](https://redirect.github.com/dyc3)! - Added a new
nursery rule
[`noVueVOnNumberValues`](https://biomejs.dev/linter/rules/no-vue-v-on-number-values/),
that disallows deprecated number modifiers on Vue `v-on` directives.

  For example, the following snippet triggers the rule:

  ```vue
  <input @&#8203;keyup.13="submit" />
  ```

- [#&#8203;10195](https://redirect.github.com/biomejs/biome/pull/10195)
[`7b8d4e1`](https://redirect.github.com/biomejs/biome/commit/7b8d4e161a225f14bc9e070e04cc8572ee988bb2)
Thanks [@&#8203;dyc3](https://redirect.github.com/dyc3)! - Added the new
nursery rule
[`useVueValidVFor`](https://biomejs.dev/linter/rules/use-vue-valid-v-for/),
which validates Vue `v-for` directives and reports invalid aliases,
missing component keys, and keys that do not use iteration variables.

- [#&#8203;10238](https://redirect.github.com/biomejs/biome/pull/10238)
[`1110256`](https://redirect.github.com/biomejs/biome/commit/1110256c6d60500ebc05b9d2738fe77345c7ffd6)
Thanks [@&#8203;dyc3](https://redirect.github.com/dyc3)! - Added the
recommended nursery rule
[`noVueImportCompilerMacros`](https://biomejs.dev/linter/rules/no-vue-import-compiler-macros/),
which disallows importing Vue compiler macros such as `defineProps` from
`vue` because they are automatically available.

- [#&#8203;10201](https://redirect.github.com/biomejs/biome/pull/10201)
[`1a08f89`](https://redirect.github.com/biomejs/biome/commit/1a08f89df55eafe1d8463696d1be53f8dea90a80)
Thanks [@&#8203;realknove](https://redirect.github.com/realknove)! -
Fixed
[#&#8203;10193](https://redirect.github.com/biomejs/biome/issues/10193):
`style/useReadonlyClassProperties` no longer reports class properties as
readonly-able when they are assigned inside arrow callbacks nested in
class property initializers.

- [#&#8203;9574](https://redirect.github.com/biomejs/biome/pull/9574)
[`3bd2b6a`](https://redirect.github.com/biomejs/biome/commit/3bd2b6adf0be44eda922ad7610781dd2e387bdb6)
Thanks [@&#8203;Conaclos](https://redirect.github.com/Conaclos)! - Fixed
[#&#8203;9530](https://redirect.github.com/biomejs/biome/issues/9530).
The diagnostics of
[`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/)
are now more detailed and more precise. They are also better at
localizing where the issue is.

- [#&#8203;10205](https://redirect.github.com/biomejs/biome/pull/10205)
[`a704a6c`](https://redirect.github.com/biomejs/biome/commit/a704a6c40392e71aad5127ab35c771486116937e)
Thanks [@&#8203;Conaclos](https://redirect.github.com/Conaclos)! - Fixed
[#&#8203;10185](https://redirect.github.com/biomejs/biome/issues/10185).
[\`organizeImports](https://biomejs.dev/assist/actions/organize-imports/)
now errors when it encounters an unknown predefined group.

The following configuration is now reported as invalid because
`:INEXISTENT:` is an unknown predefined group.

  ```json
  {
    "assist": {
      "actions": {
        "source": {
"organizeImports": { "options": { "groups": [":INEXISTENT:"] } }
        }
      }
    }
  }
  ```

- [#&#8203;10052](https://redirect.github.com/biomejs/biome/pull/10052)
[`b565bed`](https://redirect.github.com/biomejs/biome/commit/b565bedf53bd241bfef57883439d6a60a19b43c5)
Thanks [@&#8203;minseong0324](https://redirect.github.com/minseong0324)!
- Improved
[`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/):
it now flags union annotations whose extra variants are never returned,
and suggests the narrower type (e.g. `string | null` → `string`).

These functions are now reported because `null` and `number` are
included in the return annotations but never returned:

  ```ts
  function getUser(): string | null {
    return "hello";
  } // null is never returned
  function getCode(): string | number {
    return "hello";
  } // number is never returned
  ```

- [#&#8203;10213](https://redirect.github.com/biomejs/biome/pull/10213)
[`ac30057`](https://redirect.github.com/biomejs/biome/commit/ac30057415302e74003d428e96983433441e84dc)
Thanks [@&#8203;dyc3](https://redirect.github.com/dyc3)! - Fixed
[#&#8203;9450](https://redirect.github.com/biomejs/biome/issues/9450):
HTML and Vue element formatting now preserves child line breaks when an
element contains another element child on its own line, instead of
collapsing the child element onto the same line.

- [#&#8203;10275](https://redirect.github.com/biomejs/biome/pull/10275)
[`9ee6c03`](https://redirect.github.com/biomejs/biome/commit/9ee6c03203581639b564b6c7f81b3e5a2febea58)
Thanks [@&#8203;solithcy](https://redirect.github.com/solithcy)! - Fixed
[#&#8203;10274](https://redirect.github.com/biomejs/biome/issues/10274):
Svelte templates with missing expressions no longer parsed as
`HtmlBogusElement`

- [#&#8203;10143](https://redirect.github.com/biomejs/biome/pull/10143)
[`56798a7`](https://redirect.github.com/biomejs/biome/commit/56798a76b9e7f57caf070acd51734beb61904d9d)
Thanks [@&#8203;minseong0324](https://redirect.github.com/minseong0324)!
-
[`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/)
now detects misleading return type annotations when object literal
properties are initialized with `as const`.

This function is now reported because the return annotation widens a
property initialized with `as const`:

  ```ts
  function f(): { value: string } {
    return { value: "text" as const };
  }
  ```

- [#&#8203;10143](https://redirect.github.com/biomejs/biome/pull/10143)
[`56798a7`](https://redirect.github.com/biomejs/biome/commit/56798a76b9e7f57caf070acd51734beb61904d9d)
Thanks [@&#8203;minseong0324](https://redirect.github.com/minseong0324)!
-
[`noUselessTypeConversion`](https://biomejs.dev/linter/rules/no-useless-type-conversion/)
now detects redundant conversions on object literal properties
initialized with `as const`.

This conversion is now reported because `message.value` is inferred as a
string literal:

  ```ts
  const message = { value: "text" as const };
  String(message.value);
  ```

- [#&#8203;9807](https://redirect.github.com/biomejs/biome/pull/9807)
[`0ae5840`](https://redirect.github.com/biomejs/biome/commit/0ae58406b4752f296adfccf94b1d2a042c4cddc7)
Thanks [@&#8203;dyc3](https://redirect.github.com/dyc3)! - Added the new
nursery rule
[`useThisInClassMethods`](https://biomejs.dev/linter/rules/use-this-in-class-methods/),
based on ESLint's `class-methods-use-this`.

The rule now reports instance methods, getters, setters, and
function-valued instance fields that do not use `this`, and `biome
migrate eslint` preserves the supported `ignoreMethods`,
`ignoreOverrideMethods`, and `ignoreClassesWithImplements` options.

  **Invalid**:

  ```js
  class Foo {
    bar() {
      // does not use `this`, invalid
      console.log("Hello Biome");
    }
  }
  ```

- [#&#8203;10258](https://redirect.github.com/biomejs/biome/pull/10258)
[`e7b18f7`](https://redirect.github.com/biomejs/biome/commit/e7b18f759d82291a3f280ea616b3028fa716cba5)
Thanks [@&#8203;ematipico](https://redirect.github.com/ematipico)! -
Improved linter performance by narrowing the query nodes for several
lint rules, reducing how often they are evaluated.

- [#&#8203;10273](https://redirect.github.com/biomejs/biome/pull/10273)
[`04e22a1`](https://redirect.github.com/biomejs/biome/commit/04e22a10e7446178a80cf3c0c614dc512d894e9d)
Thanks [@&#8203;dyc3](https://redirect.github.com/dyc3)! - Fixed
[#&#8203;10271](https://redirect.github.com/biomejs/biome/issues/10271):
The HTML parser now correctly parses `of` as text content when in text
contexts.

- [#&#8203;9838](https://redirect.github.com/biomejs/biome/pull/9838)
[`83f7385`](https://redirect.github.com/biomejs/biome/commit/83f7385f14d68704510ea4c028cfa20317698fc0)
Thanks [@&#8203;dyc3](https://redirect.github.com/dyc3)! - Added the
nursery rule
[`noBaseToString`](https://biomejs.dev/linter/rules/no-base-to-string/),
which reports stringification sites that fall back to Object's default
`"[object Object]"` formatting. The rule also supports the
`ignoredTypeNames` option.

- [#&#8203;10143](https://redirect.github.com/biomejs/biome/pull/10143)
[`56798a7`](https://redirect.github.com/biomejs/biome/commit/56798a76b9e7f57caf070acd51734beb61904d9d)
Thanks [@&#8203;minseong0324](https://redirect.github.com/minseong0324)!
-
[`useExhaustiveSwitchCases`](https://biomejs.dev/linter/rules/use-exhaustive-switch-cases/)
now checks switch statements over object literal properties initialized
with `as const`.

This switch is now reported because `status.kind` is inferred as the
string literal `"ready"` but no case handles it:

  ```ts
  const status = { kind: "ready" as const };
  switch (status.kind) {
  }
  ```

- [#&#8203;10143](https://redirect.github.com/biomejs/biome/pull/10143)
[`56798a7`](https://redirect.github.com/biomejs/biome/commit/56798a76b9e7f57caf070acd51734beb61904d9d)
Thanks [@&#8203;minseong0324](https://redirect.github.com/minseong0324)!
-
[`useStringStartsEndsWith`](https://biomejs.dev/linter/rules/use-string-starts-ends-with/)
now detects string index comparisons on object literal properties
initialized with `as const`.

This comparison is now reported because `message.value` is inferred as a
string literal:

  ```ts
  const message = { value: "hello" as const };
  message.value[0] === "h";
  ```

</details>

<details>
<summary>conventional-changelog/commitlint
(@&#8203;commitlint/cli)</summary>

###
[`v21.0.1`](https://redirect.github.com/conventional-changelog/commitlint/blob/HEAD/@&#8203;commitlint/cli/CHANGELOG.md#2101-2026-05-12)

[Compare
Source](https://redirect.github.com/conventional-changelog/commitlint/compare/v21.0.0...v21.0.1)

**Note:** Version bump only for package
[@&#8203;commitlint/cli](https://redirect.github.com/commitlint/cli)

</details>

<details>
<summary>conventional-changelog/commitlint
(@&#8203;commitlint/config-conventional)</summary>

###
[`v21.0.1`](https://redirect.github.com/conventional-changelog/commitlint/blob/HEAD/@&#8203;commitlint/config-conventional/CHANGELOG.md#2101-2026-05-12)

[Compare
Source](https://redirect.github.com/conventional-changelog/commitlint/compare/v21.0.0...v21.0.1)

**Note:** Version bump only for package
[@&#8203;commitlint/config-conventional](https://redirect.github.com/commitlint/config-conventional)

</details>

<details>
<summary>lint-staged/lint-staged (lint-staged)</summary>

###
[`v17.0.4`](https://redirect.github.com/lint-staged/lint-staged/blob/HEAD/CHANGELOG.md#1704)

[Compare
Source](https://redirect.github.com/lint-staged/lint-staged/compare/v17.0.3...v17.0.4)

##### Patch Changes

-
[#&#8203;1788](https://redirect.github.com/lint-staged/lint-staged/pull/1788)
[`f95c1f8`](https://redirect.github.com/lint-staged/lint-staged/commit/f95c1f8df3368758c44c2052e568aac1b3d4c767)
- Another fix for making sure *lint-staged* adds task modifications
correctly to the commit in the following cases:

- after editing `<file>` it is staged with `git add <file>`, and then
committed with `git commit`
- after editing `<file>` it is committed with `git commit --all` without
explicit `git add`
- after editing `<file>` it is committed with `git commit <pathspec>`
without explicit `git add`

There's new test cases which actually setup the Git `pre_commit` hook to
run *lint-staged* and verify them. These issues started in **v17.0.0**
when trying to improve support for committig without having explicitly
staged files.

</details>

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

###
[`v11.1.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1110)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.9...v11.1.0)

##### Minor Changes

- Added `pnpm audit signatures` to verify ECDSA registry signatures for
installed packages against keys from `/-/npm/v1/keys`
[#&#8203;7909](https://redirect.github.com/pnpm/pnpm/issues/7909).
Scoped registries are respected, and registries without signing keys are
skipped.

- Added support for installing packages from the [GitHub Packages npm
registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry)
via a built-in `gh:` prefix (e.g. `pnpm add gh:@&#8203;acme/private`),
and, more broadly, for arbitrary named registries in the style of [vlt's
named-registry aliases](https://docs.vlt.sh/cli/registries).
Authentication is picked up from the existing per-URL `.npmrc` entries
(e.g. `//npm.pkg.github.com/:_authToken=...`), so no separate auth
mechanism is required.

Additional aliases — or an override for the built-in `gh` alias, for
GitHub Enterprise Server — can be configured under `namedRegistries` in
`pnpm-workspace.yaml`:

  ```yaml
  namedRegistries:
    gh: https://npm.pkg.github.example.com/
    work: https://npm.work.example.com/
  ```

With this, `work:@&#8203;corp/lib@^2.0.0` resolves against
`https://npm.work.example.com/`.
[#&#8203;8941](https://redirect.github.com/pnpm/pnpm/issues/8941).

- Allow setting sbom spec version using `--sbom-spec-version`
[#&#8203;11389](https://redirect.github.com/pnpm/pnpm/pull/11389).

- Add `--no-runtime` flag (config: `runtime=false`) to skip installing
runtime entries (e.g. Node.js downloaded via `devEngines.runtime`)
without modifying the lockfile. The lockfile keeps the runtime entry so
frozen-lockfile validation still passes; only the runtime fetch and
`.bin` linking are skipped. Useful in CI matrices where the runtime is
provisioned externally (e.g. via `pnpm runtime -g set node <version>`)
before `pnpm install` runs.

- Added the `pnpm bugs` command that opens a package's bug tracker URL
in the browser. With no arguments, it reads the current project's
`package.json`; with one or more package names, it fetches each
package's metadata from the registry and opens its bug tracker. Falls
back to `<repository>/issues` when the `bugs` field is missing
[#&#8203;11279](https://redirect.github.com/pnpm/pnpm/pull/11279).

- Added `pnpm owner` command to manage package owners on the registry.

##### Patch Changes

- Added "published X ago by Y" information to the `pnpm view` command
output, similar to `npm view`. This is useful when comparing against
`minimumReleaseAge`.

  For example, `pnpm view pnpm` now shows:

  ```
  published 17 hours ago by GitHub Actions
  ```

- `pnpm publish` now honors the configured HTTP/HTTPS proxy (including
`https_proxy`/`http_proxy`/`no_proxy` environment variables) when
polling the registry's `doneUrl` during the web-based authentication
flow. Previously the poll bypassed the proxy, causing the registry to
respond `403` from a different source IP and the login to never complete
[#&#8203;11561](https://redirect.github.com/pnpm/pnpm/issues/11561).

- `pnpm add -g` now installs each space-separated package into its own
isolated directory by default. To bundle multiple packages into the same
isolated install (so that they share dependencies and are removed
together), pass them as a comma-separated list. For example:

- `pnpm add -g foo bar` installs `foo` and `bar` as two independent
globals — removing one does not affect the other.
- `pnpm add -g foo,bar qar` bundles `foo` and `bar` into a single
isolated install while `qar` is installed on its own.

Related:
[#&#8203;11587](https://redirect.github.com/pnpm/pnpm/issues/11587).

- `pnpm runtime set <name> <version>` no longer fails in the root of a
multi-package workspace with the `ADDING_TO_ROOT` error. Installing the
workspace root is a valid target for a runtime, so the command now
bypasses that safety check.

- Fix `pnpm --version` hanging for the lifetime of the worker pool after
the version was printed. `main.ts`'s `--version` short-circuit returned
before reaching the command-handler `finally` that calls
`finishWorkers()`, so the worker pool that `switchCliVersion` had
spawned during integrity resolution stayed alive and held the Node event
loop open. The CLI entry now runs `finishWorkers()` from its own
`finally`, so every exit path tears the pool down.

Repro: `pnpm --version` in a workspace whose `devEngines.packageManager`
version already matches the running pnpm + `onFail: "download"`.
`switchCliVersion` resolves the integrity (spawning workers), finds
nothing to swap, returns. The version prints, then the process hangs.

###
[`v11.0.9`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1109)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.8...v11.0.9)

##### Patch Changes

- Fixed installation of GitLab-hosted dependencies. pnpm now downloads
the tarball from
`https://gitlab.com/<user>/<project>/-/archive/<sha>/<project>-<sha>.tar.gz`
instead of the GitLab API endpoint that contained an encoded slash
(`%2F`) between user and project. The encoded slash both triggered `406
Not Acceptable` responses from GitLab and produced virtual store
directory names that Node refused to import
(`ERR_INVALID_MODULE_SPECIFIER`)
[#&#8203;11533](https://redirect.github.com/pnpm/pnpm/issues/11533).
- Honor `NPM_CONFIG_USERCONFIG` (and its lowercase
`npm_config_userconfig` form) as a low-priority fallback when locating
the user-level `.npmrc`. This restores compatibility with environments
that point npm at a custom auth file via that env var — most notably
`actions/setup-node`, which writes registry credentials to
`${runner.temp}/.npmrc` and exports `NPM_CONFIG_USERCONFIG` to reference
it. Without this, GitHub Actions workflows using `actions/setup-node` to
authenticate to private registries broke after upgrading to pnpm v11.
PNPM-prefixed env vars and `npmrcAuthFile` from the global `config.yaml`
continue to take precedence
[#&#8203;11539](https://redirect.github.com/pnpm/pnpm/issues/11539).
- Fix `pnpm pack` not bundling dependencies listed in
`bundleDependencies` (or `bundledDependencies`). The npm-packlist
upgrade in pnpm 11 changed its API to require the caller to pre-populate
the dependency tree, which the wrapper was not doing —
`bundleDependencies` were silently dropped from the tarball
[#&#8203;11519](https://redirect.github.com/pnpm/pnpm/issues/11519).
- Fixed the pnpm CLI crashing with a confusing `SyntaxError: Invalid
regular expression flags` instead of printing a clear "requires Node.js
v22.13" error when launched on an unsupported Node.js version. The
Node.js version check in `bin/pnpm.mjs` was effectively dead code
because the static `import` of the bundled `dist/pnpm.mjs` was hoisted
by the ES module loader and parsed before the check could run
[#&#8203;11546](https://redirect.github.com/pnpm/pnpm/issues/11546).
- Fixed `pnpm --prefix=<dir> install` overwriting the existing
`pnpm-workspace.yaml` in `<dir>` with `set this to true or false`
placeholders. The renamed `--prefix` option (which maps to `dir`) was
not honored when locating the workspace root, so the workspace
manifest's `allowBuilds` settings were not loaded into config and got
clobbered when ignored builds were auto-populated
[#&#8203;11535](https://redirect.github.com/pnpm/pnpm/issues/11535).
- Fixed `pnpm publish --provenance` failing with a 422 from the registry
when the package version contained semver build metadata (e.g.
`1.0.0-canary.0+abc1234`). The `+<build>` segment is now stripped before
packing so that the version embedded in the tarball, the metadata sent
to the registry, and the sigstore provenance subject all agree
[#&#8203;11518](https://redirect.github.com/pnpm/pnpm/issues/11518).

</details>

<details>
<summary>pnpm/action-setup (pnpm/action-setup)</summary>

###
[`v6.0.8`](https://redirect.github.com/pnpm/action-setup/compare/v6.0.7...v6.0.8)

[Compare
Source](https://redirect.github.com/pnpm/action-setup/compare/v6.0.7...v6.0.8)

###
[`v6.0.7`](https://redirect.github.com/pnpm/action-setup/compare/v6.0.6...v6.0.7)

[Compare
Source](https://redirect.github.com/pnpm/action-setup/compare/v6.0.6...v6.0.7)

###
[`v6.0.6`](https://redirect.github.com/pnpm/action-setup/releases/tag/v6.0.6)

[Compare
Source](https://redirect.github.com/pnpm/action-setup/compare/v6.0.5...v6.0.6)

##### What's Changed

- fix: bin\_dest output points to self-updated pnpm, not bootstrap by
[@&#8203;zkochan](https://redirect.github.com/zkochan) in
[#&#8203;249](https://redirect.github.com/pnpm/action-setup/pull/249)

**Full Changelog**:
<pnpm/action-setup@v6.0.5...v6.0.6>

</details>

<details>
<summary>vercel/turborepo (turbo)</summary>

###
[`v2.9.12`](https://redirect.github.com/vercel/turborepo/releases/tag/v2.9.12):
Turborepo v2.9.12

[Compare
Source](https://redirect.github.com/vercel/turborepo/compare/v2.9.11...v2.9.12)

<!-- Release notes generated using configuration in .github/release.yml
at v2.9.12 -->

#### What's Changed

##### Changelog

- release(turborepo): 2.9.11 by
[@&#8203;github-actions](https://redirect.github.com/github-actions)\[bot]
in
[#&#8203;12771](https://redirect.github.com/vercel/turborepo/pull/12771)
- fix: Allow transit nodes in LSP diagnostics by
[@&#8203;anthonyshew](https://redirect.github.com/anthonyshew) in
[#&#8203;12773](https://redirect.github.com/vercel/turborepo/pull/12773)

**Full Changelog**:
<vercel/turborepo@v2.9.11...v2.9.12>

###
[`v2.9.11`](https://redirect.github.com/vercel/turborepo/releases/tag/v2.9.11):
Turborepo v2.9.11

[Compare
Source](https://redirect.github.com/vercel/turborepo/compare/v2.9.10...v2.9.11)

<!-- Release notes generated using configuration in .github/release.yml
at v2.9.11 -->

#### What's Changed

##### Changelog

- release(turborepo): 2.9.10 by
[@&#8203;github-actions](https://redirect.github.com/github-actions)\[bot]
in
[#&#8203;12745](https://redirect.github.com/vercel/turborepo/pull/12745)
- ci: Publish VS Code extension on release by
[@&#8203;anthonyshew](https://redirect.github.com/anthonyshew) in
[#&#8203;12747](https://redirect.github.com/vercel/turborepo/pull/12747)
- fix: Start daemon for VSCode Extension from the extension itself by
[@&#8203;anthonyshew](https://redirect.github.com/anthonyshew) in
[#&#8203;12749](https://redirect.github.com/vercel/turborepo/pull/12749)
- release(turborepo): 2.9.11-canary.1 by
[@&#8203;github-actions](https://redirect.github.com/github-actions)\[bot]
in
[#&#8203;12748](https://redirect.github.com/vercel/turborepo/pull/12748)
- fix: Include file URIs in LSP lifecycle logs by
[@&#8203;anthonyshew](https://redirect.github.com/anthonyshew) in
[#&#8203;12751](https://redirect.github.com/vercel/turborepo/pull/12751)
- fix: Handle JSON decoration visitor depth by
[@&#8203;anthonyshew](https://redirect.github.com/anthonyshew) in
[#&#8203;12752](https://redirect.github.com/vercel/turborepo/pull/12752)
- fix: Resolve relative `turbo path` in VS Code extension by
[@&#8203;anthonyshew](https://redirect.github.com/anthonyshew) in
[#&#8203;12753](https://redirect.github.com/vercel/turborepo/pull/12753)
- fix: Preserve Bun nested dependencies during prune by
[@&#8203;anthonyshew](https://redirect.github.com/anthonyshew) in
[#&#8203;12754](https://redirect.github.com/vercel/turborepo/pull/12754)
- fix: Prefer installed Turbo for LSP by
[@&#8203;anthonyshew](https://redirect.github.com/anthonyshew) in
[#&#8203;12755](https://redirect.github.com/vercel/turborepo/pull/12755)
- release(turborepo): 2.9.11-canary.2 by
[@&#8203;github-actions](https://redirect.github.com/github-actions)\[bot]
in
[#&#8203;12750](https://redirect.github.com/vercel/turborepo/pull/12750)
- ci: Parallelize LSP release publishing by
[@&#8203;anthonyshew](https://redirect.github.com/anthonyshew) in
[#&#8203;12758](https://redirect.github.com/vercel/turborepo/pull/12758)
- fix: Reduce VS Code extension startup popups by
[@&#8203;anthonyshew](https://redirect.github.com/anthonyshew) in
[#&#8203;12759](https://redirect.github.com/vercel/turborepo/pull/12759)
- fix: Support `turbo.jsonc` in VS Code extension by
[@&#8203;anthonyshew](https://redirect.github.com/anthonyshew) in
[#&#8203;12760](https://redirect.github.com/vercel/turborepo/pull/12760)
- fix: Remove VS Code task key gradient by
[@&#8203;anthonyshew](https://redirect.github.com/anthonyshew) in
[#&#8203;12761](https://redirect.github.com/vercel/turborepo/pull/12761)
- release(turborepo): 2.9.11-canary.3 by
[@&#8203;github-actions](https://redirect.github.com/github-actions)\[bot]
in
[#&#8203;12756](https://redirect.github.com/vercel/turborepo/pull/12756)
- chore: Release v2.9.11-canary.4 by
[@&#8203;anthonyshew](https://redirect.github.com/anthonyshew) in
[#&#8203;12762](https://redirect.github.com/vercel/turborepo/pull/12762)
- ci: Stop VS Code publish from blocking release PR by
[@&#8203;anthonyshew](https://redirect.github.com/anthonyshew) in
[#&#8203;12763](https://redirect.github.com/vercel/turborepo/pull/12763)
- release(turborepo): 2.9.11-canary.5 by
[@&#8203;github-actions](https://redirect.github.com/github-actions)\[bot]
in
[#&#8203;12764](https://redirect.github.com/vercel/turborepo/pull/12764)
- fix: Publish VS Code extension from release tag by
[@&#8203;anthonyshew](https://redirect.github.com/anthonyshew) in
[#&#8203;12765](https://redirect.github.com/vercel/turborepo/pull/12765)
- fix: Support shimmed VS Code LSP probes by
[@&#8203;anthonyshew](https://redirect.github.com/anthonyshew) in
[#&#8203;12767](https://redirect.github.com/vercel/turborepo/pull/12767)
- release(turborepo): 2.9.11-canary.6 by
[@&#8203;github-actions](https://redirect.github.com/github-actions)\[bot]
in
[#&#8203;12766](https://redirect.github.com/vercel/turborepo/pull/12766)
- release(turborepo): 2.9.11-canary.7 by
[@&#8203;github-actions](https://redirect.github.com/github-actions)\[bot]
in
[#&#8203;12768](https://redirect.github.com/vercel/turborepo/pull/12768)
- fix: Allow `$TURBO_EXTENDS$` in LSP diagnostics by
[@&#8203;anthonyshew](https://redirect.github.com/anthonyshew) in
[#&#8203;12770](https://redirect.github.com/vercel/turborepo/pull/12770)

**Full Changelog**:
<vercel/turborepo@v2.9.10...v2.9.11>

</details>

<details>
<summary>vitest-dev/vitest (vitest)</summary>

###
[`v4.1.6`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.6)

[Compare
Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.5...v4.1.6)

#####    🐞 Bug Fixes

- **browser**: Provide project reference in
`ToMatchScreenshotResolvePath`  -  by
[@&#8203;macarie](https://redirect.github.com/macarie) and
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10138](https://redirect.github.com/vitest-dev/vitest/issues/10138)
[<samp>(31882)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/31882607c)
- Global `sequence.concurrent: true` with top-level `test(..., {
concurrent: false })` + depreacte `sequential` test API and options  - 
by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa), **Codex**
and [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10196](https://redirect.github.com/vitest-dev/vitest/issues/10196)
[<samp>(2847d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/2847dfa2a)
- **browser**: Simplify orchestrator otel carrier  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;10285](https://redirect.github.com/vitest-dev/vitest/issues/10285)
[<samp>(18af9)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/18af98cee)

#####    🏎 Performance

- Stringify diff objects only once  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10276](https://redirect.github.com/vitest-dev/vitest/issues/10276)
[<samp>(9f7b1)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9f7b1528c)

#####     [View changes on
GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.5...v4.1.6)

</details>

---

### Configuration

📅 **Schedule**: (in timezone America/New_York)

- Branch creation
  - "before 9am on Monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/solve4it/mycollections).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNTkuMiIsInVwZGF0ZWRJblZlciI6IjQzLjE3My42IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
renovate Bot added a commit to medievalrain/emitter that referenced this pull request May 14, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@typescript/native-preview](https://www.typescriptlang.org/)
([source](https://redirect.github.com/microsoft/typescript-go)) |
[`7.0.0-dev.20260511.1` →
`7.0.0-dev.20260513.1`](https://renovatebot.com/diffs/npm/@typescript%2fnative-preview/7.0.0-dev.20260511.1/7.0.0-dev.20260513.1)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript%2fnative-preview/7.0.0-dev.20260513.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript%2fnative-preview/7.0.0-dev.20260511.1/7.0.0-dev.20260513.1?slim=true)
|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`11.1.0` →
`11.1.1`](https://renovatebot.com/diffs/npm/pnpm/11.1.0/11.1.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.1.0/11.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>microsoft/typescript-go
(@&#8203;typescript/native-preview)</summary>

###
[`v7.0.0-dev.20260513.1`](https://redirect.github.com/microsoft/typescript-go/compare/adb2ab4ed7d7849bb222eb27c41437d5520335a9...01cc06960f62a508d26232175e0fcfd16846ed4f)

[Compare
Source](https://redirect.github.com/microsoft/typescript-go/compare/adb2ab4ed7d7849bb222eb27c41437d5520335a9...01cc06960f62a508d26232175e0fcfd16846ed4f)

###
[`v7.0.0-dev.20260512.1`](https://redirect.github.com/microsoft/typescript-go/compare/092b34f534182baf2875887c20ffed2177f14d92...adb2ab4ed7d7849bb222eb27c41437d5520335a9)

[Compare
Source](https://redirect.github.com/microsoft/typescript-go/compare/092b34f534182baf2875887c20ffed2177f14d92...adb2ab4ed7d7849bb222eb27c41437d5520335a9)

</details>

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Amsterdam)

- Branch creation
  - "before 3am"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/medievalrain/emitter).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzMuNiIsInVwZGF0ZWRJblZlciI6IjQzLjE3My42IiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
fengmk2 pushed a commit to node-modules/urllib that referenced this pull request May 14, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`11.1.0` →
`11.1.1`](https://renovatebot.com/diffs/npm/pnpm/11.1.0/11.1.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.1.0/11.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/node-modules/urllib).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzMuNiIsInVwZGF0ZWRJblZlciI6IjQzLjE3My42IiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
renovate Bot added a commit to kosolabs/kosui that referenced this pull request May 14, 2026
> ℹ️ **Note**
> 
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) | Type |
Update |
|---|---|---|---|---|---|
|
[@eslint/compat](https://redirect.github.com/eslint/rewrite/tree/main/packages/compat#readme)
([source](https://redirect.github.com/eslint/rewrite/tree/HEAD/packages/compat))
| [`2.0.5` →
`2.1.0`](https://renovatebot.com/diffs/npm/@eslint%2fcompat/2.0.5/2.1.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@eslint%2fcompat/2.1.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@eslint%2fcompat/2.0.5/2.1.0?slim=true)
| devDependencies | minor |
| [@playwright/test](https://playwright.dev)
([source](https://redirect.github.com/microsoft/playwright)) | [`1.59.1`
→
`1.60.0`](https://renovatebot.com/diffs/npm/@playwright%2ftest/1.59.1/1.60.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@playwright%2ftest/1.60.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@playwright%2ftest/1.59.1/1.60.0?slim=true)
| devDependencies | minor |
| [@sveltejs/kit](https://svelte.dev)
([source](https://redirect.github.com/sveltejs/kit/tree/HEAD/packages/kit))
| [`2.59.0` →
`2.59.1`](https://renovatebot.com/diffs/npm/@sveltejs%2fkit/2.59.0/2.59.1)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@sveltejs%2fkit/2.59.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@sveltejs%2fkit/2.59.0/2.59.1?slim=true)
| devDependencies | patch |
|
[@sveltejs/vite-plugin-svelte](https://redirect.github.com/sveltejs/vite-plugin-svelte)
([source](https://redirect.github.com/sveltejs/vite-plugin-svelte/tree/HEAD/packages/vite-plugin-svelte))
| [`7.0.0` →
`7.1.2`](https://renovatebot.com/diffs/npm/@sveltejs%2fvite-plugin-svelte/7.0.0/7.1.2)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@sveltejs%2fvite-plugin-svelte/7.1.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@sveltejs%2fvite-plugin-svelte/7.0.0/7.1.2?slim=true)
| devDependencies | minor |
| [@tailwindcss/postcss](https://tailwindcss.com)
([source](https://redirect.github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-postcss))
| [`4.2.4` →
`4.3.0`](https://renovatebot.com/diffs/npm/@tailwindcss%2fpostcss/4.2.4/4.3.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@tailwindcss%2fpostcss/4.3.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@tailwindcss%2fpostcss/4.2.4/4.3.0?slim=true)
| devDependencies | minor |
| [@tailwindcss/vite](https://tailwindcss.com)
([source](https://redirect.github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite))
| [`4.2.4` →
`4.3.0`](https://renovatebot.com/diffs/npm/@tailwindcss%2fvite/4.2.4/4.3.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@tailwindcss%2fvite/4.3.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@tailwindcss%2fvite/4.2.4/4.3.0?slim=true)
| devDependencies | minor |
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| [`25.6.0` →
`25.7.0`](https://renovatebot.com/diffs/npm/@types%2fnode/25.6.0/25.7.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/25.7.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/25.6.0/25.7.0?slim=true)
| devDependencies | minor |
|
[actions/create-github-app-token](https://redirect.github.com/actions/create-github-app-token)
| `v3.1.1` → `v3.2.0` |
![age](https://developer.mend.io/api/mc/badges/age/github-tags/actions%2fcreate-github-app-token/v3.2.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/actions%2fcreate-github-app-token/v3.1.1/v3.2.0?slim=true)
| action | minor |
| [changesets/action](https://redirect.github.com/changesets/action) |
`v1.7.0` → `v1.8.0` |
![age](https://developer.mend.io/api/mc/badges/age/github-tags/changesets%2faction/v1.8.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/changesets%2faction/v1.7.0/v1.8.0?slim=true)
| action | minor |
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`10.33.2` →
`11.1.1`](https://renovatebot.com/diffs/npm/pnpm/10.33.2/11.1.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/10.33.2/11.1.1?slim=true)
| packageManager | major |
| [pnpm/action-setup](https://redirect.github.com/pnpm/action-setup) |
`v6.0.5` → `v6.0.8` |
![age](https://developer.mend.io/api/mc/badges/age/github-tags/pnpm%2faction-setup/v6.0.8?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/pnpm%2faction-setup/v6.0.5/v6.0.8?slim=true)
| action | patch |
| [postcss](https://postcss.org/)
([source](https://redirect.github.com/postcss/postcss)) | [`8.5.13` →
`8.5.14`](https://renovatebot.com/diffs/npm/postcss/8.5.13/8.5.14) |
![age](https://developer.mend.io/api/mc/badges/age/npm/postcss/8.5.14?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/postcss/8.5.13/8.5.14?slim=true)
| devDependencies | patch |
|
[prettier-plugin-svelte](https://redirect.github.com/sveltejs/prettier-plugin-svelte)
| [`3.5.1` →
`3.5.2`](https://renovatebot.com/diffs/npm/prettier-plugin-svelte/3.5.1/3.5.2)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/prettier-plugin-svelte/3.5.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/prettier-plugin-svelte/3.5.1/3.5.2?slim=true)
| devDependencies | patch |
| [publint](https://publint.dev)
([source](https://redirect.github.com/publint/publint/tree/HEAD/packages/publint))
| [`0.3.18` →
`0.3.21`](https://renovatebot.com/diffs/npm/publint/0.3.18/0.3.21) |
![age](https://developer.mend.io/api/mc/badges/age/npm/publint/0.3.21?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/publint/0.3.18/0.3.21?slim=true)
| devDependencies | patch |
| [svelte-check](https://redirect.github.com/sveltejs/language-tools) |
[`4.4.7` →
`4.4.8`](https://renovatebot.com/diffs/npm/svelte-check/4.4.7/4.4.8) |
![age](https://developer.mend.io/api/mc/badges/age/npm/svelte-check/4.4.8?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/svelte-check/4.4.7/4.4.8?slim=true)
| devDependencies | patch |
| [tailwind-merge](https://redirect.github.com/dcastil/tailwind-merge) |
[`3.5.0` →
`3.6.0`](https://renovatebot.com/diffs/npm/tailwind-merge/3.5.0/3.6.0) |
![age](https://developer.mend.io/api/mc/badges/age/npm/tailwind-merge/3.6.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/tailwind-merge/3.5.0/3.6.0?slim=true)
| devDependencies | minor |
| [tailwindcss](https://tailwindcss.com)
([source](https://redirect.github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss))
| [`4.2.4` →
`4.3.0`](https://renovatebot.com/diffs/npm/tailwindcss/4.2.4/4.3.0) |
![age](https://developer.mend.io/api/mc/badges/age/npm/tailwindcss/4.3.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/tailwindcss/4.2.4/4.3.0?slim=true)
| devDependencies | minor |
|
[typescript-eslint](https://typescript-eslint.io/packages/typescript-eslint)
([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint))
| [`8.59.1` →
`8.59.3`](https://renovatebot.com/diffs/npm/typescript-eslint/8.59.1/8.59.3)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/typescript-eslint/8.59.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/typescript-eslint/8.59.1/8.59.3?slim=true)
| devDependencies | patch |
| [vite](https://vite.dev)
([source](https://redirect.github.com/vitejs/vite/tree/HEAD/packages/vite))
| [`8.0.10` →
`8.0.12`](https://renovatebot.com/diffs/npm/vite/8.0.10/8.0.12) |
![age](https://developer.mend.io/api/mc/badges/age/npm/vite/8.0.12?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vite/8.0.10/8.0.12?slim=true)
| devDependencies | patch |
| [vitest](https://vitest.dev)
([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest))
| [`4.1.5` →
`4.1.6`](https://renovatebot.com/diffs/npm/vitest/4.1.5/4.1.6) |
![age](https://developer.mend.io/api/mc/badges/age/npm/vitest/4.1.6?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vitest/4.1.5/4.1.6?slim=true)
| devDependencies | patch |

---

### Release Notes

<details>
<summary>eslint/rewrite (@&#8203;eslint/compat)</summary>

###
[`v2.1.0`](https://redirect.github.com/eslint/rewrite/blob/HEAD/packages/compat/CHANGELOG.md#210-2026-05-08)

[Compare
Source](https://redirect.github.com/eslint/rewrite/compare/d2dbf7b73d01505da89a69b7465e486d8a88aa8f...b8949534bf7f498d941007f3adc2740157965b49)

##### Features

- Add new `includeIgnoreFile()` to config-helpers
([#&#8203;430](https://redirect.github.com/eslint/rewrite/issues/430))
([9b51352](https://redirect.github.com/eslint/rewrite/commit/9b513529022834e72cccfa278ec7ba6e7f4e10c5))

</details>

<details>
<summary>microsoft/playwright (@&#8203;playwright/test)</summary>

###
[`v1.60.0`](https://redirect.github.com/microsoft/playwright/releases/tag/v1.60.0)

[Compare
Source](https://redirect.github.com/microsoft/playwright/compare/v1.59.1...v1.60.0)

#### 🌐 HAR recording on Tracing


[tracing.startHar()](https://playwright.dev/docs/api/class-tracing#tracing-start-har)
/
[tracing.stopHar()](https://playwright.dev/docs/api/class-tracing#tracing-stop-har)
expose HAR recording as a first-class tracing API, with the same
`content`, `mode` and `urlFilter` options as `recordHar`. The returned
[Disposable](https://playwright.dev/docs/api/class-disposable) makes it
easy to scope a recording with `await using`:

```js
await using har = await context.tracing.startHar('trace.har');
const page = await context.newPage();
await page.goto('https://playwright.dev');
// HAR is finalized when `har` goes out of scope.
```

#### 🪝 Drop API

New
[locator.drop()](https://playwright.dev/docs/api/class-locator#locator-drop)
simulates an external drag-and-drop of files or clipboard-like data onto
an element. Playwright dispatches `dragenter`, `dragover`, and `drop`
with a synthetic \[DataTransfer] in the page context — works
cross-browser and is great for testing upload zones:

```js
await page.locator('#dropzone').drop({
  files: { name: 'note.txt', mimeType: 'text/plain', buffer: Buffer.from('hello') },
});

await page.locator('#dropzone').drop({
  data: {
    'text/plain': 'hello world',
    'text/uri-list': 'https://example.com',
  },
});
```

#### 🎯 Aria snapshots

-
[expect(page).toMatchAriaSnapshot()](https://playwright.dev/docs/api/class-pageassertions#page-assertions-to-match-aria-snapshot)
now works on a [Page](https://playwright.dev/docs/api/class-page), in
addition to a [Locator](https://playwright.dev/docs/api/class-locator) —
equivalent to asserting against `page.locator('body')`.
- New `boxes` option on
[locator.ariaSnapshot()](https://playwright.dev/docs/api/class-locator#locator-aria-snapshot)
/
[page.ariaSnapshot()](https://playwright.dev/docs/api/class-page#page-aria-snapshot)
appends each element's bounding box as `[box=x,y,width,height]`, useful
for AI consumption.

#### 🛑 test.abort()

New
[test.abort()](https://playwright.dev/docs/api/class-test#test-abort)
aborts the currently running test from a fixture, hook, or route handler
with an optional message. Use it when you have detected an unrecoverable
misuse and want to fail the test right away:

```js
test('does not publish to the shared page', async ({ page }) => {
  await page.route('**/publish', route => {
    test.abort('Tests must not publish to the shared page. Use the `clone` option.');
    return route.abort();
  });
  // ...
});
```

#### New APIs

##### Browser, Context and Page

- Event
[browser.on('context')](https://playwright.dev/docs/api/class-browser#browser-event-context)
— fired when a new context is created on the browser.
- [BrowserContext](https://playwright.dev/docs/api/class-browsercontext)
now mirrors lifecycle events from its pages:
[browserContext.on('download')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-download),
[browserContext.on('frameattached')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-frame-attached),
[browserContext.on('framedetached')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-frame-detached),
[browserContext.on('framenavigated')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-frame-navigated),
[browserContext.on('pageclose')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-page-close),
[browserContext.on('pageload')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-page-load).

##### Locators and Assertions

- New option `description` in
[page.getByRole()](https://playwright.dev/docs/api/class-page#page-get-by-role)
/
[locator.getByRole()](https://playwright.dev/docs/api/class-locator#locator-get-by-role)
/
[frame.getByRole()](https://playwright.dev/docs/api/class-frame#frame-get-by-role)
/
[frameLocator.getByRole()](https://playwright.dev/docs/api/class-framelocator#frame-locator-get-by-role)
for matching the [accessible
description](https://www.w3.org/TR/wai-aria-1.2/#dfn-accessible-description).
- New option `pseudo` in
[expect(locator).toHaveCSS()](https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-have-css)
reads computed styles from `::before` or `::after`.
- New option `style` in
[locator.highlight()](https://playwright.dev/docs/api/class-locator#locator-highlight)
applies extra inline CSS to the highlight overlay, plus new
[page.hideHighlight()](https://playwright.dev/docs/api/class-page#page-hide-highlight)
to clear all highlights.

##### Network

-
[webSocketRoute.protocols()](https://playwright.dev/docs/api/class-websocketroute#web-socket-route-protocols)
returns the WebSocket subprotocols requested by the page.
- New option `noDefaults` in
[browserType.connectOverCDP()](https://playwright.dev/docs/api/class-browsertype#browser-type-connect-over-cdp)
disables Playwright's default overrides on the default context (download
behavior, focus emulation, media emulation), so attaching to a user's
daily-driver browser doesn't disturb its state.

##### Errors and Reporting

- New
[webError.location()](https://playwright.dev/docs/api/class-weberror#web-error-location)
mirrors
[consoleMessage.location()](https://playwright.dev/docs/api/class-consolemessage#console-message-location).
-
[consoleMessage.location()](https://playwright.dev/docs/api/class-consolemessage#console-message-location)
now exposes `line` / `column` properties (`lineNumber` / `columnNumber`
are deprecated).
- New
[testInfoError.errorContext](https://playwright.dev/docs/api/class-testinfoerror#test-info-error-error-context)
surfaces additional diagnostic context, such as the aria snapshot of the
receiver at the time of an `expect(...)` matcher failure.
-
[reporter.onError()](https://playwright.dev/docs/api/class-reporter#reporter-on-error)
now receives a `workerInfo` argument with details about the worker for
fixture teardown errors.

##### Test runner

- New `{testFileBaseName}` token in
[testProject.snapshotPathTemplate](https://playwright.dev/docs/api/class-testproject#test-project-snapshot-path-template)
— file name without extension.
- Test runner now errors when a config tries to override a non-option
fixture, and rejects `workers: 0` or negative values.

#### 🛠️ Other improvements

- HTML reporter:
- `npx playwright show-report` accepts `.zip` files directly — no need
to unzip first.
- Steps that contain attachments inside nested children show an
indicator on the parent step.
  - The `repeatEachIndex` is shown in the test header when non-zero.
- Trace Viewer adds a pretty-print toggle for JSON / form request and
response bodies in the network details panel.

#### Breaking Changes ⚠️

- Removed long-deprecated APIs:
- `Locator.ariaRef()` — use the standard
[locator.ariaSnapshot()](https://playwright.dev/docs/api/class-locator#locator-aria-snapshot)
pipeline.
- `handle` option on `BrowserContext.exposeBinding` and
`Page.exposeBinding`.
- `logger` option on `BrowserType.connect` and
`BrowserType.connectOverCDP` — use
[tracing](https://playwright.dev/docs/trace-viewer) instead.
- Context options `videosPath` / `videoSize` — use `recordVideo`
instead.

#### Browser Versions

- Chromium 148.0.7778.96
- Mozilla Firefox 150.0.2
- WebKit 26.4

This version was also tested against the following stable channels:

- Google Chrome 147
- Microsoft Edge 147

</details>

<details>
<summary>sveltejs/kit (@&#8203;sveltejs/kit)</summary>

###
[`v2.59.1`](https://redirect.github.com/sveltejs/kit/blob/HEAD/packages/kit/CHANGELOG.md#2591)

[Compare
Source](https://redirect.github.com/sveltejs/kit/compare/@sveltejs/kit@2.59.0...@sveltejs/kit@2.59.1)

##### Patch Changes

- fix: resolve paths to route files with the letter drive on Windows
([#&#8203;15793](https://redirect.github.com/sveltejs/kit/pull/15793))

</details>

<details>
<summary>sveltejs/vite-plugin-svelte
(@&#8203;sveltejs/vite-plugin-svelte)</summary>

###
[`v7.1.2`](https://redirect.github.com/sveltejs/vite-plugin-svelte/blob/HEAD/packages/vite-plugin-svelte/CHANGELOG.md#712)

[Compare
Source](https://redirect.github.com/sveltejs/vite-plugin-svelte/compare/@sveltejs/vite-plugin-svelte@7.1.1...@sveltejs/vite-plugin-svelte@7.1.2)

##### Patch Changes

- fix: correctly resolve compiled CSS on the server for dependencies
with Svelte files
([#&#8203;1342](https://redirect.github.com/sveltejs/vite-plugin-svelte/pull/1342))

###
[`v7.1.1`](https://redirect.github.com/sveltejs/vite-plugin-svelte/blob/HEAD/packages/vite-plugin-svelte/CHANGELOG.md#711)

[Compare
Source](https://redirect.github.com/sveltejs/vite-plugin-svelte/compare/@sveltejs/vite-plugin-svelte@7.1.0...@sveltejs/vite-plugin-svelte@7.1.1)

##### Patch Changes

- fix: pass `typescript.onlyRemoveTypeImports` to `transformWithOxc` in
`vitePreprocess` so that value imports are not dropped when they are
only referenced in Svelte template markup
([#&#8203;1326](https://redirect.github.com/sveltejs/vite-plugin-svelte/pull/1326))

- fix: correctly resolve compiled CSS for optimised Svelte dependencies
on the server
([#&#8203;1336](https://redirect.github.com/sveltejs/vite-plugin-svelte/pull/1336))

###
[`v7.1.0`](https://redirect.github.com/sveltejs/vite-plugin-svelte/blob/HEAD/packages/vite-plugin-svelte/CHANGELOG.md#710)

[Compare
Source](https://redirect.github.com/sveltejs/vite-plugin-svelte/compare/@sveltejs/vite-plugin-svelte@7.0.0...@sveltejs/vite-plugin-svelte@7.1.0)

##### Minor Changes

- feat: enable optimizer for server environments during dev
([#&#8203;1328](https://redirect.github.com/sveltejs/vite-plugin-svelte/pull/1328))

</details>

<details>
<summary>tailwindlabs/tailwindcss
(@&#8203;tailwindcss/postcss)</summary>

###
[`v4.3.0`](https://redirect.github.com/tailwindlabs/tailwindcss/blob/HEAD/CHANGELOG.md#430---2026-05-08)

[Compare
Source](https://redirect.github.com/tailwindlabs/tailwindcss/compare/v4.2.4...v4.3.0)

##### Added

- Add `@container-size` utility
([#&#8203;18901](https://redirect.github.com/tailwindlabs/tailwindcss/pull/18901))
- Add `scrollbar-{auto,thin,none}` utilities for `scrollbar-width`, and
`scrollbar-thumb-*` / `scrollbar-track-*` color utilities for
`scrollbar-color`
([#&#8203;19981](https://redirect.github.com/tailwindlabs/tailwindcss/pull/19981),
[#&#8203;20019](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20019))
- Add `scrollbar-gutter-*` utilities
([#&#8203;20018](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20018))
- Add `zoom-*` utilities
([#&#8203;20020](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20020))
- Add `tab-*` utilities
([#&#8203;20022](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20022))
- Allow using `@variant` with stacked variants (e.g. `@variant
hover:focus { … }`)
([#&#8203;19996](https://redirect.github.com/tailwindlabs/tailwindcss/pull/19996))
- Allow using `@variant` with compound variants (e.g. `@variant hover,
focus { … }`)
([#&#8203;19996](https://redirect.github.com/tailwindlabs/tailwindcss/pull/19996))
- Support `--default(…)` in `--value(…)` and `--modifier(…)` for
functional `@utility` definitions
([#&#8203;19989](https://redirect.github.com/tailwindlabs/tailwindcss/pull/19989))

##### Fixed

- Ensure `@plugin` resolves package JavaScript entries instead of
browser CSS entries when using `@tailwindcss/vite`
([#&#8203;19949](https://redirect.github.com/tailwindlabs/tailwindcss/pull/19949))
- Fix relative `@import` and `@plugin` paths resolving from the wrong
directory when using `@tailwindcss/vite`
([#&#8203;19965](https://redirect.github.com/tailwindlabs/tailwindcss/pull/19965))
- Ensure CSS files containing `@variant` are processed by
`@tailwindcss/vite`
([#&#8203;19966](https://redirect.github.com/tailwindlabs/tailwindcss/pull/19966))
- Resolve imports relative to `base` when `result.opts.from` is not
provided when using `@tailwindcss/postcss`
([#&#8203;19980](https://redirect.github.com/tailwindlabs/tailwindcss/pull/19980))
- Canonicalization: preserve significant `_` whitespace in arbitrary
values
([#&#8203;19986](https://redirect.github.com/tailwindlabs/tailwindcss/pull/19986))
- Canonicalization: add parentheses when removing whitespace from
arbitrary values would hurt readability (e.g.
`w-[calc(100%---spacing(60))]` → `w-[calc(100%-(--spacing(60)))]`)
([#&#8203;19986](https://redirect.github.com/tailwindlabs/tailwindcss/pull/19986))
- Canonicalization: preserve the original unit in arbitrary values
instead of normalizing to base units (e.g. `-mt-[20in]` → `mt-[-20in]`,
not `mt-[-1920px]`)
([#&#8203;19988](https://redirect.github.com/tailwindlabs/tailwindcss/pull/19988))
- Canonicalization: migrate arbitrary `:has()` variants from
`[&:has(…)]` to `has-[…]`
([#&#8203;19991](https://redirect.github.com/tailwindlabs/tailwindcss/pull/19991))
- Upgrade: don’t migrate inline `style` attributes (e.g.
`style="flex-grow: 1"` → `style="flex-grow: 1"`, not `style="grow: 1"`)
([#&#8203;19918](https://redirect.github.com/tailwindlabs/tailwindcss/pull/19918))
- Allow multiple `@utility` definitions with the same name but different
value types
([#&#8203;19777](https://redirect.github.com/tailwindlabs/tailwindcss/pull/19777))
- Export missing `PluginWithConfig` type from `tailwindcss/plugin` to
fix errors when inferring plugin config types
([#&#8203;19707](https://redirect.github.com/tailwindlabs/tailwindcss/pull/19707))
- Ensure `start` and `end` legacy utilities without values do not
generate CSS
([#&#8203;20003](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20003))
- Ensure `--value(…)` is required in functional `@utility` definitions
([#&#8203;20005](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20005))
- Canonicalization: preserve required whitespace around operators in
negated arbitrary values (e.g. `-left-[(var(--a)+var(--b))]`)
([#&#8203;20011](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20011))

</details>

<details>
<summary>actions/create-github-app-token
(actions/create-github-app-token)</summary>

###
[`v3.2.0`](https://redirect.github.com/actions/create-github-app-token/releases/tag/v3.2.0)

[Compare
Source](https://redirect.github.com/actions/create-github-app-token/compare/v3.1.1...v3.2.0)

##### Features

- add support for enterprise-level GitHub Apps
([#&#8203;263](https://redirect.github.com/actions/create-github-app-token/issues/263))
([952a2a7](https://redirect.github.com/actions/create-github-app-token/commit/952a2a7073df6bfa5f49bc469ec895b6ec1acea4))
- support full repository names in `repositories` input
([#&#8203;372](https://redirect.github.com/actions/create-github-app-token/issues/372))
([85eb8dd](https://redirect.github.com/actions/create-github-app-token/commit/85eb8dd41472213aed25d1a126460e0069138ab6))

##### Bug Fixes

- **deps:** bump
[@&#8203;actions/core](https://redirect.github.com/actions/core) from
3.0.0 to 3.0.1 in the production-dependencies group
([#&#8203;364](https://redirect.github.com/actions/create-github-app-token/issues/364))
([43e5c34](https://redirect.github.com/actions/create-github-app-token/commit/43e5c345bfd4d4f3ecea019ad0042001a09dd857))
- validate private-key input
([#&#8203;376](https://redirect.github.com/actions/create-github-app-token/issues/376))
([f24bbd8](https://redirect.github.com/actions/create-github-app-token/commit/f24bbd89643991c0de27ae823c01791b2c6bafdd))

</details>

<details>
<summary>changesets/action (changesets/action)</summary>

###
[`v1.8.0`](https://redirect.github.com/changesets/action/releases/tag/v1.8.0)

[Compare
Source](https://redirect.github.com/changesets/action/compare/v1.7.0...v1.8.0)

##### Minor Changes

- [#&#8203;258](https://redirect.github.com/changesets/action/pull/258)
[`f5dbf72`](https://redirect.github.com/changesets/action/commit/f5dbf72f96949cb0daf45152f0f63062df70e97d)
Thanks [@&#8203;tom-sherman](https://redirect.github.com/tom-sherman)! -
Support draft version PR modes with a new `prDraft` input. Use `create`
to create new version PRs as drafts, or `always` to also convert
existing version PRs back to draft when updating them.

##### Patch Changes

- [#&#8203;502](https://redirect.github.com/changesets/action/pull/502)
[`6002dbd`](https://redirect.github.com/changesets/action/commit/6002dbd987f49a3c0a134910d9c7bca975b79977)
Thanks [@&#8203;oshytiko](https://redirect.github.com/oshytiko)! - Fixed
initial `.changeset` state being picked up, when `cwd` parameter is
provided

- [#&#8203;536](https://redirect.github.com/changesets/action/pull/536)
[`81b3f61`](https://redirect.github.com/changesets/action/commit/81b3f61ebffcb868f73e4c0b2682517149c834a2)
Thanks [@&#8203;radnan](https://redirect.github.com/radnan)! - Fixed
`.changeset` state being picked for the version command when `cwd`
parameter is provided

</details>

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

###
[`v11.1.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1110)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.9...v11.1.0)

##### Minor Changes

- Added `pnpm audit signatures` to verify ECDSA registry signatures for
installed packages against keys from `/-/npm/v1/keys`
[#&#8203;7909](https://redirect.github.com/pnpm/pnpm/issues/7909).
Scoped registries are respected, and registries without signing keys are
skipped.

- Added support for installing packages from the [GitHub Packages npm
registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry)
via a built-in `gh:` prefix (e.g. `pnpm add gh:@&#8203;acme/private`),
and, more broadly, for arbitrary named registries in the style of [vlt's
named-registry aliases](https://docs.vlt.sh/cli/registries).
Authentication is picked up from the existing per-URL `.npmrc` entries
(e.g. `//npm.pkg.github.com/:_authToken=...`), so no separate auth
mechanism is required.

Additional aliases — or an override for the built-in `gh` alias, for
GitHub Enterprise Server — can be configured under `namedRegistries` in
`pnpm-workspace.yaml`:

  ```yaml
  namedRegistries:
    gh: https://npm.pkg.github.example.com/
    work: https://npm.work.example.com/
  ```

With this, `work:@&#8203;corp/lib@^2.0.0` resolves against
`https://npm.work.example.com/`.
[#&#8203;8941](https://redirect.github.com/pnpm/pnpm/issues/8941).

- Allow setting sbom spec version using `--sbom-spec-version`
[#&#8203;11389](https://redirect.github.com/pnpm/pnpm/pull/11389).

- Add `--no-runtime` flag (config: `runtime=false`) to skip installing
runtime entries (e.g. Node.js downloaded via `devEngines.runtime`)
without modifying the lockfile. The lockfile keeps the runtime entry so
frozen-lockfile validation still passes; only the runtime fetch and
`.bin` linking are skipped. Useful in CI matrices where the runtime is
provisioned externally (e.g. via `pnpm runtime -g set node <version>`)
before `pnpm install` runs.

- Added the `pnpm bugs` command that opens a package's bug tracker URL
in the browser. With no arguments, it reads the current project's
`package.json`; with one or more package names, it fetches each
package's metadata from the registry and opens its bug tracker. Falls
back to `<repository>/issues` when the `bugs` field is missing
[#&#8203;11279](https://redirect.github.com/pnpm/pnpm/pull/11279).

- Added `pnpm owner` command to manage package owners on the registry.

##### Patch Changes

- Added "published X ago by Y" information to the `pnpm view` command
output, similar to `npm view`. This is useful when comparing against
`minimumReleaseAge`.

  For example, `pnpm view pnpm` now shows:

  ```
  published 17 hours ago by GitHub Actions
  ```

- `pnpm publish` now honors the configured HTTP/HTTPS proxy (including
`https_proxy`/`http_proxy`/`no_proxy` environment variables) when
polling the registry's `doneUrl` during the web-based authentication
flow. Previously the poll bypassed the proxy, causing the registry to
respond `403` from a different source IP and the login to never complete
[#&#8203;11561](https://redirect.github.com/pnpm/pnpm/issues/11561).

- `pnpm add -g` now installs each space-separated package into its own
isolated directory by default. To bundle multiple packages into the same
isolated install (so that they share dependencies and are removed
together), pass them as a comma-separated list. For example:

- `pnpm add -g foo bar` installs `foo` and `bar` as two independent
globals — removing one does not affect the other.
- `pnpm add -g foo,bar qar` bundles `foo` and `bar` into a single
isolated install while `qar` is installed on its own.

Related:
[#&#8203;11587](https://redirect.github.com/pnpm/pnpm/issues/11587).

- `pnpm runtime set <name> <version>` no longer fails in the root of a
multi-package workspace with the `ADDING_TO_ROOT` error. Installing the
workspace root is a valid target for a runtime, so the command now
bypasses that safety check.

- Fix `pnpm --version` hanging for the lifetime of the worker pool after
the version was printed. `main.ts`'s `--version` short-circuit returned
before reaching the command-handler `finally` that calls
`finishWorkers()`, so the worker pool that `switchCliVersion` had
spawned during integrity resolution stayed alive and held the Node event
loop open. The CLI entry now runs `finishWorkers()` from its own
`finally`, so every exit path tears the pool down.

Repro: `pnpm --version` in a workspace whose `devEngines.packageManager`
version already matches the running pnpm + `onFail: "download"`.
`switchCliVersion` resolves the integrity (spawning workers), finds
nothing to swap, returns. The version prints, then the process hangs.

###
[`v11.0.9`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1109)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.8...v11.0.9)

##### Patch Changes

- Fixed installation of GitLab-hosted dependencies. pnpm now downloads
the tarball from
`https://gitlab.com/<user>/<project>/-/archive/<sha>/<project>-<sha>.tar.gz`
instead of the GitLab API endpoint that contained an encoded slash
(`%2F`) between user and project. The encoded slash both triggered `406
Not Acceptable` responses from GitLab and produced virtual store
directory names that Node refused to import
(`ERR_INVALID_MODULE_SPECIFIER`)
[#&#8203;11533](https://redirect.github.com/pnpm/pnpm/issues/11533).
- Honor `NPM_CONFIG_USERCONFIG` (and its lowercase
`npm_config_userconfig` form) as a low-priority fallback when locating
the user-level `.npmrc`. This restores compatibility with environments
that point npm at a custom auth file via that env var — most notably
`actions/setup-node`, which writes registry credentials to
`${runner.temp}/.npmrc` and exports `NPM_CONFIG_USERCONFIG` to reference
it. Without this, GitHub Actions workflows using `actions/setup-node` to
authenticate to private registries broke after upgrading to pnpm v11.
PNPM-prefixed env vars and `npmrcAuthFile` from the global `config.yaml`
continue to take precedence
[#&#8203;11539](https://redirect.github.com/pnpm/pnpm/issues/11539).
- Fix `pnpm pack` not bundling dependencies listed in
`bundleDependencies` (or `bundledDependencies`). The npm-packlist
upgrade in pnpm 11 changed its API to require the caller to pre-populate
the dependency tree, which the wrapper was not doing —
`bundleDependencies` were silently dropped from the tarball
[#&#8203;11519](https://redirect.github.com/pnpm/pnpm/issues/11519).
- Fixed the pnpm CLI crashing with a confusing `SyntaxError: Invalid
regular expression flags` instead of printing a clear "requires Node.js
v22.13" error when launched on an unsupported Node.js version. The
Node.js version check in `bin/pnpm.mjs` was effectively dead code
because the static `import` of the bundled `dist/pnpm.mjs` was hoisted
by the ES module loader and parsed before the check could run
[#&#8203;11546](https://redirect.github.com/pnpm/pnpm/issues/11546).
- Fixed `pnpm --prefix=<dir> install` overwriting the existing
`pnpm-workspace.yaml` in `<dir>` with `set this to true or false`
placeholders. The renamed `--prefix` option (which maps to `dir`) was
not honored when locating the workspace root, so the workspace
manifest's `allowBuilds` settings were not loaded into config and got
clobbered when ignored builds were auto-populated
[#&#8203;11535](https://redirect.github.com/pnpm/pnpm/issues/11535).
- Fixed `pnpm publish --provenance` failing with a 422 from the registry
when the package version contained semver build metadata (e.g.
`1.0.0-canary.0+abc1234`). The `+<build>` segment is now stripped before
packing so that the version embedded in the tarball, the metadata sent
to the registry, and the sigstore provenance subject all agree
[#&#8203;11518](https://redirect.github.com/pnpm/pnpm/issues/11518).

###
[`v11.0.8`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1108)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.7...v11.0.8)

##### Patch Changes

- Restored the heuristic that preserves tarball URLs in `pnpm-lock.yaml`
when they cannot be derived from name+version+registry, even with the
default `lockfileIncludeTarballUrl: false`. Without this, `pnpm install
--frozen-lockfile` from an empty store fails with `ERR_PNPM_FETCH_404`
for packages on registries that serve tarballs from a non-standard path
— most notably GitHub Packages
(`https://npm.pkg.github.com/download/<scope>/<name>/<version>/<hash>`)
and JSR. `lockfileIncludeTarballUrl: true` continues to force the URL
into the lockfile for every package
[#&#8203;11276](https://redirect.github.com/pnpm/pnpm/issues/11276).
- Run `preversion`, `version`, and `postversion` lifecycle scripts for
`pnpm version`.
- Fixed `ERR_PNPM_BAD_TARBALL_SIZE` when a registry serves tarballs with
an end-to-end `Content-Encoding` (e.g. `gzip`). Tarballs are already
compressed, so the fetcher now requests them with `Accept-Encoding:
identity` (matching pnpm v10's effective behavior) and, as defense in
depth against misbehaving servers, no longer enforces the strict
`Content-Length` check when the response declares a `Content-Encoding` —
`Content-Length` in that case refers to the encoded payload, not the
decoded bytes the fetch implementation yields
[#&#8203;11506](https://redirect.github.com/pnpm/pnpm/issues/11506).

###
[`v11.0.7`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1107)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.6...v11.0.7)

##### Patch Changes

- Restore the execute bit on the `node-gyp` shims packed inside
`@pnpm/exe` (`dist/node-gyp-bin/node-gyp`,
`dist/node-gyp-bin/node-gyp.cmd`, and
`dist/node_modules/node-gyp/bin/node-gyp.js`). Without this,
`pnpm/action-setup`'s standalone path (used on runners with Node.js <
22.13) failed any install whose lifecycle script invoked `node-gyp
rebuild` with `sh: 1: node-gyp: Permission denied`
[#&#8203;11483](https://redirect.github.com/pnpm/pnpm/issues/11483).

- Fixed the `pn`, `pnpx`, and `pnx` aliases failing in Git Bash / MSYS2
on Windows when pnpm was installed via `@pnpm/exe` (or after `pnpm
self-update`)
[#&#8203;11486](https://redirect.github.com/pnpm/pnpm/issues/11486).
Running `pnpx` (or `pnx`) printed the cmd.exe banner and dropped the
user into an interactive command prompt instead of running `pnpm dlx`.
The `bin` field rewrite on Windows was pointing those aliases at `.cmd`
files; cmd-shim's Bash shim for a `.cmd` target wraps it in `exec cmd /C
...`, and MSYS2 mangles `/C` into a Windows path before cmd.exe sees it.
The aliases are now `.exe` hardlinks of the SEA binary, which detects
which name it was launched as via `process.execPath` and prepends `dlx`
for `pnpx` / `pnx`.

- Fix `pnpm install` recreating `node_modules` after `pnpm fetch`. `pnpm
fetch` records empty `hoistPattern` and `publicHoistPattern` in
`.modules.yaml`; since v11 removed the explicit-config gate, the
follow-up install treated those as a hoist-pattern change and purged the
modules directory. The fetch step now flags the modules manifest with
`virtualStoreOnly: true` so the next install skips the hoist-pattern
comparison and completes the missing post-import linking in place
[#&#8203;11488](https://redirect.github.com/pnpm/pnpm/issues/11488).

- Pin the integrity of git-hosted tarballs (codeload.github.com,
gitlab.com, bitbucket.org) in the lockfile so that subsequent installs
detect a tampered or substituted tarball and refuse to install it.
Previously the lockfile only stored the tarball URL for git
dependencies, so a compromised git host or a man-in-the-middle could
serve arbitrary code on later installs without lockfile changes.

A new `gitHosted: true` field is recorded on git-hosted tarball
resolutions in the lockfile, letting every reader/writer route them by a
single typed check instead of pattern-matching the tarball URL in each
call site. Lockfiles written by older pnpm versions are enriched on load
(URL fallback) so the field can be relied on uniformly across the
codebase.

- Allow user-level preferences in the global `config.yaml`. The
following settings can now be set in `~/.config/pnpm/config.yaml` (or
via `pnpm config set --location global`) instead of being restricted to
`pnpm-workspace.yaml`: `agent`, `globalVirtualStoreDir`,
`initPackageManager`, `initType`, `registrySupportsTimeField`,
`scriptShell`, `shellEmulator`, `sideEffectsCache`,
`sideEffectsCacheReadonly`, `stateDir`, `strictDepBuilds`,
`trustPolicy`, `trustPolicyExclude`, `trustPolicyIgnoreAfter`,
`updateNotifier`, `useStderr`, `verifyDepsBeforeRun`,
`verifyStoreIntegrity`, `virtualStoreDir`, `virtualStoreDirMaxLength`
[#&#8203;11474](https://redirect.github.com/pnpm/pnpm/issues/11474).

- Make trusted publishing (OIDC) take precedence over a configured
static `_authToken` in `pnpm publish`, mirroring the npm CLI's behavior.
When OIDC succeeds, the OIDC-derived token overrides any pre-configured
`_authToken`; when OIDC is not applicable (no CI environment, exchange
fails, registry has no trusted publisher configured), the static token
is used as a fallback. This applies on every package during recursive
publish, so each workspace package independently attempts trusted
publishing.

Additionally, the `NPM_ID_TOKEN` env var is now honored as a CI-agnostic
injection point for an OIDC ID token. Previously OIDC was only attempted
on GitHub Actions or GitLab; now any CI provider that exposes its own
OIDC mechanism (e.g. CircleCI's `CIRCLE_OIDC_TOKEN_V2`, Buildkite, etc.)
can forward its token via `NPM_ID_TOKEN` and trusted publishing will
work without pnpm needing to recognize the provider explicitly.

- `--pm-on-fail=ignore` (and other universal options like `--loglevel`,
`--reporter`) is now honored when combined with `--help` or `--version`.
Previously the CLI argument parser short-circuited those flags before
universal options were preserved, so `pnpm audit --pm-on-fail=ignore
--help` and `pnpm --pm-on-fail=ignore --version` reported the strict
packageManager mismatch instead of running the requested action
[#&#8203;11487](https://redirect.github.com/pnpm/pnpm/issues/11487).

- Fix a regression where `pnpm --recursive --filter '!<pkg>'
run/exec/test/add` would include the workspace root in the matched
projects. The workspace root is now correctly excluded by default when
only negative `--filter` arguments are provided, matching the
[documented behavior](https://pnpm.io/cli/recursive). To include the
root, pass `--include-workspace-root`
[#&#8203;11341](https://redirect.github.com/pnpm/pnpm/issues/11341).

- Restore npm-CLI-compatible `--json` stdout output for `pnpm publish`
([#&#8203;11476](https://redirect.github.com/pnpm/pnpm/issues/11476)).
pnpm 11 reimplemented publish natively
([#&#8203;10591](https://redirect.github.com/pnpm/pnpm/pull/10591)) and
inadvertently dropped the per-package JSON object that pnpm 10 emitted
transitively via the npm CLI, silently breaking downstream tooling —
most notably `nx release publish`, which parses stdout JSON to confirm
success
([nrwl/nx#35575](https://redirect.github.com/nrwl/nx/issues/35575)). On
success, the output is now:

- `pnpm publish --json` → single object `{ id, name, version, size,
unpackedSize, shasum, integrity, filename, files, entryCount, bundled
}`, mirroring `npm publish --json`.
- `pnpm publish -r --json` → array of those objects, mirroring `pnpm
pack --json`'s shape choice.
- `pnpm publish -r --report-summary` → existing
`pnpm-publish-summary.json` envelope `{ publishedPackages: [...] }` is
preserved, but each entry is upgraded to the same per-package shape
(additive — `name` and `version` are still present).

- `pnpm config get @&#8203;<scope>:registry` now reports the same URL
that `pnpm publish` and the resolvers actually use. Previously, `config
get` only consulted `.npmrc`, while `publish`/install used the merged
map that includes `pnpm-workspace.yaml`'s `registries` block — so the
two could diverge silently and a publish could go to the wrong registry
[#&#8203;11492](https://redirect.github.com/pnpm/pnpm/issues/11492).

###
[`v11.0.6`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1106)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.5...v11.0.6)

##### Patch Changes

- Fix `pnpm_config_npmrc_auth_file` and `pnpm_config_userconfig` env
vars not actually loading the custom `.npmrc`. The env vars were parsed
and assigned to the resolved config, but only after `loadNpmrcConfig`
had already read the default `~/.npmrc` — so the custom file path was
set but never read. The relevant env vars are now consulted before the
user-level `.npmrc` is loaded
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).
- Preserve the original key order in `pnpm-workspace.yaml` when updating
it. Existing keys keep their position, and new keys are inserted in
alphabetical position when the existing keys are already sorted (with a
leading `packages` key allowed) or appended at the end otherwise.
- Fixed `pnpm self-update` on installations originally set up by pnpm
v10. v10 added `PNPM_HOME` directly to PATH and wrote a `pnpm` bootstrap
shim there. v11 setup writes shims under `PNPM_HOME/bin` instead, so
when a v10 user upgrades to v11 the legacy shim at `PNPM_HOME` keeps
pointing into the old `.tools/<version>` install — `pnpm --version`
continues to report the pre-update version even though the new version
was installed under `global/v11`. Self-update now detects this layout,
refreshes the legacy shims so the upgrade actually takes effect, and
prints a hint suggesting `pnpm setup` to migrate PATH to the v11 layout.
[#&#8203;11464](https://redirect.github.com/pnpm/pnpm/issues/11464).
- Print a warning when settings that are not allowed in the global
config file (e.g. `nodeLinker`, `hoistPattern`) are present in
`config.yaml` and silently ignored. Previously these settings were
dropped without any feedback, leaving users unsure why their global
configuration had no effect. The warning suggests moving those settings
to a project-level `pnpm-workspace.yaml`, or sharing them across
projects via [config
dependencies](https://pnpm.io/11.x/config-dependencies).
- Throw a pnpm error when `overrides` has an invalid shape or contains a
non-string value.
- Validate all `readPackage` dependency map fields, including
`devDependencies`, and reject falsy non-object invalid values instead of
silently accepting them.
- Prevent crashes during `pnpm config`, `pnpm set`, and `pnpm get` by
tolerating `configDependencies` install failures. For these commands, a
failure to install `configDependencies` (for example because the
registry auth token has not been written yet) is now logged at debug
level and the command proceeds. All other commands still surface the
install error
[#&#8203;10684](https://redirect.github.com/pnpm/pnpm/issues/10684).
- Treat `allowBuilds` as an install-state input and clear previously
ignored builds when they are explicitly disallowed.
- Fixes
[#&#8203;10594](https://redirect.github.com/pnpm/pnpm/issues/10594),
catalogs not being read from the workspace when using the `catalog:`
protocol with the `pnpm dlx` / `pnpx` command, resulting in a catalog
entry not found error.
- Accept `PNPM_CONFIG_*` (uppercase) environment variables in addition
to `pnpm_config_*`. Previously, only the lowercase form was honored, so
env vars renamed per the v11 migration guide (e.g.
`PNPM_CONFIG_USERCONFIG`) silently had no effect on case-sensitive
systems like macOS and Linux
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).

###
[`v11.0.5`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1105)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.4...v11.0.5)

##### Patch Changes

- Drop the `darwin-x64` artifact from `@pnpm/exe` and from the GitHub
release page. The Node.js SEA mechanism `pnpm pack-app` uses produces a
binary that segfaults at startup on Intel Macs because of an upstream
Node.js bug
([nodejs/node#62893](https://redirect.github.com/nodejs/node/issues/62893),
tracked alongside
[#&#8203;59553](https://redirect.github.com/nodejs/node/issues/59553);
the Node.js team has [opted not to fix
it](https://redirect.github.com/nodejs/node/pull/60250) on the grounds
that x64 macOS is being phased out). Re-signing with `codesign` or
`ldid` doesn't help — the corruption is in LIEF's Mach-O surgery, before
signing.

Intel Mac users should install pnpm via `npm install -g pnpm` (uses the
system Node.js, no SEA), or stay on pnpm 10.x. `@pnpm/exe`'s preinstall
on Intel Mac now exits with a clear error pointing at these
alternatives.

Closes
[#&#8203;11423](https://redirect.github.com/pnpm/pnpm/issues/11423).

- `pnpm dlx` (and `pnpx`/`pnx`/`pnpm create`) now runs the same
interactive `approve-builds` prompt as `pnpm add -g` when the package
being launched depends on transitive packages with install scripts.
Previously, the v11 `strictDepBuilds` default made dlx fail with
`ERR_PNPM_IGNORED_BUILDS` and required users to re-run with
`--allow-build=<pkg>` for every offending dependency. dlx also now
removes the partially-populated cache directory when the install fails,
so a subsequent run starts clean instead of reusing a broken install
whose builds were silently skipped
[#&#8203;11444](https://redirect.github.com/pnpm/pnpm/issues/11444).

- [`72629fc`](https://redirect.github.com/pnpm/pnpm/commit/72629fc): Fix
`pnpm -g ls --json` and `pnpm -g ls --parseable` so they emit valid JSON
and parseable output respectively, matching pnpm 10 behavior. Since the
isolated global packages refactor in pnpm 11, the global list command
had a custom path that always printed plain text and ignored
`--json`/`--parseable`, which broke tools like `npm-check-updates` that
parse the JSON output
[#&#8203;11440](https://redirect.github.com/pnpm/pnpm/issues/11440).

`pnpm -g ls --depth=<n>` (with n > 0) now errors when more than one
isolated global install would be involved, since each install has its
own lockfile and merging their transitive trees would be incoherent.
When the request can be narrowed to a single install group, the regular
`list` flow is used and the full dependency tree is shown.

- Fixed `pnpm publish` to honor `publishConfig.registry` from
`package.json` when publishing a single package. The native publish flow
introduced in v11 was reading the registry from `.npmrc` only, ignoring
the per-package override
[#&#8203;11419](https://redirect.github.com/pnpm/pnpm/issues/11419).

- When `strictPeerDependencies` is `true`, the
`ERR_PNPM_PEER_DEP_ISSUES` error once again renders the peer dependency
issues inline using the same format as `pnpm peers check`, so users (and
CI tools like Renovate) can see what failed without running `pnpm peers
check` separately
[#&#8203;11439](https://redirect.github.com/pnpm/pnpm/issues/11439).

- The `WARN` and error code labels in pnpm's output now wrap in brackets
(`[WARN]`, `[ERR_PNPM_FOO]`). Previously the labels relied entirely on a
colored background to stand out, which meant they blended into the
surrounding text in terminals without color (e.g. when `NO_COLOR` is set
or output is piped). The brackets are painted in the same color as the
badge background, so they appear as ordinary padding in color-capable
terminals — only the no-color rendering changes.

###
[`v11.0.4`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1104)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.3...v11.0.4)

##### Patch Changes

- Fixed `pnpm ci` not reinstalling workspace package `node_modules`
directories after the clean step
[#&#8203;11427](https://redirect.github.com/pnpm/pnpm/issues/11427).
- Remove pnpm's workspace state file when cleaning node\_modules so
`pnpm ci` performs a fresh install after the clean step.
- Do not remove `pnpm-lock.yaml` during `pnpm clean` when `lockfile:
true` is configured in `pnpm-workspace.yaml`. The lockfile is only
removed when the `--lockfile` option is passed to `pnpm clean`.
- `pnpm self-update` (with no version argument) no longer downgrades
pnpm when the registry's `latest` dist-tag points to an older release
than the currently active version. Run `pnpm self-update latest` to
force a downgrade
[#&#8203;11418](https://redirect.github.com/pnpm/pnpm/issues/11418).
- `minimumReleaseAgeStrict` now defaults to `true` whenever the user
explicitly sets `minimumReleaseAge` (via `pnpm-workspace.yaml`, the
global `config.yaml`, the CLI, or `pnpm_config_*` env vars).

###
[`v11.0.3`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1103)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.2...v11.0.3)

##### Patch Changes

- Fix too many open files error sometimes happening on Windows, when
creating command shims in `node_modules/.bin`
[#&#8203;11412](https://redirect.github.com/pnpm/pnpm/issues/11412).
- Fix `ERR_PNPM_FETCH_404` when installing a project whose lockfile
depends on a `file:` tarball. The previous behavior dropped the
`tarball` field from `file:` and git-hosted resolutions when
`lockfile-include-tarball-url=false` (the default), even though those
URLs cannot be reconstructed from the package name, version, and
registry
[#&#8203;11407](https://redirect.github.com/pnpm/pnpm/issues/11407).

###
[`v11.0.2`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1102)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.1...v11.0.2)

##### Patch Changes

- Fix `ENOENT` symlink failure when `pnpm add -g` triggers the
approve-builds prompt. The global add flow used to forward an absolute
`modulesDir` (`<installDir>/node_modules`) into the install run by
`approve-builds`. The install layer treated `modulesDir` as a path
relative to `lockfileDir` and joined it again, producing a doubled path
on Windows because `path.join` does not collapse an embedded absolute
path. The hoist step then tried to `mkdir` and symlink under
`<installDir>\<installDir>\node_modules\.pnpm\node_modules\...` and
failed with `ENOENT`
[#&#8203;11403](https://redirect.github.com/pnpm/pnpm/issues/11403).
- Fixed `packageManagerDependencies` going stale when pnpm is invoked
through corepack. The lockfile sync (and the `devEngines.packageManager`
version check) previously ran only when pnpm was invoked directly; under
corepack the entire block was skipped, so a stale entry would persist
even after the running pnpm version changed. The lockfile sync now runs
regardless of how pnpm was invoked, while the pnpm-managed version
switch (`onFail: 'download'`) remains skipped under corepack so it
doesn't fight corepack's own version selection
[#&#8203;11397](https://redirect.github.com/pnpm/pnpm/issues/11397).
- Fix recursive publish summaries to report the manifest from
`publishConfig.directory` when packages publish from a generated
directory
[#&#8203;11239](https://redirect.github.com/pnpm/pnpm/issues/11239).
- Fix negated `os` / `cpu` entries (e.g. `["!win32"]`) being incorrectly
rejected when `supportedArchitectures` expands to multiple platforms
[#&#8203;11375](https://redirect.github.com/pnpm/pnpm/pull/11375).

###
[`v11.0.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1101)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.0...v11.0.1)

##### Patch Changes

- Report unknown top-level options before falling back to implicit `pnpm
run` scripts.
- Reject `null` named catalogs in workspace manifests with
`InvalidWorkspaceManifestError` instead of crashing with a raw
`TypeError`.
- Populate download location for git-sourced dependencies in SBOM
output. Previously `pnpm sbom` emitted `NOASSERTION` (SPDX) and omitted
the distribution reference (CycloneDX) for git dependencies. Now emits
the git URL with commit hash, e.g.
`git+https://github.com/user/repo.git#commit`.
- `pnpm self-update` now keeps `package.json`'s `packageManager` and
`devEngines.packageManager` in sync. When the legacy `packageManager`
field pins pnpm, both fields are rewritten to the new exact pnpm version
on update — `packageManager` to `pnpm@<version>` (without an integrity
hash), and `devEngines.packageManager.version` to the same exact
`<version>` (dropping any range operator). When only
`devEngines.packageManager` is declared, the existing range-preserving
behavior is unchanged
[#&#8203;11388](https://redirect.github.com/pnpm/pnpm/issues/11388).
- Sort the keys of the overrides object returned by `pnpm audit --

> ✂ **Note**
> 
> PR body was truncated to here.


</details>

---

### Configuration

📅 **Schedule**: (in timezone America/Los_Angeles)

- Branch creation
  - "before 10am on Monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/kosolabs/kosui).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzMuNiIsInVwZGF0ZWRJblZlciI6IjQzLjE3My42IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
takumi3488 pushed a commit to takumi3488/release-date-sorter that referenced this pull request May 15, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`11.1.0` →
`11.1.2`](https://renovatebot.com/diffs/npm/pnpm/11.1.0/11.1.2) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.1.0/11.1.2?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.2`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1112)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.1...v11.1.2)

##### Patch Changes

- `convertEnginesRuntimeToDependencies`: switch the runtime-dependency
write to `Object.defineProperty` so the CodeQL
`js/prototype-polluting-assignment` rule treats the assignment as safe
regardless of the property name (follow-up to
[#&#8203;11609](https://redirect.github.com/pnpm/pnpm/pull/11609)).

- Address CodeQL static-analysis findings: guard manifest dependency
writes against prototype-polluting keys (`__proto__`, `constructor`,
`prototype`), and replace a potentially super-linear semver-detection
regex in registry 404 hints with an O(n) parser.

- Strip `sec-fetch-*` headers from outgoing HTTP requests. These headers
are automatically added by undici's `fetch()` implementation per the
Fetch spec but cause Azure DevOps Artifacts to return HTTP 400 for
uncached upstream packages, as ADO interprets them as browser requests
[#&#8203;11572](https://redirect.github.com/pnpm/pnpm/issues/11572).

- Fix `minimumReleaseAge` handling for cached abbreviated metadata.

The version-spec cache fast path no longer rethrows
`ERR_PNPM_MISSING_TIME` under `strictPublishedByCheck`; it now falls
through to the registry-fetch path, consistent with the adjacent
mtime-gated cache block.

When the registry returns 304 Not Modified for a package whose cached
metadata is abbreviated (no per-version `time`), pnpm now re-fetches
with `fullMetadata: true` if `minimumReleaseAge` is active and the
package was modified after the cutoff. The upgraded metadata is
persisted to disk so subsequent installs don't repeat the fetch.
Previously the abbreviated meta was used as-is and the maturity check
fell back to its warn-and-skip path, silently bypassing the quarantine
and emitting a misleading "metadata is missing the time field" warning.

Closes
[#&#8203;11619](https://redirect.github.com/pnpm/pnpm/issues/11619).

- Fix `pnpm upgrade --interactive --latest -r` not respecting named
catalog groups. Previously, upgrading a dependency using a named catalog
(e.g. `"catalog:foo"`) would incorrectly rewrite `package.json` to
`"catalog:"` and place the updated version in the default catalog
instead of the named one
[#&#8203;10115](https://redirect.github.com/pnpm/pnpm/issues/10115).

- Fixed `optimisticRepeatInstall` skipping `pnpm-lock.yaml` merge
conflict resolution when the existing `node_modules` state appears up to
date.

- Fix `minimumReleaseAge` / `resolutionMode: time-based` installs
failing on lockfiles whose `time:` block is missing entries. The
npm-resolver's peek-from-store fast path now surfaces `publishedAt` from
the lockfile rather than discarding it, and falls through to a registry
metadata fetch when the time-based cutoff can't be computed from the
data on hand.

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/takumi3488/release-date-sorter).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzMuNiIsInVwZGF0ZWRJblZlciI6IjQzLjE3My42IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
renovate Bot added a commit to bojanrajkovic/atc that referenced this pull request May 15, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`11.0.9` →
`11.1.1`](https://renovatebot.com/diffs/npm/pnpm/11.0.9/11.1.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.0.9/11.1.1?slim=true)
|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
`11.0.9` → `11.1.1` |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.0.9/11.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

###
[`v11.1.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1110)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.9...v11.1.0)

##### Minor Changes

- Added `pnpm audit signatures` to verify ECDSA registry signatures for
installed packages against keys from `/-/npm/v1/keys`
[#&#8203;7909](https://redirect.github.com/pnpm/pnpm/issues/7909).
Scoped registries are respected, and registries without signing keys are
skipped.

- Added support for installing packages from the [GitHub Packages npm
registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry)
via a built-in `gh:` prefix (e.g. `pnpm add gh:@&#8203;acme/private`),
and, more broadly, for arbitrary named registries in the style of [vlt's
named-registry aliases](https://docs.vlt.sh/cli/registries).
Authentication is picked up from the existing per-URL `.npmrc` entries
(e.g. `//npm.pkg.github.com/:_authToken=...`), so no separate auth
mechanism is required.

Additional aliases — or an override for the built-in `gh` alias, for
GitHub Enterprise Server — can be configured under `namedRegistries` in
`pnpm-workspace.yaml`:

  ```yaml
  namedRegistries:
    gh: https://npm.pkg.github.example.com/
    work: https://npm.work.example.com/
  ```

With this, `work:@&#8203;corp/lib@^2.0.0` resolves against
`https://npm.work.example.com/`.
[#&#8203;8941](https://redirect.github.com/pnpm/pnpm/issues/8941).

- Allow setting sbom spec version using `--sbom-spec-version`
[#&#8203;11389](https://redirect.github.com/pnpm/pnpm/pull/11389).

- Add `--no-runtime` flag (config: `runtime=false`) to skip installing
runtime entries (e.g. Node.js downloaded via `devEngines.runtime`)
without modifying the lockfile. The lockfile keeps the runtime entry so
frozen-lockfile validation still passes; only the runtime fetch and
`.bin` linking are skipped. Useful in CI matrices where the runtime is
provisioned externally (e.g. via `pnpm runtime -g set node <version>`)
before `pnpm install` runs.

- Added the `pnpm bugs` command that opens a package's bug tracker URL
in the browser. With no arguments, it reads the current project's
`package.json`; with one or more package names, it fetches each
package's metadata from the registry and opens its bug tracker. Falls
back to `<repository>/issues` when the `bugs` field is missing
[#&#8203;11279](https://redirect.github.com/pnpm/pnpm/pull/11279).

- Added `pnpm owner` command to manage package owners on the registry.

##### Patch Changes

- Added "published X ago by Y" information to the `pnpm view` command
output, similar to `npm view`. This is useful when comparing against
`minimumReleaseAge`.

  For example, `pnpm view pnpm` now shows:

  ```
  published 17 hours ago by GitHub Actions
  ```

- `pnpm publish` now honors the configured HTTP/HTTPS proxy (including
`https_proxy`/`http_proxy`/`no_proxy` environment variables) when
polling the registry's `doneUrl` during the web-based authentication
flow. Previously the poll bypassed the proxy, causing the registry to
respond `403` from a different source IP and the login to never complete
[#&#8203;11561](https://redirect.github.com/pnpm/pnpm/issues/11561).

- `pnpm add -g` now installs each space-separated package into its own
isolated directory by default. To bundle multiple packages into the same
isolated install (so that they share dependencies and are removed
together), pass them as a comma-separated list. For example:

- `pnpm add -g foo bar` installs `foo` and `bar` as two independent
globals — removing one does not affect the other.
- `pnpm add -g foo,bar qar` bundles `foo` and `bar` into a single
isolated install while `qar` is installed on its own.

Related:
[#&#8203;11587](https://redirect.github.com/pnpm/pnpm/issues/11587).

- `pnpm runtime set <name> <version>` no longer fails in the root of a
multi-package workspace with the `ADDING_TO_ROOT` error. Installing the
workspace root is a valid target for a runtime, so the command now
bypasses that safety check.

- Fix `pnpm --version` hanging for the lifetime of the worker pool after
the version was printed. `main.ts`'s `--version` short-circuit returned
before reaching the command-handler `finally` that calls
`finishWorkers()`, so the worker pool that `switchCliVersion` had
spawned during integrity resolution stayed alive and held the Node event
loop open. The CLI entry now runs `finishWorkers()` from its own
`finally`, so every exit path tears the pool down.

Repro: `pnpm --version` in a workspace whose `devEngines.packageManager`
version already matches the running pnpm + `onFail: "download"`.
`switchCliVersion` resolves the integrity (spawning workers), finds
nothing to swap, returns. The version prints, then the process hangs.

</details>

---

### Configuration

📅 **Schedule**: (in timezone America/New_York)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/bojanrajkovic/atc).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzkuMyIsInVwZGF0ZWRJblZlciI6IjQzLjE3OS4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
renovate Bot added a commit to JoshuaKGoldberg/cta-transition-engines-test that referenced this pull request May 15, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`11.0.6` →
`11.1.1`](https://renovatebot.com/diffs/npm/pnpm/11.0.6/11.1.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.0.6/11.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

###
[`v11.1.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1110)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.9...v11.1.0)

##### Minor Changes

- Added `pnpm audit signatures` to verify ECDSA registry signatures for
installed packages against keys from `/-/npm/v1/keys`
[#&#8203;7909](https://redirect.github.com/pnpm/pnpm/issues/7909).
Scoped registries are respected, and registries without signing keys are
skipped.

- Added support for installing packages from the [GitHub Packages npm
registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry)
via a built-in `gh:` prefix (e.g. `pnpm add gh:@&#8203;acme/private`),
and, more broadly, for arbitrary named registries in the style of [vlt's
named-registry aliases](https://docs.vlt.sh/cli/registries).
Authentication is picked up from the existing per-URL `.npmrc` entries
(e.g. `//npm.pkg.github.com/:_authToken=...`), so no separate auth
mechanism is required.

Additional aliases — or an override for the built-in `gh` alias, for
GitHub Enterprise Server — can be configured under `namedRegistries` in
`pnpm-workspace.yaml`:

  ```yaml
  namedRegistries:
    gh: https://npm.pkg.github.example.com/
    work: https://npm.work.example.com/
  ```

With this, `work:@&#8203;corp/lib@^2.0.0` resolves against
`https://npm.work.example.com/`.
[#&#8203;8941](https://redirect.github.com/pnpm/pnpm/issues/8941).

- Allow setting sbom spec version using `--sbom-spec-version`
[#&#8203;11389](https://redirect.github.com/pnpm/pnpm/pull/11389).

- Add `--no-runtime` flag (config: `runtime=false`) to skip installing
runtime entries (e.g. Node.js downloaded via `devEngines.runtime`)
without modifying the lockfile. The lockfile keeps the runtime entry so
frozen-lockfile validation still passes; only the runtime fetch and
`.bin` linking are skipped. Useful in CI matrices where the runtime is
provisioned externally (e.g. via `pnpm runtime -g set node <version>`)
before `pnpm install` runs.

- Added the `pnpm bugs` command that opens a package's bug tracker URL
in the browser. With no arguments, it reads the current project's
`package.json`; with one or more package names, it fetches each
package's metadata from the registry and opens its bug tracker. Falls
back to `<repository>/issues` when the `bugs` field is missing
[#&#8203;11279](https://redirect.github.com/pnpm/pnpm/pull/11279).

- Added `pnpm owner` command to manage package owners on the registry.

##### Patch Changes

- Added "published X ago by Y" information to the `pnpm view` command
output, similar to `npm view`. This is useful when comparing against
`minimumReleaseAge`.

  For example, `pnpm view pnpm` now shows:

  ```
  published 17 hours ago by GitHub Actions
  ```

- `pnpm publish` now honors the configured HTTP/HTTPS proxy (including
`https_proxy`/`http_proxy`/`no_proxy` environment variables) when
polling the registry's `doneUrl` during the web-based authentication
flow. Previously the poll bypassed the proxy, causing the registry to
respond `403` from a different source IP and the login to never complete
[#&#8203;11561](https://redirect.github.com/pnpm/pnpm/issues/11561).

- `pnpm add -g` now installs each space-separated package into its own
isolated directory by default. To bundle multiple packages into the same
isolated install (so that they share dependencies and are removed
together), pass them as a comma-separated list. For example:

- `pnpm add -g foo bar` installs `foo` and `bar` as two independent
globals — removing one does not affect the other.
- `pnpm add -g foo,bar qar` bundles `foo` and `bar` into a single
isolated install while `qar` is installed on its own.

Related:
[#&#8203;11587](https://redirect.github.com/pnpm/pnpm/issues/11587).

- `pnpm runtime set <name> <version>` no longer fails in the root of a
multi-package workspace with the `ADDING_TO_ROOT` error. Installing the
workspace root is a valid target for a runtime, so the command now
bypasses that safety check.

- Fix `pnpm --version` hanging for the lifetime of the worker pool after
the version was printed. `main.ts`'s `--version` short-circuit returned
before reaching the command-handler `finally` that calls
`finishWorkers()`, so the worker pool that `switchCliVersion` had
spawned during integrity resolution stayed alive and held the Node event
loop open. The CLI entry now runs `finishWorkers()` from its own
`finally`, so every exit path tears the pool down.

Repro: `pnpm --version` in a workspace whose `devEngines.packageManager`
version already matches the running pnpm + `onFail: "download"`.
`switchCliVersion` resolves the integrity (spawning workers), finds
nothing to swap, returns. The version prints, then the process hangs.

###
[`v11.0.9`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1109)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.8...v11.0.9)

##### Patch Changes

- Fixed installation of GitLab-hosted dependencies. pnpm now downloads
the tarball from
`https://gitlab.com/<user>/<project>/-/archive/<sha>/<project>-<sha>.tar.gz`
instead of the GitLab API endpoint that contained an encoded slash
(`%2F`) between user and project. The encoded slash both triggered `406
Not Acceptable` responses from GitLab and produced virtual store
directory names that Node refused to import
(`ERR_INVALID_MODULE_SPECIFIER`)
[#&#8203;11533](https://redirect.github.com/pnpm/pnpm/issues/11533).
- Honor `NPM_CONFIG_USERCONFIG` (and its lowercase
`npm_config_userconfig` form) as a low-priority fallback when locating
the user-level `.npmrc`. This restores compatibility with environments
that point npm at a custom auth file via that env var — most notably
`actions/setup-node`, which writes registry credentials to
`${runner.temp}/.npmrc` and exports `NPM_CONFIG_USERCONFIG` to reference
it. Without this, GitHub Actions workflows using `actions/setup-node` to
authenticate to private registries broke after upgrading to pnpm v11.
PNPM-prefixed env vars and `npmrcAuthFile` from the global `config.yaml`
continue to take precedence
[#&#8203;11539](https://redirect.github.com/pnpm/pnpm/issues/11539).
- Fix `pnpm pack` not bundling dependencies listed in
`bundleDependencies` (or `bundledDependencies`). The npm-packlist
upgrade in pnpm 11 changed its API to require the caller to pre-populate
the dependency tree, which the wrapper was not doing —
`bundleDependencies` were silently dropped from the tarball
[#&#8203;11519](https://redirect.github.com/pnpm/pnpm/issues/11519).
- Fixed the pnpm CLI crashing with a confusing `SyntaxError: Invalid
regular expression flags` instead of printing a clear "requires Node.js
v22.13" error when launched on an unsupported Node.js version. The
Node.js version check in `bin/pnpm.mjs` was effectively dead code
because the static `import` of the bundled `dist/pnpm.mjs` was hoisted
by the ES module loader and parsed before the check could run
[#&#8203;11546](https://redirect.github.com/pnpm/pnpm/issues/11546).
- Fixed `pnpm --prefix=<dir> install` overwriting the existing
`pnpm-workspace.yaml` in `<dir>` with `set this to true or false`
placeholders. The renamed `--prefix` option (which maps to `dir`) was
not honored when locating the workspace root, so the workspace
manifest's `allowBuilds` settings were not loaded into config and got
clobbered when ignored builds were auto-populated
[#&#8203;11535](https://redirect.github.com/pnpm/pnpm/issues/11535).
- Fixed `pnpm publish --provenance` failing with a 422 from the registry
when the package version contained semver build metadata (e.g.
`1.0.0-canary.0+abc1234`). The `+<build>` segment is now stripped before
packing so that the version embedded in the tarball, the metadata sent
to the registry, and the sigstore provenance subject all agree
[#&#8203;11518](https://redirect.github.com/pnpm/pnpm/issues/11518).

###
[`v11.0.8`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1108)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.7...v11.0.8)

##### Patch Changes

- Restored the heuristic that preserves tarball URLs in `pnpm-lock.yaml`
when they cannot be derived from name+version+registry, even with the
default `lockfileIncludeTarballUrl: false`. Without this, `pnpm install
--frozen-lockfile` from an empty store fails with `ERR_PNPM_FETCH_404`
for packages on registries that serve tarballs from a non-standard path
— most notably GitHub Packages
(`https://npm.pkg.github.com/download/<scope>/<name>/<version>/<hash>`)
and JSR. `lockfileIncludeTarballUrl: true` continues to force the URL
into the lockfile for every package
[#&#8203;11276](https://redirect.github.com/pnpm/pnpm/issues/11276).
- Run `preversion`, `version`, and `postversion` lifecycle scripts for
`pnpm version`.
- Fixed `ERR_PNPM_BAD_TARBALL_SIZE` when a registry serves tarballs with
an end-to-end `Content-Encoding` (e.g. `gzip`). Tarballs are already
compressed, so the fetcher now requests them with `Accept-Encoding:
identity` (matching pnpm v10's effective behavior) and, as defense in
depth against misbehaving servers, no longer enforces the strict
`Content-Length` check when the response declares a `Content-Encoding` —
`Content-Length` in that case refers to the encoded payload, not the
decoded bytes the fetch implementation yields
[#&#8203;11506](https://redirect.github.com/pnpm/pnpm/issues/11506).

###
[`v11.0.7`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1107)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.6...v11.0.7)

##### Patch Changes

- Restore the execute bit on the `node-gyp` shims packed inside
`@pnpm/exe` (`dist/node-gyp-bin/node-gyp`,
`dist/node-gyp-bin/node-gyp.cmd`, and
`dist/node_modules/node-gyp/bin/node-gyp.js`). Without this,
`pnpm/action-setup`'s standalone path (used on runners with Node.js <
22.13) failed any install whose lifecycle script invoked `node-gyp
rebuild` with `sh: 1: node-gyp: Permission denied`
[#&#8203;11483](https://redirect.github.com/pnpm/pnpm/issues/11483).

- Fixed the `pn`, `pnpx`, and `pnx` aliases failing in Git Bash / MSYS2
on Windows when pnpm was installed via `@pnpm/exe` (or after `pnpm
self-update`)
[#&#8203;11486](https://redirect.github.com/pnpm/pnpm/issues/11486).
Running `pnpx` (or `pnx`) printed the cmd.exe banner and dropped the
user into an interactive command prompt instead of running `pnpm dlx`.
The `bin` field rewrite on Windows was pointing those aliases at `.cmd`
files; cmd-shim's Bash shim for a `.cmd` target wraps it in `exec cmd /C
...`, and MSYS2 mangles `/C` into a Windows path before cmd.exe sees it.
The aliases are now `.exe` hardlinks of the SEA binary, which detects
which name it was launched as via `process.execPath` and prepends `dlx`
for `pnpx` / `pnx`.

- Fix `pnpm install` recreating `node_modules` after `pnpm fetch`. `pnpm
fetch` records empty `hoistPattern` and `publicHoistPattern` in
`.modules.yaml`; since v11 removed the explicit-config gate, the
follow-up install treated those as a hoist-pattern change and purged the
modules directory. The fetch step now flags the modules manifest with
`virtualStoreOnly: true` so the next install skips the hoist-pattern
comparison and completes the missing post-import linking in place
[#&#8203;11488](https://redirect.github.com/pnpm/pnpm/issues/11488).

- Pin the integrity of git-hosted tarballs (codeload.github.com,
gitlab.com, bitbucket.org) in the lockfile so that subsequent installs
detect a tampered or substituted tarball and refuse to install it.
Previously the lockfile only stored the tarball URL for git
dependencies, so a compromised git host or a man-in-the-middle could
serve arbitrary code on later installs without lockfile changes.

A new `gitHosted: true` field is recorded on git-hosted tarball
resolutions in the lockfile, letting every reader/writer route them by a
single typed check instead of pattern-matching the tarball URL in each
call site. Lockfiles written by older pnpm versions are enriched on load
(URL fallback) so the field can be relied on uniformly across the
codebase.

- Allow user-level preferences in the global `config.yaml`. The
following settings can now be set in `~/.config/pnpm/config.yaml` (or
via `pnpm config set --location global`) instead of being restricted to
`pnpm-workspace.yaml`: `agent`, `globalVirtualStoreDir`,
`initPackageManager`, `initType`, `registrySupportsTimeField`,
`scriptShell`, `shellEmulator`, `sideEffectsCache`,
`sideEffectsCacheReadonly`, `stateDir`, `strictDepBuilds`,
`trustPolicy`, `trustPolicyExclude`, `trustPolicyIgnoreAfter`,
`updateNotifier`, `useStderr`, `verifyDepsBeforeRun`,
`verifyStoreIntegrity`, `virtualStoreDir`, `virtualStoreDirMaxLength`
[#&#8203;11474](https://redirect.github.com/pnpm/pnpm/issues/11474).

- Make trusted publishing (OIDC) take precedence over a configured
static `_authToken` in `pnpm publish`, mirroring the npm CLI's behavior.
When OIDC succeeds, the OIDC-derived token overrides any pre-configured
`_authToken`; when OIDC is not applicable (no CI environment, exchange
fails, registry has no trusted publisher configured), the static token
is used as a fallback. This applies on every package during recursive
publish, so each workspace package independently attempts trusted
publishing.

Additionally, the `NPM_ID_TOKEN` env var is now honored as a CI-agnostic
injection point for an OIDC ID token. Previously OIDC was only attempted
on GitHub Actions or GitLab; now any CI provider that exposes its own
OIDC mechanism (e.g. CircleCI's `CIRCLE_OIDC_TOKEN_V2`, Buildkite, etc.)
can forward its token via `NPM_ID_TOKEN` and trusted publishing will
work without pnpm needing to recognize the provider explicitly.

- `--pm-on-fail=ignore` (and other universal options like `--loglevel`,
`--reporter`) is now honored when combined with `--help` or `--version`.
Previously the CLI argument parser short-circuited those flags before
universal options were preserved, so `pnpm audit --pm-on-fail=ignore
--help` and `pnpm --pm-on-fail=ignore --version` reported the strict
packageManager mismatch instead of running the requested action
[#&#8203;11487](https://redirect.github.com/pnpm/pnpm/issues/11487).

- Fix a regression where `pnpm --recursive --filter '!<pkg>'
run/exec/test/add` would include the workspace root in the matched
projects. The workspace root is now correctly excluded by default when
only negative `--filter` arguments are provided, matching the
[documented behavior](https://pnpm.io/cli/recursive). To include the
root, pass `--include-workspace-root`
[#&#8203;11341](https://redirect.github.com/pnpm/pnpm/issues/11341).

- Restore npm-CLI-compatible `--json` stdout output for `pnpm publish`
([#&#8203;11476](https://redirect.github.com/pnpm/pnpm/issues/11476)).
pnpm 11 reimplemented publish natively
([#&#8203;10591](https://redirect.github.com/pnpm/pnpm/pull/10591)) and
inadvertently dropped the per-package JSON object that pnpm 10 emitted
transitively via the npm CLI, silently breaking downstream tooling —
most notably `nx release publish`, which parses stdout JSON to confirm
success
([nrwl/nx#35575](https://redirect.github.com/nrwl/nx/issues/35575)). On
success, the output is now:

- `pnpm publish --json` → single object `{ id, name, version, size,
unpackedSize, shasum, integrity, filename, files, entryCount, bundled
}`, mirroring `npm publish --json`.
- `pnpm publish -r --json` → array of those objects, mirroring `pnpm
pack --json`'s shape choice.
- `pnpm publish -r --report-summary` → existing
`pnpm-publish-summary.json` envelope `{ publishedPackages: [...] }` is
preserved, but each entry is upgraded to the same per-package shape
(additive — `name` and `version` are still present).

- `pnpm config get @&#8203;<scope>:registry` now reports the same URL
that `pnpm publish` and the resolvers actually use. Previously, `config
get` only consulted `.npmrc`, while `publish`/install used the merged
map that includes `pnpm-workspace.yaml`'s `registries` block — so the
two could diverge silently and a publish could go to the wrong registry
[#&#8203;11492](https://redirect.github.com/pnpm/pnpm/issues/11492).

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/JoshuaKGoldberg/cta-transition-engines-test).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzkuMyIsInVwZGF0ZWRJblZlciI6IjQzLjE3OS4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
renovate Bot added a commit to Arbeidstilsynet/design that referenced this pull request May 15, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Adoption](https://docs.renovatebot.com/merge-confidence/) |
[Passing](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`11.1.0` →
`11.1.1`](https://renovatebot.com/diffs/npm/pnpm/11.1.0/11.1.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/pnpm/11.1.1?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/pnpm/11.1.0/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.1.0/11.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Oslo)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Arbeidstilsynet/design).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzkuMyIsInVwZGF0ZWRJblZlciI6IjQzLjE3OS4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
alunduil pushed a commit to alunduil/blog.alunduil.com that referenced this pull request May 15, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
`11.1.0` → `11.1.1` |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.1.0/11.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/alunduil/blog.alunduil.com).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzkuMyIsInVwZGF0ZWRJblZlciI6IjQzLjE3OS4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
izumin5210 pushed a commit to izumin5210/dotfiles that referenced this pull request May 16, 2026
> ℹ️ **Note**
> 
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`10.33.4` →
`11.1.1`](https://renovatebot.com/diffs/npm/pnpm/10.33.4/11.1.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/10.33.4/11.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

###
[`v11.1.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1110)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.9...v11.1.0)

##### Minor Changes

- Added `pnpm audit signatures` to verify ECDSA registry signatures for
installed packages against keys from `/-/npm/v1/keys`
[#&#8203;7909](https://redirect.github.com/pnpm/pnpm/issues/7909).
Scoped registries are respected, and registries without signing keys are
skipped.

- Added support for installing packages from the [GitHub Packages npm
registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry)
via a built-in `gh:` prefix (e.g. `pnpm add gh:@&#8203;acme/private`),
and, more broadly, for arbitrary named registries in the style of [vlt's
named-registry aliases](https://docs.vlt.sh/cli/registries).
Authentication is picked up from the existing per-URL `.npmrc` entries
(e.g. `//npm.pkg.github.com/:_authToken=...`), so no separate auth
mechanism is required.

Additional aliases — or an override for the built-in `gh` alias, for
GitHub Enterprise Server — can be configured under `namedRegistries` in
`pnpm-workspace.yaml`:

  ```yaml
  namedRegistries:
    gh: https://npm.pkg.github.example.com/
    work: https://npm.work.example.com/
  ```

With this, `work:@&#8203;corp/lib@^2.0.0` resolves against
`https://npm.work.example.com/`.
[#&#8203;8941](https://redirect.github.com/pnpm/pnpm/issues/8941).

- Allow setting sbom spec version using `--sbom-spec-version`
[#&#8203;11389](https://redirect.github.com/pnpm/pnpm/pull/11389).

- Add `--no-runtime` flag (config: `runtime=false`) to skip installing
runtime entries (e.g. Node.js downloaded via `devEngines.runtime`)
without modifying the lockfile. The lockfile keeps the runtime entry so
frozen-lockfile validation still passes; only the runtime fetch and
`.bin` linking are skipped. Useful in CI matrices where the runtime is
provisioned externally (e.g. via `pnpm runtime -g set node <version>`)
before `pnpm install` runs.

- Added the `pnpm bugs` command that opens a package's bug tracker URL
in the browser. With no arguments, it reads the current project's
`package.json`; with one or more package names, it fetches each
package's metadata from the registry and opens its bug tracker. Falls
back to `<repository>/issues` when the `bugs` field is missing
[#&#8203;11279](https://redirect.github.com/pnpm/pnpm/pull/11279).

- Added `pnpm owner` command to manage package owners on the registry.

##### Patch Changes

- Added "published X ago by Y" information to the `pnpm view` command
output, similar to `npm view`. This is useful when comparing against
`minimumReleaseAge`.

  For example, `pnpm view pnpm` now shows:

  ```
  published 17 hours ago by GitHub Actions
  ```

- `pnpm publish` now honors the configured HTTP/HTTPS proxy (including
`https_proxy`/`http_proxy`/`no_proxy` environment variables) when
polling the registry's `doneUrl` during the web-based authentication
flow. Previously the poll bypassed the proxy, causing the registry to
respond `403` from a different source IP and the login to never complete
[#&#8203;11561](https://redirect.github.com/pnpm/pnpm/issues/11561).

- `pnpm add -g` now installs each space-separated package into its own
isolated directory by default. To bundle multiple packages into the same
isolated install (so that they share dependencies and are removed
together), pass them as a comma-separated list. For example:

- `pnpm add -g foo bar` installs `foo` and `bar` as two independent
globals — removing one does not affect the other.
- `pnpm add -g foo,bar qar` bundles `foo` and `bar` into a single
isolated install while `qar` is installed on its own.

Related:
[#&#8203;11587](https://redirect.github.com/pnpm/pnpm/issues/11587).

- `pnpm runtime set <name> <version>` no longer fails in the root of a
multi-package workspace with the `ADDING_TO_ROOT` error. Installing the
workspace root is a valid target for a runtime, so the command now
bypasses that safety check.

- Fix `pnpm --version` hanging for the lifetime of the worker pool after
the version was printed. `main.ts`'s `--version` short-circuit returned
before reaching the command-handler `finally` that calls
`finishWorkers()`, so the worker pool that `switchCliVersion` had
spawned during integrity resolution stayed alive and held the Node event
loop open. The CLI entry now runs `finishWorkers()` from its own
`finally`, so every exit path tears the pool down.

Repro: `pnpm --version` in a workspace whose `devEngines.packageManager`
version already matches the running pnpm + `onFail: "download"`.
`switchCliVersion` resolves the integrity (spawning workers), finds
nothing to swap, returns. The version prints, then the process hangs.

###
[`v11.0.9`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1109)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.8...v11.0.9)

##### Patch Changes

- Fixed installation of GitLab-hosted dependencies. pnpm now downloads
the tarball from
`https://gitlab.com/<user>/<project>/-/archive/<sha>/<project>-<sha>.tar.gz`
instead of the GitLab API endpoint that contained an encoded slash
(`%2F`) between user and project. The encoded slash both triggered `406
Not Acceptable` responses from GitLab and produced virtual store
directory names that Node refused to import
(`ERR_INVALID_MODULE_SPECIFIER`)
[#&#8203;11533](https://redirect.github.com/pnpm/pnpm/issues/11533).
- Honor `NPM_CONFIG_USERCONFIG` (and its lowercase
`npm_config_userconfig` form) as a low-priority fallback when locating
the user-level `.npmrc`. This restores compatibility with environments
that point npm at a custom auth file via that env var — most notably
`actions/setup-node`, which writes registry credentials to
`${runner.temp}/.npmrc` and exports `NPM_CONFIG_USERCONFIG` to reference
it. Without this, GitHub Actions workflows using `actions/setup-node` to
authenticate to private registries broke after upgrading to pnpm v11.
PNPM-prefixed env vars and `npmrcAuthFile` from the global `config.yaml`
continue to take precedence
[#&#8203;11539](https://redirect.github.com/pnpm/pnpm/issues/11539).
- Fix `pnpm pack` not bundling dependencies listed in
`bundleDependencies` (or `bundledDependencies`). The npm-packlist
upgrade in pnpm 11 changed its API to require the caller to pre-populate
the dependency tree, which the wrapper was not doing —
`bundleDependencies` were silently dropped from the tarball
[#&#8203;11519](https://redirect.github.com/pnpm/pnpm/issues/11519).
- Fixed the pnpm CLI crashing with a confusing `SyntaxError: Invalid
regular expression flags` instead of printing a clear "requires Node.js
v22.13" error when launched on an unsupported Node.js version. The
Node.js version check in `bin/pnpm.mjs` was effectively dead code
because the static `import` of the bundled `dist/pnpm.mjs` was hoisted
by the ES module loader and parsed before the check could run
[#&#8203;11546](https://redirect.github.com/pnpm/pnpm/issues/11546).
- Fixed `pnpm --prefix=<dir> install` overwriting the existing
`pnpm-workspace.yaml` in `<dir>` with `set this to true or false`
placeholders. The renamed `--prefix` option (which maps to `dir`) was
not honored when locating the workspace root, so the workspace
manifest's `allowBuilds` settings were not loaded into config and got
clobbered when ignored builds were auto-populated
[#&#8203;11535](https://redirect.github.com/pnpm/pnpm/issues/11535).
- Fixed `pnpm publish --provenance` failing with a 422 from the registry
when the package version contained semver build metadata (e.g.
`1.0.0-canary.0+abc1234`). The `+<build>` segment is now stripped before
packing so that the version embedded in the tarball, the metadata sent
to the registry, and the sigstore provenance subject all agree
[#&#8203;11518](https://redirect.github.com/pnpm/pnpm/issues/11518).

###
[`v11.0.8`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1108)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.7...v11.0.8)

##### Patch Changes

- Restored the heuristic that preserves tarball URLs in `pnpm-lock.yaml`
when they cannot be derived from name+version+registry, even with the
default `lockfileIncludeTarballUrl: false`. Without this, `pnpm install
--frozen-lockfile` from an empty store fails with `ERR_PNPM_FETCH_404`
for packages on registries that serve tarballs from a non-standard path
— most notably GitHub Packages
(`https://npm.pkg.github.com/download/<scope>/<name>/<version>/<hash>`)
and JSR. `lockfileIncludeTarballUrl: true` continues to force the URL
into the lockfile for every package
[#&#8203;11276](https://redirect.github.com/pnpm/pnpm/issues/11276).
- Run `preversion`, `version`, and `postversion` lifecycle scripts for
`pnpm version`.
- Fixed `ERR_PNPM_BAD_TARBALL_SIZE` when a registry serves tarballs with
an end-to-end `Content-Encoding` (e.g. `gzip`). Tarballs are already
compressed, so the fetcher now requests them with `Accept-Encoding:
identity` (matching pnpm v10's effective behavior) and, as defense in
depth against misbehaving servers, no longer enforces the strict
`Content-Length` check when the response declares a `Content-Encoding` —
`Content-Length` in that case refers to the encoded payload, not the
decoded bytes the fetch implementation yields
[#&#8203;11506](https://redirect.github.com/pnpm/pnpm/issues/11506).

###
[`v11.0.7`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1107)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.6...v11.0.7)

##### Patch Changes

- Restore the execute bit on the `node-gyp` shims packed inside
`@pnpm/exe` (`dist/node-gyp-bin/node-gyp`,
`dist/node-gyp-bin/node-gyp.cmd`, and
`dist/node_modules/node-gyp/bin/node-gyp.js`). Without this,
`pnpm/action-setup`'s standalone path (used on runners with Node.js <
22.13) failed any install whose lifecycle script invoked `node-gyp
rebuild` with `sh: 1: node-gyp: Permission denied`
[#&#8203;11483](https://redirect.github.com/pnpm/pnpm/issues/11483).

- Fixed the `pn`, `pnpx`, and `pnx` aliases failing in Git Bash / MSYS2
on Windows when pnpm was installed via `@pnpm/exe` (or after `pnpm
self-update`)
[#&#8203;11486](https://redirect.github.com/pnpm/pnpm/issues/11486).
Running `pnpx` (or `pnx`) printed the cmd.exe banner and dropped the
user into an interactive command prompt instead of running `pnpm dlx`.
The `bin` field rewrite on Windows was pointing those aliases at `.cmd`
files; cmd-shim's Bash shim for a `.cmd` target wraps it in `exec cmd /C
...`, and MSYS2 mangles `/C` into a Windows path before cmd.exe sees it.
The aliases are now `.exe` hardlinks of the SEA binary, which detects
which name it was launched as via `process.execPath` and prepends `dlx`
for `pnpx` / `pnx`.

- Fix `pnpm install` recreating `node_modules` after `pnpm fetch`. `pnpm
fetch` records empty `hoistPattern` and `publicHoistPattern` in
`.modules.yaml`; since v11 removed the explicit-config gate, the
follow-up install treated those as a hoist-pattern change and purged the
modules directory. The fetch step now flags the modules manifest with
`virtualStoreOnly: true` so the next install skips the hoist-pattern
comparison and completes the missing post-import linking in place
[#&#8203;11488](https://redirect.github.com/pnpm/pnpm/issues/11488).

- Pin the integrity of git-hosted tarballs (codeload.github.com,
gitlab.com, bitbucket.org) in the lockfile so that subsequent installs
detect a tampered or substituted tarball and refuse to install it.
Previously the lockfile only stored the tarball URL for git
dependencies, so a compromised git host or a man-in-the-middle could
serve arbitrary code on later installs without lockfile changes.

A new `gitHosted: true` field is recorded on git-hosted tarball
resolutions in the lockfile, letting every reader/writer route them by a
single typed check instead of pattern-matching the tarball URL in each
call site. Lockfiles written by older pnpm versions are enriched on load
(URL fallback) so the field can be relied on uniformly across the
codebase.

- Allow user-level preferences in the global `config.yaml`. The
following settings can now be set in `~/.config/pnpm/config.yaml` (or
via `pnpm config set --location global`) instead of being restricted to
`pnpm-workspace.yaml`: `agent`, `globalVirtualStoreDir`,
`initPackageManager`, `initType`, `registrySupportsTimeField`,
`scriptShell`, `shellEmulator`, `sideEffectsCache`,
`sideEffectsCacheReadonly`, `stateDir`, `strictDepBuilds`,
`trustPolicy`, `trustPolicyExclude`, `trustPolicyIgnoreAfter`,
`updateNotifier`, `useStderr`, `verifyDepsBeforeRun`,
`verifyStoreIntegrity`, `virtualStoreDir`, `virtualStoreDirMaxLength`
[#&#8203;11474](https://redirect.github.com/pnpm/pnpm/issues/11474).

- Make trusted publishing (OIDC) take precedence over a configured
static `_authToken` in `pnpm publish`, mirroring the npm CLI's behavior.
When OIDC succeeds, the OIDC-derived token overrides any pre-configured
`_authToken`; when OIDC is not applicable (no CI environment, exchange
fails, registry has no trusted publisher configured), the static token
is used as a fallback. This applies on every package during recursive
publish, so each workspace package independently attempts trusted
publishing.

Additionally, the `NPM_ID_TOKEN` env var is now honored as a CI-agnostic
injection point for an OIDC ID token. Previously OIDC was only attempted
on GitHub Actions or GitLab; now any CI provider that exposes its own
OIDC mechanism (e.g. CircleCI's `CIRCLE_OIDC_TOKEN_V2`, Buildkite, etc.)
can forward its token via `NPM_ID_TOKEN` and trusted publishing will
work without pnpm needing to recognize the provider explicitly.

- `--pm-on-fail=ignore` (and other universal options like `--loglevel`,
`--reporter`) is now honored when combined with `--help` or `--version`.
Previously the CLI argument parser short-circuited those flags before
universal options were preserved, so `pnpm audit --pm-on-fail=ignore
--help` and `pnpm --pm-on-fail=ignore --version` reported the strict
packageManager mismatch instead of running the requested action
[#&#8203;11487](https://redirect.github.com/pnpm/pnpm/issues/11487).

- Fix a regression where `pnpm --recursive --filter '!<pkg>'
run/exec/test/add` would include the workspace root in the matched
projects. The workspace root is now correctly excluded by default when
only negative `--filter` arguments are provided, matching the
[documented behavior](https://pnpm.io/cli/recursive). To include the
root, pass `--include-workspace-root`
[#&#8203;11341](https://redirect.github.com/pnpm/pnpm/issues/11341).

- Restore npm-CLI-compatible `--json` stdout output for `pnpm publish`
([#&#8203;11476](https://redirect.github.com/pnpm/pnpm/issues/11476)).
pnpm 11 reimplemented publish natively
([#&#8203;10591](https://redirect.github.com/pnpm/pnpm/pull/10591)) and
inadvertently dropped the per-package JSON object that pnpm 10 emitted
transitively via the npm CLI, silently breaking downstream tooling —
most notably `nx release publish`, which parses stdout JSON to confirm
success
([nrwl/nx#35575](https://redirect.github.com/nrwl/nx/issues/35575)). On
success, the output is now:

- `pnpm publish --json` → single object `{ id, name, version, size,
unpackedSize, shasum, integrity, filename, files, entryCount, bundled
}`, mirroring `npm publish --json`.
- `pnpm publish -r --json` → array of those objects, mirroring `pnpm
pack --json`'s shape choice.
- `pnpm publish -r --report-summary` → existing
`pnpm-publish-summary.json` envelope `{ publishedPackages: [...] }` is
preserved, but each entry is upgraded to the same per-package shape
(additive — `name` and `version` are still present).

- `pnpm config get @&#8203;<scope>:registry` now reports the same URL
that `pnpm publish` and the resolvers actually use. Previously, `config
get` only consulted `.npmrc`, while `publish`/install used the merged
map that includes `pnpm-workspace.yaml`'s `registries` block — so the
two could diverge silently and a publish could go to the wrong registry
[#&#8203;11492](https://redirect.github.com/pnpm/pnpm/issues/11492).

###
[`v11.0.6`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1106)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.5...v11.0.6)

##### Patch Changes

- Fix `pnpm_config_npmrc_auth_file` and `pnpm_config_userconfig` env
vars not actually loading the custom `.npmrc`. The env vars were parsed
and assigned to the resolved config, but only after `loadNpmrcConfig`
had already read the default `~/.npmrc` — so the custom file path was
set but never read. The relevant env vars are now consulted before the
user-level `.npmrc` is loaded
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).
- Preserve the original key order in `pnpm-workspace.yaml` when updating
it. Existing keys keep their position, and new keys are inserted in
alphabetical position when the existing keys are already sorted (with a
leading `packages` key allowed) or appended at the end otherwise.
- Fixed `pnpm self-update` on installations originally set up by pnpm
v10. v10 added `PNPM_HOME` directly to PATH and wrote a `pnpm` bootstrap
shim there. v11 setup writes shims under `PNPM_HOME/bin` instead, so
when a v10 user upgrades to v11 the legacy shim at `PNPM_HOME` keeps
pointing into the old `.tools/<version>` install — `pnpm --version`
continues to report the pre-update version even though the new version
was installed under `global/v11`. Self-update now detects this layout,
refreshes the legacy shims so the upgrade actually takes effect, and
prints a hint suggesting `pnpm setup` to migrate PATH to the v11 layout.
[#&#8203;11464](https://redirect.github.com/pnpm/pnpm/issues/11464).
- Print a warning when settings that are not allowed in the global
config file (e.g. `nodeLinker`, `hoistPattern`) are present in
`config.yaml` and silently ignored. Previously these settings were
dropped without any feedback, leaving users unsure why their global
configuration had no effect. The warning suggests moving those settings
to a project-level `pnpm-workspace.yaml`, or sharing them across
projects via [config
dependencies](https://pnpm.io/11.x/config-dependencies).
- Throw a pnpm error when `overrides` has an invalid shape or contains a
non-string value.
- Validate all `readPackage` dependency map fields, including
`devDependencies`, and reject falsy non-object invalid values instead of
silently accepting them.
- Prevent crashes during `pnpm config`, `pnpm set`, and `pnpm get` by
tolerating `configDependencies` install failures. For these commands, a
failure to install `configDependencies` (for example because the
registry auth token has not been written yet) is now logged at debug
level and the command proceeds. All other commands still surface the
install error
[#&#8203;10684](https://redirect.github.com/pnpm/pnpm/issues/10684).
- Treat `allowBuilds` as an install-state input and clear previously
ignored builds when they are explicitly disallowed.
- Fixes
[#&#8203;10594](https://redirect.github.com/pnpm/pnpm/issues/10594),
catalogs not being read from the workspace when using the `catalog:`
protocol with the `pnpm dlx` / `pnpx` command, resulting in a catalog
entry not found error.
- Accept `PNPM_CONFIG_*` (uppercase) environment variables in addition
to `pnpm_config_*`. Previously, only the lowercase form was honored, so
env vars renamed per the v11 migration guide (e.g.
`PNPM_CONFIG_USERCONFIG`) silently had no effect on case-sensitive
systems like macOS and Linux
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).

###
[`v11.0.5`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1105)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.4...v11.0.5)

##### Patch Changes

- Drop the `darwin-x64` artifact from `@pnpm/exe` and from the GitHub
release page. The Node.js SEA mechanism `pnpm pack-app` uses produces a
binary that segfaults at startup on Intel Macs because of an upstream
Node.js bug
([nodejs/node#62893](https://redirect.github.com/nodejs/node/issues/62893),
tracked alongside
[#&#8203;59553](https://redirect.github.com/nodejs/node/issues/59553);
the Node.js team has [opted not to fix
it](https://redirect.github.com/nodejs/node/pull/60250) on the grounds
that x64 macOS is being phased out). Re-signing with `codesign` or
`ldid` doesn't help — the corruption is in LIEF's Mach-O surgery, before
signing.

Intel Mac users should install pnpm via `npm install -g pnpm` (uses the
system Node.js, no SEA), or stay on pnpm 10.x. `@pnpm/exe`'s preinstall
on Intel Mac now exits with a clear error pointing at these
alternatives.

Closes
[#&#8203;11423](https://redirect.github.com/pnpm/pnpm/issues/11423).

- `pnpm dlx` (and `pnpx`/`pnx`/`pnpm create`) now runs the same
interactive `approve-builds` prompt as `pnpm add -g` when the package
being launched depends on transitive packages with install scripts.
Previously, the v11 `strictDepBuilds` default made dlx fail with
`ERR_PNPM_IGNORED_BUILDS` and required users to re-run with
`--allow-build=<pkg>` for every offending dependency. dlx also now
removes the partially-populated cache directory when the install fails,
so a subsequent run starts clean instead of reusing a broken install
whose builds were silently skipped
[#&#8203;11444](https://redirect.github.com/pnpm/pnpm/issues/11444).

- [`72629fc`](https://redirect.github.com/pnpm/pnpm/commit/72629fc): Fix
`pnpm -g ls --json` and `pnpm -g ls --parseable` so they emit valid JSON
and parseable output respectively, matching pnpm 10 behavior. Since the
isolated global packages refactor in pnpm 11, the global list command
had a custom path that always printed plain text and ignored
`--json`/`--parseable`, which broke tools like `npm-check-updates` that
parse the JSON output
[#&#8203;11440](https://redirect.github.com/pnpm/pnpm/issues/11440).

`pnpm -g ls --depth=<n>` (with n > 0) now errors when more than one
isolated global install would be involved, since each install has its
own lockfile and merging their transitive trees would be incoherent.
When the request can be narrowed to a single install group, the regular
`list` flow is used and the full dependency tree is shown.

- Fixed `pnpm publish` to honor `publishConfig.registry` from
`package.json` when publishing a single package. The native publish flow
introduced in v11 was reading the registry from `.npmrc` only, ignoring
the per-package override
[#&#8203;11419](https://redirect.github.com/pnpm/pnpm/issues/11419).

- When `strictPeerDependencies` is `true`, the
`ERR_PNPM_PEER_DEP_ISSUES` error once again renders the peer dependency
issues inline using the same format as `pnpm peers check`, so users (and
CI tools like Renovate) can see what failed without running `pnpm peers
check` separately
[#&#8203;11439](https://redirect.github.com/pnpm/pnpm/issues/11439).

- The `WARN` and error code labels in pnpm's output now wrap in brackets
(`[WARN]`, `[ERR_PNPM_FOO]`). Previously the labels relied entirely on a
colored background to stand out, which meant they blended into the
surrounding text in terminals without color (e.g. when `NO_COLOR` is set
or output is piped). The brackets are painted in the same color as the
badge background, so they appear as ordinary padding in color-capable
terminals — only the no-color rendering changes.

###
[`v11.0.4`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1104)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.3...v11.0.4)

##### Patch Changes

- Fixed `pnpm ci` not reinstalling workspace package `node_modules`
directories after the clean step
[#&#8203;11427](https://redirect.github.com/pnpm/pnpm/issues/11427).
- Remove pnpm's workspace state file when cleaning node\_modules so
`pnpm ci` performs a fresh install after the clean step.
- Do not remove `pnpm-lock.yaml` during `pnpm clean` when `lockfile:
true` is configured in `pnpm-workspace.yaml`. The lockfile is only
removed when the `--lockfile` option is passed to `pnpm clean`.
- `pnpm self-update` (with no version argument) no longer downgrades
pnpm when the registry's `latest` dist-tag points to an older release
than the currently active version. Run `pnpm self-update latest` to
force a downgrade
[#&#8203;11418](https://redirect.github.com/pnpm/pnpm/issues/11418).
- `minimumReleaseAgeStrict` now defaults to `true` whenever the user
explicitly sets `minimumReleaseAge` (via `pnpm-workspace.yaml`, the
global `config.yaml`, the CLI, or `pnpm_config_*` env vars).

###
[`v11.0.3`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1103)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.2...v11.0.3)

##### Patch Changes

- Fix too many open files error sometimes happening on Windows, when
creating command shims in `node_modules/.bin`
[#&#8203;11412](https://redirect.github.com/pnpm/pnpm/issues/11412).
- Fix `ERR_PNPM_FETCH_404` when installing a project whose lockfile
depends on a `file:` tarball. The previous behavior dropped the
`tarball` field from `file:` and git-hosted resolutions when
`lockfile-include-tarball-url=false` (the default), even though those
URLs cannot be reconstructed from the package name, version, and
registry
[#&#8203;11407](https://redirect.github.com/pnpm/pnpm/issues/11407).

###
[`v11.0.2`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1102)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.1...v11.0.2)

##### Patch Changes

- Fix `ENOENT` symlink failure when `pnpm add -g` triggers the
approve-builds prompt. The global add flow used to forward an absolute
`modulesDir` (`<installDir>/node_modules`) into the install run by
`approve-builds`. The install layer treated `modulesDir` as a path
relative to `lockfileDir` and joined it again, producing a doubled path
on Windows because `path.join` does not collapse an embedded absolute
path. The hoist step then tried to `mkdir` and symlink under
`<installDir>\<installDir>\node_modules\.pnpm\node_modules\...` and
failed with `ENOENT`
[#&#8203;11403](https://redirect.github.com/pnpm/pnpm/issues/11403).
- Fixed `packageManagerDependencies` going stale when pnpm is invoked
through corepack. The lockfile sync (and the `devEngines.packageManager`
version check) previously ran only when pnpm was invoked directly; under
corepack the entire block was skipped, so a stale entry would persist
even after the running pnpm version changed. The lockfile sync now runs
regardless of how pnpm was invoked, while the pnpm-managed version
switch (`onFail: 'download'`) remains skipped under corepack so it
doesn't fight corepack's own version selection
[#&#8203;11397](https://redirect.github.com/pnpm/pnpm/issues/11397).
- Fix recursive publish summaries to report the manifest from
`publishConfig.directory` when packages publish from a generated
directory
[#&#8203;11239](https://redirect.github.com/pnpm/pnpm/issues/11239).
- Fix negated `os` / `cpu` entries (e.g. `["!win32"]`) being incorrectly
rejected when `supportedArchitectures` expands to multiple platforms
[#&#8203;11375](https://redirect.github.com/pnpm/pnpm/pull/11375).

###
[`v11.0.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1101)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.0...v11.0.1)

##### Patch Changes

- Report unknown top-level options before falling back to implicit `pnpm
run` scripts.
- Reject `null` named catalogs in workspace manifests with
`InvalidWorkspaceManifestError` instead of crashing with a raw
`TypeError`.
- Populate download location for git-sourced dependencies in SBOM
output. Previously `pnpm sbom` emitted `NOASSERTION` (SPDX) and omitted
the distribution reference (CycloneDX) for git dependencies. Now emits
the git URL with commit hash, e.g.
`git+https://github.com/user/repo.git#commit`.
- `pnpm self-update` now keeps `package.json`'s `packageManager` and
`devEngines.packageManager` in sync. When the legacy `packageManager`
field pins pnpm, both fields are rewritten to the new exact pnpm version
on update — `packageManager` to `pnpm@<version>` (without an integrity
hash), and `devEngines.packageManager.version` to the same exact
`<version>` (dropping any range operator). When only
`devEngines.packageManager` is declared, the existing range-preserving
behavior is unchanged
[#&#8203;11388](https://redirect.github.com/pnpm/pnpm/issues/11388).
- Sort the keys of the overrides object returned by `pnpm audit --fix`
so that the log output order matches the order written to
`pnpm-workspace.yaml`.
- Update the env lockfile's `packageManagerDependencies` entry when
`devEngines.packageManager` declares a pnpm version that the lockfile no
longer satisfies. Previously, the stale entry was kept even though the
running pnpm matched the declared version, silently breaking the
integrity record
[#&#8203;11387](https://redirect.github.com/pnpm/pnpm/issues/11387).

###
[`v11.0.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1100)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v10.33.4...v11.0.0)

##### Highlights

##### Major

- **Node.js 22+ required** — support for Node 18, 19, 20, and 21 is
dropped, pnpm itself is now pure ESM, and the standalone exe requires
glibc 2.27.
- **Supply-chain protection on by default** — `minimumReleaseAge`
defaults to 1 day (newly published packages are not resolved for 24h)
and `blockExoticSubdeps` defaults to `true`.
- **`allowBuilds` replaces the old build-dependency settings** —
`onlyBuiltDependencies`, `onlyBuiltDependenciesFile`,
`neverBuiltDependencies`, `ignoredBuiltDependencies`, and
`ignoreDepScripts` have been removed.
- **Global installs are isolated and use the global virtual store by
default** — each `pnpm add -g` gets its own directory with its own
`package.json`, `node_modules`, and lockfile.
- **New SQLite-backed store index** (store v11) with bundled manifests
and hex digests, reducing filesystem syscalls and speeding up
installation.
- **Native publish flow** — [`pnpm
publish`](https://pnpm.io/11.x/cli/publish),
[`login`](https://pnpm.io/11.x/cli/login),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`view`](https://pnpm.io/11.x/cli/view),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) no longer delegate to the
npm CLI, and the remaining npm passthrough commands now throw "not
implemented".
- **[`pnpm audit`](https://pnpm.io/11.x/cli/audit) uses npm's bulk
advisories endpoint** — the legacy `/security/audits` endpoints are
gone. CVE-based filtering has been replaced with GHSA-based filtering:
migrate `auditConfig.ignoreCves` entries to `auditConfig.ignoreGhsas`.
- **`.npmrc` is auth/registry only** — all other settings must live in
`pnpm-workspace.yaml` or the new global `config.yaml`, and environment
variables use the `pnpm_config_*` prefix.
- **Runtime installs are slimmer** — installing a Node.js runtime via
`node@runtime:<version>` no longer extracts the bundled `npm`, `npx`,
and `corepack`, roughly halving the files pnpm has to hash, write, and
link.

##### Minor

- **New commands:** [`pnpm ci`](https://pnpm.io/11.x/cli/ci), [`pnpm
sbom`](https://pnpm.io/11.x/cli/sbom), [`pnpm
clean`](https://pnpm.io/11.x/cli/clean), [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers), [`pnpm runtime
set`](https://pnpm.io/11.x/cli/runtime), [`pnpm
docs`](https://pnpm.io/11.x/cli/docs)/`home`, [`pnpm
ping`](https://pnpm.io/11.x/cli/ping), [`pnpm
search`](https://pnpm.io/11.x/cli/search), [`pnpm
star`](https://pnpm.io/11.x/cli/star)/`unstar`/`stars`, [`pnpm
whoami`](https://pnpm.io/11.x/cli/whoami), [`pnpm
with`](https://pnpm.io/11.x/cli/with), and [`pnpm
pack-app`](https://pnpm.io/11.x/cli/pack-app), plus
`pn`/[`pnx`](https://pnpm.io/11.x/cli/pnx) short aliases.
- **ESM pnpmfiles** via `.pnpmfile.mjs`, which takes priority over
`.pnpmfile.cjs` when present.
- **[`pnpm audit --fix=update`](https://pnpm.io/11.x/cli/audit)** fixes
vulnerabilities by updating packages in the lockfile instead of adding
overrides, and `pnpm audit --fix --interactive` lets you select which
advisories to fix.
- **[`pnpm pack-app`](https://pnpm.io/11.x/cli/pack-app)** packs a
CommonJS entry into a standalone executable for one or more target
platforms using Node.js Single Executable Applications.
- **Faster HTTP and I/O** — undici with Happy Eyeballs, direct-to-CAS
writes, skipped staging directory, pre-allocated tarball downloads, and
an NDJSON metadata cache.

##### Major Changes

##### Requirements

- pnpm is now distributed as pure ESM.
- Dropped support for Node.js v18, 19, 20, and 21.
- The standalone exe version of pnpm requires at least glibc 2.27.

##### Security & Build Defaults

- Changed default values: `optimisticRepeatInstall` is now `true`,
`verifyDepsBeforeRun` is now `install`, `minimumReleaseAge` is now
`1440` (1 day), and `minimumReleaseAgeStrict` is `false`. Newly
published packages will not be resolved until they are at least 1 day
old. This protects against supply chain attacks by giving the community
time to detect and remove compromised versions. To opt out, set
`minimumReleaseAge: 0` in `pnpm-workspace.yaml`
[#&#8203;11158](https://redirect.github.com/pnpm/pnpm/pull/11158).

- `strictDepBuilds` is `true` by default.

- `blockExoticSubdeps` is `true` by default.

- Removed deprecated build dependency settings: `onlyBuiltDependencies`,
`onlyBuiltDependenciesFile`, `neverBuiltDependencies`,
`ignoredBuiltDependencies`, and `ignoreDepScripts`
[#&#8203;11220](https://redirect.github.com/pnpm/pnpm/pull/11220).

Use the `allowBuilds` setting instead. It is a map where keys are
package name patterns and values are booleans:

  - `true` means the package is allowed to run build scripts
- `false` means the package is explicitly denied from running build
scripts

Same as before, by default, none of the packages in the dependencies are
allowed to run scripts. If a package has postinstall scripts and it
isn't declared in `allowBuilds`, an error is printed.

  Before:

  ```yaml
  onlyBuiltDependencies:
    - electron
  onlyBuiltDependenciesFile: "allowed-builds.json"
  neverBuiltDependencies:
    - core-js
  ignoredBuiltDependencies:
    - esbuild
  ```

  After:

  ```yaml
  allowBuilds:
    electron: true
    core-js: false
    esbuild: false
  ```

- Removed `allowNonAppliedPatches` in favor of `allowUnusedPatches`.

- Removed `ignorePatchFailures`; patch application failures now throw an
error.

##### Store

- Runtime dependencies are always linked from the global virtual store
[#&#8203;10233](https://redirect.github.com/pnpm/pnpm/pull/10233).
- Optimized index file format to store the hash algorithm once per file
instead of repeating it for every file entry. Each file entry now stores
only the hex digest instead of the full integrity string
(`<algo>-<digest>`). Using hex format improves performance since file
paths in the content-addressable store use hex representation,
eliminating base64-to-hex conversion during path lookups.
- Store version bumped to v11.
- The bundled manifest (name, version, bin, engines, scripts, etc.) is
now stored directly in the package index file, eliminating the need to
read `package.json` from the content-addressable store during resolution
and installation. This reduces I/O and speeds up repeat installs
[#&#8203;10473](https://redirect.github.com/pnpm/pnpm/pull/10473).
- The package index in the content-addressable store is now backed by
SQLite. Instead of individual JSON files under `$STORE/index/`, package
metadata is stored in a single SQLite database at `$STORE/index.db` with
MessagePack-encoded values. This reduces filesystem syscall overhead,
improves space efficiency for small metadata entries, and enables
concurrent access via SQLite's WAL mode. Packages missing from the new
index are re-fetched on demand
[#&#8203;10500](https://redirect.github.com/pnpm/pnpm/pull/10500)
[#&#8203;10826](https://redirect.github.com/pnpm/pnpm/issues/10826).

##### Global Packages

- Global installs (`pnpm add -g pkg`) and `pnx` now use the global
virtual store by default. Packages are stored at `{storeDir}/links`
instead of per-project `.pnpm` directories. This can be disabled by
setting `enableGlobalVirtualStore: false`
[#&#8203;10694](https://redirect.github.com/pnpm/pnpm/pull/10694).

- Isolated global packages. Each globally installed package (or group of
packages installed together) now gets its own isolated installation
directory with its own `package.json`, `node_modules/`, and lockfile.
This prevents global packages from interfering with each other through
peer dependency conflicts, hoisting changes, or version resolution
shifts.

  Key changes:

- `pnpm add -g <pkg>` creates an isolated installation in
`{pnpmHomeDir}/global/v11/{hash}/`
- `pnpm remove -g <pkg>` removes the entire installation group
containing the package
- `pnpm update -g [pkg]` re-installs packages in new isolated
directories
- `pnpm list -g` scans isolated directories to show all installed global
packages
- `pnpm install -g` (no args) is no longer supported; use `pnpm add -g
<pkg>` instead

- Globally installed binaries are now stored in a `bin` subdirectory of
`PNPM_HOME` instead of directly in `PNPM_HOME`. This prevents internal
directories like `global/` and `store/` from polluting shell
autocompletion when `PNPM_HOME` is on PATH
[#&#8203;10986](https://redirect.github.com/pnpm/pnpm/issues/10986).
After upgrading, run `pnpm setup` to update your shell configuration.

- Breaking changes to `pnpm link`:

- `pnpm link <pkg-name>` no longer resolves packages from the global
store. Only relative or absolute paths are accepted. For example, use
`pnpm link ./foo` instead of `pnpm link foo`.
- `pnpm link --global` is removed. Use `pnpm add -g .` to register a
local package's bins globally.
- `pnpm link` (no arguments) is removed. Use `pnpm link <dir>` with an
explicit path instead.

##### Configuration

- pnpm no longer reads all settings from `.npmrc`. Only auth and
registry settings are read from `.npmrc` files. All other settings (like
`hoistPattern`, `nodeLinker`, `shamefullyHoist`, etc.) must be
configured in `pnpm-workspace.yaml` or the global
`~/.config/pnpm/config.yaml`
[#&#8203;11189](https://redirect.github.com/pnpm/pnpm/pull/11189).

- Network settings (`httpProxy`, `httpsProxy`, `noProxy`,
`localAddress`, `strictSsl`, `gitShallowHosts`) are now written to
`config.yaml` (global) or `pnpm-workspace.yaml` (local) instead of
`.npmrc`/`auth.ini`. They are still readable from `.npmrc` for easier
migration from the npm CLI
[#&#8203;11209](https://redirect.github.com/pnpm/pnpm/pull/11209).

pnpm no longer reads `npm_config_*` environment variables. Use
`pnpm_config_*` environment variables instead (e.g.,
`pnpm_config_registry` instead of `npm_config_registry`).

  pnpm no longer reads the npm global config at `$PREFIX/etc/npmrc`.

  `pnpm login` writes auth tokens to `~/.config/pnpm/auth.ini`.

  New `registries` setting in `pnpm-workspace.yaml`:

  ```yaml
  registries:
    default: https://registry.npmjs.org/
    "@&#8203;my-org": https://private.example.com/
    "@&#8203;internal": https://nexus.corp.com/
  ```

Auth tokens in `~/.npmrc` still work — pnpm continues to read `~/.npmrc`
as a fallback for registry authentication. The new `npmrcAuthFile`
setting can be used to point to a different file instead of `~/.npmrc`.

- Replace workspace project specific `.npmrc` with `packageConfigs` in
`pnpm-workspace.yaml`.

  A workspace manifest with `packageConfigs` looks something like this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    "project-1":
      saveExact: true
    "project-2":
      savePrefix: "~"
  ```

  Or this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    - match: ["project-1", "project-2"]
      modulesDir: "node_modules"
      saveExact: true
  ```

- pnpm no longer reads settings from the `pnpm` field of `package.json`.
Settings should be defined in `pnpm-workspace.yaml`
[#&#8203;10086](https://redirect.github.com/pnpm/pnpm/pull/10086).

- `pnpm config get` (without `--json`) no longer prints INI formatted
text. Instead, it prints JSON for objects and arrays, and raw strings
for strings, numbers, booleans, and nulls. `pnpm config get --json`
still prints all types of values as JSON, as before.

- `pnpm config get <array>` now prints a JSON array.

- `pnpm config list` now prints a JSON object instead of INI formatted
text.

- `pnpm config list` and `pnpm config get` (without argument) now hide
auth-related settings.

- `pnpm config list` and `pnpm config get` (without argument) now show
top-level keys as camelCase. Exception: keys that start with `@` or `//`
are preserved (their cases don't change).

- `pnpm config get` and `pnpm config list` no longer load non-camelCase
options from the workspace manifest (`pnpm-workspace.yaml`).

##### Removed Commands & npm Passthrough

- pnpm no longer falls back to the npm CLI. Commands that were
previously passed through to npm (`access`, `bugs`, `docs`, `edit`,
`find`, `home`, `issues`, `owner`, `ping`, `prefix`, `profile`, `pkg`,
`repo`, `search`, `set-script`, `star`, `stars`, `team`, `token`,
`unstar`, `whoami`, `xmas`) and their aliases (`s`, `se`) now throw a
"not implemented" error, with a suggestion to use the npm CLI directly
[#&#8203;10642](https://redirect.github.com/pnpm/pnpm/pull/10642). Other
previously passed-through commands —
[`view`](https://pnpm.io/11.x/cli/view) (`info`, `show`, `v`),
[`login`](https://pnpm.io/11.x/cli/login) (`adduser`),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) — have been reimplemented
natively in pnpm (see New Commands below).

- [`pnpm publish`](https://pnpm.io/11.x/cli/publish) now works without
the `npm` CLI.

The One-time Password feature now reads from `PNPM_CONFIG_OTP` instead
of `NPM_CONFIG_OTP`:

  ```sh
  export PNPM_CONFIG_OTP='<your OTP here>'
  pnpm publish --no-git-checks
  ```

If the registry requests OTP and the user has not provided it via the
`PNPM_CONFIG_OTP` environment variable or the `--otp` flag, pnpm will
prompt the user directly for an OTP code.

If the registry requests web-based authentication, pnpm will print a
scannable QR code along with the URL.

Since the new `pnpm publish` no longer calls `npm publish`, some
undocumented features may have been unknowingly dropped. If you rely on
a feature that is now gone, please open an issue at
<https://github.com/pnpm/pnpm/issues>. In the meantime, you can use
`pnpm pack && npm publish *.tgz` as a workaround.

- Removed the `pnpm server` command
[#&#8203;10463](https://redirect.github.com/pnpm/pnpm/pull/10463).

- Removed support for the `useNodeVersion` and
`executionEnv.nodeVersion` fields. `devEngines.runtime` and
`engines.runtime` should be used instead
[#&#8203;10373](https://redirect.github.com/pnpm/pnpm/pull/10373).

- Removed support for `hooks.fetchers`. We now have a new API for custom
fetchers and resolvers via the `fetchers` field of `pnpmfile`.

##### Lifecycle Scripts

- pnpm no longer populates `npm_config_*` environment variables from the
pnpm config during lifecycle scripts. Only well-known `npm_*` env vars
are now set, matching Yarn's behavior
[#&#8203;11116](https://redirect.github.com/pnpm/pnpm/pull/11116).

##### CLI Output

- Cleaner output for script execution: pnpm now prints `$ command`
instead of `> pkg@version stage path\n> command`, and shows project name
and path only when running in a different directory. The `$ command`
line is printed to stderr to keep stdout clean for piping
[#&#8203;11132](https://redirect.github.com/pnpm/pnpm/pull/11132).
- During install, instead of rendering the full peer dependency issues
tree, pnpm now suggests running [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers) to view the issues
[#&#8203;11133](https://redirect.github.com/pnpm/pnpm/pull/11133).

##### Lockfile

- Simplified `patchedDependencies` lockfile format from `Record<string,
{ path: string, hash: string }>` to `Record<string, string>` (selector
to hash). Existing lockfiles with the old format are automatically
migrated
[#&#8203;10911](https://redirect.github.com/pnpm/pnpm/pull/10911).

##### Other

- The default value of the `type` field in the `package.json` file of
the project initialized by `pnpm init` command has been changed to
`module`.

- Added support for lowercase options in `pnpm add`: `-d`, `-p`, `-o`,
`-e` [#&#8203;9197](https://redirect.github.com/pnpm/pnpm/issues/9197).

  When using the `pnpm add` command only:

  - `-p` is now an alias for `--save-prod` instead of `--parseable`
  - `-d` is now an alias for `--save-dev` instead of `--loglevel=info`

- The root workspace project is no longer excluded when it is explicitly
selected via a filter
[#&#8203;10465](https://redirect.github.com/pnpm/pnpm/pull/10465).

##### Audit

- [`pnpm audit`](https://pnpm.io/11.x/cli/audit) now calls npm's
`/-/npm/v1/security/advisories/bulk` endpoint. The legacy
`/-/npm/v1/security/audits{,/quick}` endpoints have been retired by the
registry, so the legacy request/response contract is no longer
supported.

The bulk endpoint does not return CVE identifiers. CVE-based filtering
has been replaced with GitHub advisory ID (GHSA) filtering:

- `auditConfig.ignoreCves` → `auditConfig.ignoreGhsas` (the previous key
is no longer recognized)
- `pnpm audit --ignore <id>` / `pnpm audit --ignore-unfixable` now read
and write GHSAs instead of CVEs
- GHSAs are derived from each advisory's `url`
(`https://github.com/advisories/GHSA-xxxx-xxxx-xxxx`)

To migrate: replace each `CVE-YYYY-NNNNN` entry in your
`auditConfig.ignoreCves` with the corresponding `GHSA-xxxx-xxxx-xxxx`
value (visible in the `More info` column of `pnpm audit` output) and
move it under `auditConfig.ignoreGhsas`.

##### Package Manager Settings

- **Breaking:** removed the `managePackageManagerVersions`,
`packageManagerStrict`, and `packageManagerStrictVersion` settings. They
existed only to derive the `onFail` behavior for the legacy
`packageManager` field, and the `pmOnFail` setting introduced alongside
[`pnpm with`](https://pnpm.io/11.x/cli/with) subsumes all three — it
directly sets the `onFail` behavior of both `packageManager` and
`devEngines.packageManager`. The `COREPACK_ENABLE_STRICT` environment
variable is no longer honored (it only gated `packageManagerStrict`);
use `pmOnFail` instead.

  Migration:

| Removed setting | Replace with |
| ------------------------------------- | ------------------------------
|
| `managePackageManagerVersions: true` | `pmOnFail: download` (default)
|
| `managePackageManagerVersions: false` | `pmOnFail: ignore` |
| `packageManagerStrict: false` | `pmOnFail: warn` |
| `packageManagerStrictVersion: true` | `pmOnFail: error` |
| `COREPACK_ENABLE_STRICT=0` | `pmOnFail: warn` |

##### Runtime Installs

- Installing a Node.js runtime via `node@runtime:<version>` (including
`pnpm env use` and `pnpm runtime set node`) no longer extracts the
bundled `npm`, `npx`, and `corepack` from the Node.js archive. This cuts
roughly half of the files pnpm has to hash, write to the CAS, and link
during installation, making runtime installs noticeably faster. Users
who still need `npm` can install it as a separate package.

##### Minor Changes

##### New Commands

- Added native [`pnpm view`](https://pnpm.io/11.x/cli/view) (`info`,
`show`, `v`) command for viewing package metadata from the registry
[#&#8203;11064](https://redirect.github.com/pnpm/pnpm/pull/11064).
- Added [`pnpm login`](https://pnpm.io/11.x/cli/login) (and `pnpm
adduser` alias) command for authenticating with npm registries. Supports
web-based login with QR code as well as classic username/password login
[#&#8203;11094](https://redirect.github.com/pnpm/pnpm/pull/11094).
- Added [`pnpm logout`](https://pnpm.io/11.x/cli/logout) command for
logging out of npm registries. Revokes the authentication token on the
registry and removes it from the local auth config file
[#&#8203;11213](https://redirect.github.com/pnpm/pnpm/pull/11213).
- Added native [`pnpm deprecate`](https://pnpm.io/11.x/cli/deprecate)
and `pnpm undeprecate` commands for setting and removing deprecation
messages on package versions without delegating to the npm CLI
[#&#8203;11120](https://redirect.github.com/pnpm/pnpm/pull/11120).
- Added native [`pnpm unpublish`](https://pnpm.io/11.x/cli/unpublish)
command. Supports unpublishing specific versions, version ranges via
semver, and entire packages with `--force`
[#&#8203;11128](https://redirect.github.com/pnpm/pnpm/pull/11128).
- Added native [`pnpm dist-tag`](https://pnpm.io/11.x/cli/dist-tag)
command (`ls`, `add`, `rm` subcommands)
[#&#8203;11218](https://redirect.github.com/pnpm/pnpm/pull/11218).
- Added [`pnpm sbom`](https://pnpm.io/11.x/cli/sbom) command for
generating Software Bill of Materials in CycloneDX 1.7 and SPDX 2.3 JSON
formats
[#&#8203;9088](https://redirect.github.com/pnpm/pnpm/issues/9088).
- Added [`pnpm clean`](https://pnpm.io/11.x/cli/clean) command that
safely removes `node_modules` directories from all workspace projects
[#&#8203;10707](https://redirect.github.com/pnpm/pnpm/issues/10707). Use
`--lockfile` to also remove `pnpm-lock.yaml` files.
- Added a new command [`pnpm runtime set <runtime name> <runtime version
spec> [-g]`](https://pnpm.io/11.x/cli/runtime) for installing runtimes.
Deprecated `pnpm env use` in favor of the new command.
- Added the ability to fix vulnerabilities by updating packages in the
lockfile instead of adding overrides. Use [`pnpm audit
--fix=update`](https://pnpm.io/11.x/cli/audit)
[#&#8203;10341](https://redirect.github.com/pnpm/pnpm/pull/10341).
- Added [`pnpm ci`](https://pnpm.io/11.x/cli/ci) command for clean
installs
[#&#8203;6100](https://redirect.github.com/pnpm/pnpm/issues/6100). The
command runs `pnpm clean` followed by `pnpm install --frozen-lockfile`.
Designed for CI/CD environments where reproducible builds are critical.
Aliases: `pnpm clean-install`, `pnpm ic`, `pnpm install-clean`
[#&#8203;11003](https://redirect.github.com/pnpm/pnpm/pull/11003).
- Added [`pnpm peers check`](https://pnpm.io/11.x/cli/peers) command
that checks for unmet and missing peer dependency issues by reading the
lockfile
[#&#8203;7087](https://redirect.github.com/pnpm/pnpm/issues/7087).
- Implemented the [`version`](https://pnpm.io/11.x/cli/version) command
natively in pnpm to support workspaces and `workspace:` protocols
correctly. The new command allows bumping package versions (major,
minor, patch, etc.) with full workspace support and git integration
[#&#8203;10879](https://redirect.github.com/pnpm/pnpm/pull/10879).
- [`pnpm audit --fix`](https://pnpm.io/11.x/cli/audit) now supports a
new interactive mode via `--interactive`/`-i`.
- Added the [`pnpm docs`](https://pnpm.io/11.x/cli/docs) command and its
alias `pnpm home`. This command opens the package documentation or
homepage in the browser. When the package has no valid homepage, it
falls back to `https://npmx.dev/package/<name>`.
- Added native [`pnpm ping`](https://pnpm.io/11.x/cli/ping) command to
test registry connectivity. Provides a simple way to verify connectivity
to the configured registry without requiring external tools.
- Implemented native [`search`](https://pnpm.io/11.x/cli/search) command
and its aliases (`s`, `se`, `find`).
- Implemented native [`star`, `unstar`,
`stars`](https://pnpm.io/11.x/cli/star), and
[`whoami`](https://pnpm.io/11.x/cli/whoami) commands.
- Add [`pnpm with <version|current>
<args...>`](https://pnpm.io/11.x/cli/with) command. Runs pnpm at a
specific version (or the currently active one) for a single invocation,
bypassing the project's `packageManager` and `devEngines.packageManager`
pins.
- Added a new [`pnpm pack-app`](https://pnpm.io/11.x/cli/pack-app)
command that packs a CommonJS entry file into a standalone executable
for one or more target platforms, using the [Node.js Single Executable
Applications](https://nodejs.org/api/single-executable-applications.html)
API under the hood.

##### Configuration

- Added support for a global YAML config file named `config.yaml`.

  Configuration is now split into two categories:

- Registry and auth settings, which can be stored in INI files such as
the global `rc` file and local `.npmrc`.
- pnpm-specific settings, which can only be loaded from YAML files such
as the global `config.yaml` and local `pnpm-workspace.yaml`.

- Added support for loading environment variables whose names start with
`pnpm_config_` into config. These environment variables override
settings from `pnpm-workspace.yaml` but not CLI arguments.

- Added support for reading `allowBuilds` from `pnpm-workspace.yaml` in
the global package directory for global installs.

- Added support for `pnpm config get globalconfig` to retrieve the
global config file path
[#&#8203;9977](https://redirect.github.com/pnpm/pnpm/issues/9977).

- Added a new setting `virtualStoreOnly` that populates the virtual
store without creating importer symlinks, hoisting, bin links, or
running lifecycle scripts. This is useful for pre-populating a store
(e.g., in Nix builds) without creating unnecessary project-level
artifacts. `pnpm fetch` now uses this mode internally
[#&#8203;10840](https://redirect.github.com/pnpm/pnpm/issues/10840).

- Added support for specifying the pnpm version via
`devEngines.packageManager` in `package.json`. Unlike the
`packageManager` field, this supports version ranges. The resolved
version is stored in `pnpm-lock.yaml` and reused if it still satisfies
the range
[#&#8203;10932](https://redirect.github.com/pnpm/pnpm/pull/10932).

- Added a new `dedupePeers` setting that reduces peer dependency
duplication. When enabled, peer dependency suffixes use version-only
identifiers (`name@version`) instead

> ✂ **Note**
> 
> PR body was truncated to here.


</details>

---

### Configuration

📅 **Schedule**: (in timezone Asia/Tokyo)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/izumin5210/dotfiles).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNTkuMiIsInVwZGF0ZWRJblZlciI6IjQzLjE3OS4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
bojanrajkovic added a commit to bojanrajkovic/mcp-paprika that referenced this pull request May 16, 2026
> ℹ️ **Note**
> 
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`10.33.4` →
`11.1.2`](https://renovatebot.com/diffs/npm/pnpm/10.33.4/11.1.2) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/10.33.4/11.1.2?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.2`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1112)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.1...v11.1.2)

##### Patch Changes

- `convertEnginesRuntimeToDependencies`: switch the runtime-dependency
write to `Object.defineProperty` so the CodeQL
`js/prototype-polluting-assignment` rule treats the assignment as safe
regardless of the property name (follow-up to
[#&#8203;11609](https://redirect.github.com/pnpm/pnpm/pull/11609)).

- Address CodeQL static-analysis findings: guard manifest dependency
writes against prototype-polluting keys (`__proto__`, `constructor`,
`prototype`), and replace a potentially super-linear semver-detection
regex in registry 404 hints with an O(n) parser.

- Strip `sec-fetch-*` headers from outgoing HTTP requests. These headers
are automatically added by undici's `fetch()` implementation per the
Fetch spec but cause Azure DevOps Artifacts to return HTTP 400 for
uncached upstream packages, as ADO interprets them as browser requests
[#&#8203;11572](https://redirect.github.com/pnpm/pnpm/issues/11572).

- Fix `minimumReleaseAge` handling for cached abbreviated metadata.

The version-spec cache fast path no longer rethrows
`ERR_PNPM_MISSING_TIME` under `strictPublishedByCheck`; it now falls
through to the registry-fetch path, consistent with the adjacent
mtime-gated cache block.

When the registry returns 304 Not Modified for a package whose cached
metadata is abbreviated (no per-version `time`), pnpm now re-fetches
with `fullMetadata: true` if `minimumReleaseAge` is active and the
package was modified after the cutoff. The upgraded metadata is
persisted to disk so subsequent installs don't repeat the fetch.
Previously the abbreviated meta was used as-is and the maturity check
fell back to its warn-and-skip path, silently bypassing the quarantine
and emitting a misleading "metadata is missing the time field" warning.

Closes
[#&#8203;11619](https://redirect.github.com/pnpm/pnpm/issues/11619).

- Fix `pnpm upgrade --interactive --latest -r` not respecting named
catalog groups. Previously, upgrading a dependency using a named catalog
(e.g. `"catalog:foo"`) would incorrectly rewrite `package.json` to
`"catalog:"` and place the updated version in the default catalog
instead of the named one
[#&#8203;10115](https://redirect.github.com/pnpm/pnpm/issues/10115).

- Fixed `optimisticRepeatInstall` skipping `pnpm-lock.yaml` merge
conflict resolution when the existing `node_modules` state appears up to
date.

- Fix `minimumReleaseAge` / `resolutionMode: time-based` installs
failing on lockfiles whose `time:` block is missing entries. The
npm-resolver's peek-from-store fast path now surfaces `publishedAt` from
the lockfile rather than discarding it, and falls through to a registry
metadata fetch when the time-based cutoff can't be computed from the
data on hand.

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

###
[`v11.1.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1110)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.9...v11.1.0)

##### Minor Changes

- Added `pnpm audit signatures` to verify ECDSA registry signatures for
installed packages against keys from `/-/npm/v1/keys`
[#&#8203;7909](https://redirect.github.com/pnpm/pnpm/issues/7909).
Scoped registries are respected, and registries without signing keys are
skipped.

- Added support for installing packages from the [GitHub Packages npm
registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry)
via a built-in `gh:` prefix (e.g. `pnpm add gh:@&#8203;acme/private`),
and, more broadly, for arbitrary named registries in the style of [vlt's
named-registry aliases](https://docs.vlt.sh/cli/registries).
Authentication is picked up from the existing per-URL `.npmrc` entries
(e.g. `//npm.pkg.github.com/:_authToken=...`), so no separate auth
mechanism is required.

Additional aliases — or an override for the built-in `gh` alias, for
GitHub Enterprise Server — can be configured under `namedRegistries` in
`pnpm-workspace.yaml`:

  ```yaml
  namedRegistries:
    gh: https://npm.pkg.github.example.com/
    work: https://npm.work.example.com/
  ```

With this, `work:@&#8203;corp/lib@^2.0.0` resolves against
`https://npm.work.example.com/`.
[#&#8203;8941](https://redirect.github.com/pnpm/pnpm/issues/8941).

- Allow setting sbom spec version using `--sbom-spec-version`
[#&#8203;11389](https://redirect.github.com/pnpm/pnpm/pull/11389).

- Add `--no-runtime` flag (config: `runtime=false`) to skip installing
runtime entries (e.g. Node.js downloaded via `devEngines.runtime`)
without modifying the lockfile. The lockfile keeps the runtime entry so
frozen-lockfile validation still passes; only the runtime fetch and
`.bin` linking are skipped. Useful in CI matrices where the runtime is
provisioned externally (e.g. via `pnpm runtime -g set node <version>`)
before `pnpm install` runs.

- Added the `pnpm bugs` command that opens a package's bug tracker URL
in the browser. With no arguments, it reads the current project's
`package.json`; with one or more package names, it fetches each
package's metadata from the registry and opens its bug tracker. Falls
back to `<repository>/issues` when the `bugs` field is missing
[#&#8203;11279](https://redirect.github.com/pnpm/pnpm/pull/11279).

- Added `pnpm owner` command to manage package owners on the registry.

##### Patch Changes

- Added "published X ago by Y" information to the `pnpm view` command
output, similar to `npm view`. This is useful when comparing against
`minimumReleaseAge`.

  For example, `pnpm view pnpm` now shows:

  ```
  published 17 hours ago by GitHub Actions
  ```

- `pnpm publish` now honors the configured HTTP/HTTPS proxy (including
`https_proxy`/`http_proxy`/`no_proxy` environment variables) when
polling the registry's `doneUrl` during the web-based authentication
flow. Previously the poll bypassed the proxy, causing the registry to
respond `403` from a different source IP and the login to never complete
[#&#8203;11561](https://redirect.github.com/pnpm/pnpm/issues/11561).

- `pnpm add -g` now installs each space-separated package into its own
isolated directory by default. To bundle multiple packages into the same
isolated install (so that they share dependencies and are removed
together), pass them as a comma-separated list. For example:

- `pnpm add -g foo bar` installs `foo` and `bar` as two independent
globals — removing one does not affect the other.
- `pnpm add -g foo,bar qar` bundles `foo` and `bar` into a single
isolated install while `qar` is installed on its own.

Related:
[#&#8203;11587](https://redirect.github.com/pnpm/pnpm/issues/11587).

- `pnpm runtime set <name> <version>` no longer fails in the root of a
multi-package workspace with the `ADDING_TO_ROOT` error. Installing the
workspace root is a valid target for a runtime, so the command now
bypasses that safety check.

- Fix `pnpm --version` hanging for the lifetime of the worker pool after
the version was printed. `main.ts`'s `--version` short-circuit returned
before reaching the command-handler `finally` that calls
`finishWorkers()`, so the worker pool that `switchCliVersion` had
spawned during integrity resolution stayed alive and held the Node event
loop open. The CLI entry now runs `finishWorkers()` from its own
`finally`, so every exit path tears the pool down.

Repro: `pnpm --version` in a workspace whose `devEngines.packageManager`
version already matches the running pnpm + `onFail: "download"`.
`switchCliVersion` resolves the integrity (spawning workers), finds
nothing to swap, returns. The version prints, then the process hangs.

###
[`v11.0.9`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1109)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.8...v11.0.9)

##### Patch Changes

- Fixed installation of GitLab-hosted dependencies. pnpm now downloads
the tarball from
`https://gitlab.com/<user>/<project>/-/archive/<sha>/<project>-<sha>.tar.gz`
instead of the GitLab API endpoint that contained an encoded slash
(`%2F`) between user and project. The encoded slash both triggered `406
Not Acceptable` responses from GitLab and produced virtual store
directory names that Node refused to import
(`ERR_INVALID_MODULE_SPECIFIER`)
[#&#8203;11533](https://redirect.github.com/pnpm/pnpm/issues/11533).
- Honor `NPM_CONFIG_USERCONFIG` (and its lowercase
`npm_config_userconfig` form) as a low-priority fallback when locating
the user-level `.npmrc`. This restores compatibility with environments
that point npm at a custom auth file via that env var — most notably
`actions/setup-node`, which writes registry credentials to
`${runner.temp}/.npmrc` and exports `NPM_CONFIG_USERCONFIG` to reference
it. Without this, GitHub Actions workflows using `actions/setup-node` to
authenticate to private registries broke after upgrading to pnpm v11.
PNPM-prefixed env vars and `npmrcAuthFile` from the global `config.yaml`
continue to take precedence
[#&#8203;11539](https://redirect.github.com/pnpm/pnpm/issues/11539).
- Fix `pnpm pack` not bundling dependencies listed in
`bundleDependencies` (or `bundledDependencies`). The npm-packlist
upgrade in pnpm 11 changed its API to require the caller to pre-populate
the dependency tree, which the wrapper was not doing —
`bundleDependencies` were silently dropped from the tarball
[#&#8203;11519](https://redirect.github.com/pnpm/pnpm/issues/11519).
- Fixed the pnpm CLI crashing with a confusing `SyntaxError: Invalid
regular expression flags` instead of printing a clear "requires Node.js
v22.13" error when launched on an unsupported Node.js version. The
Node.js version check in `bin/pnpm.mjs` was effectively dead code
because the static `import` of the bundled `dist/pnpm.mjs` was hoisted
by the ES module loader and parsed before the check could run
[#&#8203;11546](https://redirect.github.com/pnpm/pnpm/issues/11546).
- Fixed `pnpm --prefix=<dir> install` overwriting the existing
`pnpm-workspace.yaml` in `<dir>` with `set this to true or false`
placeholders. The renamed `--prefix` option (which maps to `dir`) was
not honored when locating the workspace root, so the workspace
manifest's `allowBuilds` settings were not loaded into config and got
clobbered when ignored builds were auto-populated
[#&#8203;11535](https://redirect.github.com/pnpm/pnpm/issues/11535).
- Fixed `pnpm publish --provenance` failing with a 422 from the registry
when the package version contained semver build metadata (e.g.
`1.0.0-canary.0+abc1234`). The `+<build>` segment is now stripped before
packing so that the version embedded in the tarball, the metadata sent
to the registry, and the sigstore provenance subject all agree
[#&#8203;11518](https://redirect.github.com/pnpm/pnpm/issues/11518).

###
[`v11.0.8`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1108)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.7...v11.0.8)

##### Patch Changes

- Restored the heuristic that preserves tarball URLs in `pnpm-lock.yaml`
when they cannot be derived from name+version+registry, even with the
default `lockfileIncludeTarballUrl: false`. Without this, `pnpm install
--frozen-lockfile` from an empty store fails with `ERR_PNPM_FETCH_404`
for packages on registries that serve tarballs from a non-standard path
— most notably GitHub Packages
(`https://npm.pkg.github.com/download/<scope>/<name>/<version>/<hash>`)
and JSR. `lockfileIncludeTarballUrl: true` continues to force the URL
into the lockfile for every package
[#&#8203;11276](https://redirect.github.com/pnpm/pnpm/issues/11276).
- Run `preversion`, `version`, and `postversion` lifecycle scripts for
`pnpm version`.
- Fixed `ERR_PNPM_BAD_TARBALL_SIZE` when a registry serves tarballs with
an end-to-end `Content-Encoding` (e.g. `gzip`). Tarballs are already
compressed, so the fetcher now requests them with `Accept-Encoding:
identity` (matching pnpm v10's effective behavior) and, as defense in
depth against misbehaving servers, no longer enforces the strict
`Content-Length` check when the response declares a `Content-Encoding` —
`Content-Length` in that case refers to the encoded payload, not the
decoded bytes the fetch implementation yields
[#&#8203;11506](https://redirect.github.com/pnpm/pnpm/issues/11506).

###
[`v11.0.7`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1107)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.6...v11.0.7)

##### Patch Changes

- Restore the execute bit on the `node-gyp` shims packed inside
`@pnpm/exe` (`dist/node-gyp-bin/node-gyp`,
`dist/node-gyp-bin/node-gyp.cmd`, and
`dist/node_modules/node-gyp/bin/node-gyp.js`). Without this,
`pnpm/action-setup`'s standalone path (used on runners with Node.js <
22.13) failed any install whose lifecycle script invoked `node-gyp
rebuild` with `sh: 1: node-gyp: Permission denied`
[#&#8203;11483](https://redirect.github.com/pnpm/pnpm/issues/11483).

- Fixed the `pn`, `pnpx`, and `pnx` aliases failing in Git Bash / MSYS2
on Windows when pnpm was installed via `@pnpm/exe` (or after `pnpm
self-update`)
[#&#8203;11486](https://redirect.github.com/pnpm/pnpm/issues/11486).
Running `pnpx` (or `pnx`) printed the cmd.exe banner and dropped the
user into an interactive command prompt instead of running `pnpm dlx`.
The `bin` field rewrite on Windows was pointing those aliases at `.cmd`
files; cmd-shim's Bash shim for a `.cmd` target wraps it in `exec cmd /C
...`, and MSYS2 mangles `/C` into a Windows path before cmd.exe sees it.
The aliases are now `.exe` hardlinks of the SEA binary, which detects
which name it was launched as via `process.execPath` and prepends `dlx`
for `pnpx` / `pnx`.

- Fix `pnpm install` recreating `node_modules` after `pnpm fetch`. `pnpm
fetch` records empty `hoistPattern` and `publicHoistPattern` in
`.modules.yaml`; since v11 removed the explicit-config gate, the
follow-up install treated those as a hoist-pattern change and purged the
modules directory. The fetch step now flags the modules manifest with
`virtualStoreOnly: true` so the next install skips the hoist-pattern
comparison and completes the missing post-import linking in place
[#&#8203;11488](https://redirect.github.com/pnpm/pnpm/issues/11488).

- Pin the integrity of git-hosted tarballs (codeload.github.com,
gitlab.com, bitbucket.org) in the lockfile so that subsequent installs
detect a tampered or substituted tarball and refuse to install it.
Previously the lockfile only stored the tarball URL for git
dependencies, so a compromised git host or a man-in-the-middle could
serve arbitrary code on later installs without lockfile changes.

A new `gitHosted: true` field is recorded on git-hosted tarball
resolutions in the lockfile, letting every reader/writer route them by a
single typed check instead of pattern-matching the tarball URL in each
call site. Lockfiles written by older pnpm versions are enriched on load
(URL fallback) so the field can be relied on uniformly across the
codebase.

- Allow user-level preferences in the global `config.yaml`. The
following settings can now be set in `~/.config/pnpm/config.yaml` (or
via `pnpm config set --location global`) instead of being restricted to
`pnpm-workspace.yaml`: `agent`, `globalVirtualStoreDir`,
`initPackageManager`, `initType`, `registrySupportsTimeField`,
`scriptShell`, `shellEmulator`, `sideEffectsCache`,
`sideEffectsCacheReadonly`, `stateDir`, `strictDepBuilds`,
`trustPolicy`, `trustPolicyExclude`, `trustPolicyIgnoreAfter`,
`updateNotifier`, `useStderr`, `verifyDepsBeforeRun`,
`verifyStoreIntegrity`, `virtualStoreDir`, `virtualStoreDirMaxLength`
[#&#8203;11474](https://redirect.github.com/pnpm/pnpm/issues/11474).

- Make trusted publishing (OIDC) take precedence over a configured
static `_authToken` in `pnpm publish`, mirroring the npm CLI's behavior.
When OIDC succeeds, the OIDC-derived token overrides any pre-configured
`_authToken`; when OIDC is not applicable (no CI environment, exchange
fails, registry has no trusted publisher configured), the static token
is used as a fallback. This applies on every package during recursive
publish, so each workspace package independently attempts trusted
publishing.

Additionally, the `NPM_ID_TOKEN` env var is now honored as a CI-agnostic
injection point for an OIDC ID token. Previously OIDC was only attempted
on GitHub Actions or GitLab; now any CI provider that exposes its own
OIDC mechanism (e.g. CircleCI's `CIRCLE_OIDC_TOKEN_V2`, Buildkite, etc.)
can forward its token via `NPM_ID_TOKEN` and trusted publishing will
work without pnpm needing to recognize the provider explicitly.

- `--pm-on-fail=ignore` (and other universal options like `--loglevel`,
`--reporter`) is now honored when combined with `--help` or `--version`.
Previously the CLI argument parser short-circuited those flags before
universal options were preserved, so `pnpm audit --pm-on-fail=ignore
--help` and `pnpm --pm-on-fail=ignore --version` reported the strict
packageManager mismatch instead of running the requested action
[#&#8203;11487](https://redirect.github.com/pnpm/pnpm/issues/11487).

- Fix a regression where `pnpm --recursive --filter '!<pkg>'
run/exec/test/add` would include the workspace root in the matched
projects. The workspace root is now correctly excluded by default when
only negative `--filter` arguments are provided, matching the
[documented behavior](https://pnpm.io/cli/recursive). To include the
root, pass `--include-workspace-root`
[#&#8203;11341](https://redirect.github.com/pnpm/pnpm/issues/11341).

- Restore npm-CLI-compatible `--json` stdout output for `pnpm publish`
([#&#8203;11476](https://redirect.github.com/pnpm/pnpm/issues/11476)).
pnpm 11 reimplemented publish natively
([#&#8203;10591](https://redirect.github.com/pnpm/pnpm/pull/10591)) and
inadvertently dropped the per-package JSON object that pnpm 10 emitted
transitively via the npm CLI, silently breaking downstream tooling —
most notably `nx release publish`, which parses stdout JSON to confirm
success
([nrwl/nx#35575](https://redirect.github.com/nrwl/nx/issues/35575)). On
success, the output is now:

- `pnpm publish --json` → single object `{ id, name, version, size,
unpackedSize, shasum, integrity, filename, files, entryCount, bundled
}`, mirroring `npm publish --json`.
- `pnpm publish -r --json` → array of those objects, mirroring `pnpm
pack --json`'s shape choice.
- `pnpm publish -r --report-summary` → existing
`pnpm-publish-summary.json` envelope `{ publishedPackages: [...] }` is
preserved, but each entry is upgraded to the same per-package shape
(additive — `name` and `version` are still present).

- `pnpm config get @&#8203;<scope>:registry` now reports the same URL
that `pnpm publish` and the resolvers actually use. Previously, `config
get` only consulted `.npmrc`, while `publish`/install used the merged
map that includes `pnpm-workspace.yaml`'s `registries` block — so the
two could diverge silently and a publish could go to the wrong registry
[#&#8203;11492](https://redirect.github.com/pnpm/pnpm/issues/11492).

###
[`v11.0.6`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1106)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.5...v11.0.6)

##### Patch Changes

- Fix `pnpm_config_npmrc_auth_file` and `pnpm_config_userconfig` env
vars not actually loading the custom `.npmrc`. The env vars were parsed
and assigned to the resolved config, but only after `loadNpmrcConfig`
had already read the default `~/.npmrc` — so the custom file path was
set but never read. The relevant env vars are now consulted before the
user-level `.npmrc` is loaded
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).
- Preserve the original key order in `pnpm-workspace.yaml` when updating
it. Existing keys keep their position, and new keys are inserted in
alphabetical position when the existing keys are already sorted (with a
leading `packages` key allowed) or appended at the end otherwise.
- Fixed `pnpm self-update` on installations originally set up by pnpm
v10. v10 added `PNPM_HOME` directly to PATH and wrote a `pnpm` bootstrap
shim there. v11 setup writes shims under `PNPM_HOME/bin` instead, so
when a v10 user upgrades to v11 the legacy shim at `PNPM_HOME` keeps
pointing into the old `.tools/<version>` install — `pnpm --version`
continues to report the pre-update version even though the new version
was installed under `global/v11`. Self-update now detects this layout,
refreshes the legacy shims so the upgrade actually takes effect, and
prints a hint suggesting `pnpm setup` to migrate PATH to the v11 layout.
[#&#8203;11464](https://redirect.github.com/pnpm/pnpm/issues/11464).
- Print a warning when settings that are not allowed in the global
config file (e.g. `nodeLinker`, `hoistPattern`) are present in
`config.yaml` and silently ignored. Previously these settings were
dropped without any feedback, leaving users unsure why their global
configuration had no effect. The warning suggests moving those settings
to a project-level `pnpm-workspace.yaml`, or sharing them across
projects via [config
dependencies](https://pnpm.io/11.x/config-dependencies).
- Throw a pnpm error when `overrides` has an invalid shape or contains a
non-string value.
- Validate all `readPackage` dependency map fields, including
`devDependencies`, and reject falsy non-object invalid values instead of
silently accepting them.
- Prevent crashes during `pnpm config`, `pnpm set`, and `pnpm get` by
tolerating `configDependencies` install failures. For these commands, a
failure to install `configDependencies` (for example because the
registry auth token has not been written yet) is now logged at debug
level and the command proceeds. All other commands still surface the
install error
[#&#8203;10684](https://redirect.github.com/pnpm/pnpm/issues/10684).
- Treat `allowBuilds` as an install-state input and clear previously
ignored builds when they are explicitly disallowed.
- Fixes
[#&#8203;10594](https://redirect.github.com/pnpm/pnpm/issues/10594),
catalogs not being read from the workspace when using the `catalog:`
protocol with the `pnpm dlx` / `pnpx` command, resulting in a catalog
entry not found error.
- Accept `PNPM_CONFIG_*` (uppercase) environment variables in addition
to `pnpm_config_*`. Previously, only the lowercase form was honored, so
env vars renamed per the v11 migration guide (e.g.
`PNPM_CONFIG_USERCONFIG`) silently had no effect on case-sensitive
systems like macOS and Linux
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).

###
[`v11.0.5`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1105)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.4...v11.0.5)

##### Patch Changes

- Drop the `darwin-x64` artifact from `@pnpm/exe` and from the GitHub
release page. The Node.js SEA mechanism `pnpm pack-app` uses produces a
binary that segfaults at startup on Intel Macs because of an upstream
Node.js bug
([nodejs/node#62893](https://redirect.github.com/nodejs/node/issues/62893),
tracked alongside
[#&#8203;59553](https://redirect.github.com/nodejs/node/issues/59553);
the Node.js team has [opted not to fix
it](https://redirect.github.com/nodejs/node/pull/60250) on the grounds
that x64 macOS is being phased out). Re-signing with `codesign` or
`ldid` doesn't help — the corruption is in LIEF's Mach-O surgery, before
signing.

Intel Mac users should install pnpm via `npm install -g pnpm` (uses the
system Node.js, no SEA), or stay on pnpm 10.x. `@pnpm/exe`'s preinstall
on Intel Mac now exits with a clear error pointing at these
alternatives.

Closes
[#&#8203;11423](https://redirect.github.com/pnpm/pnpm/issues/11423).

- `pnpm dlx` (and `pnpx`/`pnx`/`pnpm create`) now runs the same
interactive `approve-builds` prompt as `pnpm add -g` when the package
being launched depends on transitive packages with install scripts.
Previously, the v11 `strictDepBuilds` default made dlx fail with
`ERR_PNPM_IGNORED_BUILDS` and required users to re-run with
`--allow-build=<pkg>` for every offending dependency. dlx also now
removes the partially-populated cache directory when the install fails,
so a subsequent run starts clean instead of reusing a broken install
whose builds were silently skipped
[#&#8203;11444](https://redirect.github.com/pnpm/pnpm/issues/11444).

- [`72629fc`](https://redirect.github.com/pnpm/pnpm/commit/72629fc): Fix
`pnpm -g ls --json` and `pnpm -g ls --parseable` so they emit valid JSON
and parseable output respectively, matching pnpm 10 behavior. Since the
isolated global packages refactor in pnpm 11, the global list command
had a custom path that always printed plain text and ignored
`--json`/`--parseable`, which broke tools like `npm-check-updates` that
parse the JSON output
[#&#8203;11440](https://redirect.github.com/pnpm/pnpm/issues/11440).

`pnpm -g ls --depth=<n>` (with n > 0) now errors when more than one
isolated global install would be involved, since each install has its
own lockfile and merging their transitive trees would be incoherent.
When the request can be narrowed to a single install group, the regular
`list` flow is used and the full dependency tree is shown.

- Fixed `pnpm publish` to honor `publishConfig.registry` from
`package.json` when publishing a single package. The native publish flow
introduced in v11 was reading the registry from `.npmrc` only, ignoring
the per-package override
[#&#8203;11419](https://redirect.github.com/pnpm/pnpm/issues/11419).

- When `strictPeerDependencies` is `true`, the
`ERR_PNPM_PEER_DEP_ISSUES` error once again renders the peer dependency
issues inline using the same format as `pnpm peers check`, so users (and
CI tools like Renovate) can see what failed without running `pnpm peers
check` separately
[#&#8203;11439](https://redirect.github.com/pnpm/pnpm/issues/11439).

- The `WARN` and error code labels in pnpm's output now wrap in brackets
(`[WARN]`, `[ERR_PNPM_FOO]`). Previously the labels relied entirely on a
colored background to stand out, which meant they blended into the
surrounding text in terminals without color (e.g. when `NO_COLOR` is set
or output is piped). The brackets are painted in the same color as the
badge background, so they appear as ordinary padding in color-capable
terminals — only the no-color rendering changes.

###
[`v11.0.4`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1104)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.3...v11.0.4)

##### Patch Changes

- Fixed `pnpm ci` not reinstalling workspace package `node_modules`
directories after the clean step
[#&#8203;11427](https://redirect.github.com/pnpm/pnpm/issues/11427).
- Remove pnpm's workspace state file when cleaning node\_modules so
`pnpm ci` performs a fresh install after the clean step.
- Do not remove `pnpm-lock.yaml` during `pnpm clean` when `lockfile:
true` is configured in `pnpm-workspace.yaml`. The lockfile is only
removed when the `--lockfile` option is passed to `pnpm clean`.
- `pnpm self-update` (with no version argument) no longer downgrades
pnpm when the registry's `latest` dist-tag points to an older release
than the currently active version. Run `pnpm self-update latest` to
force a downgrade
[#&#8203;11418](https://redirect.github.com/pnpm/pnpm/issues/11418).
- `minimumReleaseAgeStrict` now defaults to `true` whenever the user
explicitly sets `minimumReleaseAge` (via `pnpm-workspace.yaml`, the
global `config.yaml`, the CLI, or `pnpm_config_*` env vars).

###
[`v11.0.3`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1103)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.2...v11.0.3)

##### Patch Changes

- Fix too many open files error sometimes happening on Windows, when
creating command shims in `node_modules/.bin`
[#&#8203;11412](https://redirect.github.com/pnpm/pnpm/issues/11412).
- Fix `ERR_PNPM_FETCH_404` when installing a project whose lockfile
depends on a `file:` tarball. The previous behavior dropped the
`tarball` field from `file:` and git-hosted resolutions when
`lockfile-include-tarball-url=false` (the default), even though those
URLs cannot be reconstructed from the package name, version, and
registry
[#&#8203;11407](https://redirect.github.com/pnpm/pnpm/issues/11407).

###
[`v11.0.2`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1102)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.1...v11.0.2)

##### Patch Changes

- Fix `ENOENT` symlink failure when `pnpm add -g` triggers the
approve-builds prompt. The global add flow used to forward an absolute
`modulesDir` (`<installDir>/node_modules`) into the install run by
`approve-builds`. The install layer treated `modulesDir` as a path
relative to `lockfileDir` and joined it again, producing a doubled path
on Windows because `path.join` does not collapse an embedded absolute
path. The hoist step then tried to `mkdir` and symlink under
`<installDir>\<installDir>\node_modules\.pnpm\node_modules\...` and
failed with `ENOENT`
[#&#8203;11403](https://redirect.github.com/pnpm/pnpm/issues/11403).
- Fixed `packageManagerDependencies` going stale when pnpm is invoked
through corepack. The lockfile sync (and the `devEngines.packageManager`
version check) previously ran only when pnpm was invoked directly; under
corepack the entire block was skipped, so a stale entry would persist
even after the running pnpm version changed. The lockfile sync now runs
regardless of how pnpm was invoked, while the pnpm-managed version
switch (`onFail: 'download'`) remains skipped under corepack so it
doesn't fight corepack's own version selection
[#&#8203;11397](https://redirect.github.com/pnpm/pnpm/issues/11397).
- Fix recursive publish summaries to report the manifest from
`publishConfig.directory` when packages publish from a generated
directory
[#&#8203;11239](https://redirect.github.com/pnpm/pnpm/issues/11239).
- Fix negated `os` / `cpu` entries (e.g. `["!win32"]`) being incorrectly
rejected when `supportedArchitectures` expands to multiple platforms
[#&#8203;11375](https://redirect.github.com/pnpm/pnpm/pull/11375).

###
[`v11.0.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1101)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.0...v11.0.1)

##### Patch Changes

- Report unknown top-level options before falling back to implicit `pnpm
run` scripts.
- Reject `null` named catalogs in workspace manifests with
`InvalidWorkspaceManifestError` instead of crashing with a raw
`TypeError`.
- Populate download location for git-sourced dependencies in SBOM
output. Previously `pnpm sbom` emitted `NOASSERTION` (SPDX) and omitted
the distribution reference (CycloneDX) for git dependencies. Now emits
the git URL with commit hash, e.g.
`git+https://github.com/user/repo.git#commit`.
- `pnpm self-update` now keeps `package.json`'s `packageManager` and
`devEngines.packageManager` in sync. When the legacy `packageManager`
field pins pnpm, both fields are rewritten to the new exact pnpm version
on update — `packageManager` to `pnpm@<version>` (without an integrity
hash), and `devEngines.packageManager.version` to the same exact
`<version>` (dropping any range operator). When only
`devEngines.packageManager` is declared, the existing range-preserving
behavior is unchanged
[#&#8203;11388](https://redirect.github.com/pnpm/pnpm/issues/11388).
- Sort the keys of the overrides object returned by `pnpm audit --fix`
so that the log output order matches the order written to
`pnpm-workspace.yaml`.
- Update the env lockfile's `packageManagerDependencies` entry when
`devEngines.packageManager` declares a pnpm version that the lockfile no
longer satisfies. Previously, the stale entry was kept even though the
running pnpm matched the declared version, silently breaking the
integrity record
[#&#8203;11387](https://redirect.github.com/pnpm/pnpm/issues/11387).

###
[`v11.0.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1100)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v10.33.4...v11.0.0)

##### Highlights

##### Major

- **Node.js 22+ required** — support for Node 18, 19, 20, and 21 is
dropped, pnpm itself is now pure ESM, and the standalone exe requires
glibc 2.27.
- **Supply-chain protection on by default** — `minimumReleaseAge`
defaults to 1 day (newly published packages are not resolved for 24h)
and `blockExoticSubdeps` defaults to `true`.
- **`allowBuilds` replaces the old build-dependency settings** —
`onlyBuiltDependencies`, `onlyBuiltDependenciesFile`,
`neverBuiltDependencies`, `ignoredBuiltDependencies`, and
`ignoreDepScripts` have been removed.
- **Global installs are isolated and use the global virtual store by
default** — each `pnpm add -g` gets its own directory with its own
`package.json`, `node_modules`, and lockfile.
- **New SQLite-backed store index** (store v11) with bundled manifests
and hex digests, reducing filesystem syscalls and speeding up
installation.
- **Native publish flow** — [`pnpm
publish`](https://pnpm.io/11.x/cli/publish),
[`login`](https://pnpm.io/11.x/cli/login),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`view`](https://pnpm.io/11.x/cli/view),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) no longer delegate to the
npm CLI, and the remaining npm passthrough commands now throw "not
implemented".
- **[`pnpm audit`](https://pnpm.io/11.x/cli/audit) uses npm's bulk
advisories endpoint** — the legacy `/security/audits` endpoints are
gone. CVE-based filtering has been replaced with GHSA-based filtering:
migrate `auditConfig.ignoreCves` entries to `auditConfig.ignoreGhsas`.
- **`.npmrc` is auth/registry only** — all other settings must live in
`pnpm-workspace.yaml` or the new global `config.yaml`, and environment
variables use the `pnpm_config_*` prefix.
- **Runtime installs are slimmer** — installing a Node.js runtime via
`node@runtime:<version>` no longer extracts the bundled `npm`, `npx`,
and `corepack`, roughly halving the files pnpm has to hash, write, and
link.

##### Minor

- **New commands:** [`pnpm ci`](https://pnpm.io/11.x/cli/ci), [`pnpm
sbom`](https://pnpm.io/11.x/cli/sbom), [`pnpm
clean`](https://pnpm.io/11.x/cli/clean), [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers), [`pnpm runtime
set`](https://pnpm.io/11.x/cli/runtime), [`pnpm
docs`](https://pnpm.io/11.x/cli/docs)/`home`, [`pnpm
ping`](https://pnpm.io/11.x/cli/ping), [`pnpm
search`](https://pnpm.io/11.x/cli/search), [`pnpm
star`](https://pnpm.io/11.x/cli/star)/`unstar`/`stars`, [`pnpm
whoami`](https://pnpm.io/11.x/cli/whoami), [`pnpm
with`](https://pnpm.io/11.x/cli/with), and [`pnpm
pack-app`](https://pnpm.io/11.x/cli/pack-app), plus
`pn`/[`pnx`](https://pnpm.io/11.x/cli/pnx) short aliases.
- **ESM pnpmfiles** via `.pnpmfile.mjs`, which takes priority over
`.pnpmfile.cjs` when present.
- **[`pnpm audit --fix=update`](https://pnpm.io/11.x/cli/audit)** fixes
vulnerabilities by updating packages in the lockfile instead of adding
overrides, and `pnpm audit --fix --interactive` lets you select which
advisories to fix.
- **[`pnpm pack-app`](https://pnpm.io/11.x/cli/pack-app)** packs a
CommonJS entry into a standalone executable for one or more target
platforms using Node.js Single Executable Applications.
- **Faster HTTP and I/O** — undici with Happy Eyeballs, direct-to-CAS
writes, skipped staging directory, pre-allocated tarball downloads, and
an NDJSON metadata cache.

##### Major Changes

##### Requirements

- pnpm is now distributed as pure ESM.
- Dropped support for Node.js v18, 19, 20, and 21.
- The standalone exe version of pnpm requires at least glibc 2.27.

##### Security & Build Defaults

- Changed default values: `optimisticRepeatInstall` is now `true`,
`verifyDepsBeforeRun` is now `install`, `minimumReleaseAge` is now
`1440` (1 day), and `minimumReleaseAgeStrict` is `false`. Newly
published packages will not be resolved until they are at least 1 day
old. This protects against supply chain attacks by giving the community
time to detect and remove compromised versions. To opt out, set
`minimumReleaseAge: 0` in `pnpm-workspace.yaml`
[#&#8203;11158](https://redirect.github.com/pnpm/pnpm/pull/11158).

- `strictDepBuilds` is `true` by default.

- `blockExoticSubdeps` is `true` by default.

- Removed deprecated build dependency settings: `onlyBuiltDependencies`,
`onlyBuiltDependenciesFile`, `neverBuiltDependencies`,
`ignoredBuiltDependencies`, and `ignoreDepScripts`
[#&#8203;11220](https://redirect.github.com/pnpm/pnpm/pull/11220).

Use the `allowBuilds` setting instead. It is a map where keys are
package name patterns and values are booleans:

  - `true` means the package is allowed to run build scripts
- `false` means the package is explicitly denied from running build
scripts

Same as before, by default, none of the packages in the dependencies are
allowed to run scripts. If a package has postinstall scripts and it
isn't declared in `allowBuilds`, an error is printed.

  Before:

  ```yaml
  onlyBuiltDependencies:
    - electron
  onlyBuiltDependenciesFile: "allowed-builds.json"
  neverBuiltDependencies:
    - core-js
  ignoredBuiltDependencies:
    - esbuild
  ```

  After:

  ```yaml
  allowBuilds:
    electron: true
    core-js: false
    esbuild: false
  ```

- Removed `allowNonAppliedPatches` in favor of `allowUnusedPatches`.

- Removed `ignorePatchFailures`; patch application failures now throw an
error.

##### Store

- Runtime dependencies are always linked from the global virtual store
[#&#8203;10233](https://redirect.github.com/pnpm/pnpm/pull/10233).
- Optimized index file format to store the hash algorithm once per file
instead of repeating it for every file entry. Each file entry now stores
only the hex digest instead of the full integrity string
(`<algo>-<digest>`). Using hex format improves performance since file
paths in the content-addressable store use hex representation,
eliminating base64-to-hex conversion during path lookups.
- Store version bumped to v11.
- The bundled manifest (name, version, bin, engines, scripts, etc.) is
now stored directly in the package index file, eliminating the need to
read `package.json` from the content-addressable store during resolution
and installation. This reduces I/O and speeds up repeat installs
[#&#8203;10473](https://redirect.github.com/pnpm/pnpm/pull/10473).
- The package index in the content-addressable store is now backed by
SQLite. Instead of individual JSON files under `$STORE/index/`, package
metadata is stored in a single SQLite database at `$STORE/index.db` with
MessagePack-encoded values. This reduces filesystem syscall overhead,
improves space efficiency for small metadata entries, and enables
concurrent access via SQLite's WAL mode. Packages missing from the new
index are re-fetched on demand
[#&#8203;10500](https://redirect.github.com/pnpm/pnpm/pull/10500)
[#&#8203;10826](https://redirect.github.com/pnpm/pnpm/issues/10826).

##### Global Packages

- Global installs (`pnpm add -g pkg`) and `pnx` now use the global
virtual store by default. Packages are stored at `{storeDir}/links`
instead of per-project `.pnpm` directories. This can be disabled by
setting `enableGlobalVirtualStore: false`
[#&#8203;10694](https://redirect.github.com/pnpm/pnpm/pull/10694).

- Isolated global packages. Each globally installed package (or group of
packages installed together) now gets its own isolated installation
directory with its own `package.json`, `node_modules/`, and lockfile.
This prevents global packages from interfering with each other through
peer dependency conflicts, hoisting changes, or version resolution
shifts.

  Key changes:

- `pnpm add -g <pkg>` creates an isolated installation in
`{pnpmHomeDir}/global/v11/{hash}/`
- `pnpm remove -g <pkg>` removes the entire installation group
containing the package
- `pnpm update -g [pkg]` re-installs packages in new isolated
directories
- `pnpm list -g` scans isolated directories to show all installed global
packages
- `pnpm install -g` (no args) is no longer supported; use `pnpm add -g
<pkg>` instead

- Globally installed binaries are now stored in a `bin` subdirectory of
`PNPM_HOME` instead of directly in `PNPM_HOME`. This prevents internal
directories like `global/` and `store/` from polluting shell
autocompletion when `PNPM_HOME` is on PATH
[#&#8203;10986](https://redirect.github.com/pnpm/pnpm/issues/10986).
After upgrading, run `pnpm setup` to update your shell configuration.

- Breaking changes to `pnpm link`:

- `pnpm link <pkg-name>` no longer resolves packages from the global
store. Only relative or absolute paths are accepted. For example, use
`pnpm link ./foo` instead of `pnpm link foo`.
- `pnpm link --global` is removed. Use `pnpm add -g .` to register a
local package's bins globally.
- `pnpm link` (no arguments) is removed. Use `pnpm link <dir>` with an
explicit path instead.

##### Configuration

- pnpm no longer reads all settings from `.npmrc`. Only auth and
registry settings are read from `.npmrc` files. All other settings (like
`hoistPattern`, `nodeLinker`, `shamefullyHoist`, etc.) must be
configured in `pnpm-workspace.yaml` or the global
`~/.config/pnpm/config.yaml`
[#&#8203;11189](https://redirect.github.com/pnpm/pnpm/pull/11189).

- Network settings (`httpProxy`, `httpsProxy`, `noProxy`,
`localAddress`, `strictSsl`, `gitShallowHosts`) are now written to
`config.yaml` (global) or `pnpm-workspace.yaml` (local) instead of
`.npmrc`/`auth.ini`. They are still readable from `.npmrc` for easier
migration from the npm CLI
[#&#8203;11209](https://redirect.github.com/pnpm/pnpm/pull/11209).

pnpm no longer reads `npm_config_*` environment variables. Use
`pnpm_config_*` environment variables instead (e.g.,
`pnpm_config_registry` instead of `npm_config_registry`).

  pnpm no longer reads the npm global config at `$PREFIX/etc/npmrc`.

  `pnpm login` writes auth tokens to `~/.config/pnpm/auth.ini`.

  New `registries` setting in `pnpm-workspace.yaml`:

  ```yaml
  registries:
    default: https://registry.npmjs.org/
    "@&#8203;my-org": https://private.example.com/
    "@&#8203;internal": https://nexus.corp.com/
  ```

Auth tokens in `~/.npmrc` still work — pnpm continues to read `~/.npmrc`
as a fallback for registry authentication. The new `npmrcAuthFile`
setting can be used to point to a different file instead of `~/.npmrc`.

- Replace workspace project specific `.npmrc` with `packageConfigs` in
`pnpm-workspace.yaml`.

  A workspace manifest with `packageConfigs` looks something like this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    "project-1":
      saveExact: true
    "project-2":
      savePrefix: "~"
  ```

  Or this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    - match: ["project-1", "project-2"]
      modulesDir: "node_modules"
      saveExact: true
  ```

- pnpm no longer reads settings from the `pnpm` field of `package.json`.
Settings should be defined in `pnpm-workspace.yaml`
[#&#8203;10086](https://redirect.github.com/pnpm/pnpm/pull/10086).

- `pnpm config get` (without `--json`) no longer prints INI formatted
text. Instead, it prints JSON for objects and arrays, and raw strings
for strings, numbers, booleans, and nulls. `pnpm config get --json`
still prints all types of values as JSON, as before.

- `pnpm config get <array>` now prints a JSON array.

- `pnpm config list` now prints a JSON object instead of INI formatted
text.

- `pnpm config list` and `pnpm config get` (without argument) now hide
auth-related settings.

- `pnpm config list` and `pnpm config get` (without argument) now show
top-level keys as camelCase. Exception: keys that start with `@` or `//`
are preserved (their cases don't change).

- `pnpm config get` and `pnpm config list` no longer load non-camelCase
options from the workspace manifest (`pnpm-workspace.yaml`).

##### Removed Commands & npm Passthrough

- pnpm no longer falls back to the npm CLI. Commands that were
previously passed through to npm (`access`, `bugs`, `docs`, `edit`,
`find`, `home`, `issues`, `owner`, `ping`, `prefix`, `profile`, `pkg`,
`repo`, `search`, `set-script`, `star`, `stars`, `team`, `token`,
`unstar`, `whoami`, `xmas`) and their aliases (`s`, `se`) now throw a
"not implemented" error, with a suggestion to use the npm CLI directly
[#&#8203;10642](https://redirect.github.com/pnpm/pnpm/pull/10642). Other
previously passed-through commands —
[`view`](https://pnpm.io/11.x/cli/view) (`info`, `show`, `v`),
[`login`](https://pnpm.io/11.x/cli/login) (`adduser`),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) — have been reimplemented
natively in pnpm (see New Commands below).

- [`pnpm publish`](https://pnpm.io/11.x/cli/publish) now works without
the `npm` CLI.

The One-time Password feature now reads from `PNPM_CONFIG_OTP` instead
of `NPM_CONFIG_OTP`:

  ```sh
  export PNPM_CONFIG_OTP='<your OTP here>'
  pnpm publish --no-git-checks
  ```

If the registry requests OTP and the user has not provided it via the
`PNPM_CONFIG_OTP` environment variable or the `--otp` flag, pnpm will
prompt the user directly for an OTP code.

If the registry requests web-based authentication, pnpm will print a
scannable QR code along with the URL.

Since the new `pnpm publish` no longer calls `npm publish`, some
undocumented features may have been unknowingly dropped. If you rely on
a feature that is now gone, please open an issue at
<https://github.com/pnpm/pnpm/issues>. In the meantime, you can use
`pnpm pack && npm publish *.tgz` as a workaround.

- Removed the `pnpm server` command
[#&#8203;10463](https://redirect.github.com/pnpm/pnpm/pull/10463).

- Removed support for the `useNodeVersion` and
`executionEnv.nodeVersion` fields. `devEngines.runtime` and
`engines.runtime` should be used instead
[#&#8203;10373](https://redirect.github.com/pnpm/pnpm/pull/10373).

- Removed support for `hooks.fetchers`. We now have a new API for custom
fetchers and resolvers via the `fetchers` field of `pnpmfile`.

##### Lifecycle Scripts

- pnpm no longer populates `npm_config_*` environment variables from the
pnpm config during lifecycle scripts. Only well-known `npm_*` env vars
are now set, matching Yarn's behavior
[#&#8203;11116](https://redirect.github.com/pnpm/pnpm/pull/11116).

##### CLI Output

- Cleaner output for script execution: pnpm now prints `$ command`
instead of `> pkg@version stage path\n> command`, and shows project name
and path only when running in a different directory. The `$ command`
line is printed to stderr to keep stdout clean for piping
[#&#8203;11132](https://redirect.github.com/pnpm/pnpm/pull/11132).
- During install, instead of rendering the full peer dependency issues
tree, pnpm now suggests running [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers) to view the issues
[#&#8203;11133](https://redirect.github.com/pnpm/pnpm/pull/11133).

##### Lockfile

- Simplified `patchedDependencies` lockfile format from `Record<string,
{ path: string, hash: string }>` to `Record<string, string>` (selector
to hash). Existing lockfiles with the old format are automatically
migrated
[#&#8203;10911](https://redirect.github.com/pnpm/pnpm/pull/10911).

##### Other

- The default value of the `type` field in the `package.json` file of
the project initialized by `pnpm init` command has been changed to
`module`.

- Added support for lowercase options in `pnpm add`: `-d`, `-p`, `-o`,
`-e` [#&#8203;9197](https://redirect.github.com/pnpm/pnpm/issues/9197).

  When using the `pnpm add` command only:

  - `-p` is now an alias for `--save-prod` instead of `--parseable`
  - `-d` is now an alias for `--save-dev` instead of `--loglevel=info`

- The root workspace project is no longer excluded when it is explicitly
selected via a filter
[#&#8203;10465](https://redirect.github.com/pnpm/pnpm/pull/10465).

##### Audit

- [`pnpm audit`](https://pnpm.io/11.x/cli/audit) now calls npm's
`/-/npm/v1/security/advisories/bulk` endpoint. The legacy
`/-/npm/v1/security/audits{,/quick}` endpoints have been retired by the
registry, so the legacy request/response contract is no longer
supported.

The bulk endpoint does not return CVE identifiers. CVE-based filtering
has been replaced with GitHub advisory ID (GHSA) filtering:

- `auditConfig.ignoreCves` → `auditConfig.ignoreGhsas` (the previous key
is no longer recognized)
- `pnpm audit --ignore <id>` / `pnpm audit --ignore-unfixable` now read
and write GHSAs instead of CVEs
- GHSAs are derived from each advisory's `url`
(`https://github.com/advisories/GHSA-xxxx-xxxx-xxxx`)

To migrate: replace each `CVE-YYYY-NNNNN` entry in your
`auditConfig.ignoreCves` with the corresponding `GHSA-xxxx-xxxx-xxxx`
value (visible in the `More info` column of `pnpm audit` output) and
move it under `auditConfig.ignoreGhsas`.

##### Package Manager Settings

- **Breaking:** removed the `managePackageManagerVersions`,
`packageManagerStrict`, and `packageManagerStrictVersion` settings. They
existed only to derive the `onFail` behavior for the legacy
`packageManager` field, and the `pmOnFail` setting introduced alongside
[`pnpm with`](https://pnpm.io/11.x/cli/with) subsumes all three — it
directly sets the `onFail` behavior of both `packageManager` and
`devEngines.packageManager`. The `COREPACK_ENABLE_STRICT` environment
variable is no longer honored (it only gated `packageManagerStrict`);
use `pmOnFail` instead.

  Migration:

| Removed setting | Replace with |
| ------------------------------------- | ------------------------------
|
| `managePackageManagerVersions: true` | `pmOnFail: download` (default)
|
| `managePackageManagerVersions: false` | `pmOnFail: ignore` |
| `packageManagerStrict: false` | `pmOnFail: warn` |
| `packageManagerStrictVersion: true` | `pmOnFail: error` |
| `COREPACK_ENABLE_STRICT=0` | `pmOnFail: warn` |

##### Runtime Installs

- Installing a Node.js runtime via `node@runtime:<version>` (including
`pnpm env use` and `pnpm runtime set node`) no longer extracts the
bundled `npm`, `npx`, and `corepack` from the Node.js archive. This cuts
roughly half of the files pnpm has to hash, write to the CAS, and link
during installation, making runtime installs noticeably faster. Users
who still need `npm` can install it as a separate package.

##### Minor Changes

##### New Commands

- Added native [`pnpm view`](https://pnpm.io/11.x/cli/view) (`info`,
`show`, `v`) command for viewing package metadata from the registry
[#&#8203;11064](https://redirect.github.com/pnpm/pnpm/pull/11064).
- Added [`pnpm login`](https://pnpm.io/11.x/cli/login) (and `pnpm
adduser` alias) command for authenticating with npm registries. Supports
web-based login with QR code as well as classic username/password login
[#&#8203;11094](https://redirect.github.com/pnpm/pnpm/pull/11094).
- Added [`pnpm logout`](https://pnpm.io/11.x/cli/logout) command for
logging out of npm registries. Revokes the authentication token on the
registry and removes it from the local auth config file
[#&#8203;11213](https://redirect.github.com/pnpm/pnpm/pull/11213).
- Added native [`pnpm deprecate`](https://pnpm.io/11.x/cli/deprecate)
and `pnpm undeprecate` commands for setting and removing deprecation
messages on package versions without delegating to the npm CLI
[#&#8203;11120](https://redirect.github.com/pnpm/pnpm/pull/11120).
- Added native [`pnpm unpublish`](https://pnpm.io/11.x/cli/unpublish)
command. Supports unpublishing specific versions, version ranges via
semver, and entire packages with `--force`
[#&#8203;11128](https://redirect.github.com/pnpm/pnpm/pull/11128).
- Added native [`pnpm dist-tag`](https://pnpm.io/11.x/cli/dist-tag)
command (`ls`, `add`, `rm` subcommands)
[#&#8203;11218](https://redirect.github.com/pnpm/pnpm/pull/11218).
- Added [`pnpm sbom`](https://pnpm.io/11.x/cli/sbom) command for
generating Software Bill of Materials in CycloneDX 1.7 and SPDX 2.3 JSON
formats
[#&#8203;9088](https://redirect.github.com/pnpm/pnpm/issues/9088).
- Added [`pnpm clean`](https://pnpm.io/11.x/cli/clean) command that
safely removes `node_modules` directories from all workspace projects
[#&#8203;10707](https://redirect.github.com/pnpm/pnpm/issues/10707). Use
`--lockfile` to also remove `pnpm-lock.yaml` files.
- Added a new command [`pnpm runtime set <runtime name> <runtime version
spec> [-g]`](https://pnpm.io/11.x/cli/runtime) for installing runtimes.
Deprecated `pnpm env use` in favor of the new command.
- Added the ability to fix vulnerabilities by updating packages in the
lockfile instead of adding overrides. Use [`pnpm audit
--fix=update`](https://pnpm.io/11.x/cli/audit)
[#&#8203;10341](https://redirect.github.com/pnpm/pnpm/pull/10341).
- Added [`pnpm ci`](https://pnpm.io/11.x/cli/ci) command for clean
installs
[#&#8203;6100](https://redirect.github.com/pnpm/pnpm/issues/6100). The
command runs `pnpm clean` followed by `pnpm install --frozen-lockfile`.
Designed for CI/CD environments where reproducible builds are critical.
Aliases: `pnpm clean-install`, `pnpm ic`, `pnpm install-clean`
[#&#8203;11003](https://redirect.github.com/pnpm/pnpm/pull/11003).
- Added [`pnpm peers check`](https://pnpm.io/11.x/cli/peers) command
that checks for unmet and missing peer dependency issues by reading the
lockfile
[#&#8203;7087](https://redirect.github.com/pnpm/pnpm/issues/7087).
- Implemented the [`version`](https://pnpm.io/11.x/cli/version) command
natively in pnpm to support workspaces and `workspace:` protocols
correctly. The new command allows bumping package versions (major,
minor, patch, etc.) with full workspace support and git integration
[#&#8203;10879](https://redirect.github.com/pnpm/pnpm/pull/10879).
- [`pnpm audit --fix`](https://pnpm.io/11.x/cli/audit) now supports a
new interactive mode via `--interactive`/`-i`.
- Added the [`pnpm docs`](https://pnpm.io/11.x/cli/docs) command and its
alias `pnpm home`. This command opens the

> ✂ **Note**
> 
> PR body was truncated to here.


</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - Between 12:00 AM and 03:59 AM, only on Monday (`* 0-3 * * 1`)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/bojanrajkovic/mcp-paprika).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNTkuMiIsInVwZGF0ZWRJblZlciI6IjQzLjE3OS4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Bojan Rajkovic <brajkovic@coderinserepeat.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
alunduil pushed a commit to alunduil/woodland-generators that referenced this pull request May 16, 2026
> ℹ️ **Note**
> 
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`10.33.4` →
`11.1.1`](https://renovatebot.com/diffs/npm/pnpm/10.33.4/11.1.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/10.33.4/11.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

###
[`v11.1.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1110)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.9...v11.1.0)

##### Minor Changes

- Added `pnpm audit signatures` to verify ECDSA registry signatures for
installed packages against keys from `/-/npm/v1/keys`
[#&#8203;7909](https://redirect.github.com/pnpm/pnpm/issues/7909).
Scoped registries are respected, and registries without signing keys are
skipped.

- Added support for installing packages from the [GitHub Packages npm
registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry)
via a built-in `gh:` prefix (e.g. `pnpm add gh:@&#8203;acme/private`),
and, more broadly, for arbitrary named registries in the style of [vlt's
named-registry aliases](https://docs.vlt.sh/cli/registries).
Authentication is picked up from the existing per-URL `.npmrc` entries
(e.g. `//npm.pkg.github.com/:_authToken=...`), so no separate auth
mechanism is required.

Additional aliases — or an override for the built-in `gh` alias, for
GitHub Enterprise Server — can be configured under `namedRegistries` in
`pnpm-workspace.yaml`:

  ```yaml
  namedRegistries:
    gh: https://npm.pkg.github.example.com/
    work: https://npm.work.example.com/
  ```

With this, `work:@&#8203;corp/lib@^2.0.0` resolves against
`https://npm.work.example.com/`.
[#&#8203;8941](https://redirect.github.com/pnpm/pnpm/issues/8941).

- Allow setting sbom spec version using `--sbom-spec-version`
[#&#8203;11389](https://redirect.github.com/pnpm/pnpm/pull/11389).

- Add `--no-runtime` flag (config: `runtime=false`) to skip installing
runtime entries (e.g. Node.js downloaded via `devEngines.runtime`)
without modifying the lockfile. The lockfile keeps the runtime entry so
frozen-lockfile validation still passes; only the runtime fetch and
`.bin` linking are skipped. Useful in CI matrices where the runtime is
provisioned externally (e.g. via `pnpm runtime -g set node <version>`)
before `pnpm install` runs.

- Added the `pnpm bugs` command that opens a package's bug tracker URL
in the browser. With no arguments, it reads the current project's
`package.json`; with one or more package names, it fetches each
package's metadata from the registry and opens its bug tracker. Falls
back to `<repository>/issues` when the `bugs` field is missing
[#&#8203;11279](https://redirect.github.com/pnpm/pnpm/pull/11279).

- Added `pnpm owner` command to manage package owners on the registry.

##### Patch Changes

- Added "published X ago by Y" information to the `pnpm view` command
output, similar to `npm view`. This is useful when comparing against
`minimumReleaseAge`.

  For example, `pnpm view pnpm` now shows:

  ```
  published 17 hours ago by GitHub Actions
  ```

- `pnpm publish` now honors the configured HTTP/HTTPS proxy (including
`https_proxy`/`http_proxy`/`no_proxy` environment variables) when
polling the registry's `doneUrl` during the web-based authentication
flow. Previously the poll bypassed the proxy, causing the registry to
respond `403` from a different source IP and the login to never complete
[#&#8203;11561](https://redirect.github.com/pnpm/pnpm/issues/11561).

- `pnpm add -g` now installs each space-separated package into its own
isolated directory by default. To bundle multiple packages into the same
isolated install (so that they share dependencies and are removed
together), pass them as a comma-separated list. For example:

- `pnpm add -g foo bar` installs `foo` and `bar` as two independent
globals — removing one does not affect the other.
- `pnpm add -g foo,bar qar` bundles `foo` and `bar` into a single
isolated install while `qar` is installed on its own.

Related:
[#&#8203;11587](https://redirect.github.com/pnpm/pnpm/issues/11587).

- `pnpm runtime set <name> <version>` no longer fails in the root of a
multi-package workspace with the `ADDING_TO_ROOT` error. Installing the
workspace root is a valid target for a runtime, so the command now
bypasses that safety check.

- Fix `pnpm --version` hanging for the lifetime of the worker pool after
the version was printed. `main.ts`'s `--version` short-circuit returned
before reaching the command-handler `finally` that calls
`finishWorkers()`, so the worker pool that `switchCliVersion` had
spawned during integrity resolution stayed alive and held the Node event
loop open. The CLI entry now runs `finishWorkers()` from its own
`finally`, so every exit path tears the pool down.

Repro: `pnpm --version` in a workspace whose `devEngines.packageManager`
version already matches the running pnpm + `onFail: "download"`.
`switchCliVersion` resolves the integrity (spawning workers), finds
nothing to swap, returns. The version prints, then the process hangs.

###
[`v11.0.9`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1109)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.8...v11.0.9)

##### Patch Changes

- Fixed installation of GitLab-hosted dependencies. pnpm now downloads
the tarball from
`https://gitlab.com/<user>/<project>/-/archive/<sha>/<project>-<sha>.tar.gz`
instead of the GitLab API endpoint that contained an encoded slash
(`%2F`) between user and project. The encoded slash both triggered `406
Not Acceptable` responses from GitLab and produced virtual store
directory names that Node refused to import
(`ERR_INVALID_MODULE_SPECIFIER`)
[#&#8203;11533](https://redirect.github.com/pnpm/pnpm/issues/11533).
- Honor `NPM_CONFIG_USERCONFIG` (and its lowercase
`npm_config_userconfig` form) as a low-priority fallback when locating
the user-level `.npmrc`. This restores compatibility with environments
that point npm at a custom auth file via that env var — most notably
`actions/setup-node`, which writes registry credentials to
`${runner.temp}/.npmrc` and exports `NPM_CONFIG_USERCONFIG` to reference
it. Without this, GitHub Actions workflows using `actions/setup-node` to
authenticate to private registries broke after upgrading to pnpm v11.
PNPM-prefixed env vars and `npmrcAuthFile` from the global `config.yaml`
continue to take precedence
[#&#8203;11539](https://redirect.github.com/pnpm/pnpm/issues/11539).
- Fix `pnpm pack` not bundling dependencies listed in
`bundleDependencies` (or `bundledDependencies`). The npm-packlist
upgrade in pnpm 11 changed its API to require the caller to pre-populate
the dependency tree, which the wrapper was not doing —
`bundleDependencies` were silently dropped from the tarball
[#&#8203;11519](https://redirect.github.com/pnpm/pnpm/issues/11519).
- Fixed the pnpm CLI crashing with a confusing `SyntaxError: Invalid
regular expression flags` instead of printing a clear "requires Node.js
v22.13" error when launched on an unsupported Node.js version. The
Node.js version check in `bin/pnpm.mjs` was effectively dead code
because the static `import` of the bundled `dist/pnpm.mjs` was hoisted
by the ES module loader and parsed before the check could run
[#&#8203;11546](https://redirect.github.com/pnpm/pnpm/issues/11546).
- Fixed `pnpm --prefix=<dir> install` overwriting the existing
`pnpm-workspace.yaml` in `<dir>` with `set this to true or false`
placeholders. The renamed `--prefix` option (which maps to `dir`) was
not honored when locating the workspace root, so the workspace
manifest's `allowBuilds` settings were not loaded into config and got
clobbered when ignored builds were auto-populated
[#&#8203;11535](https://redirect.github.com/pnpm/pnpm/issues/11535).
- Fixed `pnpm publish --provenance` failing with a 422 from the registry
when the package version contained semver build metadata (e.g.
`1.0.0-canary.0+abc1234`). The `+<build>` segment is now stripped before
packing so that the version embedded in the tarball, the metadata sent
to the registry, and the sigstore provenance subject all agree
[#&#8203;11518](https://redirect.github.com/pnpm/pnpm/issues/11518).

###
[`v11.0.8`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1108)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.7...v11.0.8)

##### Patch Changes

- Restored the heuristic that preserves tarball URLs in `pnpm-lock.yaml`
when they cannot be derived from name+version+registry, even with the
default `lockfileIncludeTarballUrl: false`. Without this, `pnpm install
--frozen-lockfile` from an empty store fails with `ERR_PNPM_FETCH_404`
for packages on registries that serve tarballs from a non-standard path
— most notably GitHub Packages
(`https://npm.pkg.github.com/download/<scope>/<name>/<version>/<hash>`)
and JSR. `lockfileIncludeTarballUrl: true` continues to force the URL
into the lockfile for every package
[#&#8203;11276](https://redirect.github.com/pnpm/pnpm/issues/11276).
- Run `preversion`, `version`, and `postversion` lifecycle scripts for
`pnpm version`.
- Fixed `ERR_PNPM_BAD_TARBALL_SIZE` when a registry serves tarballs with
an end-to-end `Content-Encoding` (e.g. `gzip`). Tarballs are already
compressed, so the fetcher now requests them with `Accept-Encoding:
identity` (matching pnpm v10's effective behavior) and, as defense in
depth against misbehaving servers, no longer enforces the strict
`Content-Length` check when the response declares a `Content-Encoding` —
`Content-Length` in that case refers to the encoded payload, not the
decoded bytes the fetch implementation yields
[#&#8203;11506](https://redirect.github.com/pnpm/pnpm/issues/11506).

###
[`v11.0.7`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1107)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.6...v11.0.7)

##### Patch Changes

- Restore the execute bit on the `node-gyp` shims packed inside
`@pnpm/exe` (`dist/node-gyp-bin/node-gyp`,
`dist/node-gyp-bin/node-gyp.cmd`, and
`dist/node_modules/node-gyp/bin/node-gyp.js`). Without this,
`pnpm/action-setup`'s standalone path (used on runners with Node.js <
22.13) failed any install whose lifecycle script invoked `node-gyp
rebuild` with `sh: 1: node-gyp: Permission denied`
[#&#8203;11483](https://redirect.github.com/pnpm/pnpm/issues/11483).

- Fixed the `pn`, `pnpx`, and `pnx` aliases failing in Git Bash / MSYS2
on Windows when pnpm was installed via `@pnpm/exe` (or after `pnpm
self-update`)
[#&#8203;11486](https://redirect.github.com/pnpm/pnpm/issues/11486).
Running `pnpx` (or `pnx`) printed the cmd.exe banner and dropped the
user into an interactive command prompt instead of running `pnpm dlx`.
The `bin` field rewrite on Windows was pointing those aliases at `.cmd`
files; cmd-shim's Bash shim for a `.cmd` target wraps it in `exec cmd /C
...`, and MSYS2 mangles `/C` into a Windows path before cmd.exe sees it.
The aliases are now `.exe` hardlinks of the SEA binary, which detects
which name it was launched as via `process.execPath` and prepends `dlx`
for `pnpx` / `pnx`.

- Fix `pnpm install` recreating `node_modules` after `pnpm fetch`. `pnpm
fetch` records empty `hoistPattern` and `publicHoistPattern` in
`.modules.yaml`; since v11 removed the explicit-config gate, the
follow-up install treated those as a hoist-pattern change and purged the
modules directory. The fetch step now flags the modules manifest with
`virtualStoreOnly: true` so the next install skips the hoist-pattern
comparison and completes the missing post-import linking in place
[#&#8203;11488](https://redirect.github.com/pnpm/pnpm/issues/11488).

- Pin the integrity of git-hosted tarballs (codeload.github.com,
gitlab.com, bitbucket.org) in the lockfile so that subsequent installs
detect a tampered or substituted tarball and refuse to install it.
Previously the lockfile only stored the tarball URL for git
dependencies, so a compromised git host or a man-in-the-middle could
serve arbitrary code on later installs without lockfile changes.

A new `gitHosted: true` field is recorded on git-hosted tarball
resolutions in the lockfile, letting every reader/writer route them by a
single typed check instead of pattern-matching the tarball URL in each
call site. Lockfiles written by older pnpm versions are enriched on load
(URL fallback) so the field can be relied on uniformly across the
codebase.

- Allow user-level preferences in the global `config.yaml`. The
following settings can now be set in `~/.config/pnpm/config.yaml` (or
via `pnpm config set --location global`) instead of being restricted to
`pnpm-workspace.yaml`: `agent`, `globalVirtualStoreDir`,
`initPackageManager`, `initType`, `registrySupportsTimeField`,
`scriptShell`, `shellEmulator`, `sideEffectsCache`,
`sideEffectsCacheReadonly`, `stateDir`, `strictDepBuilds`,
`trustPolicy`, `trustPolicyExclude`, `trustPolicyIgnoreAfter`,
`updateNotifier`, `useStderr`, `verifyDepsBeforeRun`,
`verifyStoreIntegrity`, `virtualStoreDir`, `virtualStoreDirMaxLength`
[#&#8203;11474](https://redirect.github.com/pnpm/pnpm/issues/11474).

- Make trusted publishing (OIDC) take precedence over a configured
static `_authToken` in `pnpm publish`, mirroring the npm CLI's behavior.
When OIDC succeeds, the OIDC-derived token overrides any pre-configured
`_authToken`; when OIDC is not applicable (no CI environment, exchange
fails, registry has no trusted publisher configured), the static token
is used as a fallback. This applies on every package during recursive
publish, so each workspace package independently attempts trusted
publishing.

Additionally, the `NPM_ID_TOKEN` env var is now honored as a CI-agnostic
injection point for an OIDC ID token. Previously OIDC was only attempted
on GitHub Actions or GitLab; now any CI provider that exposes its own
OIDC mechanism (e.g. CircleCI's `CIRCLE_OIDC_TOKEN_V2`, Buildkite, etc.)
can forward its token via `NPM_ID_TOKEN` and trusted publishing will
work without pnpm needing to recognize the provider explicitly.

- `--pm-on-fail=ignore` (and other universal options like `--loglevel`,
`--reporter`) is now honored when combined with `--help` or `--version`.
Previously the CLI argument parser short-circuited those flags before
universal options were preserved, so `pnpm audit --pm-on-fail=ignore
--help` and `pnpm --pm-on-fail=ignore --version` reported the strict
packageManager mismatch instead of running the requested action
[#&#8203;11487](https://redirect.github.com/pnpm/pnpm/issues/11487).

- Fix a regression where `pnpm --recursive --filter '!<pkg>'
run/exec/test/add` would include the workspace root in the matched
projects. The workspace root is now correctly excluded by default when
only negative `--filter` arguments are provided, matching the
[documented behavior](https://pnpm.io/cli/recursive). To include the
root, pass `--include-workspace-root`
[#&#8203;11341](https://redirect.github.com/pnpm/pnpm/issues/11341).

- Restore npm-CLI-compatible `--json` stdout output for `pnpm publish`
([#&#8203;11476](https://redirect.github.com/pnpm/pnpm/issues/11476)).
pnpm 11 reimplemented publish natively
([#&#8203;10591](https://redirect.github.com/pnpm/pnpm/pull/10591)) and
inadvertently dropped the per-package JSON object that pnpm 10 emitted
transitively via the npm CLI, silently breaking downstream tooling —
most notably `nx release publish`, which parses stdout JSON to confirm
success
([nrwl/nx#35575](https://redirect.github.com/nrwl/nx/issues/35575)). On
success, the output is now:

- `pnpm publish --json` → single object `{ id, name, version, size,
unpackedSize, shasum, integrity, filename, files, entryCount, bundled
}`, mirroring `npm publish --json`.
- `pnpm publish -r --json` → array of those objects, mirroring `pnpm
pack --json`'s shape choice.
- `pnpm publish -r --report-summary` → existing
`pnpm-publish-summary.json` envelope `{ publishedPackages: [...] }` is
preserved, but each entry is upgraded to the same per-package shape
(additive — `name` and `version` are still present).

- `pnpm config get @&#8203;<scope>:registry` now reports the same URL
that `pnpm publish` and the resolvers actually use. Previously, `config
get` only consulted `.npmrc`, while `publish`/install used the merged
map that includes `pnpm-workspace.yaml`'s `registries` block — so the
two could diverge silently and a publish could go to the wrong registry
[#&#8203;11492](https://redirect.github.com/pnpm/pnpm/issues/11492).

###
[`v11.0.6`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1106)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.5...v11.0.6)

##### Patch Changes

- Fix `pnpm_config_npmrc_auth_file` and `pnpm_config_userconfig` env
vars not actually loading the custom `.npmrc`. The env vars were parsed
and assigned to the resolved config, but only after `loadNpmrcConfig`
had already read the default `~/.npmrc` — so the custom file path was
set but never read. The relevant env vars are now consulted before the
user-level `.npmrc` is loaded
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).
- Preserve the original key order in `pnpm-workspace.yaml` when updating
it. Existing keys keep their position, and new keys are inserted in
alphabetical position when the existing keys are already sorted (with a
leading `packages` key allowed) or appended at the end otherwise.
- Fixed `pnpm self-update` on installations originally set up by pnpm
v10. v10 added `PNPM_HOME` directly to PATH and wrote a `pnpm` bootstrap
shim there. v11 setup writes shims under `PNPM_HOME/bin` instead, so
when a v10 user upgrades to v11 the legacy shim at `PNPM_HOME` keeps
pointing into the old `.tools/<version>` install — `pnpm --version`
continues to report the pre-update version even though the new version
was installed under `global/v11`. Self-update now detects this layout,
refreshes the legacy shims so the upgrade actually takes effect, and
prints a hint suggesting `pnpm setup` to migrate PATH to the v11 layout.
[#&#8203;11464](https://redirect.github.com/pnpm/pnpm/issues/11464).
- Print a warning when settings that are not allowed in the global
config file (e.g. `nodeLinker`, `hoistPattern`) are present in
`config.yaml` and silently ignored. Previously these settings were
dropped without any feedback, leaving users unsure why their global
configuration had no effect. The warning suggests moving those settings
to a project-level `pnpm-workspace.yaml`, or sharing them across
projects via [config
dependencies](https://pnpm.io/11.x/config-dependencies).
- Throw a pnpm error when `overrides` has an invalid shape or contains a
non-string value.
- Validate all `readPackage` dependency map fields, including
`devDependencies`, and reject falsy non-object invalid values instead of
silently accepting them.
- Prevent crashes during `pnpm config`, `pnpm set`, and `pnpm get` by
tolerating `configDependencies` install failures. For these commands, a
failure to install `configDependencies` (for example because the
registry auth token has not been written yet) is now logged at debug
level and the command proceeds. All other commands still surface the
install error
[#&#8203;10684](https://redirect.github.com/pnpm/pnpm/issues/10684).
- Treat `allowBuilds` as an install-state input and clear previously
ignored builds when they are explicitly disallowed.
- Fixes
[#&#8203;10594](https://redirect.github.com/pnpm/pnpm/issues/10594),
catalogs not being read from the workspace when using the `catalog:`
protocol with the `pnpm dlx` / `pnpx` command, resulting in a catalog
entry not found error.
- Accept `PNPM_CONFIG_*` (uppercase) environment variables in addition
to `pnpm_config_*`. Previously, only the lowercase form was honored, so
env vars renamed per the v11 migration guide (e.g.
`PNPM_CONFIG_USERCONFIG`) silently had no effect on case-sensitive
systems like macOS and Linux
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).

###
[`v11.0.5`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1105)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.4...v11.0.5)

##### Patch Changes

- Drop the `darwin-x64` artifact from `@pnpm/exe` and from the GitHub
release page. The Node.js SEA mechanism `pnpm pack-app` uses produces a
binary that segfaults at startup on Intel Macs because of an upstream
Node.js bug
([nodejs/node#62893](https://redirect.github.com/nodejs/node/issues/62893),
tracked alongside
[#&#8203;59553](https://redirect.github.com/nodejs/node/issues/59553);
the Node.js team has [opted not to fix
it](https://redirect.github.com/nodejs/node/pull/60250) on the grounds
that x64 macOS is being phased out). Re-signing with `codesign` or
`ldid` doesn't help — the corruption is in LIEF's Mach-O surgery, before
signing.

Intel Mac users should install pnpm via `npm install -g pnpm` (uses the
system Node.js, no SEA), or stay on pnpm 10.x. `@pnpm/exe`'s preinstall
on Intel Mac now exits with a clear error pointing at these
alternatives.

Closes
[#&#8203;11423](https://redirect.github.com/pnpm/pnpm/issues/11423).

- `pnpm dlx` (and `pnpx`/`pnx`/`pnpm create`) now runs the same
interactive `approve-builds` prompt as `pnpm add -g` when the package
being launched depends on transitive packages with install scripts.
Previously, the v11 `strictDepBuilds` default made dlx fail with
`ERR_PNPM_IGNORED_BUILDS` and required users to re-run with
`--allow-build=<pkg>` for every offending dependency. dlx also now
removes the partially-populated cache directory when the install fails,
so a subsequent run starts clean instead of reusing a broken install
whose builds were silently skipped
[#&#8203;11444](https://redirect.github.com/pnpm/pnpm/issues/11444).

- [`72629fc`](https://redirect.github.com/pnpm/pnpm/commit/72629fc): Fix
`pnpm -g ls --json` and `pnpm -g ls --parseable` so they emit valid JSON
and parseable output respectively, matching pnpm 10 behavior. Since the
isolated global packages refactor in pnpm 11, the global list command
had a custom path that always printed plain text and ignored
`--json`/`--parseable`, which broke tools like `npm-check-updates` that
parse the JSON output
[#&#8203;11440](https://redirect.github.com/pnpm/pnpm/issues/11440).

`pnpm -g ls --depth=<n>` (with n > 0) now errors when more than one
isolated global install would be involved, since each install has its
own lockfile and merging their transitive trees would be incoherent.
When the request can be narrowed to a single install group, the regular
`list` flow is used and the full dependency tree is shown.

- Fixed `pnpm publish` to honor `publishConfig.registry` from
`package.json` when publishing a single package. The native publish flow
introduced in v11 was reading the registry from `.npmrc` only, ignoring
the per-package override
[#&#8203;11419](https://redirect.github.com/pnpm/pnpm/issues/11419).

- When `strictPeerDependencies` is `true`, the
`ERR_PNPM_PEER_DEP_ISSUES` error once again renders the peer dependency
issues inline using the same format as `pnpm peers check`, so users (and
CI tools like Renovate) can see what failed without running `pnpm peers
check` separately
[#&#8203;11439](https://redirect.github.com/pnpm/pnpm/issues/11439).

- The `WARN` and error code labels in pnpm's output now wrap in brackets
(`[WARN]`, `[ERR_PNPM_FOO]`). Previously the labels relied entirely on a
colored background to stand out, which meant they blended into the
surrounding text in terminals without color (e.g. when `NO_COLOR` is set
or output is piped). The brackets are painted in the same color as the
badge background, so they appear as ordinary padding in color-capable
terminals — only the no-color rendering changes.

###
[`v11.0.4`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1104)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.3...v11.0.4)

##### Patch Changes

- Fixed `pnpm ci` not reinstalling workspace package `node_modules`
directories after the clean step
[#&#8203;11427](https://redirect.github.com/pnpm/pnpm/issues/11427).
- Remove pnpm's workspace state file when cleaning node\_modules so
`pnpm ci` performs a fresh install after the clean step.
- Do not remove `pnpm-lock.yaml` during `pnpm clean` when `lockfile:
true` is configured in `pnpm-workspace.yaml`. The lockfile is only
removed when the `--lockfile` option is passed to `pnpm clean`.
- `pnpm self-update` (with no version argument) no longer downgrades
pnpm when the registry's `latest` dist-tag points to an older release
than the currently active version. Run `pnpm self-update latest` to
force a downgrade
[#&#8203;11418](https://redirect.github.com/pnpm/pnpm/issues/11418).
- `minimumReleaseAgeStrict` now defaults to `true` whenever the user
explicitly sets `minimumReleaseAge` (via `pnpm-workspace.yaml`, the
global `config.yaml`, the CLI, or `pnpm_config_*` env vars).

###
[`v11.0.3`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1103)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.2...v11.0.3)

##### Patch Changes

- Fix too many open files error sometimes happening on Windows, when
creating command shims in `node_modules/.bin`
[#&#8203;11412](https://redirect.github.com/pnpm/pnpm/issues/11412).
- Fix `ERR_PNPM_FETCH_404` when installing a project whose lockfile
depends on a `file:` tarball. The previous behavior dropped the
`tarball` field from `file:` and git-hosted resolutions when
`lockfile-include-tarball-url=false` (the default), even though those
URLs cannot be reconstructed from the package name, version, and
registry
[#&#8203;11407](https://redirect.github.com/pnpm/pnpm/issues/11407).

###
[`v11.0.2`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1102)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.1...v11.0.2)

##### Patch Changes

- Fix `ENOENT` symlink failure when `pnpm add -g` triggers the
approve-builds prompt. The global add flow used to forward an absolute
`modulesDir` (`<installDir>/node_modules`) into the install run by
`approve-builds`. The install layer treated `modulesDir` as a path
relative to `lockfileDir` and joined it again, producing a doubled path
on Windows because `path.join` does not collapse an embedded absolute
path. The hoist step then tried to `mkdir` and symlink under
`<installDir>\<installDir>\node_modules\.pnpm\node_modules\...` and
failed with `ENOENT`
[#&#8203;11403](https://redirect.github.com/pnpm/pnpm/issues/11403).
- Fixed `packageManagerDependencies` going stale when pnpm is invoked
through corepack. The lockfile sync (and the `devEngines.packageManager`
version check) previously ran only when pnpm was invoked directly; under
corepack the entire block was skipped, so a stale entry would persist
even after the running pnpm version changed. The lockfile sync now runs
regardless of how pnpm was invoked, while the pnpm-managed version
switch (`onFail: 'download'`) remains skipped under corepack so it
doesn't fight corepack's own version selection
[#&#8203;11397](https://redirect.github.com/pnpm/pnpm/issues/11397).
- Fix recursive publish summaries to report the manifest from
`publishConfig.directory` when packages publish from a generated
directory
[#&#8203;11239](https://redirect.github.com/pnpm/pnpm/issues/11239).
- Fix negated `os` / `cpu` entries (e.g. `["!win32"]`) being incorrectly
rejected when `supportedArchitectures` expands to multiple platforms
[#&#8203;11375](https://redirect.github.com/pnpm/pnpm/pull/11375).

###
[`v11.0.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1101)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.0...v11.0.1)

##### Patch Changes

- Report unknown top-level options before falling back to implicit `pnpm
run` scripts.
- Reject `null` named catalogs in workspace manifests with
`InvalidWorkspaceManifestError` instead of crashing with a raw
`TypeError`.
- Populate download location for git-sourced dependencies in SBOM
output. Previously `pnpm sbom` emitted `NOASSERTION` (SPDX) and omitted
the distribution reference (CycloneDX) for git dependencies. Now emits
the git URL with commit hash, e.g.
`git+https://github.com/user/repo.git#commit`.
- `pnpm self-update` now keeps `package.json`'s `packageManager` and
`devEngines.packageManager` in sync. When the legacy `packageManager`
field pins pnpm, both fields are rewritten to the new exact pnpm version
on update — `packageManager` to `pnpm@<version>` (without an integrity
hash), and `devEngines.packageManager.version` to the same exact
`<version>` (dropping any range operator). When only
`devEngines.packageManager` is declared, the existing range-preserving
behavior is unchanged
[#&#8203;11388](https://redirect.github.com/pnpm/pnpm/issues/11388).
- Sort the keys of the overrides object returned by `pnpm audit --fix`
so that the log output order matches the order written to
`pnpm-workspace.yaml`.
- Update the env lockfile's `packageManagerDependencies` entry when
`devEngines.packageManager` declares a pnpm version that the lockfile no
longer satisfies. Previously, the stale entry was kept even though the
running pnpm matched the declared version, silently breaking the
integrity record
[#&#8203;11387](https://redirect.github.com/pnpm/pnpm/issues/11387).

###
[`v11.0.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1100)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v10.33.4...v11.0.0)

##### Highlights

##### Major

- **Node.js 22+ required** — support for Node 18, 19, 20, and 21 is
dropped, pnpm itself is now pure ESM, and the standalone exe requires
glibc 2.27.
- **Supply-chain protection on by default** — `minimumReleaseAge`
defaults to 1 day (newly published packages are not resolved for 24h)
and `blockExoticSubdeps` defaults to `true`.
- **`allowBuilds` replaces the old build-dependency settings** —
`onlyBuiltDependencies`, `onlyBuiltDependenciesFile`,
`neverBuiltDependencies`, `ignoredBuiltDependencies`, and
`ignoreDepScripts` have been removed.
- **Global installs are isolated and use the global virtual store by
default** — each `pnpm add -g` gets its own directory with its own
`package.json`, `node_modules`, and lockfile.
- **New SQLite-backed store index** (store v11) with bundled manifests
and hex digests, reducing filesystem syscalls and speeding up
installation.
- **Native publish flow** — [`pnpm
publish`](https://pnpm.io/11.x/cli/publish),
[`login`](https://pnpm.io/11.x/cli/login),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`view`](https://pnpm.io/11.x/cli/view),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) no longer delegate to the
npm CLI, and the remaining npm passthrough commands now throw "not
implemented".
- **[`pnpm audit`](https://pnpm.io/11.x/cli/audit) uses npm's bulk
advisories endpoint** — the legacy `/security/audits` endpoints are
gone. CVE-based filtering has been replaced with GHSA-based filtering:
migrate `auditConfig.ignoreCves` entries to `auditConfig.ignoreGhsas`.
- **`.npmrc` is auth/registry only** — all other settings must live in
`pnpm-workspace.yaml` or the new global `config.yaml`, and environment
variables use the `pnpm_config_*` prefix.
- **Runtime installs are slimmer** — installing a Node.js runtime via
`node@runtime:<version>` no longer extracts the bundled `npm`, `npx`,
and `corepack`, roughly halving the files pnpm has to hash, write, and
link.

##### Minor

- **New commands:** [`pnpm ci`](https://pnpm.io/11.x/cli/ci), [`pnpm
sbom`](https://pnpm.io/11.x/cli/sbom), [`pnpm
clean`](https://pnpm.io/11.x/cli/clean), [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers), [`pnpm runtime
set`](https://pnpm.io/11.x/cli/runtime), [`pnpm
docs`](https://pnpm.io/11.x/cli/docs)/`home`, [`pnpm
ping`](https://pnpm.io/11.x/cli/ping), [`pnpm
search`](https://pnpm.io/11.x/cli/search), [`pnpm
star`](https://pnpm.io/11.x/cli/star)/`unstar`/`stars`, [`pnpm
whoami`](https://pnpm.io/11.x/cli/whoami), [`pnpm
with`](https://pnpm.io/11.x/cli/with), and [`pnpm
pack-app`](https://pnpm.io/11.x/cli/pack-app), plus
`pn`/[`pnx`](https://pnpm.io/11.x/cli/pnx) short aliases.
- **ESM pnpmfiles** via `.pnpmfile.mjs`, which takes priority over
`.pnpmfile.cjs` when present.
- **[`pnpm audit --fix=update`](https://pnpm.io/11.x/cli/audit)** fixes
vulnerabilities by updating packages in the lockfile instead of adding
overrides, and `pnpm audit --fix --interactive` lets you select which
advisories to fix.
- **[`pnpm pack-app`](https://pnpm.io/11.x/cli/pack-app)** packs a
CommonJS entry into a standalone executable for one or more target
platforms using Node.js Single Executable Applications.
- **Faster HTTP and I/O** — undici with Happy Eyeballs, direct-to-CAS
writes, skipped staging directory, pre-allocated tarball downloads, and
an NDJSON metadata cache.

##### Major Changes

##### Requirements

- pnpm is now distributed as pure ESM.
- Dropped support for Node.js v18, 19, 20, and 21.
- The standalone exe version of pnpm requires at least glibc 2.27.

##### Security & Build Defaults

- Changed default values: `optimisticRepeatInstall` is now `true`,
`verifyDepsBeforeRun` is now `install`, `minimumReleaseAge` is now
`1440` (1 day), and `minimumReleaseAgeStrict` is `false`. Newly
published packages will not be resolved until they are at least 1 day
old. This protects against supply chain attacks by giving the community
time to detect and remove compromised versions. To opt out, set
`minimumReleaseAge: 0` in `pnpm-workspace.yaml`
[#&#8203;11158](https://redirect.github.com/pnpm/pnpm/pull/11158).

- `strictDepBuilds` is `true` by default.

- `blockExoticSubdeps` is `true` by default.

- Removed deprecated build dependency settings: `onlyBuiltDependencies`,
`onlyBuiltDependenciesFile`, `neverBuiltDependencies`,
`ignoredBuiltDependencies`, and `ignoreDepScripts`
[#&#8203;11220](https://redirect.github.com/pnpm/pnpm/pull/11220).

Use the `allowBuilds` setting instead. It is a map where keys are
package name patterns and values are booleans:

  - `true` means the package is allowed to run build scripts
- `false` means the package is explicitly denied from running build
scripts

Same as before, by default, none of the packages in the dependencies are
allowed to run scripts. If a package has postinstall scripts and it
isn't declared in `allowBuilds`, an error is printed.

  Before:

  ```yaml
  onlyBuiltDependencies:
    - electron
  onlyBuiltDependenciesFile: "allowed-builds.json"
  neverBuiltDependencies:
    - core-js
  ignoredBuiltDependencies:
    - esbuild
  ```

  After:

  ```yaml
  allowBuilds:
    electron: true
    core-js: false
    esbuild: false
  ```

- Removed `allowNonAppliedPatches` in favor of `allowUnusedPatches`.

- Removed `ignorePatchFailures`; patch application failures now throw an
error.

##### Store

- Runtime dependencies are always linked from the global virtual store
[#&#8203;10233](https://redirect.github.com/pnpm/pnpm/pull/10233).
- Optimized index file format to store the hash algorithm once per file
instead of repeating it for every file entry. Each file entry now stores
only the hex digest instead of the full integrity string
(`<algo>-<digest>`). Using hex format improves performance since file
paths in the content-addressable store use hex representation,
eliminating base64-to-hex conversion during path lookups.
- Store version bumped to v11.
- The bundled manifest (name, version, bin, engines, scripts, etc.) is
now stored directly in the package index file, eliminating the need to
read `package.json` from the content-addressable store during resolution
and installation. This reduces I/O and speeds up repeat installs
[#&#8203;10473](https://redirect.github.com/pnpm/pnpm/pull/10473).
- The package index in the content-addressable store is now backed by
SQLite. Instead of individual JSON files under `$STORE/index/`, package
metadata is stored in a single SQLite database at `$STORE/index.db` with
MessagePack-encoded values. This reduces filesystem syscall overhead,
improves space efficiency for small metadata entries, and enables
concurrent access via SQLite's WAL mode. Packages missing from the new
index are re-fetched on demand
[#&#8203;10500](https://redirect.github.com/pnpm/pnpm/pull/10500)
[#&#8203;10826](https://redirect.github.com/pnpm/pnpm/issues/10826).

##### Global Packages

- Global installs (`pnpm add -g pkg`) and `pnx` now use the global
virtual store by default. Packages are stored at `{storeDir}/links`
instead of per-project `.pnpm` directories. This can be disabled by
setting `enableGlobalVirtualStore: false`
[#&#8203;10694](https://redirect.github.com/pnpm/pnpm/pull/10694).

- Isolated global packages. Each globally installed package (or group of
packages installed together) now gets its own isolated installation
directory with its own `package.json`, `node_modules/`, and lockfile.
This prevents global packages from interfering with each other through
peer dependency conflicts, hoisting changes, or version resolution
shifts.

  Key changes:

- `pnpm add -g <pkg>` creates an isolated installation in
`{pnpmHomeDir}/global/v11/{hash}/`
- `pnpm remove -g <pkg>` removes the entire installation group
containing the package
- `pnpm update -g [pkg]` re-installs packages in new isolated
directories
- `pnpm list -g` scans isolated directories to show all installed global
packages
- `pnpm install -g` (no args) is no longer supported; use `pnpm add -g
<pkg>` instead

- Globally installed binaries are now stored in a `bin` subdirectory of
`PNPM_HOME` instead of directly in `PNPM_HOME`. This prevents internal
directories like `global/` and `store/` from polluting shell
autocompletion when `PNPM_HOME` is on PATH
[#&#8203;10986](https://redirect.github.com/pnpm/pnpm/issues/10986).
After upgrading, run `pnpm setup` to update your shell configuration.

- Breaking changes to `pnpm link`:

- `pnpm link <pkg-name>` no longer resolves packages from the global
store. Only relative or absolute paths are accepted. For example, use
`pnpm link ./foo` instead of `pnpm link foo`.
- `pnpm link --global` is removed. Use `pnpm add -g .` to register a
local package's bins globally.
- `pnpm link` (no arguments) is removed. Use `pnpm link <dir>` with an
explicit path instead.

##### Configuration

- pnpm no longer reads all settings from `.npmrc`. Only auth and
registry settings are read from `.npmrc` files. All other settings (like
`hoistPattern`, `nodeLinker`, `shamefullyHoist`, etc.) must be
configured in `pnpm-workspace.yaml` or the global
`~/.config/pnpm/config.yaml`
[#&#8203;11189](https://redirect.github.com/pnpm/pnpm/pull/11189).

- Network settings (`httpProxy`, `httpsProxy`, `noProxy`,
`localAddress`, `strictSsl`, `gitShallowHosts`) are now written to
`config.yaml` (global) or `pnpm-workspace.yaml` (local) instead of
`.npmrc`/`auth.ini`. They are still readable from `.npmrc` for easier
migration from the npm CLI
[#&#8203;11209](https://redirect.github.com/pnpm/pnpm/pull/11209).

pnpm no longer reads `npm_config_*` environment variables. Use
`pnpm_config_*` environment variables instead (e.g.,
`pnpm_config_registry` instead of `npm_config_registry`).

  pnpm no longer reads the npm global config at `$PREFIX/etc/npmrc`.

  `pnpm login` writes auth tokens to `~/.config/pnpm/auth.ini`.

  New `registries` setting in `pnpm-workspace.yaml`:

  ```yaml
  registries:
    default: https://registry.npmjs.org/
    "@&#8203;my-org": https://private.example.com/
    "@&#8203;internal": https://nexus.corp.com/
  ```

Auth tokens in `~/.npmrc` still work — pnpm continues to read `~/.npmrc`
as a fallback for registry authentication. The new `npmrcAuthFile`
setting can be used to point to a different file instead of `~/.npmrc`.

- Replace workspace project specific `.npmrc` with `packageConfigs` in
`pnpm-workspace.yaml`.

  A workspace manifest with `packageConfigs` looks something like this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    "project-1":
      saveExact: true
    "project-2":
      savePrefix: "~"
  ```

  Or this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    - match: ["project-1", "project-2"]
      modulesDir: "node_modules"
      saveExact: true
  ```

- pnpm no longer reads settings from the `pnpm` field of `package.json`.
Settings should be defined in `pnpm-workspace.yaml`
[#&#8203;10086](https://redirect.github.com/pnpm/pnpm/pull/10086).

- `pnpm config get` (without `--json`) no longer prints INI formatted
text. Instead, it prints JSON for objects and arrays, and raw strings
for strings, numbers, booleans, and nulls. `pnpm config get --json`
still prints all types of values as JSON, as before.

- `pnpm config get <array>` now prints a JSON array.

- `pnpm config list` now prints a JSON object instead of INI formatted
text.

- `pnpm config list` and `pnpm config get` (without argument) now hide
auth-related settings.

- `pnpm config list` and `pnpm config get` (without argument) now show
top-level keys as camelCase. Exception: keys that start with `@` or `//`
are preserved (their cases don't change).

- `pnpm config get` and `pnpm config list` no longer load non-camelCase
options from the workspace manifest (`pnpm-workspace.yaml`).

##### Removed Commands & npm Passthrough

- pnpm no longer falls back to the npm CLI. Commands that were
previously passed through to npm (`access`, `bugs`, `docs`, `edit`,
`find`, `home`, `issues`, `owner`, `ping`, `prefix`, `profile`, `pkg`,
`repo`, `search`, `set-script`, `star`, `stars`, `team`, `token`,
`unstar`, `whoami`, `xmas`) and their aliases (`s`, `se`) now throw a
"not implemented" error, with a suggestion to use the npm CLI directly
[#&#8203;10642](https://redirect.github.com/pnpm/pnpm/pull/10642). Other
previously passed-through commands —
[`view`](https://pnpm.io/11.x/cli/view) (`info`, `show`, `v`),
[`login`](https://pnpm.io/11.x/cli/login) (`adduser`),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) — have been reimplemented
natively in pnpm (see New Commands below).

- [`pnpm publish`](https://pnpm.io/11.x/cli/publish) now works without
the `npm` CLI.

The One-time Password feature now reads from `PNPM_CONFIG_OTP` instead
of `NPM_CONFIG_OTP`:

  ```sh
  export PNPM_CONFIG_OTP='<your OTP here>'
  pnpm publish --no-git-checks
  ```

If the registry requests OTP and the user has not provided it via the
`PNPM_CONFIG_OTP` environment variable or the `--otp` flag, pnpm will
prompt the user directly for an OTP code.

If the registry requests web-based authentication, pnpm will print a
scannable QR code along with the URL.

Since the new `pnpm publish` no longer calls `npm publish`, some
undocumented features may have been unknowingly dropped. If you rely on
a feature that is now gone, please open an issue at
<https://github.com/pnpm/pnpm/issues>. In the meantime, you can use
`pnpm pack && npm publish *.tgz` as a workaround.

- Removed the `pnpm server` command
[#&#8203;10463](https://redirect.github.com/pnpm/pnpm/pull/10463).

- Removed support for the `useNodeVersion` and
`executionEnv.nodeVersion` fields. `devEngines.runtime` and
`engines.runtime` should be used instead
[#&#8203;10373](https://redirect.github.com/pnpm/pnpm/pull/10373).

- Removed support for `hooks.fetchers`. We now have a new API for custom
fetchers and resolvers via the `fetchers` field of `pnpmfile`.

##### Lifecycle Scripts

- pnpm no longer populates `npm_config_*` environment variables from the
pnpm config during lifecycle scripts. Only well-known `npm_*` env vars
are now set, matching Yarn's behavior
[#&#8203;11116](https://redirect.github.com/pnpm/pnpm/pull/11116).

##### CLI Output

- Cleaner output for script execution: pnpm now prints `$ command`
instead of `> pkg@version stage path\n> command`, and shows project name
and path only when running in a different directory. The `$ command`
line is printed to stderr to keep stdout clean for piping
[#&#8203;11132](https://redirect.github.com/pnpm/pnpm/pull/11132).
- During install, instead of rendering the full peer dependency issues
tree, pnpm now suggests running [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers) to view the issues
[#&#8203;11133](https://redirect.github.com/pnpm/pnpm/pull/11133).

##### Lockfile

- Simplified `patchedDependencies` lockfile format from `Record<string,
{ path: string, hash: string }>` to `Record<string, string>` (selector
to hash). Existing lockfiles with the old format are automatically
migrated
[#&#8203;10911](https://redirect.github.com/pnpm/pnpm/pull/10911).

##### Other

- The default value of the `type` field in the `package.json` file of
the project initialized by `pnpm init` command has been changed to
`module`.

- Added support for lowercase options in `pnpm add`: `-d`, `-p`, `-o`,
`-e` [#&#8203;9197](https://redirect.github.com/pnpm/pnpm/issues/9197).

  When using the `pnpm add` command only:

  - `-p` is now an alias for `--save-prod` instead of `--parseable`
  - `-d` is now an alias for `--save-dev` instead of `--loglevel=info`

- The root workspace project is no longer excluded when it is explicitly
selected via a filter
[#&#8203;10465](https://redirect.github.com/pnpm/pnpm/pull/10465).

##### Audit

- [`pnpm audit`](https://pnpm.io/11.x/cli/audit) now calls npm's
`/-/npm/v1/security/advisories/bulk` endpoint. The legacy
`/-/npm/v1/security/audits{,/quick}` endpoints have been retired by the
registry, so the legacy request/response contract is no longer
supported.

The bulk endpoint does not return CVE identifiers. CVE-based filtering
has been replaced with GitHub advisory ID (GHSA) filtering:

- `auditConfig.ignoreCves` → `auditConfig.ignoreGhsas` (the previous key
is no longer recognized)
- `pnpm audit --ignore <id>` / `pnpm audit --ignore-unfixable` now read
and write GHSAs instead of CVEs
- GHSAs are derived from each advisory's `url`
(`https://github.com/advisories/GHSA-xxxx-xxxx-xxxx`)

To migrate: replace each `CVE-YYYY-NNNNN` entry in your
`auditConfig.ignoreCves` with the corresponding `GHSA-xxxx-xxxx-xxxx`
value (visible in the `More info` column of `pnpm audit` output) and
move it under `auditConfig.ignoreGhsas`.

##### Package Manager Settings

- **Breaking:** removed the `managePackageManagerVersions`,
`packageManagerStrict`, and `packageManagerStrictVersion` settings. They
existed only to derive the `onFail` behavior for the legacy
`packageManager` field, and the `pmOnFail` setting introduced alongside
[`pnpm with`](https://pnpm.io/11.x/cli/with) subsumes all three — it
directly sets the `onFail` behavior of both `packageManager` and
`devEngines.packageManager`. The `COREPACK_ENABLE_STRICT` environment
variable is no longer honored (it only gated `packageManagerStrict`);
use `pmOnFail` instead.

  Migration:

| Removed setting | Replace with |
| ------------------------------------- | ------------------------------
|
| `managePackageManagerVersions: true` | `pmOnFail: download` (default)
|
| `managePackageManagerVersions: false` | `pmOnFail: ignore` |
| `packageManagerStrict: false` | `pmOnFail: warn` |
| `packageManagerStrictVersion: true` | `pmOnFail: error` |
| `COREPACK_ENABLE_STRICT=0` | `pmOnFail: warn` |

##### Runtime Installs

- Installing a Node.js runtime via `node@runtime:<version>` (including
`pnpm env use` and `pnpm runtime set node`) no longer extracts the
bundled `npm`, `npx`, and `corepack` from the Node.js archive. This cuts
roughly half of the files pnpm has to hash, write to the CAS, and link
during installation, making runtime installs noticeably faster. Users
who still need `npm` can install it as a separate package.

##### Minor Changes

##### New Commands

- Added native [`pnpm view`](https://pnpm.io/11.x/cli/view) (`info`,
`show`, `v`) command for viewing package metadata from the registry
[#&#8203;11064](https://redirect.github.com/pnpm/pnpm/pull/11064).
- Added [`pnpm login`](https://pnpm.io/11.x/cli/login) (and `pnpm
adduser` alias) command for authenticating with npm registries. Supports
web-based login with QR code as well as classic username/password login
[#&#8203;11094](https://redirect.github.com/pnpm/pnpm/pull/11094).
- Added [`pnpm logout`](https://pnpm.io/11.x/cli/logout) command for
logging out of npm registries. Revokes the authentication token on the
registry and removes it from the local auth config file
[#&#8203;11213](https://redirect.github.com/pnpm/pnpm/pull/11213).
- Added native [`pnpm deprecate`](https://pnpm.io/11.x/cli/deprecate)
and `pnpm undeprecate` commands for setting and removing deprecation
messages on package versions without delegating to the npm CLI
[#&#8203;11120](https://redirect.github.com/pnpm/pnpm/pull/11120).
- Added native [`pnpm unpublish`](https://pnpm.io/11.x/cli/unpublish)
command. Supports unpublishing specific versions, version ranges via
semver, and entire packages with `--force`
[#&#8203;11128](https://redirect.github.com/pnpm/pnpm/pull/11128).
- Added native [`pnpm dist-tag`](https://pnpm.io/11.x/cli/dist-tag)
command (`ls`, `add`, `rm` subcommands)
[#&#8203;11218](https://redirect.github.com/pnpm/pnpm/pull/11218).
- Added [`pnpm sbom`](https://pnpm.io/11.x/cli/sbom) command for
generating Software Bill of Materials in CycloneDX 1.7 and SPDX 2.3 JSON
formats
[#&#8203;9088](https://redirect.github.com/pnpm/pnpm/issues/9088).
- Added [`pnpm clean`](https://pnpm.io/11.x/cli/clean) command that
safely removes `node_modules` directories from all workspace projects
[#&#8203;10707](https://redirect.github.com/pnpm/pnpm/issues/10707). Use
`--lockfile` to also remove `pnpm-lock.yaml` files.
- Added a new command [`pnpm runtime set <runtime name> <runtime version
spec> [-g]`](https://pnpm.io/11.x/cli/runtime) for installing runtimes.
Deprecated `pnpm env use` in favor of the new command.
- Added the ability to fix vulnerabilities by updating packages in the
lockfile instead of adding overrides. Use [`pnpm audit
--fix=update`](https://pnpm.io/11.x/cli/audit)
[#&#8203;10341](https://redirect.github.com/pnpm/pnpm/pull/10341).
- Added [`pnpm ci`](https://pnpm.io/11.x/cli/ci) command for clean
installs
[#&#8203;6100](https://redirect.github.com/pnpm/pnpm/issues/6100). The
command runs `pnpm clean` followed by `pnpm install --frozen-lockfile`.
Designed for CI/CD environments where reproducible builds are critical.
Aliases: `pnpm clean-install`, `pnpm ic`, `pnpm install-clean`
[#&#8203;11003](https://redirect.github.com/pnpm/pnpm/pull/11003).
- Added [`pnpm peers check`](https://pnpm.io/11.x/cli/peers) command
that checks for unmet and missing peer dependency issues by reading the
lockfile
[#&#8203;7087](https://redirect.github.com/pnpm/pnpm/issues/7087).
- Implemented the [`version`](https://pnpm.io/11.x/cli/version) command
natively in pnpm to support workspaces and `workspace:` protocols
correctly. The new command allows bumping package versions (major,
minor, patch, etc.) with full workspace support and git integration
[#&#8203;10879](https://redirect.github.com/pnpm/pnpm/pull/10879).
- [`pnpm audit --fix`](https://pnpm.io/11.x/cli/audit) now supports a
new interactive mode via `--interactive`/`-i`.
- Added the [`pnpm docs`](https://pnpm.io/11.x/cli/docs) command and its
alias `pnpm home`. This command opens the package documentation or
homepage in the browser. When the package has no valid homepage, it
falls back to `https://npmx.dev/package/<name>`.
- Added native [`pnpm ping`](https://pnpm.io/11.x/cli/ping) command to
test registry connectivity. Provides a simple way to verify connectivity
to the configured registry without requiring external tools.
- Implemented native [`search`](https://pnpm.io/11.x/cli/search) command
and its aliases (`s`, `se`, `find`).
- Implemented native [`star`, `unstar`,
`stars`](https://pnpm.io/11.x/cli/star), and
[`whoami`](https://pnpm.io/11.x/cli/whoami) commands.
- Add [`pnpm with <version|current>
<args...>`](https://pnpm.io/11.x/cli/with) command. Runs pnpm at a
specific version (or the currently active one) for a single invocation,
bypassing the project's `packageManager` and `devEngines.packageManager`
pins.
- Added a new [`pnpm pack-app`](https://pnpm.io/11.x/cli/pack-app)
command that packs a CommonJS entry file into a standalone executable
for one or more target platforms, using the [Node.js Single Executable
Applications](https://nodejs.org/api/single-executable-applications.html)
API under the hood.

##### Configuration

- Added support for a global YAML config file named `config.yaml`.

  Configuration is now split into two categories:

- Registry and auth settings, which can be stored in INI files such as
the global `rc` file and local `.npmrc`.
- pnpm-specific settings, which can only be loaded from YAML files such
as the global `config.yaml` and local `pnpm-workspace.yaml`.

- Added support for loading environment variables whose names start with
`pnpm_config_` into config. These environment variables override
settings from `pnpm-workspace.yaml` but not CLI arguments.

- Added support for reading `allowBuilds` from `pnpm-workspace.yaml` in
the global package directory for global installs.

- Added support for `pnpm config get globalconfig` to retrieve the
global config file path
[#&#8203;9977](https://redirect.github.com/pnpm/pnpm/issues/9977).

- Added a new setting `virtualStoreOnly` that populates the virtual
store without creating importer symlinks, hoisting, bin links, or
running lifecycle scripts. This is useful for pre-populating a store
(e.g., in Nix builds) without creating unnecessary project-level
artifacts. `pnpm fetch` now uses this mode internally
[#&#8203;10840](https://redirect.github.com/pnpm/pnpm/issues/10840).

- Added support for specifying the pnpm version via
`devEngines.packageManager` in `package.json`. Unlike the
`packageManager` field, this supports version ranges. The resolved
version is stored in `pnpm-lock.yaml` and reused if it still satisfies
the range
[#&#8203;10932](https://redirect.github.com/pnpm/pnpm/pull/10932).

- Added a new `dedupePeers` setting that reduces peer dependency
duplication. When enabled, peer dependency suffixes use version-only
identif

> ✂ **Note**
> 
> PR body was truncated to here.


</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/London)

- Branch creation
  - "before 6pm on friday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/alunduil/woodland-generators).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzkuMyIsInVwZGF0ZWRJblZlciI6IjQzLjE3OS4zIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbImF1dG9tYXRlZCIsImRlcGVuZGVuY2llcyIsIm5wbSJdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
renovate Bot added a commit to oxc-project/eslint-plugin-oxlint that referenced this pull request May 17, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Adoption](https://docs.renovatebot.com/merge-confidence/) |
[Passing](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|---|---|
| [@vitest/coverage-v8](https://vitest.dev/guide/coverage)
([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8))
| [`4.1.5` →
`4.1.6`](https://renovatebot.com/diffs/npm/@vitest%2fcoverage-v8/4.1.5/4.1.6)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@vitest%2fcoverage-v8/4.1.6?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@vitest%2fcoverage-v8/4.1.6?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@vitest%2fcoverage-v8/4.1.5/4.1.6?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@vitest%2fcoverage-v8/4.1.5/4.1.6?slim=true)
|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`11.0.4` →
`11.1.2`](https://renovatebot.com/diffs/npm/pnpm/11.0.4/11.1.2) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.2?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/pnpm/11.1.2?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/pnpm/11.0.4/11.1.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.0.4/11.1.2?slim=true)
|
|
[typescript-eslint](https://typescript-eslint.io/packages/typescript-eslint)
([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint))
| [`8.59.2` →
`8.59.3`](https://renovatebot.com/diffs/npm/typescript-eslint/8.59.2/8.59.3)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/typescript-eslint/8.59.3?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/typescript-eslint/8.59.3?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/typescript-eslint/8.59.2/8.59.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/typescript-eslint/8.59.2/8.59.3?slim=true)
|

---

### Release Notes

<details>
<summary>vitest-dev/vitest (@&#8203;vitest/coverage-v8)</summary>

###
[`v4.1.6`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.6)

[Compare
Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.5...v4.1.6)

#####    🐞 Bug Fixes

- **browser**: Provide project reference in
`ToMatchScreenshotResolvePath`  -  by
[@&#8203;macarie](https://redirect.github.com/macarie) and
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10138](https://redirect.github.com/vitest-dev/vitest/issues/10138)
[<samp>(31882)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/31882607c)
- Global `sequence.concurrent: true` with top-level `test(..., {
concurrent: false })` + depreacte `sequential` test API and options  - 
by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa), **Codex**
and [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10196](https://redirect.github.com/vitest-dev/vitest/issues/10196)
[<samp>(2847d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/2847dfa2a)
- **browser**: Simplify orchestrator otel carrier  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;10285](https://redirect.github.com/vitest-dev/vitest/issues/10285)
[<samp>(18af9)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/18af98cee)

#####    🏎 Performance

- Stringify diff objects only once  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10276](https://redirect.github.com/vitest-dev/vitest/issues/10276)
[<samp>(9f7b1)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9f7b1528c)

#####     [View changes on
GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.5...v4.1.6)

</details>

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.2`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1112)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.1...v11.1.2)

##### Patch Changes

- `convertEnginesRuntimeToDependencies`: switch the runtime-dependency
write to `Object.defineProperty` so the CodeQL
`js/prototype-polluting-assignment` rule treats the assignment as safe
regardless of the property name (follow-up to
[#&#8203;11609](https://redirect.github.com/pnpm/pnpm/pull/11609)).

- Address CodeQL static-analysis findings: guard manifest dependency
writes against prototype-polluting keys (`__proto__`, `constructor`,
`prototype`), and replace a potentially super-linear semver-detection
regex in registry 404 hints with an O(n) parser.

- Strip `sec-fetch-*` headers from outgoing HTTP requests. These headers
are automatically added by undici's `fetch()` implementation per the
Fetch spec but cause Azure DevOps Artifacts to return HTTP 400 for
uncached upstream packages, as ADO interprets them as browser requests
[#&#8203;11572](https://redirect.github.com/pnpm/pnpm/issues/11572).

- Fix `minimumReleaseAge` handling for cached abbreviated metadata.

The version-spec cache fast path no longer rethrows
`ERR_PNPM_MISSING_TIME` under `strictPublishedByCheck`; it now falls
through to the registry-fetch path, consistent with the adjacent
mtime-gated cache block.

When the registry returns 304 Not Modified for a package whose cached
metadata is abbreviated (no per-version `time`), pnpm now re-fetches
with `fullMetadata: true` if `minimumReleaseAge` is active and the
package was modified after the cutoff. The upgraded metadata is
persisted to disk so subsequent installs don't repeat the fetch.
Previously the abbreviated meta was used as-is and the maturity check
fell back to its warn-and-skip path, silently bypassing the quarantine
and emitting a misleading "metadata is missing the time field" warning.

Closes
[#&#8203;11619](https://redirect.github.com/pnpm/pnpm/issues/11619).

- Fix `pnpm upgrade --interactive --latest -r` not respecting named
catalog groups. Previously, upgrading a dependency using a named catalog
(e.g. `"catalog:foo"`) would incorrectly rewrite `package.json` to
`"catalog:"` and place the updated version in the default catalog
instead of the named one
[#&#8203;10115](https://redirect.github.com/pnpm/pnpm/issues/10115).

- Fixed `optimisticRepeatInstall` skipping `pnpm-lock.yaml` merge
conflict resolution when the existing `node_modules` state appears up to
date.

- Fix `minimumReleaseAge` / `resolutionMode: time-based` installs
failing on lockfiles whose `time:` block is missing entries. The
npm-resolver's peek-from-store fast path now surfaces `publishedAt` from
the lockfile rather than discarding it, and falls through to a registry
metadata fetch when the time-based cutoff can't be computed from the
data on hand.

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

###
[`v11.1.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1110)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.9...v11.1.0)

##### Minor Changes

- Added `pnpm audit signatures` to verify ECDSA registry signatures for
installed packages against keys from `/-/npm/v1/keys`
[#&#8203;7909](https://redirect.github.com/pnpm/pnpm/issues/7909).
Scoped registries are respected, and registries without signing keys are
skipped.

- Added support for installing packages from the [GitHub Packages npm
registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry)
via a built-in `gh:` prefix (e.g. `pnpm add gh:@&#8203;acme/private`),
and, more broadly, for arbitrary named registries in the style of [vlt's
named-registry aliases](https://docs.vlt.sh/cli/registries).
Authentication is picked up from the existing per-URL `.npmrc` entries
(e.g. `//npm.pkg.github.com/:_authToken=...`), so no separate auth
mechanism is required.

Additional aliases — or an override for the built-in `gh` alias, for
GitHub Enterprise Server — can be configured under `namedRegistries` in
`pnpm-workspace.yaml`:

  ```yaml
  namedRegistries:
    gh: https://npm.pkg.github.example.com/
    work: https://npm.work.example.com/
  ```

With this, `work:@&#8203;corp/lib@^2.0.0` resolves against
`https://npm.work.example.com/`.
[#&#8203;8941](https://redirect.github.com/pnpm/pnpm/issues/8941).

- Allow setting sbom spec version using `--sbom-spec-version`
[#&#8203;11389](https://redirect.github.com/pnpm/pnpm/pull/11389).

- Add `--no-runtime` flag (config: `runtime=false`) to skip installing
runtime entries (e.g. Node.js downloaded via `devEngines.runtime`)
without modifying the lockfile. The lockfile keeps the runtime entry so
frozen-lockfile validation still passes; only the runtime fetch and
`.bin` linking are skipped. Useful in CI matrices where the runtime is
provisioned externally (e.g. via `pnpm runtime -g set node <version>`)
before `pnpm install` runs.

- Added the `pnpm bugs` command that opens a package's bug tracker URL
in the browser. With no arguments, it reads the current project's
`package.json`; with one or more package names, it fetches each
package's metadata from the registry and opens its bug tracker. Falls
back to `<repository>/issues` when the `bugs` field is missing
[#&#8203;11279](https://redirect.github.com/pnpm/pnpm/pull/11279).

- Added `pnpm owner` command to manage package owners on the registry.

##### Patch Changes

- Added "published X ago by Y" information to the `pnpm view` command
output, similar to `npm view`. This is useful when comparing against
`minimumReleaseAge`.

  For example, `pnpm view pnpm` now shows:

  ```
  published 17 hours ago by GitHub Actions
  ```

- `pnpm publish` now honors the configured HTTP/HTTPS proxy (including
`https_proxy`/`http_proxy`/`no_proxy` environment variables) when
polling the registry's `doneUrl` during the web-based authentication
flow. Previously the poll bypassed the proxy, causing the registry to
respond `403` from a different source IP and the login to never complete
[#&#8203;11561](https://redirect.github.com/pnpm/pnpm/issues/11561).

- `pnpm add -g` now installs each space-separated package into its own
isolated directory by default. To bundle multiple packages into the same
isolated install (so that they share dependencies and are removed
together), pass them as a comma-separated list. For example:

- `pnpm add -g foo bar` installs `foo` and `bar` as two independent
globals — removing one does not affect the other.
- `pnpm add -g foo,bar qar` bundles `foo` and `bar` into a single
isolated install while `qar` is installed on its own.

Related:
[#&#8203;11587](https://redirect.github.com/pnpm/pnpm/issues/11587).

- `pnpm runtime set <name> <version>` no longer fails in the root of a
multi-package workspace with the `ADDING_TO_ROOT` error. Installing the
workspace root is a valid target for a runtime, so the command now
bypasses that safety check.

- Fix `pnpm --version` hanging for the lifetime of the worker pool after
the version was printed. `main.ts`'s `--version` short-circuit returned
before reaching the command-handler `finally` that calls
`finishWorkers()`, so the worker pool that `switchCliVersion` had
spawned during integrity resolution stayed alive and held the Node event
loop open. The CLI entry now runs `finishWorkers()` from its own
`finally`, so every exit path tears the pool down.

Repro: `pnpm --version` in a workspace whose `devEngines.packageManager`
version already matches the running pnpm + `onFail: "download"`.
`switchCliVersion` resolves the integrity (spawning workers), finds
nothing to swap, returns. The version prints, then the process hangs.

###
[`v11.0.9`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1109)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.8...v11.0.9)

##### Patch Changes

- Fixed installation of GitLab-hosted dependencies. pnpm now downloads
the tarball from
`https://gitlab.com/<user>/<project>/-/archive/<sha>/<project>-<sha>.tar.gz`
instead of the GitLab API endpoint that contained an encoded slash
(`%2F`) between user and project. The encoded slash both triggered `406
Not Acceptable` responses from GitLab and produced virtual store
directory names that Node refused to import
(`ERR_INVALID_MODULE_SPECIFIER`)
[#&#8203;11533](https://redirect.github.com/pnpm/pnpm/issues/11533).
- Honor `NPM_CONFIG_USERCONFIG` (and its lowercase
`npm_config_userconfig` form) as a low-priority fallback when locating
the user-level `.npmrc`. This restores compatibility with environments
that point npm at a custom auth file via that env var — most notably
`actions/setup-node`, which writes registry credentials to
`${runner.temp}/.npmrc` and exports `NPM_CONFIG_USERCONFIG` to reference
it. Without this, GitHub Actions workflows using `actions/setup-node` to
authenticate to private registries broke after upgrading to pnpm v11.
PNPM-prefixed env vars and `npmrcAuthFile` from the global `config.yaml`
continue to take precedence
[#&#8203;11539](https://redirect.github.com/pnpm/pnpm/issues/11539).
- Fix `pnpm pack` not bundling dependencies listed in
`bundleDependencies` (or `bundledDependencies`). The npm-packlist
upgrade in pnpm 11 changed its API to require the caller to pre-populate
the dependency tree, which the wrapper was not doing —
`bundleDependencies` were silently dropped from the tarball
[#&#8203;11519](https://redirect.github.com/pnpm/pnpm/issues/11519).
- Fixed the pnpm CLI crashing with a confusing `SyntaxError: Invalid
regular expression flags` instead of printing a clear "requires Node.js
v22.13" error when launched on an unsupported Node.js version. The
Node.js version check in `bin/pnpm.mjs` was effectively dead code
because the static `import` of the bundled `dist/pnpm.mjs` was hoisted
by the ES module loader and parsed before the check could run
[#&#8203;11546](https://redirect.github.com/pnpm/pnpm/issues/11546).
- Fixed `pnpm --prefix=<dir> install` overwriting the existing
`pnpm-workspace.yaml` in `<dir>` with `set this to true or false`
placeholders. The renamed `--prefix` option (which maps to `dir`) was
not honored when locating the workspace root, so the workspace
manifest's `allowBuilds` settings were not loaded into config and got
clobbered when ignored builds were auto-populated
[#&#8203;11535](https://redirect.github.com/pnpm/pnpm/issues/11535).
- Fixed `pnpm publish --provenance` failing with a 422 from the registry
when the package version contained semver build metadata (e.g.
`1.0.0-canary.0+abc1234`). The `+<build>` segment is now stripped before
packing so that the version embedded in the tarball, the metadata sent
to the registry, and the sigstore provenance subject all agree
[#&#8203;11518](https://redirect.github.com/pnpm/pnpm/issues/11518).

###
[`v11.0.8`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1108)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.7...v11.0.8)

##### Patch Changes

- Restored the heuristic that preserves tarball URLs in `pnpm-lock.yaml`
when they cannot be derived from name+version+registry, even with the
default `lockfileIncludeTarballUrl: false`. Without this, `pnpm install
--frozen-lockfile` from an empty store fails with `ERR_PNPM_FETCH_404`
for packages on registries that serve tarballs from a non-standard path
— most notably GitHub Packages
(`https://npm.pkg.github.com/download/<scope>/<name>/<version>/<hash>`)
and JSR. `lockfileIncludeTarballUrl: true` continues to force the URL
into the lockfile for every package
[#&#8203;11276](https://redirect.github.com/pnpm/pnpm/issues/11276).
- Run `preversion`, `version`, and `postversion` lifecycle scripts for
`pnpm version`.
- Fixed `ERR_PNPM_BAD_TARBALL_SIZE` when a registry serves tarballs with
an end-to-end `Content-Encoding` (e.g. `gzip`). Tarballs are already
compressed, so the fetcher now requests them with `Accept-Encoding:
identity` (matching pnpm v10's effective behavior) and, as defense in
depth against misbehaving servers, no longer enforces the strict
`Content-Length` check when the response declares a `Content-Encoding` —
`Content-Length` in that case refers to the encoded payload, not the
decoded bytes the fetch implementation yields
[#&#8203;11506](https://redirect.github.com/pnpm/pnpm/issues/11506).

###
[`v11.0.7`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1107)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.6...v11.0.7)

##### Patch Changes

- Restore the execute bit on the `node-gyp` shims packed inside
`@pnpm/exe` (`dist/node-gyp-bin/node-gyp`,
`dist/node-gyp-bin/node-gyp.cmd`, and
`dist/node_modules/node-gyp/bin/node-gyp.js`). Without this,
`pnpm/action-setup`'s standalone path (used on runners with Node.js <
22.13) failed any install whose lifecycle script invoked `node-gyp
rebuild` with `sh: 1: node-gyp: Permission denied`
[#&#8203;11483](https://redirect.github.com/pnpm/pnpm/issues/11483).

- Fixed the `pn`, `pnpx`, and `pnx` aliases failing in Git Bash / MSYS2
on Windows when pnpm was installed via `@pnpm/exe` (or after `pnpm
self-update`)
[#&#8203;11486](https://redirect.github.com/pnpm/pnpm/issues/11486).
Running `pnpx` (or `pnx`) printed the cmd.exe banner and dropped the
user into an interactive command prompt instead of running `pnpm dlx`.
The `bin` field rewrite on Windows was pointing those aliases at `.cmd`
files; cmd-shim's Bash shim for a `.cmd` target wraps it in `exec cmd /C
...`, and MSYS2 mangles `/C` into a Windows path before cmd.exe sees it.
The aliases are now `.exe` hardlinks of the SEA binary, which detects
which name it was launched as via `process.execPath` and prepends `dlx`
for `pnpx` / `pnx`.

- Fix `pnpm install` recreating `node_modules` after `pnpm fetch`. `pnpm
fetch` records empty `hoistPattern` and `publicHoistPattern` in
`.modules.yaml`; since v11 removed the explicit-config gate, the
follow-up install treated those as a hoist-pattern change and purged the
modules directory. The fetch step now flags the modules manifest with
`virtualStoreOnly: true` so the next install skips the hoist-pattern
comparison and completes the missing post-import linking in place
[#&#8203;11488](https://redirect.github.com/pnpm/pnpm/issues/11488).

- Pin the integrity of git-hosted tarballs (codeload.github.com,
gitlab.com, bitbucket.org) in the lockfile so that subsequent installs
detect a tampered or substituted tarball and refuse to install it.
Previously the lockfile only stored the tarball URL for git
dependencies, so a compromised git host or a man-in-the-middle could
serve arbitrary code on later installs without lockfile changes.

A new `gitHosted: true` field is recorded on git-hosted tarball
resolutions in the lockfile, letting every reader/writer route them by a
single typed check instead of pattern-matching the tarball URL in each
call site. Lockfiles written by older pnpm versions are enriched on load
(URL fallback) so the field can be relied on uniformly across the
codebase.

- Allow user-level preferences in the global `config.yaml`. The
following settings can now be set in `~/.config/pnpm/config.yaml` (or
via `pnpm config set --location global`) instead of being restricted to
`pnpm-workspace.yaml`: `agent`, `globalVirtualStoreDir`,
`initPackageManager`, `initType`, `registrySupportsTimeField`,
`scriptShell`, `shellEmulator`, `sideEffectsCache`,
`sideEffectsCacheReadonly`, `stateDir`, `strictDepBuilds`,
`trustPolicy`, `trustPolicyExclude`, `trustPolicyIgnoreAfter`,
`updateNotifier`, `useStderr`, `verifyDepsBeforeRun`,
`verifyStoreIntegrity`, `virtualStoreDir`, `virtualStoreDirMaxLength`
[#&#8203;11474](https://redirect.github.com/pnpm/pnpm/issues/11474).

- Make trusted publishing (OIDC) take precedence over a configured
static `_authToken` in `pnpm publish`, mirroring the npm CLI's behavior.
When OIDC succeeds, the OIDC-derived token overrides any pre-configured
`_authToken`; when OIDC is not applicable (no CI environment, exchange
fails, registry has no trusted publisher configured), the static token
is used as a fallback. This applies on every package during recursive
publish, so each workspace package independently attempts trusted
publishing.

Additionally, the `NPM_ID_TOKEN` env var is now honored as a CI-agnostic
injection point for an OIDC ID token. Previously OIDC was only attempted
on GitHub Actions or GitLab; now any CI provider that exposes its own
OIDC mechanism (e.g. CircleCI's `CIRCLE_OIDC_TOKEN_V2`, Buildkite, etc.)
can forward its token via `NPM_ID_TOKEN` and trusted publishing will
work without pnpm needing to recognize the provider explicitly.

- `--pm-on-fail=ignore` (and other universal options like `--loglevel`,
`--reporter`) is now honored when combined with `--help` or `--version`.
Previously the CLI argument parser short-circuited those flags before
universal options were preserved, so `pnpm audit --pm-on-fail=ignore
--help` and `pnpm --pm-on-fail=ignore --version` reported the strict
packageManager mismatch instead of running the requested action
[#&#8203;11487](https://redirect.github.com/pnpm/pnpm/issues/11487).

- Fix a regression where `pnpm --recursive --filter '!<pkg>'
run/exec/test/add` would include the workspace root in the matched
projects. The workspace root is now correctly excluded by default when
only negative `--filter` arguments are provided, matching the
[documented behavior](https://pnpm.io/cli/recursive). To include the
root, pass `--include-workspace-root`
[#&#8203;11341](https://redirect.github.com/pnpm/pnpm/issues/11341).

- Restore npm-CLI-compatible `--json` stdout output for `pnpm publish`
([#&#8203;11476](https://redirect.github.com/pnpm/pnpm/issues/11476)).
pnpm 11 reimplemented publish natively
([#&#8203;10591](https://redirect.github.com/pnpm/pnpm/pull/10591)) and
inadvertently dropped the per-package JSON object that pnpm 10 emitted
transitively via the npm CLI, silently breaking downstream tooling —
most notably `nx release publish`, which parses stdout JSON to confirm
success
([nrwl/nx#35575](https://redirect.github.com/nrwl/nx/issues/35575)). On
success, the output is now:

- `pnpm publish --json` → single object `{ id, name, version, size,
unpackedSize, shasum, integrity, filename, files, entryCount, bundled
}`, mirroring `npm publish --json`.
- `pnpm publish -r --json` → array of those objects, mirroring `pnpm
pack --json`'s shape choice.
- `pnpm publish -r --report-summary` → existing
`pnpm-publish-summary.json` envelope `{ publishedPackages: [...] }` is
preserved, but each entry is upgraded to the same per-package shape
(additive — `name` and `version` are still present).

- `pnpm config get @&#8203;<scope>:registry` now reports the same URL
that `pnpm publish` and the resolvers actually use. Previously, `config
get` only consulted `.npmrc`, while `publish`/install used the merged
map that includes `pnpm-workspace.yaml`'s `registries` block — so the
two could diverge silently and a publish could go to the wrong registry
[#&#8203;11492](https://redirect.github.com/pnpm/pnpm/issues/11492).

###
[`v11.0.6`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1106)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.5...v11.0.6)

##### Patch Changes

- Fix `pnpm_config_npmrc_auth_file` and `pnpm_config_userconfig` env
vars not actually loading the custom `.npmrc`. The env vars were parsed
and assigned to the resolved config, but only after `loadNpmrcConfig`
had already read the default `~/.npmrc` — so the custom file path was
set but never read. The relevant env vars are now consulted before the
user-level `.npmrc` is loaded
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).
- Preserve the original key order in `pnpm-workspace.yaml` when updating
it. Existing keys keep their position, and new keys are inserted in
alphabetical position when the existing keys are already sorted (with a
leading `packages` key allowed) or appended at the end otherwise.
- Fixed `pnpm self-update` on installations originally set up by pnpm
v10. v10 added `PNPM_HOME` directly to PATH and wrote a `pnpm` bootstrap
shim there. v11 setup writes shims under `PNPM_HOME/bin` instead, so
when a v10 user upgrades to v11 the legacy shim at `PNPM_HOME` keeps
pointing into the old `.tools/<version>` install — `pnpm --version`
continues to report the pre-update version even though the new version
was installed under `global/v11`. Self-update now detects this layout,
refreshes the legacy shims so the upgrade actually takes effect, and
prints a hint suggesting `pnpm setup` to migrate PATH to the v11 layout.
[#&#8203;11464](https://redirect.github.com/pnpm/pnpm/issues/11464).
- Print a warning when settings that are not allowed in the global
config file (e.g. `nodeLinker`, `hoistPattern`) are present in
`config.yaml` and silently ignored. Previously these settings were
dropped without any feedback, leaving users unsure why their global
configuration had no effect. The warning suggests moving those settings
to a project-level `pnpm-workspace.yaml`, or sharing them across
projects via [config
dependencies](https://pnpm.io/11.x/config-dependencies).
- Throw a pnpm error when `overrides` has an invalid shape or contains a
non-string value.
- Validate all `readPackage` dependency map fields, including
`devDependencies`, and reject falsy non-object invalid values instead of
silently accepting them.
- Prevent crashes during `pnpm config`, `pnpm set`, and `pnpm get` by
tolerating `configDependencies` install failures. For these commands, a
failure to install `configDependencies` (for example because the
registry auth token has not been written yet) is now logged at debug
level and the command proceeds. All other commands still surface the
install error
[#&#8203;10684](https://redirect.github.com/pnpm/pnpm/issues/10684).
- Treat `allowBuilds` as an install-state input and clear previously
ignored builds when they are explicitly disallowed.
- Fixes
[#&#8203;10594](https://redirect.github.com/pnpm/pnpm/issues/10594),
catalogs not being read from the workspace when using the `catalog:`
protocol with the `pnpm dlx` / `pnpx` command, resulting in a catalog
entry not found error.
- Accept `PNPM_CONFIG_*` (uppercase) environment variables in addition
to `pnpm_config_*`. Previously, only the lowercase form was honored, so
env vars renamed per the v11 migration guide (e.g.
`PNPM_CONFIG_USERCONFIG`) silently had no effect on case-sensitive
systems like macOS and Linux
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).

###
[`v11.0.5`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1105)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.4...v11.0.5)

##### Patch Changes

- Drop the `darwin-x64` artifact from `@pnpm/exe` and from the GitHub
release page. The Node.js SEA mechanism `pnpm pack-app` uses produces a
binary that segfaults at startup on Intel Macs because of an upstream
Node.js bug
([nodejs/node#62893](https://redirect.github.com/nodejs/node/issues/62893),
tracked alongside
[#&#8203;59553](https://redirect.github.com/nodejs/node/issues/59553);
the Node.js team has [opted not to fix
it](https://redirect.github.com/nodejs/node/pull/60250) on the grounds
that x64 macOS is being phased out). Re-signing with `codesign` or
`ldid` doesn't help — the corruption is in LIEF's Mach-O surgery, before
signing.

Intel Mac users should install pnpm via `npm install -g pnpm` (uses the
system Node.js, no SEA), or stay on pnpm 10.x. `@pnpm/exe`'s preinstall
on Intel Mac now exits with a clear error pointing at these
alternatives.

Closes
[#&#8203;11423](https://redirect.github.com/pnpm/pnpm/issues/11423).

- `pnpm dlx` (and `pnpx`/`pnx`/`pnpm create`) now runs the same
interactive `approve-builds` prompt as `pnpm add -g` when the package
being launched depends on transitive packages with install scripts.
Previously, the v11 `strictDepBuilds` default made dlx fail with
`ERR_PNPM_IGNORED_BUILDS` and required users to re-run with
`--allow-build=<pkg>` for every offending dependency. dlx also now
removes the partially-populated cache directory when the install fails,
so a subsequent run starts clean instead of reusing a broken install
whose builds were silently skipped
[#&#8203;11444](https://redirect.github.com/pnpm/pnpm/issues/11444).

- [`72629fc`](https://redirect.github.com/pnpm/pnpm/commit/72629fc): Fix
`pnpm -g ls --json` and `pnpm -g ls --parseable` so they emit valid JSON
and parseable output respectively, matching pnpm 10 behavior. Since the
isolated global packages refactor in pnpm 11, the global list command
had a custom path that always printed plain text and ignored
`--json`/`--parseable`, which broke tools like `npm-check-updates` that
parse the JSON output
[#&#8203;11440](https://redirect.github.com/pnpm/pnpm/issues/11440).

`pnpm -g ls --depth=<n>` (with n > 0) now errors when more than one
isolated global install would be involved, since each install has its
own lockfile and merging their transitive trees would be incoherent.
When the request can be narrowed to a single install group, the regular
`list` flow is used and the full dependency tree is shown.

- Fixed `pnpm publish` to honor `publishConfig.registry` from
`package.json` when publishing a single package. The native publish flow
introduced in v11 was reading the registry from `.npmrc` only, ignoring
the per-package override
[#&#8203;11419](https://redirect.github.com/pnpm/pnpm/issues/11419).

- When `strictPeerDependencies` is `true`, the
`ERR_PNPM_PEER_DEP_ISSUES` error once again renders the peer dependency
issues inline using the same format as `pnpm peers check`, so users (and
CI tools like Renovate) can see what failed without running `pnpm peers
check` separately
[#&#8203;11439](https://redirect.github.com/pnpm/pnpm/issues/11439).

- The `WARN` and error code labels in pnpm's output now wrap in brackets
(`[WARN]`, `[ERR_PNPM_FOO]`). Previously the labels relied entirely on a
colored background to stand out, which meant they blended into the
surrounding text in terminals without color (e.g. when `NO_COLOR` is set
or output is piped). The brackets are painted in the same color as the
badge background, so they appear as ordinary padding in color-capable
terminals — only the no-color rendering changes.

</details>

<details>
<summary>typescript-eslint/typescript-eslint
(typescript-eslint)</summary>

###
[`v8.59.3`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/typescript-eslint/CHANGELOG.md#8593-2026-05-11)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.59.2...v8.59.3)

This was a version bump only for typescript-eslint to align it with
other projects, there were no code changes.

See [GitHub
Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.3)
for more information.

You can read about our [versioning
strategy](https://typescript-eslint.io/users/versioning) and
[releases](https://typescript-eslint.io/users/releases) on our website.

</details>

---

### Configuration

📅 **Schedule**: (in timezone Asia/Shanghai)

- Branch creation
  - "before 10am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/oxc-project/eslint-plugin-oxlint).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzkuMyIsInVwZGF0ZWRJblZlciI6IjQzLjE3OS4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
alunduil pushed a commit to dungeon-studio/genshin.dungeon.studio that referenced this pull request May 17, 2026
> ℹ️ **Note**
> 
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| @&#8203;types/content-type | [`1.1.9` →
`2.0.0`](https://renovatebot.com/diffs/npm/@types%2fcontent-type/1.1.9/2.0.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fcontent-type/2.0.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fcontent-type/1.1.9/2.0.0?slim=true)
|
| [content-type](https://redirect.github.com/jshttp/content-type) |
[`1.0.5` →
`2.0.0`](https://renovatebot.com/diffs/npm/content-type/1.0.5/2.0.0) |
![age](https://developer.mend.io/api/mc/badges/age/npm/content-type/2.0.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/content-type/1.0.5/2.0.0?slim=true)
|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
[`10.33.4` →
`11.1.2`](https://renovatebot.com/diffs/npm/pnpm/10.33.4/11.1.2) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/10.33.4/11.1.2?slim=true)
|

---

### Release Notes

<details>
<summary>jshttp/content-type (content-type)</summary>

###
[`v2.0.0`](https://redirect.github.com/jshttp/content-type/releases/tag/v2.0.0)

[Compare
Source](https://redirect.github.com/jshttp/content-type/compare/v1.0.5...v2.0.0)

Rewrite package to be 3x faster and support lenient parsing. No longer
errors during `parse`, so you *must* validate things like `type` after
parsing before using it blindly.

**Changed**

- Only accept first parameter by name
([#&#8203;67](https://redirect.github.com/jshttp/content-type/issues/67))
[`ac5ba17`](https://redirect.github.com/jshttp/content-type/commit/ac5ba17)
- Null object perf optimization
([#&#8203;62](https://redirect.github.com/jshttp/content-type/issues/62))
[`427eb1b`](https://redirect.github.com/jshttp/content-type/commit/427eb1b)

**Added**

- Add parameters option to parse
([#&#8203;61](https://redirect.github.com/jshttp/content-type/issues/61))
[`5f65f1c`](https://redirect.github.com/jshttp/content-type/commit/5f65f1c)
  - Set `parameters: false` to only extract `type` when parsing

***

</details>

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.2`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1112)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.1...v11.1.2)

##### Patch Changes

- `convertEnginesRuntimeToDependencies`: switch the runtime-dependency
write to `Object.defineProperty` so the CodeQL
`js/prototype-polluting-assignment` rule treats the assignment as safe
regardless of the property name (follow-up to
[#&#8203;11609](https://redirect.github.com/pnpm/pnpm/pull/11609)).

- Address CodeQL static-analysis findings: guard manifest dependency
writes against prototype-polluting keys (`__proto__`, `constructor`,
`prototype`), and replace a potentially super-linear semver-detection
regex in registry 404 hints with an O(n) parser.

- Strip `sec-fetch-*` headers from outgoing HTTP requests. These headers
are automatically added by undici's `fetch()` implementation per the
Fetch spec but cause Azure DevOps Artifacts to return HTTP 400 for
uncached upstream packages, as ADO interprets them as browser requests
[#&#8203;11572](https://redirect.github.com/pnpm/pnpm/issues/11572).

- Fix `minimumReleaseAge` handling for cached abbreviated metadata.

The version-spec cache fast path no longer rethrows
`ERR_PNPM_MISSING_TIME` under `strictPublishedByCheck`; it now falls
through to the registry-fetch path, consistent with the adjacent
mtime-gated cache block.

When the registry returns 304 Not Modified for a package whose cached
metadata is abbreviated (no per-version `time`), pnpm now re-fetches
with `fullMetadata: true` if `minimumReleaseAge` is active and the
package was modified after the cutoff. The upgraded metadata is
persisted to disk so subsequent installs don't repeat the fetch.
Previously the abbreviated meta was used as-is and the maturity check
fell back to its warn-and-skip path, silently bypassing the quarantine
and emitting a misleading "metadata is missing the time field" warning.

Closes
[#&#8203;11619](https://redirect.github.com/pnpm/pnpm/issues/11619).

- Fix `pnpm upgrade --interactive --latest -r` not respecting named
catalog groups. Previously, upgrading a dependency using a named catalog
(e.g. `"catalog:foo"`) would incorrectly rewrite `package.json` to
`"catalog:"` and place the updated version in the default catalog
instead of the named one
[#&#8203;10115](https://redirect.github.com/pnpm/pnpm/issues/10115).

- Fixed `optimisticRepeatInstall` skipping `pnpm-lock.yaml` merge
conflict resolution when the existing `node_modules` state appears up to
date.

- Fix `minimumReleaseAge` / `resolutionMode: time-based` installs
failing on lockfiles whose `time:` block is missing entries. The
npm-resolver's peek-from-store fast path now surfaces `publishedAt` from
the lockfile rather than discarding it, and falls through to a registry
metadata fetch when the time-based cutoff can't be computed from the
data on hand.

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

###
[`v11.1.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1110)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.9...v11.1.0)

##### Minor Changes

- Added `pnpm audit signatures` to verify ECDSA registry signatures for
installed packages against keys from `/-/npm/v1/keys`
[#&#8203;7909](https://redirect.github.com/pnpm/pnpm/issues/7909).
Scoped registries are respected, and registries without signing keys are
skipped.

- Added support for installing packages from the [GitHub Packages npm
registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry)
via a built-in `gh:` prefix (e.g. `pnpm add gh:@&#8203;acme/private`),
and, more broadly, for arbitrary named registries in the style of [vlt's
named-registry aliases](https://docs.vlt.sh/cli/registries).
Authentication is picked up from the existing per-URL `.npmrc` entries
(e.g. `//npm.pkg.github.com/:_authToken=...`), so no separate auth
mechanism is required.

Additional aliases — or an override for the built-in `gh` alias, for
GitHub Enterprise Server — can be configured under `namedRegistries` in
`pnpm-workspace.yaml`:

  ```yaml
  namedRegistries:
    gh: https://npm.pkg.github.example.com/
    work: https://npm.work.example.com/
  ```

With this, `work:@&#8203;corp/lib@^2.0.0` resolves against
`https://npm.work.example.com/`.
[#&#8203;8941](https://redirect.github.com/pnpm/pnpm/issues/8941).

- Allow setting sbom spec version using `--sbom-spec-version`
[#&#8203;11389](https://redirect.github.com/pnpm/pnpm/pull/11389).

- Add `--no-runtime` flag (config: `runtime=false`) to skip installing
runtime entries (e.g. Node.js downloaded via `devEngines.runtime`)
without modifying the lockfile. The lockfile keeps the runtime entry so
frozen-lockfile validation still passes; only the runtime fetch and
`.bin` linking are skipped. Useful in CI matrices where the runtime is
provisioned externally (e.g. via `pnpm runtime -g set node <version>`)
before `pnpm install` runs.

- Added the `pnpm bugs` command that opens a package's bug tracker URL
in the browser. With no arguments, it reads the current project's
`package.json`; with one or more package names, it fetches each
package's metadata from the registry and opens its bug tracker. Falls
back to `<repository>/issues` when the `bugs` field is missing
[#&#8203;11279](https://redirect.github.com/pnpm/pnpm/pull/11279).

- Added `pnpm owner` command to manage package owners on the registry.

##### Patch Changes

- Added "published X ago by Y" information to the `pnpm view` command
output, similar to `npm view`. This is useful when comparing against
`minimumReleaseAge`.

  For example, `pnpm view pnpm` now shows:

  ```
  published 17 hours ago by GitHub Actions
  ```

- `pnpm publish` now honors the configured HTTP/HTTPS proxy (including
`https_proxy`/`http_proxy`/`no_proxy` environment variables) when
polling the registry's `doneUrl` during the web-based authentication
flow. Previously the poll bypassed the proxy, causing the registry to
respond `403` from a different source IP and the login to never complete
[#&#8203;11561](https://redirect.github.com/pnpm/pnpm/issues/11561).

- `pnpm add -g` now installs each space-separated package into its own
isolated directory by default. To bundle multiple packages into the same
isolated install (so that they share dependencies and are removed
together), pass them as a comma-separated list. For example:

- `pnpm add -g foo bar` installs `foo` and `bar` as two independent
globals — removing one does not affect the other.
- `pnpm add -g foo,bar qar` bundles `foo` and `bar` into a single
isolated install while `qar` is installed on its own.

Related:
[#&#8203;11587](https://redirect.github.com/pnpm/pnpm/issues/11587).

- `pnpm runtime set <name> <version>` no longer fails in the root of a
multi-package workspace with the `ADDING_TO_ROOT` error. Installing the
workspace root is a valid target for a runtime, so the command now
bypasses that safety check.

- Fix `pnpm --version` hanging for the lifetime of the worker pool after
the version was printed. `main.ts`'s `--version` short-circuit returned
before reaching the command-handler `finally` that calls
`finishWorkers()`, so the worker pool that `switchCliVersion` had
spawned during integrity resolution stayed alive and held the Node event
loop open. The CLI entry now runs `finishWorkers()` from its own
`finally`, so every exit path tears the pool down.

Repro: `pnpm --version` in a workspace whose `devEngines.packageManager`
version already matches the running pnpm + `onFail: "download"`.
`switchCliVersion` resolves the integrity (spawning workers), finds
nothing to swap, returns. The version prints, then the process hangs.

###
[`v11.0.9`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1109)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.8...v11.0.9)

##### Patch Changes

- Fixed installation of GitLab-hosted dependencies. pnpm now downloads
the tarball from
`https://gitlab.com/<user>/<project>/-/archive/<sha>/<project>-<sha>.tar.gz`
instead of the GitLab API endpoint that contained an encoded slash
(`%2F`) between user and project. The encoded slash both triggered `406
Not Acceptable` responses from GitLab and produced virtual store
directory names that Node refused to import
(`ERR_INVALID_MODULE_SPECIFIER`)
[#&#8203;11533](https://redirect.github.com/pnpm/pnpm/issues/11533).
- Honor `NPM_CONFIG_USERCONFIG` (and its lowercase
`npm_config_userconfig` form) as a low-priority fallback when locating
the user-level `.npmrc`. This restores compatibility with environments
that point npm at a custom auth file via that env var — most notably
`actions/setup-node`, which writes registry credentials to
`${runner.temp}/.npmrc` and exports `NPM_CONFIG_USERCONFIG` to reference
it. Without this, GitHub Actions workflows using `actions/setup-node` to
authenticate to private registries broke after upgrading to pnpm v11.
PNPM-prefixed env vars and `npmrcAuthFile` from the global `config.yaml`
continue to take precedence
[#&#8203;11539](https://redirect.github.com/pnpm/pnpm/issues/11539).
- Fix `pnpm pack` not bundling dependencies listed in
`bundleDependencies` (or `bundledDependencies`). The npm-packlist
upgrade in pnpm 11 changed its API to require the caller to pre-populate
the dependency tree, which the wrapper was not doing —
`bundleDependencies` were silently dropped from the tarball
[#&#8203;11519](https://redirect.github.com/pnpm/pnpm/issues/11519).
- Fixed the pnpm CLI crashing with a confusing `SyntaxError: Invalid
regular expression flags` instead of printing a clear "requires Node.js
v22.13" error when launched on an unsupported Node.js version. The
Node.js version check in `bin/pnpm.mjs` was effectively dead code
because the static `import` of the bundled `dist/pnpm.mjs` was hoisted
by the ES module loader and parsed before the check could run
[#&#8203;11546](https://redirect.github.com/pnpm/pnpm/issues/11546).
- Fixed `pnpm --prefix=<dir> install` overwriting the existing
`pnpm-workspace.yaml` in `<dir>` with `set this to true or false`
placeholders. The renamed `--prefix` option (which maps to `dir`) was
not honored when locating the workspace root, so the workspace
manifest's `allowBuilds` settings were not loaded into config and got
clobbered when ignored builds were auto-populated
[#&#8203;11535](https://redirect.github.com/pnpm/pnpm/issues/11535).
- Fixed `pnpm publish --provenance` failing with a 422 from the registry
when the package version contained semver build metadata (e.g.
`1.0.0-canary.0+abc1234`). The `+<build>` segment is now stripped before
packing so that the version embedded in the tarball, the metadata sent
to the registry, and the sigstore provenance subject all agree
[#&#8203;11518](https://redirect.github.com/pnpm/pnpm/issues/11518).

###
[`v11.0.8`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1108)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.7...v11.0.8)

##### Patch Changes

- Restored the heuristic that preserves tarball URLs in `pnpm-lock.yaml`
when they cannot be derived from name+version+registry, even with the
default `lockfileIncludeTarballUrl: false`. Without this, `pnpm install
--frozen-lockfile` from an empty store fails with `ERR_PNPM_FETCH_404`
for packages on registries that serve tarballs from a non-standard path
— most notably GitHub Packages
(`https://npm.pkg.github.com/download/<scope>/<name>/<version>/<hash>`)
and JSR. `lockfileIncludeTarballUrl: true` continues to force the URL
into the lockfile for every package
[#&#8203;11276](https://redirect.github.com/pnpm/pnpm/issues/11276).
- Run `preversion`, `version`, and `postversion` lifecycle scripts for
`pnpm version`.
- Fixed `ERR_PNPM_BAD_TARBALL_SIZE` when a registry serves tarballs with
an end-to-end `Content-Encoding` (e.g. `gzip`). Tarballs are already
compressed, so the fetcher now requests them with `Accept-Encoding:
identity` (matching pnpm v10's effective behavior) and, as defense in
depth against misbehaving servers, no longer enforces the strict
`Content-Length` check when the response declares a `Content-Encoding` —
`Content-Length` in that case refers to the encoded payload, not the
decoded bytes the fetch implementation yields
[#&#8203;11506](https://redirect.github.com/pnpm/pnpm/issues/11506).

###
[`v11.0.7`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1107)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.6...v11.0.7)

##### Patch Changes

- Restore the execute bit on the `node-gyp` shims packed inside
`@pnpm/exe` (`dist/node-gyp-bin/node-gyp`,
`dist/node-gyp-bin/node-gyp.cmd`, and
`dist/node_modules/node-gyp/bin/node-gyp.js`). Without this,
`pnpm/action-setup`'s standalone path (used on runners with Node.js <
22.13) failed any install whose lifecycle script invoked `node-gyp
rebuild` with `sh: 1: node-gyp: Permission denied`
[#&#8203;11483](https://redirect.github.com/pnpm/pnpm/issues/11483).

- Fixed the `pn`, `pnpx`, and `pnx` aliases failing in Git Bash / MSYS2
on Windows when pnpm was installed via `@pnpm/exe` (or after `pnpm
self-update`)
[#&#8203;11486](https://redirect.github.com/pnpm/pnpm/issues/11486).
Running `pnpx` (or `pnx`) printed the cmd.exe banner and dropped the
user into an interactive command prompt instead of running `pnpm dlx`.
The `bin` field rewrite on Windows was pointing those aliases at `.cmd`
files; cmd-shim's Bash shim for a `.cmd` target wraps it in `exec cmd /C
...`, and MSYS2 mangles `/C` into a Windows path before cmd.exe sees it.
The aliases are now `.exe` hardlinks of the SEA binary, which detects
which name it was launched as via `process.execPath` and prepends `dlx`
for `pnpx` / `pnx`.

- Fix `pnpm install` recreating `node_modules` after `pnpm fetch`. `pnpm
fetch` records empty `hoistPattern` and `publicHoistPattern` in
`.modules.yaml`; since v11 removed the explicit-config gate, the
follow-up install treated those as a hoist-pattern change and purged the
modules directory. The fetch step now flags the modules manifest with
`virtualStoreOnly: true` so the next install skips the hoist-pattern
comparison and completes the missing post-import linking in place
[#&#8203;11488](https://redirect.github.com/pnpm/pnpm/issues/11488).

- Pin the integrity of git-hosted tarballs (codeload.github.com,
gitlab.com, bitbucket.org) in the lockfile so that subsequent installs
detect a tampered or substituted tarball and refuse to install it.
Previously the lockfile only stored the tarball URL for git
dependencies, so a compromised git host or a man-in-the-middle could
serve arbitrary code on later installs without lockfile changes.

A new `gitHosted: true` field is recorded on git-hosted tarball
resolutions in the lockfile, letting every reader/writer route them by a
single typed check instead of pattern-matching the tarball URL in each
call site. Lockfiles written by older pnpm versions are enriched on load
(URL fallback) so the field can be relied on uniformly across the
codebase.

- Allow user-level preferences in the global `config.yaml`. The
following settings can now be set in `~/.config/pnpm/config.yaml` (or
via `pnpm config set --location global`) instead of being restricted to
`pnpm-workspace.yaml`: `agent`, `globalVirtualStoreDir`,
`initPackageManager`, `initType`, `registrySupportsTimeField`,
`scriptShell`, `shellEmulator`, `sideEffectsCache`,
`sideEffectsCacheReadonly`, `stateDir`, `strictDepBuilds`,
`trustPolicy`, `trustPolicyExclude`, `trustPolicyIgnoreAfter`,
`updateNotifier`, `useStderr`, `verifyDepsBeforeRun`,
`verifyStoreIntegrity`, `virtualStoreDir`, `virtualStoreDirMaxLength`
[#&#8203;11474](https://redirect.github.com/pnpm/pnpm/issues/11474).

- Make trusted publishing (OIDC) take precedence over a configured
static `_authToken` in `pnpm publish`, mirroring the npm CLI's behavior.
When OIDC succeeds, the OIDC-derived token overrides any pre-configured
`_authToken`; when OIDC is not applicable (no CI environment, exchange
fails, registry has no trusted publisher configured), the static token
is used as a fallback. This applies on every package during recursive
publish, so each workspace package independently attempts trusted
publishing.

Additionally, the `NPM_ID_TOKEN` env var is now honored as a CI-agnostic
injection point for an OIDC ID token. Previously OIDC was only attempted
on GitHub Actions or GitLab; now any CI provider that exposes its own
OIDC mechanism (e.g. CircleCI's `CIRCLE_OIDC_TOKEN_V2`, Buildkite, etc.)
can forward its token via `NPM_ID_TOKEN` and trusted publishing will
work without pnpm needing to recognize the provider explicitly.

- `--pm-on-fail=ignore` (and other universal options like `--loglevel`,
`--reporter`) is now honored when combined with `--help` or `--version`.
Previously the CLI argument parser short-circuited those flags before
universal options were preserved, so `pnpm audit --pm-on-fail=ignore
--help` and `pnpm --pm-on-fail=ignore --version` reported the strict
packageManager mismatch instead of running the requested action
[#&#8203;11487](https://redirect.github.com/pnpm/pnpm/issues/11487).

- Fix a regression where `pnpm --recursive --filter '!<pkg>'
run/exec/test/add` would include the workspace root in the matched
projects. The workspace root is now correctly excluded by default when
only negative `--filter` arguments are provided, matching the
[documented behavior](https://pnpm.io/cli/recursive). To include the
root, pass `--include-workspace-root`
[#&#8203;11341](https://redirect.github.com/pnpm/pnpm/issues/11341).

- Restore npm-CLI-compatible `--json` stdout output for `pnpm publish`
([#&#8203;11476](https://redirect.github.com/pnpm/pnpm/issues/11476)).
pnpm 11 reimplemented publish natively
([#&#8203;10591](https://redirect.github.com/pnpm/pnpm/pull/10591)) and
inadvertently dropped the per-package JSON object that pnpm 10 emitted
transitively via the npm CLI, silently breaking downstream tooling —
most notably `nx release publish`, which parses stdout JSON to confirm
success
([nrwl/nx#35575](https://redirect.github.com/nrwl/nx/issues/35575)). On
success, the output is now:

- `pnpm publish --json` → single object `{ id, name, version, size,
unpackedSize, shasum, integrity, filename, files, entryCount, bundled
}`, mirroring `npm publish --json`.
- `pnpm publish -r --json` → array of those objects, mirroring `pnpm
pack --json`'s shape choice.
- `pnpm publish -r --report-summary` → existing
`pnpm-publish-summary.json` envelope `{ publishedPackages: [...] }` is
preserved, but each entry is upgraded to the same per-package shape
(additive — `name` and `version` are still present).

- `pnpm config get @&#8203;<scope>:registry` now reports the same URL
that `pnpm publish` and the resolvers actually use. Previously, `config
get` only consulted `.npmrc`, while `publish`/install used the merged
map that includes `pnpm-workspace.yaml`'s `registries` block — so the
two could diverge silently and a publish could go to the wrong registry
[#&#8203;11492](https://redirect.github.com/pnpm/pnpm/issues/11492).

###
[`v11.0.6`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1106)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.5...v11.0.6)

##### Patch Changes

- Fix `pnpm_config_npmrc_auth_file` and `pnpm_config_userconfig` env
vars not actually loading the custom `.npmrc`. The env vars were parsed
and assigned to the resolved config, but only after `loadNpmrcConfig`
had already read the default `~/.npmrc` — so the custom file path was
set but never read. The relevant env vars are now consulted before the
user-level `.npmrc` is loaded
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).
- Preserve the original key order in `pnpm-workspace.yaml` when updating
it. Existing keys keep their position, and new keys are inserted in
alphabetical position when the existing keys are already sorted (with a
leading `packages` key allowed) or appended at the end otherwise.
- Fixed `pnpm self-update` on installations originally set up by pnpm
v10. v10 added `PNPM_HOME` directly to PATH and wrote a `pnpm` bootstrap
shim there. v11 setup writes shims under `PNPM_HOME/bin` instead, so
when a v10 user upgrades to v11 the legacy shim at `PNPM_HOME` keeps
pointing into the old `.tools/<version>` install — `pnpm --version`
continues to report the pre-update version even though the new version
was installed under `global/v11`. Self-update now detects this layout,
refreshes the legacy shims so the upgrade actually takes effect, and
prints a hint suggesting `pnpm setup` to migrate PATH to the v11 layout.
[#&#8203;11464](https://redirect.github.com/pnpm/pnpm/issues/11464).
- Print a warning when settings that are not allowed in the global
config file (e.g. `nodeLinker`, `hoistPattern`) are present in
`config.yaml` and silently ignored. Previously these settings were
dropped without any feedback, leaving users unsure why their global
configuration had no effect. The warning suggests moving those settings
to a project-level `pnpm-workspace.yaml`, or sharing them across
projects via [config
dependencies](https://pnpm.io/11.x/config-dependencies).
- Throw a pnpm error when `overrides` has an invalid shape or contains a
non-string value.
- Validate all `readPackage` dependency map fields, including
`devDependencies`, and reject falsy non-object invalid values instead of
silently accepting them.
- Prevent crashes during `pnpm config`, `pnpm set`, and `pnpm get` by
tolerating `configDependencies` install failures. For these commands, a
failure to install `configDependencies` (for example because the
registry auth token has not been written yet) is now logged at debug
level and the command proceeds. All other commands still surface the
install error
[#&#8203;10684](https://redirect.github.com/pnpm/pnpm/issues/10684).
- Treat `allowBuilds` as an install-state input and clear previously
ignored builds when they are explicitly disallowed.
- Fixes
[#&#8203;10594](https://redirect.github.com/pnpm/pnpm/issues/10594),
catalogs not being read from the workspace when using the `catalog:`
protocol with the `pnpm dlx` / `pnpx` command, resulting in a catalog
entry not found error.
- Accept `PNPM_CONFIG_*` (uppercase) environment variables in addition
to `pnpm_config_*`. Previously, only the lowercase form was honored, so
env vars renamed per the v11 migration guide (e.g.
`PNPM_CONFIG_USERCONFIG`) silently had no effect on case-sensitive
systems like macOS and Linux
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).

###
[`v11.0.5`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1105)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.4...v11.0.5)

##### Patch Changes

- Drop the `darwin-x64` artifact from `@pnpm/exe` and from the GitHub
release page. The Node.js SEA mechanism `pnpm pack-app` uses produces a
binary that segfaults at startup on Intel Macs because of an upstream
Node.js bug
([nodejs/node#62893](https://redirect.github.com/nodejs/node/issues/62893),
tracked alongside
[#&#8203;59553](https://redirect.github.com/nodejs/node/issues/59553);
the Node.js team has [opted not to fix
it](https://redirect.github.com/nodejs/node/pull/60250) on the grounds
that x64 macOS is being phased out). Re-signing with `codesign` or
`ldid` doesn't help — the corruption is in LIEF's Mach-O surgery, before
signing.

Intel Mac users should install pnpm via `npm install -g pnpm` (uses the
system Node.js, no SEA), or stay on pnpm 10.x. `@pnpm/exe`'s preinstall
on Intel Mac now exits with a clear error pointing at these
alternatives.

Closes
[#&#8203;11423](https://redirect.github.com/pnpm/pnpm/issues/11423).

- `pnpm dlx` (and `pnpx`/`pnx`/`pnpm create`) now runs the same
interactive `approve-builds` prompt as `pnpm add -g` when the package
being launched depends on transitive packages with install scripts.
Previously, the v11 `strictDepBuilds` default made dlx fail with
`ERR_PNPM_IGNORED_BUILDS` and required users to re-run with
`--allow-build=<pkg>` for every offending dependency. dlx also now
removes the partially-populated cache directory when the install fails,
so a subsequent run starts clean instead of reusing a broken install
whose builds were silently skipped
[#&#8203;11444](https://redirect.github.com/pnpm/pnpm/issues/11444).

- [`72629fc`](https://redirect.github.com/pnpm/pnpm/commit/72629fc): Fix
`pnpm -g ls --json` and `pnpm -g ls --parseable` so they emit valid JSON
and parseable output respectively, matching pnpm 10 behavior. Since the
isolated global packages refactor in pnpm 11, the global list command
had a custom path that always printed plain text and ignored
`--json`/`--parseable`, which broke tools like `npm-check-updates` that
parse the JSON output
[#&#8203;11440](https://redirect.github.com/pnpm/pnpm/issues/11440).

`pnpm -g ls --depth=<n>` (with n > 0) now errors when more than one
isolated global install would be involved, since each install has its
own lockfile and merging their transitive trees would be incoherent.
When the request can be narrowed to a single install group, the regular
`list` flow is used and the full dependency tree is shown.

- Fixed `pnpm publish` to honor `publishConfig.registry` from
`package.json` when publishing a single package. The native publish flow
introduced in v11 was reading the registry from `.npmrc` only, ignoring
the per-package override
[#&#8203;11419](https://redirect.github.com/pnpm/pnpm/issues/11419).

- When `strictPeerDependencies` is `true`, the
`ERR_PNPM_PEER_DEP_ISSUES` error once again renders the peer dependency
issues inline using the same format as `pnpm peers check`, so users (and
CI tools like Renovate) can see what failed without running `pnpm peers
check` separately
[#&#8203;11439](https://redirect.github.com/pnpm/pnpm/issues/11439).

- The `WARN` and error code labels in pnpm's output now wrap in brackets
(`[WARN]`, `[ERR_PNPM_FOO]`). Previously the labels relied entirely on a
colored background to stand out, which meant they blended into the
surrounding text in terminals without color (e.g. when `NO_COLOR` is set
or output is piped). The brackets are painted in the same color as the
badge background, so they appear as ordinary padding in color-capable
terminals — only the no-color rendering changes.

###
[`v11.0.4`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1104)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.3...v11.0.4)

##### Patch Changes

- Fixed `pnpm ci` not reinstalling workspace package `node_modules`
directories after the clean step
[#&#8203;11427](https://redirect.github.com/pnpm/pnpm/issues/11427).
- Remove pnpm's workspace state file when cleaning node\_modules so
`pnpm ci` performs a fresh install after the clean step.
- Do not remove `pnpm-lock.yaml` during `pnpm clean` when `lockfile:
true` is configured in `pnpm-workspace.yaml`. The lockfile is only
removed when the `--lockfile` option is passed to `pnpm clean`.
- `pnpm self-update` (with no version argument) no longer downgrades
pnpm when the registry's `latest` dist-tag points to an older release
than the currently active version. Run `pnpm self-update latest` to
force a downgrade
[#&#8203;11418](https://redirect.github.com/pnpm/pnpm/issues/11418).
- `minimumReleaseAgeStrict` now defaults to `true` whenever the user
explicitly sets `minimumReleaseAge` (via `pnpm-workspace.yaml`, the
global `config.yaml`, the CLI, or `pnpm_config_*` env vars).

###
[`v11.0.3`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1103)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.2...v11.0.3)

##### Patch Changes

- Fix too many open files error sometimes happening on Windows, when
creating command shims in `node_modules/.bin`
[#&#8203;11412](https://redirect.github.com/pnpm/pnpm/issues/11412).
- Fix `ERR_PNPM_FETCH_404` when installing a project whose lockfile
depends on a `file:` tarball. The previous behavior dropped the
`tarball` field from `file:` and git-hosted resolutions when
`lockfile-include-tarball-url=false` (the default), even though those
URLs cannot be reconstructed from the package name, version, and
registry
[#&#8203;11407](https://redirect.github.com/pnpm/pnpm/issues/11407).

###
[`v11.0.2`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1102)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.1...v11.0.2)

##### Patch Changes

- Fix `ENOENT` symlink failure when `pnpm add -g` triggers the
approve-builds prompt. The global add flow used to forward an absolute
`modulesDir` (`<installDir>/node_modules`) into the install run by
`approve-builds`. The install layer treated `modulesDir` as a path
relative to `lockfileDir` and joined it again, producing a doubled path
on Windows because `path.join` does not collapse an embedded absolute
path. The hoist step then tried to `mkdir` and symlink under
`<installDir>\<installDir>\node_modules\.pnpm\node_modules\...` and
failed with `ENOENT`
[#&#8203;11403](https://redirect.github.com/pnpm/pnpm/issues/11403).
- Fixed `packageManagerDependencies` going stale when pnpm is invoked
through corepack. The lockfile sync (and the `devEngines.packageManager`
version check) previously ran only when pnpm was invoked directly; under
corepack the entire block was skipped, so a stale entry would persist
even after the running pnpm version changed. The lockfile sync now runs
regardless of how pnpm was invoked, while the pnpm-managed version
switch (`onFail: 'download'`) remains skipped under corepack so it
doesn't fight corepack's own version selection
[#&#8203;11397](https://redirect.github.com/pnpm/pnpm/issues/11397).
- Fix recursive publish summaries to report the manifest from
`publishConfig.directory` when packages publish from a generated
directory
[#&#8203;11239](https://redirect.github.com/pnpm/pnpm/issues/11239).
- Fix negated `os` / `cpu` entries (e.g. `["!win32"]`) being incorrectly
rejected when `supportedArchitectures` expands to multiple platforms
[#&#8203;11375](https://redirect.github.com/pnpm/pnpm/pull/11375).

###
[`v11.0.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1101)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.0...v11.0.1)

##### Patch Changes

- Report unknown top-level options before falling back to implicit `pnpm
run` scripts.
- Reject `null` named catalogs in workspace manifests with
`InvalidWorkspaceManifestError` instead of crashing with a raw
`TypeError`.
- Populate download location for git-sourced dependencies in SBOM
output. Previously `pnpm sbom` emitted `NOASSERTION` (SPDX) and omitted
the distribution reference (CycloneDX) for git dependencies. Now emits
the git URL with commit hash, e.g.
`git+https://github.com/user/repo.git#commit`.
- `pnpm self-update` now keeps `package.json`'s `packageManager` and
`devEngines.packageManager` in sync. When the legacy `packageManager`
field pins pnpm, both fields are rewritten to the new exact pnpm version
on update — `packageManager` to `pnpm@<version>` (without an integrity
hash), and `devEngines.packageManager.version` to the same exact
`<version>` (dropping any range operator). When only
`devEngines.packageManager` is declared, the existing range-preserving
behavior is unchanged
[#&#8203;11388](https://redirect.github.com/pnpm/pnpm/issues/11388).
- Sort the keys of the overrides object returned by `pnpm audit --fix`
so that the log output order matches the order written to
`pnpm-workspace.yaml`.
- Update the env lockfile's `packageManagerDependencies` entry when
`devEngines.packageManager` declares a pnpm version that the lockfile no
longer satisfies. Previously, the stale entry was kept even though the
running pnpm matched the declared version, silently breaking the
integrity record
[#&#8203;11387](https://redirect.github.com/pnpm/pnpm/issues/11387).

###
[`v11.0.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1100)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v10.33.4...v11.0.0)

##### Highlights

##### Major

- **Node.js 22+ required** — support for Node 18, 19, 20, and 21 is
dropped, pnpm itself is now pure ESM, and the standalone exe requires
glibc 2.27.
- **Supply-chain protection on by default** — `minimumReleaseAge`
defaults to 1 day (newly published packages are not resolved for 24h)
and `blockExoticSubdeps` defaults to `true`.
- **`allowBuilds` replaces the old build-dependency settings** —
`onlyBuiltDependencies`, `onlyBuiltDependenciesFile`,
`neverBuiltDependencies`, `ignoredBuiltDependencies`, and
`ignoreDepScripts` have been removed.
- **Global installs are isolated and use the global virtual store by
default** — each `pnpm add -g` gets its own directory with its own
`package.json`, `node_modules`, and lockfile.
- **New SQLite-backed store index** (store v11) with bundled manifests
and hex digests, reducing filesystem syscalls and speeding up
installation.
- **Native publish flow** — [`pnpm
publish`](https://pnpm.io/11.x/cli/publish),
[`login`](https://pnpm.io/11.x/cli/login),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`view`](https://pnpm.io/11.x/cli/view),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) no longer delegate to the
npm CLI, and the remaining npm passthrough commands now throw "not
implemented".
- **[`pnpm audit`](https://pnpm.io/11.x/cli/audit) uses npm's bulk
advisories endpoint** — the legacy `/security/audits` endpoints are
gone. CVE-based filtering has been replaced with GHSA-based filtering:
migrate `auditConfig.ignoreCves` entries to `auditConfig.ignoreGhsas`.
- **`.npmrc` is auth/registry only** — all other settings must live in
`pnpm-workspace.yaml` or the new global `config.yaml`, and environment
variables use the `pnpm_config_*` prefix.
- **Runtime installs are slimmer** — installing a Node.js runtime via
`node@runtime:<version>` no longer extracts the bundled `npm`, `npx`,
and `corepack`, roughly halving the files pnpm has to hash, write, and
link.

##### Minor

- **New commands:** [`pnpm ci`](https://pnpm.io/11.x/cli/ci), [`pnpm
sbom`](https://pnpm.io/11.x/cli/sbom), [`pnpm
clean`](https://pnpm.io/11.x/cli/clean), [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers), [`pnpm runtime
set`](https://pnpm.io/11.x/cli/runtime), [`pnpm
docs`](https://pnpm.io/11.x/cli/docs)/`home`, [`pnpm
ping`](https://pnpm.io/11.x/cli/ping), [`pnpm
search`](https://pnpm.io/11.x/cli/search), [`pnpm
star`](https://pnpm.io/11.x/cli/star)/`unstar`/`stars`, [`pnpm
whoami`](https://pnpm.io/11.x/cli/whoami), [`pnpm
with`](https://pnpm.io/11.x/cli/with), and [`pnpm
pack-app`](https://pnpm.io/11.x/cli/pack-app), plus
`pn`/[`pnx`](https://pnpm.io/11.x/cli/pnx) short aliases.
- **ESM pnpmfiles** via `.pnpmfile.mjs`, which takes priority over
`.pnpmfile.cjs` when present.
- **[`pnpm audit --fix=update`](https://pnpm.io/11.x/cli/audit)** fixes
vulnerabilities by updating packages in the lockfile instead of adding
overrides, and `pnpm audit --fix --interactive` lets you select which
advisories to fix.
- **[`pnpm pack-app`](https://pnpm.io/11.x/cli/pack-app)** packs a
CommonJS entry into a standalone executable for one or more target
platforms using Node.js Single Executable Applications.
- **Faster HTTP and I/O** — undici with Happy Eyeballs, direct-to-CAS
writes, skipped staging directory, pre-allocated tarball downloads, and
an NDJSON metadata cache.

##### Major Changes

##### Requirements

- pnpm is now distributed as pure ESM.
- Dropped support for Node.js v18, 19, 20, and 21.
- The standalone exe version of pnpm requires at least glibc 2.27.

##### Security & Build Defaults

- Changed default values: `optimisticRepeatInstall` is now `true`,
`verifyDepsBeforeRun` is now `install`, `minimumReleaseAge` is now
`1440` (1 day), and `minimumReleaseAgeStrict` is `false`. Newly
published packages will not be resolved until they are at least 1 day
old. This protects against supply chain attacks by giving the community
time to detect and remove compromised versions. To opt out, set
`minimumReleaseAge: 0` in `pnpm-workspace.yaml`
[#&#8203;11158](https://redirect.github.com/pnpm/pnpm/pull/11158).

- `strictDepBuilds` is `true` by default.

- `blockExoticSubdeps` is `true` by default.

- Removed deprecated build dependency settings: `onlyBuiltDependencies`,
`onlyBuiltDependenciesFile`, `neverBuiltDependencies`,
`ignoredBuiltDependencies`, and `ignoreDepScripts`
[#&#8203;11220](https://redirect.github.com/pnpm/pnpm/pull/11220).

Use the `allowBuilds` setting instead. It is a map where keys are
package name patterns and values are booleans:

  - `true` means the package is allowed to run build scripts
- `false` means the package is explicitly denied from running build
scripts

Same as before, by default, none of the packages in the dependencies are
allowed to run scripts. If a package has postinstall scripts and it
isn't declared in `allowBuilds`, an error is printed.

  Before:

  ```yaml
  onlyBuiltDependencies:
    - electron
  onlyBuiltDependenciesFile: "allowed-builds.json"
  neverBuiltDependencies:
    - core-js
  ignoredBuiltDependencies:
    - esbuild
  ```

  After:

  ```yaml
  allowBuilds:
    electron: true
    core-js: false
    esbuild: false
  ```

- Removed `allowNonAppliedPatches` in favor of `allowUnusedPatches`.

- Removed `ignorePatchFailures`; patch application failures now throw an
error.

##### Store

- Runtime dependencies are always linked from the global virtual store
[#&#8203;10233](https://redirect.github.com/pnpm/pnpm/pull/10233).
- Optimized index file format to store the hash algorithm once per file
instead of repeating it for every file entry. Each file entry now stores
only the hex digest instead of the full integrity string
(`<algo>-<digest>`). Using hex format improves performance since file
paths in the content-addressable store use hex representation,
eliminating base64-to-hex conversion during path lookups.
- Store version bumped to v11.
- The bundled manifest (name, version, bin, engines, scripts, etc.) is
now stored directly in the package index file, eliminating the need to
read `package.json` from the content-addressable store during resolution
and installation. This reduces I/O and speeds up repeat installs
[#&#8203;10473](https://redirect.github.com/pnpm/pnpm/pull/10473).
- The package index in the content-addressable store is now backed by
SQLite. Instead of individual JSON files under `$STORE/index/`, package
metadata is stored in a single SQLite database at `$STORE/index.db` with
MessagePack-encoded values. This reduces filesystem syscall overhead,
improves space efficiency for small metadata entries, and enables
concurrent access via SQLite's WAL mode. Packages missing from the new
index are re-fetched on demand
[#&#8203;10500](https://redirect.github.com/pnpm/pnpm/pull/10500)
[#&#8203;10826](https://redirect.github.com/pnpm/pnpm/issues/10826).

##### Global Packages

- Global installs (`pnpm add -g pkg`) and `pnx` now use the global
virtual store by default. Packages are stored at `{storeDir}/links`
instead of per-project `.pnpm` directories. This can be disabled by
setting `enableGlobalVirtualStore: false`
[#&#8203;10694](https://redirect.github.com/pnpm/pnpm/pull/10694).

- Isolated global packages. Each globally installed package (or group of
packages installed together) now gets its own isolated installation
directory with its own `package.json`, `node_modules/`, and lockfile.
This prevents global packages from interfering with each other through
peer dependency conflicts, hoisting changes, or version resolution
shifts.

  Key changes:

- `pnpm add -g <pkg>` creates an isolated installation in
`{pnpmHomeDir}/global/v11/{hash}/`
- `pnpm remove -g <pkg>` removes the entire installation group
containing the package
- `pnpm update -g [pkg]` re-installs packages in new isolated
directories
- `pnpm list -g` scans isolated directories to show all installed global
packages
- `pnpm install -g` (no args) is no longer supported; use `pnpm add -g
<pkg>` instead

- Globally installed binaries are now stored in a `bin` subdirectory of
`PNPM_HOME` instead of directly in `PNPM_HOME`. This prevents internal
directories like `global/` and `store/` from polluting shell
autocompletion when `PNPM_HOME` is on PATH
[#&#8203;10986](https://redirect.github.com/pnpm/pnpm/issues/10986).
After upgrading, run `pnpm setup` to update your shell configuration.

- Breaking changes to `pnpm link`:

- `pnpm link <pkg-name>` no longer resolves packages from the global
store. Only relative or absolute paths are accepted. For example, use
`pnpm link ./foo` instead of `pnpm link foo`.
- `pnpm link --global` is removed. Use `pnpm add -g .` to register a
local package's bins globally.
- `pnpm link` (no arguments) is removed. Use `pnpm link <dir>` with an
explicit path instead.

##### Configuration

- pnpm no longer reads all settings from `.npmrc`. Only auth and
registry settings are read from `.npmrc` files. All other settings (like
`hoistPattern`, `nodeLinker`, `shamefullyHoist`, etc.) must be
configured in `pnpm-workspace.yaml` or the global
`~/.config/pnpm/config.yaml`
[#&#8203;11189](https://redirect.github.com/pnpm/pnpm/pull/11189).

- Network settings (`httpProxy`, `httpsProxy`, `noProxy`,
`localAddress`, `strictSsl`, `gitShallowHosts`) are now written to
`config.yaml` (global) or `pnpm-workspace.yaml` (local) instead of
`.npmrc`/`auth.ini`. They are still readable from `.npmrc` for easier
migration from the npm CLI
[#&#8203;11209](https://redirect.github.com/pnpm/pnpm/pull/11209).

pnpm no longer reads `npm_config_*` environment variables. Use
`pnpm_config_*` environment variables instead (e.g.,
`pnpm_config_registry` instead of `npm_config_registry`).

  pnpm no longer reads the npm global config at `$PREFIX/etc/npmrc`.

  `pnpm login` writes auth tokens to `~/.config/pnpm/auth.ini`.

  New `registries` setting in `pnpm-workspace.yaml`:

  ```yaml
  registries:
    default: https://registry.npmjs.org/
    "@&#8203;my-org": https://private.example.com/
    "@&#8203;internal": https://nexus.corp.com/
  ```

Auth tokens in `~/.npmrc` still work — pnpm continues to read `~/.npmrc`
as a fallback for registry authentication. The new `npmrcAuthFile`
setting can be used to point to a different file instead of `~/.npmrc`.

- Replace workspace project specific `.npmrc` with `packageConfigs` in
`pnpm-workspace.yaml`.

  A workspace manifest with `packageConfigs` looks something like this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    "project-1":
      saveExact: true
    "project-2":
      savePrefix: "~"
  ```

  Or this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    - match: ["project-1", "project-2"]
      modulesDir: "node_modules"
      saveExact: true
  ```

- pnpm no longer reads settings from the `pnpm` field of `package.json`.
Settings should be defined in `pnpm-workspace.yaml`
[#&#8203;10086](https://redirect.github.com/pnpm/pnpm/pull/10086).

- `pnpm config get` (without `--json`) no longer prints INI formatted
text. Instead, it prints JSON for objects and arrays, and raw strings
for strings, numbers, booleans, and nulls. `pnpm config get --json`
still prints all types of values as JSON, as before.

- `pnpm config get <array>` now prints a JSON array.

- `pnpm config list` now prints a JSON object instead of INI formatted
text.

- `pnpm config list` and `pnpm config get` (without argument) now hide
auth-related settings.

- `pnpm config list` and `pnpm config get` (without argument) now show
top-level keys as camelCase. Exception: keys that start with `@` or `//`
are preserved (their cases don't change).

- `pnpm config get` and `pnpm config list` no longer load non-camelCase
options from the workspace manifest (`pnpm-workspace.yaml`).

##### Removed Commands & npm Passthrough

- pnpm no longer falls back to the npm CLI. Commands that were
previously passed through to npm (`access`, `bugs`, `docs`, `edit`,
`find`, `home`, `issues`, `owner`, `ping`, `prefix`, `profile`, `pkg`,
`repo`, `search`, `set-script`, `star`, `stars`, `team`, `token`,
`unstar`, `whoami`, `xmas`) and their aliases (`s`, `se`) now throw a
"not implemented" error, with a suggestion to use the npm CLI directly
[#&#8203;10642](https://redirect.github.com/pnpm/pnpm/pull/10642). Other
previously passed-through commands —
[`view`](https://pnpm.io/11.x/cli/view) (`info`, `show`, `v`),
[`login`](https://pnpm.io/11.x/cli/login) (`adduser`),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) — have been reimplemented
natively in pnpm (see New Commands below).

- [`pnpm publish`](https://pnpm.io/11.x/cli/publish) now works without
the `npm` CLI.

The One-time Password feature now reads from `PNPM_CONFIG_OTP` instead
of `NPM_CONFIG_OTP`:

  ```sh
  export PNPM_CONFIG_OTP='<your OTP here>'
  pnpm publish --no-git-checks
  ```

If the registry requests OTP and the user has not provided it via the
`PNPM_CONFIG_OTP` environment variable or the `--otp` flag, pnpm will
prompt the user directly for an OTP code.

If the registry requests web-based authentication, pnpm will print a
scannable QR code along with the URL.

Since the new `pnpm publish` no longer calls `npm publish`, some
undocumented features may have been unknowingly dropped. If you rely on
a feature that is now gone, please open an issue at
<https://github.com/pnpm/pnpm/issues>. In the meantime, you can use
`pnpm pack && npm publish *.tgz` as a workaround.

- Removed the `pnpm server` command
[#&#8203;10463](https://redirect.github.com/pnpm/pnpm/pull/10463).

- Removed support for the `useNodeVersion` and
`executionEnv.nodeVersion` fields. `devEngines.runtime` and
`engines.runtime` should be used instead
[#&#8203;10373](https://redirect.github.com/pnpm/pnpm/pull/10373).

- Removed support for `hooks.fetchers`. We now have a new API for custom
fetchers and resolvers via the `fetchers` field of `pnpmfile`.

##### Lifecycle Scripts

- pnpm no longer populates `npm_config_*` environment variables from the
pnpm config during lifecycle scripts. Only well-known `npm_*` env vars
are now set, matching Yarn's behavior
[#&#8203;11116](https://redirect.github.com/pnpm/pnpm/pull/11116).

##### CLI Output

- Cleaner output for script execution: pnpm now prints `$ command`
instead of `> pkg@version stage path\n> command`, and shows project name
and path only when running in a different directory. The `$ command`
line is printed to stderr to keep stdout clean for piping
[#&#8203;11132](https://redirect.github.com/pnpm/pnpm/pull/11132).
- During install, instead of rendering the full peer dependency issues
tree, pnpm now suggests running [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers) to view the issues
[#&#8203;11133](https://redirect.github.com/pnpm/pnpm/pull/11133).

##### Lockfile

- Simplified `patchedDependencies` lockfile format from `Record<string,
{ path: string, hash: string }>` to `Record<string, string>` (selector
to hash). Existing lockfiles with the old format are automatically
migrated
[#&#8203;10911](https://redirect.github.com/pnpm/pnpm/pull/10911).

##### Other

- The default value of the `type` field in the `package.json` file of
the project initialized by `pnpm init` command has been changed to
`module`.

- Added support for lowercase options in `pnpm add`: `-d`, `-p`, `-o`,
`-e` [#&#8203;9197](https://redirect.github.com/pnpm/pnpm/issues/9197).

  When using the `pnpm add` command only:

  - `-p` is now an alias for `--save-prod` instead of `--parseable`
  - `-d` is now an alias for `--save-dev` instead of `--loglevel=info`

- The root workspace project is no longer excluded when it is explicitly
selected via a filter
[#&#8203;10465](https://redirect.github.com/pnpm/pnpm/pull/10465).

##### Audit

- [`pnpm audit`](https://pnpm.io/11.x/cli/audit) now calls npm's
`/-/npm/v1/security/advisories/bulk` endpoint. The legacy
`/-/npm/v1/security/audits{,/quick}` endpoints have been retired by the
registry, so the legacy request/response contract is no longer
supported.

The bulk endpoint does not return CVE identifiers. CVE-based filtering
has been replaced with GitHub advisory ID (GHSA) filtering:

- `auditConfig.ignoreCves` → `auditConfig.ignoreGhsas` (the previous key
is no longer recognized)
- `pnpm audit --ignore <id>` / `pnpm audit --ignore-unfixable` now read
and write GHSAs instead of CVEs
- GHSAs are derived from each advisory's `url`
(`https://github.com/advisories/GHSA-xxxx-xxxx-xxxx`)

To migrate: replace each `CVE-YYYY-NNNNN` entry in your
`auditConfig.ignoreCves` with the corresponding `GHSA-xxxx-xxxx-xxxx`
value (visible in the `More info` column of `pnpm audit` output) and
move it under `auditConfig.ignoreGhsas`.

##### Package Manager Settings

- **Breaking:** removed the `managePackageManagerVersions`,
`packageManagerStrict`, and `packageManagerStrictVersion` settings. They
existed only to derive the `onFail` behavior for the legacy
`packageManager` field, and the `pmOnFail` setting introduced alongside
[`pnpm with`](https://pnpm.io/11.x/cli/with) subsumes all three — it
directly sets the `onFail` behavior of both `packageManager` and
`devEngines.packageManager`. The `COREPACK_ENABLE_STRICT` environment
variable is no longer honored (it only gated `packageManagerStrict`);
use `pmOnFail` instead.

  Migration:

| Removed setting | Replace with |
| ------------------------------------- | ------------------------------
|
| `managePackageManagerVersions: true` | `pmOnFail: download` (default)
|
| `managePackageManagerVersions: false` | `pmOnFail: ignore` |
| `packageManagerStrict: false` | `pmOnFail: warn` |
| `packageManagerStrictVersion: true` | `pmOnFail: error` |
| `COREPACK_ENABLE_STRICT=0` | `pmOnFail: warn` |

##### Runtime Installs

- Installing a Node.js runtime via `node@runtime:<version>` (including
`pnpm env use` and `pnpm runtime set node`) no longer extracts the
bundled `npm`, `npx`, and `corepack` from the Node.js archive. This cuts
roughly half of the files pnpm has to hash, write to the CAS, and link
during installation, making runtime installs noticeably faster. Users
who still need `npm` can install it as a separate package.

##### Minor Changes

##### New Commands

- Added native [`pnpm view`](https://pnpm.io/11.x/cli/view) (`info`,
`show`, `v`) command for viewing package metadata from the registry
[#&#8203;11064](https://redirect.github.com/pnpm/pnpm/pull/11064).
- Added [`pnpm login`](https://pnpm.io/11.x/cli/login) (and `pnpm
adduser` alias) command for authenticating with npm registries. Supports
web-based login with QR code as well as classic username/password login
[#&#8203;11094](https://redirect.github.com/pnpm/pnpm/pull/11094).
- Added [`pnpm logout`](https://pnpm.io/11.x/cli/logout) command for
logging out of npm registries. Revokes the authentication token on the
registry and removes it from the local auth config file
[#&#8203;11213](https://redirect.github.com/pnpm/pnpm/pull/11213).
- Added native [`pnpm deprecate`](https://pnpm.io/11.x/cli/deprecate)
and `pnpm undeprecate` commands for setting and removing deprecation
messages on package versions without delegating to the npm CLI
[#&#8203;11120](https://redirect.github.com/pnpm/pnpm/pull/11120).
- Added native [`pnpm unpublish`](https://pnpm.io/11.x/cli/unpublish)
command. Supports unpublishing specific versions, version ranges via
semver, and entire packages with `--force`
[#&#8203;11128](https://redirect.github.com/pnpm/pnpm/pull/11128).
- Added native [`pnpm dist-tag`](https://pnpm.io/11.x/cli/dist-tag)
command (`ls`, `add`, `rm` subcommands)
[#&#8203;11218](https://redirect.github.com/pnpm/pnpm/pull/11218).
- Added [`pnpm sbom`](https://pnpm.io/11.x/cli/sbom) command for
generating Software Bill of Materials in CycloneDX 1.7 and SPDX 2.3 JSON
formats
[#&#8203;9088](https://redirect.github.com/pnpm/pnpm/issues/9088).
- Added [`pnpm clean`](https://pnpm.io/11.x/cli/

> ✂ **Note**
> 
> PR body was truncated to here.


</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/London)

- Branch creation
  - "before 6pm on friday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/dungeon-studio/genshin.dungeon.studio).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNTkuMiIsInVwZGF0ZWRJblZlciI6IjQzLjE3OS4zIiwidGFyZ2V0QnJhbmNoIjoiZGV2ZWxvcCIsImxhYmVscyI6WyJhdXRvbWF0ZWQiLCJkZXBlbmRlbmNpZXMiLCJucG0iXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
renovate Bot added a commit to oxc-project/eslint-plugin-oxlint that referenced this pull request May 17, 2026
> ℹ️ **Note**
> 
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Adoption](https://docs.renovatebot.com/merge-confidence/) |
[Passing](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|---|---|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) |
`10.33.4` → `11.1.2` |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.1.2?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/pnpm/11.1.2?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/pnpm/10.33.4/11.1.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/10.33.4/11.1.2?slim=true)
|

---

### Release Notes

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.1.2`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1112)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.1...v11.1.2)

##### Patch Changes

- `convertEnginesRuntimeToDependencies`: switch the runtime-dependency
write to `Object.defineProperty` so the CodeQL
`js/prototype-polluting-assignment` rule treats the assignment as safe
regardless of the property name (follow-up to
[#&#8203;11609](https://redirect.github.com/pnpm/pnpm/pull/11609)).

- Address CodeQL static-analysis findings: guard manifest dependency
writes against prototype-polluting keys (`__proto__`, `constructor`,
`prototype`), and replace a potentially super-linear semver-detection
regex in registry 404 hints with an O(n) parser.

- Strip `sec-fetch-*` headers from outgoing HTTP requests. These headers
are automatically added by undici's `fetch()` implementation per the
Fetch spec but cause Azure DevOps Artifacts to return HTTP 400 for
uncached upstream packages, as ADO interprets them as browser requests
[#&#8203;11572](https://redirect.github.com/pnpm/pnpm/issues/11572).

- Fix `minimumReleaseAge` handling for cached abbreviated metadata.

The version-spec cache fast path no longer rethrows
`ERR_PNPM_MISSING_TIME` under `strictPublishedByCheck`; it now falls
through to the registry-fetch path, consistent with the adjacent
mtime-gated cache block.

When the registry returns 304 Not Modified for a package whose cached
metadata is abbreviated (no per-version `time`), pnpm now re-fetches
with `fullMetadata: true` if `minimumReleaseAge` is active and the
package was modified after the cutoff. The upgraded metadata is
persisted to disk so subsequent installs don't repeat the fetch.
Previously the abbreviated meta was used as-is and the maturity check
fell back to its warn-and-skip path, silently bypassing the quarantine
and emitting a misleading "metadata is missing the time field" warning.

Closes
[#&#8203;11619](https://redirect.github.com/pnpm/pnpm/issues/11619).

- Fix `pnpm upgrade --interactive --latest -r` not respecting named
catalog groups. Previously, upgrading a dependency using a named catalog
(e.g. `"catalog:foo"`) would incorrectly rewrite `package.json` to
`"catalog:"` and place the updated version in the default catalog
instead of the named one
[#&#8203;10115](https://redirect.github.com/pnpm/pnpm/issues/10115).

- Fixed `optimisticRepeatInstall` skipping `pnpm-lock.yaml` merge
conflict resolution when the existing `node_modules` state appears up to
date.

- Fix `minimumReleaseAge` / `resolutionMode: time-based` installs
failing on lockfiles whose `time:` block is missing entries. The
npm-resolver's peek-from-store fast path now surfaces `publishedAt` from
the lockfile rather than discarding it, and falls through to a registry
metadata fetch when the time-based cutoff can't be computed from the
data on hand.

###
[`v11.1.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1111)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.1.0...v11.1.1)

##### Patch Changes

- Skip installability validation when scanning workspace projects in
`checkDepsStatus` (run by `verifyDepsBeforeRun`). Previously the status
check called `findWorkspaceProjects`, which validates each project's
`engines` and `os`/`cpu`/`libc` and warns about useless fields in
non-root manifests — work that the install pipeline already performs.
With no `nodeVersion` threaded through, the engine check also fell back
to the system Node from `PATH` and emitted spurious "Unsupported engine"
warnings before scripts ran. Status-only callers now use
`findWorkspaceProjectsNoCheck`; install paths continue to validate.
- Fixed `pnpm add <alias>:@&#8203;scope/pkg` for [named
registries](https://redirect.github.com/pnpm/pnpm/pull/11324). The local
resolver was claiming any specifier containing `/` as a local directory,
so `pnpm add bit:@&#8203;teambit/bit` (with `bit` configured under
`namedRegistries`) installed a bogus link to `bit:@&#8203;teambit/bit/`
instead of resolving from the configured registry. The local resolver
now runs after the named-registry resolver in the resolution chain.
- Updated `@zkochan/cmd-shim` to 9.0.3. The sh shim it writes for `.cmd`
/ `.bat` targets now escapes the `/C` switch as `//C`, so it survives
the path translation Git Bash applies when launching `cmd.exe`. Without
this, a bare `/C` was rewritten to `C:\` before reaching cmd.exe — the
switch was dropped, cmd started interactively, and the calling script
saw the cmd banner instead of the wrapped command's output. Affects any
cmd-shim-wrapped batch script invoked from Git Bash / MSYS / Cygwin on
Windows. See
[pnpm/cmd-shim#55](https://redirect.github.com/pnpm/cmd-shim/pull/55).

###
[`v11.1.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1110)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.9...v11.1.0)

##### Minor Changes

- Added `pnpm audit signatures` to verify ECDSA registry signatures for
installed packages against keys from `/-/npm/v1/keys`
[#&#8203;7909](https://redirect.github.com/pnpm/pnpm/issues/7909).
Scoped registries are respected, and registries without signing keys are
skipped.

- Added support for installing packages from the [GitHub Packages npm
registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry)
via a built-in `gh:` prefix (e.g. `pnpm add gh:@&#8203;acme/private`),
and, more broadly, for arbitrary named registries in the style of [vlt's
named-registry aliases](https://docs.vlt.sh/cli/registries).
Authentication is picked up from the existing per-URL `.npmrc` entries
(e.g. `//npm.pkg.github.com/:_authToken=...`), so no separate auth
mechanism is required.

Additional aliases — or an override for the built-in `gh` alias, for
GitHub Enterprise Server — can be configured under `namedRegistries` in
`pnpm-workspace.yaml`:

  ```yaml
  namedRegistries:
    gh: https://npm.pkg.github.example.com/
    work: https://npm.work.example.com/
  ```

With this, `work:@&#8203;corp/lib@^2.0.0` resolves against
`https://npm.work.example.com/`.
[#&#8203;8941](https://redirect.github.com/pnpm/pnpm/issues/8941).

- Allow setting sbom spec version using `--sbom-spec-version`
[#&#8203;11389](https://redirect.github.com/pnpm/pnpm/pull/11389).

- Add `--no-runtime` flag (config: `runtime=false`) to skip installing
runtime entries (e.g. Node.js downloaded via `devEngines.runtime`)
without modifying the lockfile. The lockfile keeps the runtime entry so
frozen-lockfile validation still passes; only the runtime fetch and
`.bin` linking are skipped. Useful in CI matrices where the runtime is
provisioned externally (e.g. via `pnpm runtime -g set node <version>`)
before `pnpm install` runs.

- Added the `pnpm bugs` command that opens a package's bug tracker URL
in the browser. With no arguments, it reads the current project's
`package.json`; with one or more package names, it fetches each
package's metadata from the registry and opens its bug tracker. Falls
back to `<repository>/issues` when the `bugs` field is missing
[#&#8203;11279](https://redirect.github.com/pnpm/pnpm/pull/11279).

- Added `pnpm owner` command to manage package owners on the registry.

##### Patch Changes

- Added "published X ago by Y" information to the `pnpm view` command
output, similar to `npm view`. This is useful when comparing against
`minimumReleaseAge`.

  For example, `pnpm view pnpm` now shows:

  ```
  published 17 hours ago by GitHub Actions
  ```

- `pnpm publish` now honors the configured HTTP/HTTPS proxy (including
`https_proxy`/`http_proxy`/`no_proxy` environment variables) when
polling the registry's `doneUrl` during the web-based authentication
flow. Previously the poll bypassed the proxy, causing the registry to
respond `403` from a different source IP and the login to never complete
[#&#8203;11561](https://redirect.github.com/pnpm/pnpm/issues/11561).

- `pnpm add -g` now installs each space-separated package into its own
isolated directory by default. To bundle multiple packages into the same
isolated install (so that they share dependencies and are removed
together), pass them as a comma-separated list. For example:

- `pnpm add -g foo bar` installs `foo` and `bar` as two independent
globals — removing one does not affect the other.
- `pnpm add -g foo,bar qar` bundles `foo` and `bar` into a single
isolated install while `qar` is installed on its own.

Related:
[#&#8203;11587](https://redirect.github.com/pnpm/pnpm/issues/11587).

- `pnpm runtime set <name> <version>` no longer fails in the root of a
multi-package workspace with the `ADDING_TO_ROOT` error. Installing the
workspace root is a valid target for a runtime, so the command now
bypasses that safety check.

- Fix `pnpm --version` hanging for the lifetime of the worker pool after
the version was printed. `main.ts`'s `--version` short-circuit returned
before reaching the command-handler `finally` that calls
`finishWorkers()`, so the worker pool that `switchCliVersion` had
spawned during integrity resolution stayed alive and held the Node event
loop open. The CLI entry now runs `finishWorkers()` from its own
`finally`, so every exit path tears the pool down.

Repro: `pnpm --version` in a workspace whose `devEngines.packageManager`
version already matches the running pnpm + `onFail: "download"`.
`switchCliVersion` resolves the integrity (spawning workers), finds
nothing to swap, returns. The version prints, then the process hangs.

###
[`v11.0.9`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1109)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.8...v11.0.9)

##### Patch Changes

- Fixed installation of GitLab-hosted dependencies. pnpm now downloads
the tarball from
`https://gitlab.com/<user>/<project>/-/archive/<sha>/<project>-<sha>.tar.gz`
instead of the GitLab API endpoint that contained an encoded slash
(`%2F`) between user and project. The encoded slash both triggered `406
Not Acceptable` responses from GitLab and produced virtual store
directory names that Node refused to import
(`ERR_INVALID_MODULE_SPECIFIER`)
[#&#8203;11533](https://redirect.github.com/pnpm/pnpm/issues/11533).
- Honor `NPM_CONFIG_USERCONFIG` (and its lowercase
`npm_config_userconfig` form) as a low-priority fallback when locating
the user-level `.npmrc`. This restores compatibility with environments
that point npm at a custom auth file via that env var — most notably
`actions/setup-node`, which writes registry credentials to
`${runner.temp}/.npmrc` and exports `NPM_CONFIG_USERCONFIG` to reference
it. Without this, GitHub Actions workflows using `actions/setup-node` to
authenticate to private registries broke after upgrading to pnpm v11.
PNPM-prefixed env vars and `npmrcAuthFile` from the global `config.yaml`
continue to take precedence
[#&#8203;11539](https://redirect.github.com/pnpm/pnpm/issues/11539).
- Fix `pnpm pack` not bundling dependencies listed in
`bundleDependencies` (or `bundledDependencies`). The npm-packlist
upgrade in pnpm 11 changed its API to require the caller to pre-populate
the dependency tree, which the wrapper was not doing —
`bundleDependencies` were silently dropped from the tarball
[#&#8203;11519](https://redirect.github.com/pnpm/pnpm/issues/11519).
- Fixed the pnpm CLI crashing with a confusing `SyntaxError: Invalid
regular expression flags` instead of printing a clear "requires Node.js
v22.13" error when launched on an unsupported Node.js version. The
Node.js version check in `bin/pnpm.mjs` was effectively dead code
because the static `import` of the bundled `dist/pnpm.mjs` was hoisted
by the ES module loader and parsed before the check could run
[#&#8203;11546](https://redirect.github.com/pnpm/pnpm/issues/11546).
- Fixed `pnpm --prefix=<dir> install` overwriting the existing
`pnpm-workspace.yaml` in `<dir>` with `set this to true or false`
placeholders. The renamed `--prefix` option (which maps to `dir`) was
not honored when locating the workspace root, so the workspace
manifest's `allowBuilds` settings were not loaded into config and got
clobbered when ignored builds were auto-populated
[#&#8203;11535](https://redirect.github.com/pnpm/pnpm/issues/11535).
- Fixed `pnpm publish --provenance` failing with a 422 from the registry
when the package version contained semver build metadata (e.g.
`1.0.0-canary.0+abc1234`). The `+<build>` segment is now stripped before
packing so that the version embedded in the tarball, the metadata sent
to the registry, and the sigstore provenance subject all agree
[#&#8203;11518](https://redirect.github.com/pnpm/pnpm/issues/11518).

###
[`v11.0.8`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1108)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.7...v11.0.8)

##### Patch Changes

- Restored the heuristic that preserves tarball URLs in `pnpm-lock.yaml`
when they cannot be derived from name+version+registry, even with the
default `lockfileIncludeTarballUrl: false`. Without this, `pnpm install
--frozen-lockfile` from an empty store fails with `ERR_PNPM_FETCH_404`
for packages on registries that serve tarballs from a non-standard path
— most notably GitHub Packages
(`https://npm.pkg.github.com/download/<scope>/<name>/<version>/<hash>`)
and JSR. `lockfileIncludeTarballUrl: true` continues to force the URL
into the lockfile for every package
[#&#8203;11276](https://redirect.github.com/pnpm/pnpm/issues/11276).
- Run `preversion`, `version`, and `postversion` lifecycle scripts for
`pnpm version`.
- Fixed `ERR_PNPM_BAD_TARBALL_SIZE` when a registry serves tarballs with
an end-to-end `Content-Encoding` (e.g. `gzip`). Tarballs are already
compressed, so the fetcher now requests them with `Accept-Encoding:
identity` (matching pnpm v10's effective behavior) and, as defense in
depth against misbehaving servers, no longer enforces the strict
`Content-Length` check when the response declares a `Content-Encoding` —
`Content-Length` in that case refers to the encoded payload, not the
decoded bytes the fetch implementation yields
[#&#8203;11506](https://redirect.github.com/pnpm/pnpm/issues/11506).

###
[`v11.0.7`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1107)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.6...v11.0.7)

##### Patch Changes

- Restore the execute bit on the `node-gyp` shims packed inside
`@pnpm/exe` (`dist/node-gyp-bin/node-gyp`,
`dist/node-gyp-bin/node-gyp.cmd`, and
`dist/node_modules/node-gyp/bin/node-gyp.js`). Without this,
`pnpm/action-setup`'s standalone path (used on runners with Node.js <
22.13) failed any install whose lifecycle script invoked `node-gyp
rebuild` with `sh: 1: node-gyp: Permission denied`
[#&#8203;11483](https://redirect.github.com/pnpm/pnpm/issues/11483).

- Fixed the `pn`, `pnpx`, and `pnx` aliases failing in Git Bash / MSYS2
on Windows when pnpm was installed via `@pnpm/exe` (or after `pnpm
self-update`)
[#&#8203;11486](https://redirect.github.com/pnpm/pnpm/issues/11486).
Running `pnpx` (or `pnx`) printed the cmd.exe banner and dropped the
user into an interactive command prompt instead of running `pnpm dlx`.
The `bin` field rewrite on Windows was pointing those aliases at `.cmd`
files; cmd-shim's Bash shim for a `.cmd` target wraps it in `exec cmd /C
...`, and MSYS2 mangles `/C` into a Windows path before cmd.exe sees it.
The aliases are now `.exe` hardlinks of the SEA binary, which detects
which name it was launched as via `process.execPath` and prepends `dlx`
for `pnpx` / `pnx`.

- Fix `pnpm install` recreating `node_modules` after `pnpm fetch`. `pnpm
fetch` records empty `hoistPattern` and `publicHoistPattern` in
`.modules.yaml`; since v11 removed the explicit-config gate, the
follow-up install treated those as a hoist-pattern change and purged the
modules directory. The fetch step now flags the modules manifest with
`virtualStoreOnly: true` so the next install skips the hoist-pattern
comparison and completes the missing post-import linking in place
[#&#8203;11488](https://redirect.github.com/pnpm/pnpm/issues/11488).

- Pin the integrity of git-hosted tarballs (codeload.github.com,
gitlab.com, bitbucket.org) in the lockfile so that subsequent installs
detect a tampered or substituted tarball and refuse to install it.
Previously the lockfile only stored the tarball URL for git
dependencies, so a compromised git host or a man-in-the-middle could
serve arbitrary code on later installs without lockfile changes.

A new `gitHosted: true` field is recorded on git-hosted tarball
resolutions in the lockfile, letting every reader/writer route them by a
single typed check instead of pattern-matching the tarball URL in each
call site. Lockfiles written by older pnpm versions are enriched on load
(URL fallback) so the field can be relied on uniformly across the
codebase.

- Allow user-level preferences in the global `config.yaml`. The
following settings can now be set in `~/.config/pnpm/config.yaml` (or
via `pnpm config set --location global`) instead of being restricted to
`pnpm-workspace.yaml`: `agent`, `globalVirtualStoreDir`,
`initPackageManager`, `initType`, `registrySupportsTimeField`,
`scriptShell`, `shellEmulator`, `sideEffectsCache`,
`sideEffectsCacheReadonly`, `stateDir`, `strictDepBuilds`,
`trustPolicy`, `trustPolicyExclude`, `trustPolicyIgnoreAfter`,
`updateNotifier`, `useStderr`, `verifyDepsBeforeRun`,
`verifyStoreIntegrity`, `virtualStoreDir`, `virtualStoreDirMaxLength`
[#&#8203;11474](https://redirect.github.com/pnpm/pnpm/issues/11474).

- Make trusted publishing (OIDC) take precedence over a configured
static `_authToken` in `pnpm publish`, mirroring the npm CLI's behavior.
When OIDC succeeds, the OIDC-derived token overrides any pre-configured
`_authToken`; when OIDC is not applicable (no CI environment, exchange
fails, registry has no trusted publisher configured), the static token
is used as a fallback. This applies on every package during recursive
publish, so each workspace package independently attempts trusted
publishing.

Additionally, the `NPM_ID_TOKEN` env var is now honored as a CI-agnostic
injection point for an OIDC ID token. Previously OIDC was only attempted
on GitHub Actions or GitLab; now any CI provider that exposes its own
OIDC mechanism (e.g. CircleCI's `CIRCLE_OIDC_TOKEN_V2`, Buildkite, etc.)
can forward its token via `NPM_ID_TOKEN` and trusted publishing will
work without pnpm needing to recognize the provider explicitly.

- `--pm-on-fail=ignore` (and other universal options like `--loglevel`,
`--reporter`) is now honored when combined with `--help` or `--version`.
Previously the CLI argument parser short-circuited those flags before
universal options were preserved, so `pnpm audit --pm-on-fail=ignore
--help` and `pnpm --pm-on-fail=ignore --version` reported the strict
packageManager mismatch instead of running the requested action
[#&#8203;11487](https://redirect.github.com/pnpm/pnpm/issues/11487).

- Fix a regression where `pnpm --recursive --filter '!<pkg>'
run/exec/test/add` would include the workspace root in the matched
projects. The workspace root is now correctly excluded by default when
only negative `--filter` arguments are provided, matching the
[documented behavior](https://pnpm.io/cli/recursive). To include the
root, pass `--include-workspace-root`
[#&#8203;11341](https://redirect.github.com/pnpm/pnpm/issues/11341).

- Restore npm-CLI-compatible `--json` stdout output for `pnpm publish`
([#&#8203;11476](https://redirect.github.com/pnpm/pnpm/issues/11476)).
pnpm 11 reimplemented publish natively
([#&#8203;10591](https://redirect.github.com/pnpm/pnpm/pull/10591)) and
inadvertently dropped the per-package JSON object that pnpm 10 emitted
transitively via the npm CLI, silently breaking downstream tooling —
most notably `nx release publish`, which parses stdout JSON to confirm
success
([nrwl/nx#35575](https://redirect.github.com/nrwl/nx/issues/35575)). On
success, the output is now:

- `pnpm publish --json` → single object `{ id, name, version, size,
unpackedSize, shasum, integrity, filename, files, entryCount, bundled
}`, mirroring `npm publish --json`.
- `pnpm publish -r --json` → array of those objects, mirroring `pnpm
pack --json`'s shape choice.
- `pnpm publish -r --report-summary` → existing
`pnpm-publish-summary.json` envelope `{ publishedPackages: [...] }` is
preserved, but each entry is upgraded to the same per-package shape
(additive — `name` and `version` are still present).

- `pnpm config get @&#8203;<scope>:registry` now reports the same URL
that `pnpm publish` and the resolvers actually use. Previously, `config
get` only consulted `.npmrc`, while `publish`/install used the merged
map that includes `pnpm-workspace.yaml`'s `registries` block — so the
two could diverge silently and a publish could go to the wrong registry
[#&#8203;11492](https://redirect.github.com/pnpm/pnpm/issues/11492).

###
[`v11.0.6`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1106)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.5...v11.0.6)

##### Patch Changes

- Fix `pnpm_config_npmrc_auth_file` and `pnpm_config_userconfig` env
vars not actually loading the custom `.npmrc`. The env vars were parsed
and assigned to the resolved config, but only after `loadNpmrcConfig`
had already read the default `~/.npmrc` — so the custom file path was
set but never read. The relevant env vars are now consulted before the
user-level `.npmrc` is loaded
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).
- Preserve the original key order in `pnpm-workspace.yaml` when updating
it. Existing keys keep their position, and new keys are inserted in
alphabetical position when the existing keys are already sorted (with a
leading `packages` key allowed) or appended at the end otherwise.
- Fixed `pnpm self-update` on installations originally set up by pnpm
v10. v10 added `PNPM_HOME` directly to PATH and wrote a `pnpm` bootstrap
shim there. v11 setup writes shims under `PNPM_HOME/bin` instead, so
when a v10 user upgrades to v11 the legacy shim at `PNPM_HOME` keeps
pointing into the old `.tools/<version>` install — `pnpm --version`
continues to report the pre-update version even though the new version
was installed under `global/v11`. Self-update now detects this layout,
refreshes the legacy shims so the upgrade actually takes effect, and
prints a hint suggesting `pnpm setup` to migrate PATH to the v11 layout.
[#&#8203;11464](https://redirect.github.com/pnpm/pnpm/issues/11464).
- Print a warning when settings that are not allowed in the global
config file (e.g. `nodeLinker`, `hoistPattern`) are present in
`config.yaml` and silently ignored. Previously these settings were
dropped without any feedback, leaving users unsure why their global
configuration had no effect. The warning suggests moving those settings
to a project-level `pnpm-workspace.yaml`, or sharing them across
projects via [config
dependencies](https://pnpm.io/11.x/config-dependencies).
- Throw a pnpm error when `overrides` has an invalid shape or contains a
non-string value.
- Validate all `readPackage` dependency map fields, including
`devDependencies`, and reject falsy non-object invalid values instead of
silently accepting them.
- Prevent crashes during `pnpm config`, `pnpm set`, and `pnpm get` by
tolerating `configDependencies` install failures. For these commands, a
failure to install `configDependencies` (for example because the
registry auth token has not been written yet) is now logged at debug
level and the command proceeds. All other commands still surface the
install error
[#&#8203;10684](https://redirect.github.com/pnpm/pnpm/issues/10684).
- Treat `allowBuilds` as an install-state input and clear previously
ignored builds when they are explicitly disallowed.
- Fixes
[#&#8203;10594](https://redirect.github.com/pnpm/pnpm/issues/10594),
catalogs not being read from the workspace when using the `catalog:`
protocol with the `pnpm dlx` / `pnpx` command, resulting in a catalog
entry not found error.
- Accept `PNPM_CONFIG_*` (uppercase) environment variables in addition
to `pnpm_config_*`. Previously, only the lowercase form was honored, so
env vars renamed per the v11 migration guide (e.g.
`PNPM_CONFIG_USERCONFIG`) silently had no effect on case-sensitive
systems like macOS and Linux
[#&#8203;11465](https://redirect.github.com/pnpm/pnpm/issues/11465).

###
[`v11.0.5`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1105)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.4...v11.0.5)

##### Patch Changes

- Drop the `darwin-x64` artifact from `@pnpm/exe` and from the GitHub
release page. The Node.js SEA mechanism `pnpm pack-app` uses produces a
binary that segfaults at startup on Intel Macs because of an upstream
Node.js bug
([nodejs/node#62893](https://redirect.github.com/nodejs/node/issues/62893),
tracked alongside
[#&#8203;59553](https://redirect.github.com/nodejs/node/issues/59553);
the Node.js team has [opted not to fix
it](https://redirect.github.com/nodejs/node/pull/60250) on the grounds
that x64 macOS is being phased out). Re-signing with `codesign` or
`ldid` doesn't help — the corruption is in LIEF's Mach-O surgery, before
signing.

Intel Mac users should install pnpm via `npm install -g pnpm` (uses the
system Node.js, no SEA), or stay on pnpm 10.x. `@pnpm/exe`'s preinstall
on Intel Mac now exits with a clear error pointing at these
alternatives.

Closes
[#&#8203;11423](https://redirect.github.com/pnpm/pnpm/issues/11423).

- `pnpm dlx` (and `pnpx`/`pnx`/`pnpm create`) now runs the same
interactive `approve-builds` prompt as `pnpm add -g` when the package
being launched depends on transitive packages with install scripts.
Previously, the v11 `strictDepBuilds` default made dlx fail with
`ERR_PNPM_IGNORED_BUILDS` and required users to re-run with
`--allow-build=<pkg>` for every offending dependency. dlx also now
removes the partially-populated cache directory when the install fails,
so a subsequent run starts clean instead of reusing a broken install
whose builds were silently skipped
[#&#8203;11444](https://redirect.github.com/pnpm/pnpm/issues/11444).

- [`72629fc`](https://redirect.github.com/pnpm/pnpm/commit/72629fc): Fix
`pnpm -g ls --json` and `pnpm -g ls --parseable` so they emit valid JSON
and parseable output respectively, matching pnpm 10 behavior. Since the
isolated global packages refactor in pnpm 11, the global list command
had a custom path that always printed plain text and ignored
`--json`/`--parseable`, which broke tools like `npm-check-updates` that
parse the JSON output
[#&#8203;11440](https://redirect.github.com/pnpm/pnpm/issues/11440).

`pnpm -g ls --depth=<n>` (with n > 0) now errors when more than one
isolated global install would be involved, since each install has its
own lockfile and merging their transitive trees would be incoherent.
When the request can be narrowed to a single install group, the regular
`list` flow is used and the full dependency tree is shown.

- Fixed `pnpm publish` to honor `publishConfig.registry` from
`package.json` when publishing a single package. The native publish flow
introduced in v11 was reading the registry from `.npmrc` only, ignoring
the per-package override
[#&#8203;11419](https://redirect.github.com/pnpm/pnpm/issues/11419).

- When `strictPeerDependencies` is `true`, the
`ERR_PNPM_PEER_DEP_ISSUES` error once again renders the peer dependency
issues inline using the same format as `pnpm peers check`, so users (and
CI tools like Renovate) can see what failed without running `pnpm peers
check` separately
[#&#8203;11439](https://redirect.github.com/pnpm/pnpm/issues/11439).

- The `WARN` and error code labels in pnpm's output now wrap in brackets
(`[WARN]`, `[ERR_PNPM_FOO]`). Previously the labels relied entirely on a
colored background to stand out, which meant they blended into the
surrounding text in terminals without color (e.g. when `NO_COLOR` is set
or output is piped). The brackets are painted in the same color as the
badge background, so they appear as ordinary padding in color-capable
terminals — only the no-color rendering changes.

###
[`v11.0.4`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1104)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.3...v11.0.4)

##### Patch Changes

- Fixed `pnpm ci` not reinstalling workspace package `node_modules`
directories after the clean step
[#&#8203;11427](https://redirect.github.com/pnpm/pnpm/issues/11427).
- Remove pnpm's workspace state file when cleaning node\_modules so
`pnpm ci` performs a fresh install after the clean step.
- Do not remove `pnpm-lock.yaml` during `pnpm clean` when `lockfile:
true` is configured in `pnpm-workspace.yaml`. The lockfile is only
removed when the `--lockfile` option is passed to `pnpm clean`.
- `pnpm self-update` (with no version argument) no longer downgrades
pnpm when the registry's `latest` dist-tag points to an older release
than the currently active version. Run `pnpm self-update latest` to
force a downgrade
[#&#8203;11418](https://redirect.github.com/pnpm/pnpm/issues/11418).
- `minimumReleaseAgeStrict` now defaults to `true` whenever the user
explicitly sets `minimumReleaseAge` (via `pnpm-workspace.yaml`, the
global `config.yaml`, the CLI, or `pnpm_config_*` env vars).

###
[`v11.0.3`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1103)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.2...v11.0.3)

##### Patch Changes

- Fix too many open files error sometimes happening on Windows, when
creating command shims in `node_modules/.bin`
[#&#8203;11412](https://redirect.github.com/pnpm/pnpm/issues/11412).
- Fix `ERR_PNPM_FETCH_404` when installing a project whose lockfile
depends on a `file:` tarball. The previous behavior dropped the
`tarball` field from `file:` and git-hosted resolutions when
`lockfile-include-tarball-url=false` (the default), even though those
URLs cannot be reconstructed from the package name, version, and
registry
[#&#8203;11407](https://redirect.github.com/pnpm/pnpm/issues/11407).

###
[`v11.0.2`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1102)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.1...v11.0.2)

##### Patch Changes

- Fix `ENOENT` symlink failure when `pnpm add -g` triggers the
approve-builds prompt. The global add flow used to forward an absolute
`modulesDir` (`<installDir>/node_modules`) into the install run by
`approve-builds`. The install layer treated `modulesDir` as a path
relative to `lockfileDir` and joined it again, producing a doubled path
on Windows because `path.join` does not collapse an embedded absolute
path. The hoist step then tried to `mkdir` and symlink under
`<installDir>\<installDir>\node_modules\.pnpm\node_modules\...` and
failed with `ENOENT`
[#&#8203;11403](https://redirect.github.com/pnpm/pnpm/issues/11403).
- Fixed `packageManagerDependencies` going stale when pnpm is invoked
through corepack. The lockfile sync (and the `devEngines.packageManager`
version check) previously ran only when pnpm was invoked directly; under
corepack the entire block was skipped, so a stale entry would persist
even after the running pnpm version changed. The lockfile sync now runs
regardless of how pnpm was invoked, while the pnpm-managed version
switch (`onFail: 'download'`) remains skipped under corepack so it
doesn't fight corepack's own version selection
[#&#8203;11397](https://redirect.github.com/pnpm/pnpm/issues/11397).
- Fix recursive publish summaries to report the manifest from
`publishConfig.directory` when packages publish from a generated
directory
[#&#8203;11239](https://redirect.github.com/pnpm/pnpm/issues/11239).
- Fix negated `os` / `cpu` entries (e.g. `["!win32"]`) being incorrectly
rejected when `supportedArchitectures` expands to multiple platforms
[#&#8203;11375](https://redirect.github.com/pnpm/pnpm/pull/11375).

###
[`v11.0.1`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1101)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.0.0...v11.0.1)

##### Patch Changes

- Report unknown top-level options before falling back to implicit `pnpm
run` scripts.
- Reject `null` named catalogs in workspace manifests with
`InvalidWorkspaceManifestError` instead of crashing with a raw
`TypeError`.
- Populate download location for git-sourced dependencies in SBOM
output. Previously `pnpm sbom` emitted `NOASSERTION` (SPDX) and omitted
the distribution reference (CycloneDX) for git dependencies. Now emits
the git URL with commit hash, e.g.
`git+https://github.com/user/repo.git#commit`.
- `pnpm self-update` now keeps `package.json`'s `packageManager` and
`devEngines.packageManager` in sync. When the legacy `packageManager`
field pins pnpm, both fields are rewritten to the new exact pnpm version
on update — `packageManager` to `pnpm@<version>` (without an integrity
hash), and `devEngines.packageManager.version` to the same exact
`<version>` (dropping any range operator). When only
`devEngines.packageManager` is declared, the existing range-preserving
behavior is unchanged
[#&#8203;11388](https://redirect.github.com/pnpm/pnpm/issues/11388).
- Sort the keys of the overrides object returned by `pnpm audit --fix`
so that the log output order matches the order written to
`pnpm-workspace.yaml`.
- Update the env lockfile's `packageManagerDependencies` entry when
`devEngines.packageManager` declares a pnpm version that the lockfile no
longer satisfies. Previously, the stale entry was kept even though the
running pnpm matched the declared version, silently breaking the
integrity record
[#&#8203;11387](https://redirect.github.com/pnpm/pnpm/issues/11387).

###
[`v11.0.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#1100)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v10.33.4...v11.0.0)

##### Highlights

##### Major

- **Node.js 22+ required** — support for Node 18, 19, 20, and 21 is
dropped, pnpm itself is now pure ESM, and the standalone exe requires
glibc 2.27.
- **Supply-chain protection on by default** — `minimumReleaseAge`
defaults to 1 day (newly published packages are not resolved for 24h)
and `blockExoticSubdeps` defaults to `true`.
- **`allowBuilds` replaces the old build-dependency settings** —
`onlyBuiltDependencies`, `onlyBuiltDependenciesFile`,
`neverBuiltDependencies`, `ignoredBuiltDependencies`, and
`ignoreDepScripts` have been removed.
- **Global installs are isolated and use the global virtual store by
default** — each `pnpm add -g` gets its own directory with its own
`package.json`, `node_modules`, and lockfile.
- **New SQLite-backed store index** (store v11) with bundled manifests
and hex digests, reducing filesystem syscalls and speeding up
installation.
- **Native publish flow** — [`pnpm
publish`](https://pnpm.io/11.x/cli/publish),
[`login`](https://pnpm.io/11.x/cli/login),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`view`](https://pnpm.io/11.x/cli/view),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) no longer delegate to the
npm CLI, and the remaining npm passthrough commands now throw "not
implemented".
- **[`pnpm audit`](https://pnpm.io/11.x/cli/audit) uses npm's bulk
advisories endpoint** — the legacy `/security/audits` endpoints are
gone. CVE-based filtering has been replaced with GHSA-based filtering:
migrate `auditConfig.ignoreCves` entries to `auditConfig.ignoreGhsas`.
- **`.npmrc` is auth/registry only** — all other settings must live in
`pnpm-workspace.yaml` or the new global `config.yaml`, and environment
variables use the `pnpm_config_*` prefix.
- **Runtime installs are slimmer** — installing a Node.js runtime via
`node@runtime:<version>` no longer extracts the bundled `npm`, `npx`,
and `corepack`, roughly halving the files pnpm has to hash, write, and
link.

##### Minor

- **New commands:** [`pnpm ci`](https://pnpm.io/11.x/cli/ci), [`pnpm
sbom`](https://pnpm.io/11.x/cli/sbom), [`pnpm
clean`](https://pnpm.io/11.x/cli/clean), [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers), [`pnpm runtime
set`](https://pnpm.io/11.x/cli/runtime), [`pnpm
docs`](https://pnpm.io/11.x/cli/docs)/`home`, [`pnpm
ping`](https://pnpm.io/11.x/cli/ping), [`pnpm
search`](https://pnpm.io/11.x/cli/search), [`pnpm
star`](https://pnpm.io/11.x/cli/star)/`unstar`/`stars`, [`pnpm
whoami`](https://pnpm.io/11.x/cli/whoami), [`pnpm
with`](https://pnpm.io/11.x/cli/with), and [`pnpm
pack-app`](https://pnpm.io/11.x/cli/pack-app), plus
`pn`/[`pnx`](https://pnpm.io/11.x/cli/pnx) short aliases.
- **ESM pnpmfiles** via `.pnpmfile.mjs`, which takes priority over
`.pnpmfile.cjs` when present.
- **[`pnpm audit --fix=update`](https://pnpm.io/11.x/cli/audit)** fixes
vulnerabilities by updating packages in the lockfile instead of adding
overrides, and `pnpm audit --fix --interactive` lets you select which
advisories to fix.
- **[`pnpm pack-app`](https://pnpm.io/11.x/cli/pack-app)** packs a
CommonJS entry into a standalone executable for one or more target
platforms using Node.js Single Executable Applications.
- **Faster HTTP and I/O** — undici with Happy Eyeballs, direct-to-CAS
writes, skipped staging directory, pre-allocated tarball downloads, and
an NDJSON metadata cache.

##### Major Changes

##### Requirements

- pnpm is now distributed as pure ESM.
- Dropped support for Node.js v18, 19, 20, and 21.
- The standalone exe version of pnpm requires at least glibc 2.27.

##### Security & Build Defaults

- Changed default values: `optimisticRepeatInstall` is now `true`,
`verifyDepsBeforeRun` is now `install`, `minimumReleaseAge` is now
`1440` (1 day), and `minimumReleaseAgeStrict` is `false`. Newly
published packages will not be resolved until they are at least 1 day
old. This protects against supply chain attacks by giving the community
time to detect and remove compromised versions. To opt out, set
`minimumReleaseAge: 0` in `pnpm-workspace.yaml`
[#&#8203;11158](https://redirect.github.com/pnpm/pnpm/pull/11158).

- `strictDepBuilds` is `true` by default.

- `blockExoticSubdeps` is `true` by default.

- Removed deprecated build dependency settings: `onlyBuiltDependencies`,
`onlyBuiltDependenciesFile`, `neverBuiltDependencies`,
`ignoredBuiltDependencies`, and `ignoreDepScripts`
[#&#8203;11220](https://redirect.github.com/pnpm/pnpm/pull/11220).

Use the `allowBuilds` setting instead. It is a map where keys are
package name patterns and values are booleans:

  - `true` means the package is allowed to run build scripts
- `false` means the package is explicitly denied from running build
scripts

Same as before, by default, none of the packages in the dependencies are
allowed to run scripts. If a package has postinstall scripts and it
isn't declared in `allowBuilds`, an error is printed.

  Before:

  ```yaml
  onlyBuiltDependencies:
    - electron
  onlyBuiltDependenciesFile: "allowed-builds.json"
  neverBuiltDependencies:
    - core-js
  ignoredBuiltDependencies:
    - esbuild
  ```

  After:

  ```yaml
  allowBuilds:
    electron: true
    core-js: false
    esbuild: false
  ```

- Removed `allowNonAppliedPatches` in favor of `allowUnusedPatches`.

- Removed `ignorePatchFailures`; patch application failures now throw an
error.

##### Store

- Runtime dependencies are always linked from the global virtual store
[#&#8203;10233](https://redirect.github.com/pnpm/pnpm/pull/10233).
- Optimized index file format to store the hash algorithm once per file
instead of repeating it for every file entry. Each file entry now stores
only the hex digest instead of the full integrity string
(`<algo>-<digest>`). Using hex format improves performance since file
paths in the content-addressable store use hex representation,
eliminating base64-to-hex conversion during path lookups.
- Store version bumped to v11.
- The bundled manifest (name, version, bin, engines, scripts, etc.) is
now stored directly in the package index file, eliminating the need to
read `package.json` from the content-addressable store during resolution
and installation. This reduces I/O and speeds up repeat installs
[#&#8203;10473](https://redirect.github.com/pnpm/pnpm/pull/10473).
- The package index in the content-addressable store is now backed by
SQLite. Instead of individual JSON files under `$STORE/index/`, package
metadata is stored in a single SQLite database at `$STORE/index.db` with
MessagePack-encoded values. This reduces filesystem syscall overhead,
improves space efficiency for small metadata entries, and enables
concurrent access via SQLite's WAL mode. Packages missing from the new
index are re-fetched on demand
[#&#8203;10500](https://redirect.github.com/pnpm/pnpm/pull/10500)
[#&#8203;10826](https://redirect.github.com/pnpm/pnpm/issues/10826).

##### Global Packages

- Global installs (`pnpm add -g pkg`) and `pnx` now use the global
virtual store by default. Packages are stored at `{storeDir}/links`
instead of per-project `.pnpm` directories. This can be disabled by
setting `enableGlobalVirtualStore: false`
[#&#8203;10694](https://redirect.github.com/pnpm/pnpm/pull/10694).

- Isolated global packages. Each globally installed package (or group of
packages installed together) now gets its own isolated installation
directory with its own `package.json`, `node_modules/`, and lockfile.
This prevents global packages from interfering with each other through
peer dependency conflicts, hoisting changes, or version resolution
shifts.

  Key changes:

- `pnpm add -g <pkg>` creates an isolated installation in
`{pnpmHomeDir}/global/v11/{hash}/`
- `pnpm remove -g <pkg>` removes the entire installation group
containing the package
- `pnpm update -g [pkg]` re-installs packages in new isolated
directories
- `pnpm list -g` scans isolated directories to show all installed global
packages
- `pnpm install -g` (no args) is no longer supported; use `pnpm add -g
<pkg>` instead

- Globally installed binaries are now stored in a `bin` subdirectory of
`PNPM_HOME` instead of directly in `PNPM_HOME`. This prevents internal
directories like `global/` and `store/` from polluting shell
autocompletion when `PNPM_HOME` is on PATH
[#&#8203;10986](https://redirect.github.com/pnpm/pnpm/issues/10986).
After upgrading, run `pnpm setup` to update your shell configuration.

- Breaking changes to `pnpm link`:

- `pnpm link <pkg-name>` no longer resolves packages from the global
store. Only relative or absolute paths are accepted. For example, use
`pnpm link ./foo` instead of `pnpm link foo`.
- `pnpm link --global` is removed. Use `pnpm add -g .` to register a
local package's bins globally.
- `pnpm link` (no arguments) is removed. Use `pnpm link <dir>` with an
explicit path instead.

##### Configuration

- pnpm no longer reads all settings from `.npmrc`. Only auth and
registry settings are read from `.npmrc` files. All other settings (like
`hoistPattern`, `nodeLinker`, `shamefullyHoist`, etc.) must be
configured in `pnpm-workspace.yaml` or the global
`~/.config/pnpm/config.yaml`
[#&#8203;11189](https://redirect.github.com/pnpm/pnpm/pull/11189).

- Network settings (`httpProxy`, `httpsProxy`, `noProxy`,
`localAddress`, `strictSsl`, `gitShallowHosts`) are now written to
`config.yaml` (global) or `pnpm-workspace.yaml` (local) instead of
`.npmrc`/`auth.ini`. They are still readable from `.npmrc` for easier
migration from the npm CLI
[#&#8203;11209](https://redirect.github.com/pnpm/pnpm/pull/11209).

pnpm no longer reads `npm_config_*` environment variables. Use
`pnpm_config_*` environment variables instead (e.g.,
`pnpm_config_registry` instead of `npm_config_registry`).

  pnpm no longer reads the npm global config at `$PREFIX/etc/npmrc`.

  `pnpm login` writes auth tokens to `~/.config/pnpm/auth.ini`.

  New `registries` setting in `pnpm-workspace.yaml`:

  ```yaml
  registries:
    default: https://registry.npmjs.org/
    "@&#8203;my-org": https://private.example.com/
    "@&#8203;internal": https://nexus.corp.com/
  ```

Auth tokens in `~/.npmrc` still work — pnpm continues to read `~/.npmrc`
as a fallback for registry authentication. The new `npmrcAuthFile`
setting can be used to point to a different file instead of `~/.npmrc`.

- Replace workspace project specific `.npmrc` with `packageConfigs` in
`pnpm-workspace.yaml`.

  A workspace manifest with `packageConfigs` looks something like this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    "project-1":
      saveExact: true
    "project-2":
      savePrefix: "~"
  ```

  Or this:

  ```yaml
  # File: pnpm-workspace.yaml
  packages:
    - "packages/project-1"
    - "packages/project-2"
  packageConfigs:
    - match: ["project-1", "project-2"]
      modulesDir: "node_modules"
      saveExact: true
  ```

- pnpm no longer reads settings from the `pnpm` field of `package.json`.
Settings should be defined in `pnpm-workspace.yaml`
[#&#8203;10086](https://redirect.github.com/pnpm/pnpm/pull/10086).

- `pnpm config get` (without `--json`) no longer prints INI formatted
text. Instead, it prints JSON for objects and arrays, and raw strings
for strings, numbers, booleans, and nulls. `pnpm config get --json`
still prints all types of values as JSON, as before.

- `pnpm config get <array>` now prints a JSON array.

- `pnpm config list` now prints a JSON object instead of INI formatted
text.

- `pnpm config list` and `pnpm config get` (without argument) now hide
auth-related settings.

- `pnpm config list` and `pnpm config get` (without argument) now show
top-level keys as camelCase. Exception: keys that start with `@` or `//`
are preserved (their cases don't change).

- `pnpm config get` and `pnpm config list` no longer load non-camelCase
options from the workspace manifest (`pnpm-workspace.yaml`).

##### Removed Commands & npm Passthrough

- pnpm no longer falls back to the npm CLI. Commands that were
previously passed through to npm (`access`, `bugs`, `docs`, `edit`,
`find`, `home`, `issues`, `owner`, `ping`, `prefix`, `profile`, `pkg`,
`repo`, `search`, `set-script`, `star`, `stars`, `team`, `token`,
`unstar`, `whoami`, `xmas`) and their aliases (`s`, `se`) now throw a
"not implemented" error, with a suggestion to use the npm CLI directly
[#&#8203;10642](https://redirect.github.com/pnpm/pnpm/pull/10642). Other
previously passed-through commands —
[`view`](https://pnpm.io/11.x/cli/view) (`info`, `show`, `v`),
[`login`](https://pnpm.io/11.x/cli/login) (`adduser`),
[`logout`](https://pnpm.io/11.x/cli/logout),
[`deprecate`](https://pnpm.io/11.x/cli/deprecate),
[`unpublish`](https://pnpm.io/11.x/cli/unpublish),
[`dist-tag`](https://pnpm.io/11.x/cli/dist-tag), and
[`version`](https://pnpm.io/11.x/cli/version) — have been reimplemented
natively in pnpm (see New Commands below).

- [`pnpm publish`](https://pnpm.io/11.x/cli/publish) now works without
the `npm` CLI.

The One-time Password feature now reads from `PNPM_CONFIG_OTP` instead
of `NPM_CONFIG_OTP`:

  ```sh
  export PNPM_CONFIG_OTP='<your OTP here>'
  pnpm publish --no-git-checks
  ```

If the registry requests OTP and the user has not provided it via the
`PNPM_CONFIG_OTP` environment variable or the `--otp` flag, pnpm will
prompt the user directly for an OTP code.

If the registry requests web-based authentication, pnpm will print a
scannable QR code along with the URL.

Since the new `pnpm publish` no longer calls `npm publish`, some
undocumented features may have been unknowingly dropped. If you rely on
a feature that is now gone, please open an issue at
<https://github.com/pnpm/pnpm/issues>. In the meantime, you can use
`pnpm pack && npm publish *.tgz` as a workaround.

- Removed the `pnpm server` command
[#&#8203;10463](https://redirect.github.com/pnpm/pnpm/pull/10463).

- Removed support for the `useNodeVersion` and
`executionEnv.nodeVersion` fields. `devEngines.runtime` and
`engines.runtime` should be used instead
[#&#8203;10373](https://redirect.github.com/pnpm/pnpm/pull/10373).

- Removed support for `hooks.fetchers`. We now have a new API for custom
fetchers and resolvers via the `fetchers` field of `pnpmfile`.

##### Lifecycle Scripts

- pnpm no longer populates `npm_config_*` environment variables from the
pnpm config during lifecycle scripts. Only well-known `npm_*` env vars
are now set, matching Yarn's behavior
[#&#8203;11116](https://redirect.github.com/pnpm/pnpm/pull/11116).

##### CLI Output

- Cleaner output for script execution: pnpm now prints `$ command`
instead of `> pkg@version stage path\n> command`, and shows project name
and path only when running in a different directory. The `$ command`
line is printed to stderr to keep stdout clean for piping
[#&#8203;11132](https://redirect.github.com/pnpm/pnpm/pull/11132).
- During install, instead of rendering the full peer dependency issues
tree, pnpm now suggests running [`pnpm peers
check`](https://pnpm.io/11.x/cli/peers) to view the issues
[#&#8203;11133](https://redirect.github.com/pnpm/pnpm/pull/11133).

##### Lockfile

- Simplified `patchedDependencies` lockfile format from `Record<string,
{ path: string, hash: string }>` to `Record<string, string>` (selector
to hash). Existing lockfiles with the old format are automatically
migrated
[#&#8203;10911](https://redirect.github.com/pnpm/pnpm/pull/10911).

##### Other

- The default value of the `type` field in the `package.json` file of
the project initialized by `pnpm init` command has been changed to
`module`.

- Added support for lowercase options in `pnpm add`: `-d`, `-p`, `-o`,
`-e` [#&#8203;9197](https://redirect.github.com/pnpm/pnpm/issues/9197).

  When using the `pnpm add` command only:

  - `-p` is now an alias for `--save-prod` instead of `--parseable`
  - `-d` is now an alias for `--save-dev` instead of `--loglevel=info`

- The root workspace project is no longer excluded when it is explicitly
selected via a filter
[#&#8203;10465](https://redirect.github.com/pnpm/pnpm/pull/10465).

##### Audit

- [`pnpm audit`](https://pnpm.io/11.x/cli/audit) now calls npm's
`/-/npm/v1/security/advisories/bulk` endpoint. The legacy
`/-/npm/v1/security/audits{,/quick}` endpoints have been retired by the
registry, so the legacy request/response contract is no longer
supported.

The bulk endpoint does not return CVE identifiers. CVE-based filtering
has been replaced with GitHub advisory ID (GHSA) filtering:

- `auditConfig.ignoreCves` → `auditConfig.ignoreGhsas` (the previous key
is no longer recognized)
- `pnpm audit --ignore <id>` / `pnpm audit --ignore-unfixable` now read
and write GHSAs instead of CVEs
- GHSAs are derived from each advisory's `url`
(`https://github.com/advisories/GHSA-xxxx-xxxx-xxxx`)

To migrate: replace each `CVE-YYYY-NNNNN` entry in your
`auditConfig.ignoreCves` with the corresponding `GHSA-xxxx-xxxx-xxxx`
value (visible in the `More info` column of `pnpm audit` output) and
move it under `auditConfig.ignoreGhsas`.

##### Package Manager Settings

- **Breaking:** removed the `managePackageManagerVersions`,
`packageManagerStrict`, and `packageManagerStrictVersion` settings. They
existed only to derive the `onFail` behavior for the legacy
`packageManager` field, and the `pmOnFail` setting introduced alongside
[`pnpm with`](https://pnpm.io/11.x/cli/with) subsumes all three — it
directly sets the `onFail` behavior of both `packageManager` and
`devEngines.packageManager`. The `COREPACK_ENABLE_STRICT` environment
variable is no longer honored (it only gated `packageManagerStrict`);
use `pmOnFail` instead.

  Migration:

| Removed setting | Replace with |
| ------------------------------------- | ------------------------------
|
| `managePackageManagerVersions: true` | `pmOnFail: download` (default)
|
| `managePackageManagerVersions: false` | `pmOnFail: ignore` |
| `packageManagerStrict: false` | `pmOnFail: warn` |
| `packageManagerStrictVersion: true` | `pmOnFail: error` |
| `COREPACK_ENABLE_STRICT=0` | `pmOnFail: warn` |

##### Runtime Installs

- Installing a Node.js runtime via `node@runtime:<version>` (including
`pnpm env use` and `pnpm runtime set node`) no longer extracts the
bundled `npm`, `npx`, and `corepack` from the Node.js archive. This cuts
roughly half of the files pnpm has to hash, write to the CAS, and link
during installation, making runtime installs noticeably faster. Users
who still need `npm` can install it as a separate package.

##### Minor Changes

##### New Commands

- Added native [`pnpm view`](https://pnpm.io/11.x/cli/view) (`info`,
`show`, `v`) command for viewing package metadata from the registry
[#&#8203;11064](https://redirect.github.com/pnpm/pnpm/pull/11064).
- Added [`pnpm login`](https://pnpm.io/11.x/cli/login) (and `pnpm
adduser` alias) command for authenticating with npm registries. Supports
web-based login with QR code as well as classic username/password login
[#&#8203;11094](https://redirect.github.com/pnpm/pnpm/pull/11094).
- Added [`pnpm logout`](https://pnpm.io/11.x/cli/logout) command for
logging out of npm registries. Revokes the authentication token on the
registry and removes it from the local auth config file
[#&#8203;11213](https://redirect.github.com/pnpm/pnpm/pull/11213).
- Added native [`pnpm deprecate`](https://pnpm.io/11.x/cli/deprecate)
and `pnpm undeprecate` commands for setting and removing deprecation
messages on package versions without delegating to the npm CLI
[#&#8203;11120](https://redirect.github.com/pnpm/pnpm/pull/11120).
- Added native [`pnpm unpublish`](https://pnpm.io/11.x/cli/unpublish)
command. Supports unpublishing specific versions, version ranges via
semver, and entire packages with `--force`
[#&#8203;11128](https://redirect.github.com/pnpm/pnpm/pull/11128).
- Added native [`pnpm dist-tag`](https://pnpm.io/11.x/cli/dist-tag)
command (`ls`, `add`, `rm` subcommands)
[#&#8203;11218](https://redirect.github.com/pnpm/pnpm/pull/11218).
- Added [`pnpm sbom`](https://pnpm.io/11.x/cli/sbom) command for
generating Software Bill of Materials in CycloneDX 1.7 and SPDX 2.3 JSON
formats
[#&#8203;9088](https://redirect.github.com/pnpm/pnpm/issues/9088).
- Added [`pnpm clean`](https://pnpm.io/11.x/cli/clean) command that
safely removes `node_modules` directories from all workspace projects
[#&#8203;10707](https://redirect.github.com/pnpm/pnpm/issues/10707). Use
`--lockfile` to also remove `pnpm-lock.yaml` files.
- Added a new command [`pnpm runtime set <runtime name> <runtime version
spec> [-g]`](https://pnpm.io/11.x/cli/runtime) for installing runtimes.
Deprecated `pnpm env use` in favor of the new command.
- Added the ability to fix vulnerabilities by updating packages in the
lockfile instead of adding overrides. Use [`pnpm audit
--fix=update`](https://pnpm.io/11.x/cli/audit)
[#&#8203;10341](https://redirect.github.com/pnpm/pnpm/pull/10341).
- Added [`pnpm ci`](https://pnpm.io/11.x/cli/ci) command for clean
installs
[#&#8203;6100](https://redirect.github.com/pnpm/pnpm/issues/6100). The
command runs `pnpm clean` followed by `pnpm install --frozen-lockfile`.
Designed for CI/CD environments where reproducible builds are critical.
Aliases: `pnpm clean-install`, `pnpm ic`, `pnpm install-clean`
[#&#8203;11003](https://redirect.github.com/pnpm/pnpm/pull/11003).
- Added [`pnpm peers check`](https://pnpm.io/11.x/cli/peers) command
that checks for unmet and missing peer dependency issues by reading the
lockfile
[#&#8203;7087](https://redirect.github.com/pnpm/pnpm/issues/7087).
- Implemented the [`version`](https://pnpm.io/11.x/cli/version) command
natively in pnpm to support workspaces and `workspace:` protocols
correctly. The new command allows bumping package versions (major,
minor, patch, etc.) with full workspace support and git integration
[#&#8203;10879](https://redirect.github.com/pnpm/pnpm/pull/10879).
- [`pnpm audit --fix`](https://pnpm.io/11.x/cli/audit) now 

> ✂ **Note**
> 
> PR body was truncated to here.


</details>

---

### Configuration

📅 **Schedule**: (in timezone Asia/Shanghai)

- Branch creation
  - "before 10am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/oxc-project/eslint-plugin-oxlint).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzkuMyIsInVwZGF0ZWRJblZlciI6IjQzLjE3OS4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant