Skip to content

chore: adopt pnpm 10 and let packageManager name the version - #449

Merged
dastratakos merged 1 commit into
mainfrom
chore-adopt-pnpm-10
Aug 22, 2026
Merged

chore: adopt pnpm 10 and let packageManager name the version#449
dastratakos merged 1 commit into
mainfrom
chore-adopt-pnpm-10

Conversation

@dastratakos

@dastratakos dastratakos commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

The drift

The lockfile has been generated by pnpm 10 for some time while packageManager still pinned 9.15.0. Vercel reported it on every build:

Detected `pnpm-lock.yaml` version 9 generated by pnpm@10.x
  with package.json#packageManager pnpm@9.15.0

Same class as the Node majors: several places naming a version, one of them stale, nothing failing.

What changed

  • packageManagerpnpm@10.34.5.
  • The three workflow steps stop pinning version: 9.15.0. pnpm/action-setup reads packageManager when given no version, so the field becomes the single source the way .nvmrc already is for Node. Three copies of a version string were three more places for this exact drift to start.
  • README updated.

No lockfile migration was needed. lockfileVersion: '9.0' is what both majors write, so pnpm-lock.yaml is byte-identical after a full pnpm 10 install — which is also the evidence the lockfile really was already pnpm-10-generated.

pnpm 10's breaking change, and why nothing needed allowlisting

pnpm 10 runs no dependency's build script unless named in onlyBuiltDependencies. It reports six ignored here, and each was checked rather than assumed:

Ignored script Why it can stay ignored
esbuild ×4 Ships a binary per platform as an optional dep; the script isn't a download step. esbuild --version0.28.2, and the desktop build runs.
core-js Prints a funding notice.
electron-winstaller Builds the Windows installer this project never makes.

So pnpm-workspace.yaml is untouched and every dependency script stays blocked, which is the point of pnpm's policy.

I did first add a macos-alias entry, for the native addon ds-store reached in the legacy packager DMG path — then dropped it: that path (apps/desktop/scripts/release.mjs) has since been removed in favour of electron-builder, and ds-store/macos-alias are no longer in the lockfile at all. Allowlisting a package that isn't in the tree would have been dead config.

Verification

  • Clean install with pnpm 10.34.5 from an empty node_modules, then ./scripts/check.shexit 0, 24 suites clean.
  • pnpm --filter @luke/desktop run build succeeds — the esbuild-driven path, which is what the unapproved esbuild scripts would have broken.
  • Corepack resolves pnpm to 10.34.5 from the field, so a contributor with an older pnpm on PATH is switched automatically rather than left on 9.

Portable-only change; no macOS or UI surface touched, so no visual evidence applies. CI's macOS job exercises verify.sh against the pnpm 10 install.

Pre-existing flakiness, unrelated to this change

apps/desktop's native/Electron-adjacent tests (talk-key, output-volume, apple-calendar, settings-handler, dock-presence, microphone-route, hotkey-registrar) intermittently fail under check.sh's parallel load with a bare 'test failed' and uniform sub-second durations — the signature of a helper timeout. They pass 734/734 run alone and 34/34 in isolation, and this reproduced on pnpm 9 before any change in this branch. Flagging it as worth a look on its own; not addressed here.

🤖 Generated with Claude Code

Automated visual evidence

Download the deterministic macOS evidence · workflow run

  • Commit: 4da7647c64b1ac3236c97f9c66e5aebbd6acf719
  • Scenario: smoke
  • Physical-notch check: not performed by CI

The lockfile has been generated by pnpm 10 for some time while
`packageManager` still pinned 9.15.0, which Vercel reported on every build:

    Detected `pnpm-lock.yaml` version 9 generated by pnpm@10.x with
    package.json#packageManager pnpm@9.15.0

`packageManager` now names 10.34.5. Nothing had to be migrated to get there:
lockfileVersion 9.0 is what both majors write, so the lockfile is untouched by
this change.

The workflows stop pinning a version of their own. `pnpm/action-setup` reads
`packageManager` when no `version` is given, so the field is the single source
the way `.nvmrc` already is for Node — three copies of `9.15.0` were three
more places for the same drift to start, and this is the drift they would have
produced.

pnpm 10 runs no dependency's build script unless it is named in
`onlyBuiltDependencies`, and none here needs naming. It reports six ignored:
the four esbuild copies ship a binary per platform rather than fetching one in
a script, core-js only prints a funding notice, and electron-winstaller builds
the Windows installer this project never makes. The desktop build and the full
suite both run against that install, so the default stays and every script
stays blocked, which is the whole point of pnpm's policy.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Aug 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
luke-web Ready Ready Preview Aug 22, 2026 12:53am

Request Review

@dastratakos
dastratakos added this pull request to the merge queue Aug 22, 2026
Merged via the queue into main with commit a1157b1 Aug 22, 2026
10 checks passed
@dastratakos
dastratakos deleted the chore-adopt-pnpm-10 branch August 22, 2026 00:59
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