Skip to content

chore(pnpm): supply-chain hardening (lifecycle allowlist, release-age cooldown, overrides migration)#688

Draft
Shinyaigeek wants to merge 2 commits into
thesysdev:mainfrom
Shinyaigeek:chore/pnpm-supply-chain
Draft

chore(pnpm): supply-chain hardening (lifecycle allowlist, release-age cooldown, overrides migration)#688
Shinyaigeek wants to merge 2 commits into
thesysdev:mainfrom
Shinyaigeek:chore/pnpm-supply-chain

Conversation

@Shinyaigeek

Copy link
Copy Markdown
Contributor

Summary

Supply-chain hardening for pnpm.

Stacked on #687 (pin Node.js to v24). pnpm 11 requires Node ≥ 22.13, so this depends on the Node bump.
Until #687 merges, the diff here also shows its single Node commit (chore: pin Node.js to v24); once #687 lands, this PR's diff reduces to the pnpm-only changes below. Please review/merge #687 first.

Changes (this PR)

  • Pin pnpm via packageManager: pnpm@11.9.0; both workflows resolve it from that field through pnpm/action-setup@v4 — single source of truth, replacing the divergent 9.0.6 / 9.15.4 pins.
  • Block lifecycle scripts by default (pnpm 11). Only deps that genuinely need a native build are allow-listed via allowBuilds (@parcel/watcher, esbuild, sharp, unrs-resolver). Telemetry/cosmetic scripts stay blocked: @scarf/scarf, core-js, protobufjs, @google/genai.
  • Release-age cooldown minimumReleaseAge: 1440 (24h) — refuses to install versions published in the last day, mitigating self-propagating npm worms.
  • verifyDepsBeforeRun: install — scripts never run against a stale/tampered dependency tree.
  • Migrate CVE-pin overrides from the package.json pnpm field to pnpm-workspace.yaml. pnpm 11 no longer reads the package.json field — without this move the CVE pins would silently stop applying.

Test plan / validation

Validated locally with Node 24.18.0 + pnpm 11.9.0 (pnpm install --frozen-lockfile):

  • Exit 0; pnpm-lock.yaml unchanged
  • allowBuilds honored — esbuild/sharp/unrs-resolver/@parcel/watcher build; the four telemetry/cosmetic scripts do not run; no ERR_PNPM_IGNORED_BUILDS
  • No "the pnpm field in package.json is no longer read" warning (overrides correctly relocated)
  • CI green on Node 24 (after chore: pin Node.js to v24 (LTS) #687)

🤖 Generated with Claude Code

Shinyaigeek and others added 2 commits June 28, 2026 23:42
Standardize the toolchain on Node.js 24.18.0 (current LTS, "Krypton"):

- Add a `.node-version` file so local tooling (nvm/fnm/mise/Volta) and CI
  resolve the same Node version.
- Have both GitHub Actions workflows read the version from `.node-version`
  via `node-version-file` instead of a hardcoded `node-version: 20`, keeping
  a single source of truth.
- Declare the requirement in package.json `engines.node` (exact match to
  `.node-version`).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Harden the pnpm setup against supply-chain attacks. Requires Node >= 22.13
(pnpm 11), hence stacked on the Node 24 bump.

- Pin pnpm via `packageManager: pnpm@11.9.0`; both workflows now resolve it
  from that field through `pnpm/action-setup@v4` (single source of truth,
  replacing the divergent 9.0.6 / 9.15.4 pins).
- Block lifecycle scripts by default (pnpm 11) and allow only the few deps
  that genuinely need a native build via `allowBuilds`; telemetry/cosmetic
  scripts (@scarf/scarf, core-js, protobufjs, @google/genai) stay blocked.
- Add `minimumReleaseAge: 1440` (24h cooldown) to avoid installing
  freshly-published, potentially-compromised releases.
- Add `verifyDepsBeforeRun: install` so scripts never run against a stale or
  tampered dependency tree.
- Migrate the CVE-pin `overrides` from the package.json `pnpm` field to
  `pnpm-workspace.yaml` (pnpm 11 no longer reads the package.json field).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.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