Repository navigation
chore(toolchain): standardize Node.js 24 and pnpm 12 across active repositories #38
Copy link
Copy link
Closed
Closed
Copy link
Description
Goal
Standardize active firstsun-dev JavaScript/TypeScript projects on Node.js 24 for CI/build and pnpm 12.14.0 (exact pin), preserving runtime compatibility, release safety and current tests. Keep independent from Cloudflare Worker CI/CD v2.
Initial inventory (re-audit at execution)
- Existing pnpm: blog, heaven-monorepo, innovation-apps, anas-mcp, content-core, heaven-www, code-insights.
- npm candidates: git-files-sync, watermark-bucket-uploader, obsidian-plugin-template, news-getter (astro-src), kilo-plugin-smart-web, agent-mcp (openhands-mcp). Audit consumer/release compatibility before converting.
- Inspect newly active projects and pending PRs (such as firstsun-bot PR ci: Remove SonarQube, update Node versions, and enhance build summary #2), nested packages, and each repo's default branch. Exclude archives, empty repos, and unrelated Python/Terraform/Windmill projects.
Related existing work
- Migrate GitHub Actions off Node 20 runtimes #29 covers GitHub Actions Node 20 action-runtime migration; coordinate but do not conflate it with the build/runtime baseline.
- firstsun-dev/heaven-monorepo#49 covers Docker pnpm@latest / lockfile mismatch; resolve its exact scope during the pnpm pinning migration.
Requirements
- Audit existing Issues and PRs per repository before changing anything; reuse/update applicable Issues and create only missing per-repo tracking Issues.
- Create one dedicated branch and one PR per applicable repository, based on its actual default branch. Suggested branch: chore/node24-pnpm12. Do not auto-merge or deploy.
- Pin pnpm@12.14.0 consistently in packageManager and any CI/Docker bootstrap. Use Node 24 for CI/build; retain lower published runtime Node engine ranges where necessary and test them.
- Migrate pnpm 10/11 config: package.json pnpm settings / overrides, pnpm-workspace.yaml, .npmrc non-auth configuration, allowBuilds, catalogs, and lockfile. Preserve security overrides and dependency script safety.
- Update all npm candidates' CI/cache/install/release/packaging instructions and Dockerfiles only after compatibility testing; preserve existing consumer install behavior and release provenance.
- Verify cold/frozen installs, lint, typecheck, build, unit, integration, E2E, native dependency builds, Docker and publish/pack dry-run where applicable; do not hide, skip, or downgrade failing checks.
- Verify self-hosted runner Node 24 with pnpm 12 via Corepack or supported official installer; extend runner-image smoke test. Runner fleet rollout remains explicitly gated.
- Keep Cloudflare Previews/Hybrid v2 and unrelated dependency upgrades outside toolchain PRs.
- Push each completed branch, open its PR with issue link, exact validation evidence and CI links. Treat push as ready for review, not CI pass. Do not merge until CI is checked.
- Maintain a linked per-repo checklist here; close per-repo Issues only after merged PRs, and this Issue only when all agreed in-scope migrations are complete.
Acceptance
- All applicable active JS/TS repositories have Node 24 CI/build baseline and identical exact pnpm 12 pin, or documented justified exceptions.
- Every applicable frozen-lockfile install, test, build, Docker/publish workflow passes on the relevant runner/platform.
- Existing shared workflows, monorepo dependencies, package publishers, and consumers continue to work.
- Changes remain independently reviewable and reversible per repository.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
ClaudiaFang commentedon Oct 19, 2026
Migration status (Node.js 24 + pnpm 12.14.0)
Status as of 2026-10-19. Every repo has its own Issue + PR; nothing was auto-merged by tooling. Install = clean
rm -rf node_modules && pnpm install --frozen-lockfilewith pnpm 12.14.0 (passes in every worktree).Stage 1 — shared infrastructure
v1.6.0+ floatingv1moved to the merge commit. Obsidian shared workflows now pnpm-aware (npm fallback kept);actions/setupunchanged (already Node 24, readspackageManager).Stage 2 — existing pnpm repos
mainCI/CD was still running when this was written — verify before treating as complete. Lockfile refresh NOT applied (wrangler/vite-plugin/miniflare need a coordinated bump → separate PR). Container images still need a rebuild/push to pick up Node 24 + pnpm 12.pnpm@latest), all build on amd64. pull_request run green after clearing a stale/cache/pnpm-storeentry (see risks). Lockfile refresh NOT applied (@hono/zod-openapi1.2.2→1.6.3 breaksapi-009-user400→415).Stage 3 — npm → pnpm
main.jsbyte-identical to npm baseline; after the lockfile-refresh commitmain.jsdiffers (ignore7.0.6→7.0.12) — revert that commit if byte-identical artifacts are required. Conflicts expected with #157/#160.main.jsis NOT byte-identical to the npm baseline (re-resolved transitives:@smithy/types,undici,semver). Lockfile refresh NOT applied (TS 5.9 / obsidian 1.14 break typecheck + lint → needs source fixes). Dependabot fix(ci): reach Postgres service via job container network #28 needs rebase.main.jsbyte-identical to npm baseline. Package Artifact now passes; Lint and Test jobs still fail — template defects that fail identically on the npm baseline (no eslint config, missingtslib, no tests). Also fixesid-token: write/ stray\${{in ci.yml.>=range would float to it).develop) — npm → 12.14.0,engines.node >=20kept. No CI, no tests (smoke only); refresh bumps@kilocode/plugin7.4.11→7.8.12 — try in Kilo before merging.node:24-alpine, 60/60 tests, docker build +/healthzOK,dist/byte-identical. No CI in repo.engines.noderaised to>=24(private service).mainhas no JS yet; asked scaffold PR #2 to adopt Node 24 + pnpm 12.14.0.Excluded
status-page, windmill-flows, obsidian-sync-test (no JS/TS package); skills (two tiny
nutritional-specialistpackage.json only); firstsun-core, git-files-sync-e2e, kestra-flows (empty); obsidian-releases, general-workflows (archived); Python/Terraform-only repos.Open risks
/cache/pnpm-store(host bind mount on gitlabci-01, shared by 10 runners) producedERR_PNPM_BROKEN_PNPM_INSTALL(missing@pnpm/exe.linux-x64/bin/pnpm.mjs) when jobs switch pnpm 11 → 12. git-files-sync traced it to parallel jobs racing on the shared store (fixed there with a per-leg store under$RUNNER_TEMP); heaven-monorepo recovered after the stale entry was removed. Not fixed at the source —actions/setup@v1+setup-pnpm: trueon any pnpm-12 repo can hit it again. Store ownership (permission denied removing astianyao) suggests a uid mismatch worth a follow-up in infra-config.22-slim-build) need rebuilding before they carry Node 24 + pnpm 12.Close each per-repo issue only after its PR is merged and post-merge CI is verified; close this issue when all in-scope PRs are done.
ClaudiaFang commentedon Oct 20, 2026
Update — shared pnpm store fix
fix/runner-pnpm-store-per-runner, open, no CI on repo): each runner container gets its own host store/cache/pnpm-stores/runner-N, mounted at the unchanged/cache/pnpm-store. Template test fails on the old layout (3/4) and passes on the new one; rendered compose validates withdocker compose config. Nothing applied to the host.Supersedes open risk #1 above (shared runner store): the fix is written but not live — it takes effect only at the gated runner rollout (
github_actions_runner_rollout). Until then the shared/cache/pnpm-storecan still race. Before rollout: check free disk on gitlabci-01 (df -h /cache; up to 10× one store), and afterwards delete the old shared dir with the documented throwaway-container command.Other updates since the checklist: .github#39 is closed (PR #40 merged,
v1.6.0+v1tagged). obsidian-plugin-template and watermark-bucket-uploader re-ran against the merged shared workflows via close/reopen — watermark CI is green, the template's Package Artifact passes and its Lint/Test still fail on baseline template defects.ClaudiaFang commentedon Oct 20, 2026
Update — infra-config #95 deployed to the runner fleet (2026-10-20)
de2d2ef) and rolled out on gitlabci-01 withgithub_actions_runner_rollout=true. All 10 runners were idle beforehand (no Runner.Worker), so no jobs were interrupted.ok=9 changed=2 failed=0(image build + fleet reconcile).heavenweb-runner-1..10online and idle in the org runner list.packageManager; Node v24.20.0.Open risk #1 (shared runner store) is unchanged: the fleet still shares
/cache/pnpm-store(6.1 GB), so the pnpm 11 → 12ERR_PNPM_BROKEN_PNPM_INSTALLrace can recur until #98 is merged and rolled out. That second rollout needs up to 10× the store disk;/has 62 GB free (84% used), and the old shared dir should be deleted afterwards with the documented throwaway-container command.ClaudiaFang commentedon Oct 20, 2026
Update — shared store fixed, failed post-merge jobs recovered (2026-10-20)
ok=9 changed=3 failed=0): each runner now has its own pnpm store (/cache/pnpm-stores/runner-N); 10/10 runners online. The old shared/cache/pnpm-storewas removed. Some jobs on 3 busy runners were interrupted (accepted beforehand). Details in the PR's Deployment section.df -h /on gitlabci-01 as each runner warms its store); container images for blog / heaven-monorepo still need a rebuild to carry Node 24 + pnpm 12; blog, heaven-monorepo and watermark lockfile refreshes were skipped (regressions listed earlier); maskedpnpm versionerror in anas-mcp; kilo-plugin-smart-web@kilocode/pluginbump untried; git-files-sync main CI was still running when last checked earlier.