Upgrade pnpm 10 → 11#4761
Merged
Merged
Conversation
* Codemod: `package.json#pnpm.*` (overrides, peerDependencyRules,
patchedDependencies, onlyBuiltDependencies, allowedDeprecatedVersions)
→ `pnpm-workspace.yaml`; `onlyBuiltDependencies` array → `allowBuilds`
map; `.npmrc` `use-node-version` → `package.json#devEngines.runtime`
(`.npmrc` is now empty and removed).
* `.mise.toml`: switch from `pnpm` (aqua backend) to `npm:pnpm = "11.0.9"`.
The aqua manifest doesn't yet support pnpm 11's repackaged release
assets (tarballs, `darwin-arm64`); `npm:pnpm` works today and removes
the aqua dependency for this tool.
* `engines.pnpm`: `^10` → `^11`.
* `pnpm-workspace.yaml`: pin the @embroider/compat patch to `3.9.3` only.
Under v10 it was silently a no-op for v4.1.17 (the package was
repackaged with sources under `dist/src/`); v11 fails hard on patch
apply errors, so we preserve v10's effective behavior by scoping the
patch to the version it actually patches.
* `pnpm-workspace.yaml`: `allowBuilds.core-js: false`. v11 turns
ignored build scripts into a hard fail; `core-js@2`'s install banner
is the only postinstall not previously listed in `onlyBuiltDependencies`.
* `pnpm-lock.yaml` regenerated:
- `patchedDependencies` shape changed to `Record<string, string>`.
- v11's stricter peer-dep resolution prunes unused transitive
`@glint/environment-ember-loose@1.5.2`.
Contributor
There was a problem hiding this comment.
Pull request overview
This PR upgrades the repo’s package manager tooling from pnpm v10 to pnpm v11 as part of CS-11100, updating workspace configuration and regenerating the lockfile to match pnpm 11’s formats and behaviors.
Changes:
- Migrate pnpm configuration from
package.json#pnpmintopnpm-workspace.yaml, including overrides, patched dependencies, peer rules, and build-script allow/deny settings. - Bump the repo’s pnpm engine requirement to
^11, moveuse-node-versiontopackage.json#devEngines.runtime, and remove the now-empty.npmrc. - Update
misetooling to install pnpm 11.0.9 vianpm:pnpmand regeneratepnpm-lock.yamlin pnpm 11 format.
Reviewed changes
Copilot reviewed 4 out of 5 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| pnpm-workspace.yaml | Adds pnpm v11 workspace-level configuration (overrides, patches, peer rules, allowBuilds). |
| pnpm-lock.yaml | Regenerated lockfile reflecting pnpm 11 structural changes and peer/patch metadata updates. |
| package.json | Bumps engines.pnpm to ^11 and records the Node runtime version via devEngines.runtime. |
| .npmrc | Removes use-node-version since it’s migrated to package.json. |
| .mise.toml | Switches pnpm install source to npm:pnpm and pins pnpm to 11.0.9. |
Files not reviewed (1)
- pnpm-lock.yaml: Language not supported
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Contributor
habdelra
approved these changes
May 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Resolves CS-11100.
Summary
pnpx codemod run pnpm-v10-to-v11: movedpackage.json#pnpm.*→pnpm-workspace.yaml, consolidatedonlyBuiltDependenciesintoallowBuilds, migrated.npmrc#use-node-version→package.json#devEngines.runtime(and removed the now-empty.npmrc)..mise.tomlto pnpm 11.0.9, bumpedengines.pnpmto^11, regenerated the lockfile.Things worth flagging in review
.mise.tomlswitched frompnpm(aqua) →"npm:pnpm" = "11.0.9". The aqua manifest for pnpm hasn't been updated to handle v11's new GitHub release asset layout (tarballs vs raw binaries,darwin-arm64/linux-arm64.tar.gzvsmacos-arm64/linux-arm64).npm:pnpmworks today and removes the aqua-manifest dependency for this tool. Trade-off: pnpm now installs through npm rather than from a prebuilt binary — a few seconds slower on first install but otherwise transparent (CI usesjdx/mise-actionwhich sources.mise.tomleither way).@embroider/compatpatch was pinned to3.9.3only. Under pnpm 10 this patch was silently a no-op for v4.1.17 — the package was repackaged with sources underdist/src/, so the patch path (src/compat-app.js) missed. v11 makes patch-apply failures fatal, so I scoped the patch to3.9.3(the version it actually patches) to preserve v10's effective behavior. Thecatalog:-aware codepath in v4.1.17 remains unpatched, same as today.allowBuilds.core-js: false. v11 turns "ignored build scripts" into a hard install failure (ERR_PNPM_IGNORED_BUILDS).core-js@2.6.12is the only transitive postinstall not already covered by the migratedonlyBuiltDependencies. It's the classic opencollective banner — explicitly opting out matches v10 behavior.minimumReleaseAge: 1440kept as-is. The Linear ticket recommends0, but this was deliberately added in Add minimumReleaseAge configuration for pnpm #3255 with an explicitminimumReleaseAgeExcludelist — keeping the cooldown matches the team's existing opt-in.@glint/environment-ember-loose@1.5.2(verified nothing in source or build configs imports it).patchedDependenciesshape collapsed from object →Record<string, string>(path moved topnpm-workspace.yaml).patches/(ember-window-mock@1.0.0.patch,tracked-built-ins.patch) — not referenced inpatchedDependencies. Pre-existing onmain, not removed in this PR to keep scope tight.After-merge note for the team
Anyone with a checked-out branch needs to run
mise installto pick up pnpm 11 beforepnpm installon their branch. Local-devpnpmwill still resolve to whatever your old.mise.tomlpinned until youmise install.Test plan
Verified locally on this branch:
pnpm install(non-frozen) succeeds; lockfile diff is structural, no resolution shuffles.pnpm install --frozen-lockfile(CI mode) succeeds.patches/apply cleanly (after pinning@embroider/compatto 3.9.3).pnpm --filter @cardstack/boxel-icons buildpnpm --filter @cardstack/boxel-ui buildpnpm --filter @cardstack/host build(dev) andbuild:productionpnpm --filter @cardstack/realm-server lint:types(realm-server has no separate build)pnpm --filter @cardstack/eslint-plugin-boxel test(65/65)pnpm --filter bot-runner test(38/38, 1 skip)Relying on CI to exercise:
ci.yaml,ci-host.yaml,ci-lint.yaml,ci-software-factory.yaml,test-web-assets.yamlapply.sh/lint.shif anything inpackages/observability/changes on this branchDraft until CI is green.