Skip to content

chore: Node 26, @types/node 26 and pnpm 12 - #259

Merged
procoduck merged 1 commit into
mainfrom
chore/node-26-pnpm-12
Oct 1, 2026
Merged

procoduck merged 1 commit into
mainfrom
chore/node-26-pnpm-12

Conversation

@procoduck

Copy link
Copy Markdown
Owner

Node 24 -> 26 runtime, with @types/node 26 and pnpm 11 -> 12 (maintainer-approved 2026-10-01).

Stacked on #254 (Go 1.27): this PR's base is chore/go-1.27. When #254 merges and its branch is deleted, GitHub retargets this PR to main.

What moved

  • NODE_IMAGE (deploy/versions.env) and the ARG defaults in deploy/Dockerfile.local and deploy/Dockerfile.init: node:26-slim@sha256:ec7758ee051e457b468b32bde57b0879010b325bb9862718e9615225ce4aaae1 (Node 26.10.0).
  • PNPM_VERSION, the Dockerfile ARG defaults and web/package.json packageManager: 12.8.1. CI and release still read the pin from packageManager.
  • node-version: 26 in ci.yml (4 jobs) and release.yml.
  • web/package.json:
    • @types/node ^24.19.0 -> ^26.6.3.
    • New engines.node: ">=26". engineStrict was already on in pnpm-workspace.yaml, but there was no engine for it to enforce.
  • web/pnpm-lock.yaml, rewritten by pnpm 12.8.1:
    • @types/node 26.6.3 and undici-types 8.9.0.
    • pnpm 12's packageManagerDependencies document, now at the top of the file.
    • lockfileVersion is still 9.0, and no other package moved.
  • Docs: AGENTS.md image table, web/AGENTS.md tooling section, README, CONTRIBUTING, scripts/docs-content/requirements.html (make docs regenerated the site page), a vite.config.ts comment, and a CHANGELOG Unreleased entry.
  • No edit needed in dependabot.yml or renovate.json. Dependabot ignores @types/node majors and Renovate freezes node majors, and neither file names a version.

Findings fixed

  • node:26-slim does not include corepack. Node 25+ stopped bundling it, so the Dockerfiles' corepack enable && corepack prepare pnpm@… would fail. Both Dockerfiles now run npm install --global --no-fund --no-audit --ignore-scripts pnpm@${PNPM_VERSION}, and COREPACK_NPM_REGISTRY is removed.
    • --ignore-scripts is safe here. pnpm's preinstall only relinks its bin onto the native binary; without it, the placeholder bin starts the same binary through Node. Without the flag, npm 11.19 printed an "install scripts not covered by allowScripts" warning instead.
  • pnpm 12 breaking changes checked; none needed a change:
    • Unknown pnpm-workspace.yaml keys are now fatal. All of ours (allowBuilds, saveExact, engineStrict) are recognised.
    • --frozen-lockfile false is gone. Nothing here uses it.
    • Git-dependency handling changed. There are no git dependencies.

Verification (Node 26.10.0, pnpm 12.8.1)

  • make web-ci: typecheck, vitest (41 files, 646 tests), biome check and build all pass.
  • Full mocked Playwright suite: 345 passed. Run with an untracked port-5073 config, which was not committed.
  • make generate: no diff at all in gen/, web/src/gen/ or internal/store/sqlc/, including the version headers.
  • make guards passes, including check-docker and check-docs-drift.
  • golangci-lint run: 0 issues.
  • go test ./scripts/repocheck/: ok.
  • make smoke: passed. It built shepherd:local and shepherd:local-init on node:26-slim + pnpm 12.8.1, and check-alloy-runnable is OK.
  • make config-scan: OK.

🤖 Generated with Claude Code

https://claude.ai/code/session_01BPMsuQQBnedAsJ8tJMH3rw

@procoduck
procoduck force-pushed the chore/node-26-pnpm-12 branch from 350305e to 915511f Compare October 1, 2026 13:49
Base automatically changed from chore/go-1.27 to main October 1, 2026 13:57
@procoduck
procoduck enabled auto-merge (squash) October 1, 2026 13:58
- NODE_IMAGE (deploy/versions.env + Dockerfile.{local,init} ARG
  defaults): node:26-slim@sha256:ec7758ee... (Node 26.10.0).
- PNPM_VERSION and web/package.json packageManager: 12.8.1.
- ci.yml (4 jobs) and release.yml setup-node: node-version 26.
- web/package.json: @types/node ^26.6.3 and engines.node ">=26"
  (engineStrict was already on but had no engine to enforce).
- web/pnpm-lock.yaml rewritten by pnpm 12.8.1: @types/node 26.6.3 /
  undici-types 8.9.0, plus pnpm 12's packageManagerDependencies document
  at the top. lockfileVersion stays 9.0.
- Finding: node:26-slim no longer ships corepack (Node 25+ dropped it),
  so `corepack enable && corepack prepare` in the Dockerfiles would fail.
  They now `npm install --global --ignore-scripts pnpm@${PNPM_VERSION}`.
  COREPACK_NPM_REGISTRY is gone with it.
- pnpm 12 breaking changes checked: pnpm-workspace.yaml keys
  (allowBuilds, saveExact, engineStrict) are all recognised; nothing
  uses `--frozen-lockfile false`; there are no git dependencies.
- Docs: AGENTS.md image table, web/AGENTS.md tooling (Node 26, pnpm 12,
  no corepack, unknown-workspace-setting failure), README, CONTRIBUTING,
  docs-content requirements (+ make docs), vite.config.ts comment,
  CHANGELOG.
- dependabot.yml (@types/node majors ignored) and renovate.json (node
  majors frozen) need no edit: neither names a version.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BPMsuQQBnedAsJ8tJMH3rw
@procoduck
procoduck force-pushed the chore/node-26-pnpm-12 branch from 915511f to 18343e7 Compare October 1, 2026 13:59
@procoduck
procoduck merged commit 027a690 into main Oct 1, 2026
23 checks passed
@procoduck
procoduck deleted the chore/node-26-pnpm-12 branch October 1, 2026 14:10
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