Skip to content
This repository was archived by the owner on Aug 31, 2026. It is now read-only.

chore(ci): standardise every workflow on Node 24 via .nvmrc - #368

Closed
georgeglarson wants to merge 1 commit into
OpenHands:mainfrom
georgeglarson:chore-node-24
Closed

chore(ci): standardise every workflow on Node 24 via .nvmrc#368
georgeglarson wants to merge 1 commit into
OpenHands:mainfrom
georgeglarson:chore-node-24

Conversation

@georgeglarson

@georgeglarson georgeglarson commented Aug 29, 2026

Copy link
Copy Markdown
Contributor
  • A human has tested these changes.

HUMAN: Ran the full check set against this branch on Node 24.20 in a clean container: lint reports 0 errors, build succeeds, Prettier is clean, and all 309 tests pass across 18 suites. The workflow changes themselves are only exercisable by this PR's own CI run.


Why

From #proj-agent-canvas, 2026-08-29:

Well 22 is old too, we would like to support 24+

We need to simplify all these workflows where we can, so we can do more without being dragged down by, for example, TWO CI runs, one for 22 and another for 24

So I'd like to kill Node 22, and make all stuff run well on Node 24

Six workflow files each hardcoded their own Node literal, eleven pins in total, so every bump meant eleven synchronised edits. The test job ran the whole suite twice, once on 22.12 and once on 24.x.

The 22.12 floor was already fiction. 63 packages in package-lock.json declare engines.node above it: the eslint set wants ^20.19.0 || ^22.13.0 || >=24, @hey-api/* wants >=22.18.0. Nothing fails today only because npm warns rather than errors without engine-strict.

Summary

  • Every setup-node step now reads a single .nvmrc containing 24, so the next bump is one file instead of eleven.
  • The test job's [22.12, 24.x] matrix is removed rather than reduced to one element, so CI runs once.
  • CONTRIBUTING.md moves its stated floor to Node 24 to match.

No runtime code changes and no package.json change, so nothing here affects what consumers install.

Issue Number

No issue filed. Requested in Slack, quoted above.

How to Test

npm ci && npm run lint && npm run build && npm run format:check && npm test

Green on Node 24.20.0: 18 suites, 309 tests, 0 lint errors.

The rest is CI config, so this PR's own checks are the real test. The test job should appear once rather than twice, and every job should resolve its Node from .nvmrc.

Video/Screenshots

image

Type

  • Bug fix
  • Feature
  • Refactor
  • Breaking change
  • Docs / chore

Notes

npm-publish.yml keeps its explicit npm install -g npm@latest. Node 24.0.0 shipped npm 11.3.0, under the 11.5.1 that trusted publishing needs, and .nvmrc floats across the 24.x line, so that step is still load-bearing. Its comment claimed "Node 22 bundles npm 10.x" and now gives the real reason.

Two follow-ups, kept out deliberately so this one stays a pure chore:

  • An engines: { "node": ">=24" } floor. That narrows the published support range, which is semver-major, and this repo squash-merges, so bundling it here would make the whole PR breaking and force a 2.0 on merge. It belongs in its own PR where that call can be made on its own merits. Branch is ready if you want it: georgeglarson:feat-node-24-engines.
  • Removing the ws dependency. With the floor at 24 that fallback branch is dead code, and deleting it subsumes fix(events): use global WebSocket in Node ESM #362's edit. Happy to open that next.

Every setup-node step hardcoded its own Node literal across six workflow
files, so each bump meant six synchronised edits and the CI job matrix ran
twice, once on 22.12 and once on 24.x.

All of them now read a single .nvmrc containing 24, and the test job's
two-entry matrix is removed rather than reduced to one element. The next
bump is one file.

The suite already passes on Node 24.20.0: 18 suites, 309 tests. The 22.12
floor was also fiction in practice, since 63 packages in package-lock.json
declare engines.node above it (the eslint set wants ^20.19.0 || ^22.13.0 ||
>=24, @hey-api/* wants >=22.18.0).

npm-publish.yml keeps its explicit npm upgrade. The bundled npm is not
reliably new enough for trusted publishing: Node 24.0.0 shipped npm 11.3.0,
under the 11.5.1 floor, and .nvmrc floats across the 24.x line. Its comment
said "Node 22 bundles npm 10.x" and is updated to say why the step still
earns its place.
@github-actions github-actions Bot added the type: chore Maintenance / chores label Aug 29, 2026
@georgeglarson
georgeglarson marked this pull request as ready for review August 29, 2026 16:46
georgeglarson added a commit to georgeglarson/typescript-client that referenced this pull request Aug 29, 2026
The package declares no engines field, so the implicit contract is "runs on
whatever Node you have". A consumer on 20 or 22 should learn otherwise at
install rather than at connect().

Node 20 reached EOL on 2026-04-30. Node 22 runs to 2027-04-30, so this drops
a line that is still supported, which is what makes it breaking rather than
housekeeping.

Pairs with OpenHands#368, which moves CI onto 24. That one is a plain chore and can
land without this.

BREAKING CHANGE: raises the minimum supported Node to 24
@all-hands-bot

Copy link
Copy Markdown
Contributor

🚦 CI is currently failing on this PR's latest commit.

Please fix the failing checks before OpenHands reviews it - this is re-checked automatically once you push a new commit. (A maintainer can also request @all-hands-bot as a reviewer to have it reviewed regardless of CI status.)

This is an automated check - no AI was used to generate this comment.

georgeglarson added a commit to georgeglarson/typescript-client that referenced this pull request Aug 29, 2026
The package declares no engines field, so the implicit contract is "runs on
whatever Node you have". With CI on 24 that is wider than anything gets
tested, and a consumer on an untested runtime is better off seeing it at
install than at connect().

Not marked breaking: the maintainer's call is that dropping 22 is not a
breaking change for this package, since 24 is what gets built. Under
release-please a chore carries no version event, so the field ships with
whatever release comes next.

Pairs with OpenHands#368, which moves CI onto 24. That one can land without this.
@neubig neubig closed this Aug 30, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

type: chore Maintenance / chores

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants