Skip to content

Commit 9eae823

Browse files
committed
chore(node): drop Node 20; default to 24, test 22 + 24
Node 20 left LTS at end of April 2026. Drop it from the supported set: bump `engines.node` from `>=20.0.0` to `>=22.0.0`, switch every workflow's default Node from 20 to 24, change the CI test matrix from ['20','22'] to ['22','24'], and move the coverage-upload gate from `matrix.node == '20'` to `'24'`. Update CLAUDE.md / CONTRIBUTING.md / copilot-instructions.md prose from "Node 20+" to "Node 22+". The `npm install -g npm@latest` defensive step in release.yml stays, with its comment updated: Node 24 bundles npm 11.5+ already, so the upgrade is now belt-and-braces. Shipping as a minor, not a major. `engines` is advisory (npm warns but installs), no Node 22+ APIs are introduced in this release, and the package is too young for a 2.0.0 on a Node-support narrowing alone. The changelog entry captures the contract change in prose.
1 parent 223906e commit 9eae823

9 files changed

Lines changed: 29 additions & 13 deletions

File tree

.changeset/drop-node-20.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
---
2+
'github-actions-updater': minor
3+
---
4+
5+
Drop Node 20 support; require Node 22+.
6+
7+
Node 20 left LTS at the end of April 2026, so the project drops it from its supported runtimes. The CLI is now tested on Node 22 and Node 24, with Node 24 as the build/release default. `package.json`'s `engines.node` bumps from `>=20.0.0` to `>=22.0.0`.
8+
9+
**What this means in practice:** the `engines` field is advisory — npm will print a warning when installing on Node 20 but will still complete the install. Configurations with `engine-strict=true` will refuse outright. The CLI itself uses no Node 22+ APIs in this release, so unaffected users on Node 20 are likely to keep working for a while — but any regression observed on Node 20 will not be treated as a bug, and CI will not catch one.
10+
11+
**What to do if you're on Node 20:** upgrade your runner to Node 22 or Node 24. There are no source-level API changes in this release; the bump is policy-only.
12+
13+
Why this isn't a major: the `engines` field is a soft contract, no runtime API changed, and the package is young enough that burning a 2.0.0 on a Node-support narrowing alone would make the version stream noisier than it needs to be. A loud changelog entry captures the contract change without committing the version number.

.github/copilot-instructions.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ guidance in the repo. Keep this file in sync whenever the workflow rules in
88
## What this project is
99

1010
A CLI (`ghau`) that scans `.github/workflows/*.{yml,yaml}` for outdated remote `uses:`
11-
references and optionally rewrites them. TypeScript ESM, Node 20+, pnpm. Tested with
11+
references and optionally rewrites them. TypeScript ESM, Node 22+, pnpm. Tested with
1212
Vitest, linted with ESLint strict-type-checked + unicorn, formatted with Prettier.
1313

1414
## Workflow rules

.github/workflows/ci.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
- uses: pnpm/action-setup@v6
2323
- uses: actions/setup-node@v6
2424
with:
25-
node-version: 20
25+
node-version: 24
2626
cache: pnpm
2727
- run: pnpm install --frozen-lockfile
2828
- run: pnpm lint
@@ -36,7 +36,7 @@ jobs:
3636
- uses: pnpm/action-setup@v6
3737
- uses: actions/setup-node@v6
3838
with:
39-
node-version: 20
39+
node-version: 24
4040
cache: pnpm
4141
- run: pnpm install --frozen-lockfile
4242
- run: pnpm typecheck
@@ -47,7 +47,7 @@ jobs:
4747
strategy:
4848
fail-fast: false
4949
matrix:
50-
node: ['20', '22']
50+
node: ['22', '24']
5151
os: [ubuntu-latest, macos-latest, windows-latest]
5252
steps:
5353
- uses: actions/checkout@v6
@@ -59,7 +59,7 @@ jobs:
5959
- run: pnpm install --frozen-lockfile
6060
- run: pnpm test:coverage
6161
- name: Upload coverage
62-
if: matrix.os == 'ubuntu-latest' && matrix.node == '20'
62+
if: matrix.os == 'ubuntu-latest' && matrix.node == '24'
6363
uses: actions/upload-artifact@v7
6464
with:
6565
name: coverage
@@ -74,7 +74,7 @@ jobs:
7474
- uses: pnpm/action-setup@v6
7575
- uses: actions/setup-node@v6
7676
with:
77-
node-version: 20
77+
node-version: 24
7878
cache: pnpm
7979
- run: pnpm install --frozen-lockfile
8080
- run: pnpm build

.github/workflows/deploy-docs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ jobs:
2626
- uses: pnpm/action-setup@v6
2727
- uses: actions/setup-node@v6
2828
with:
29-
node-version: 20
29+
node-version: 24
3030
cache: pnpm
3131
- run: pnpm install --frozen-lockfile
3232
- run: pnpm docs:build

.github/workflows/release.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,12 @@ jobs:
4444
# dropping `registry-url:` costs nothing.
4545
- uses: actions/setup-node@v6
4646
with:
47-
node-version: 20
47+
node-version: 24
4848
cache: pnpm
49-
# npm 11.5+ is required for trusted-publishing OIDC. Node 20 ships with npm 10.
49+
# npm 11.5+ is required for trusted-publishing OIDC. Node 24 ships with
50+
# npm 11.5+ already, so this is defensive only — it keeps the release
51+
# path resilient if the `node-version` above is ever downgraded to a
52+
# release line that still bundles npm 10 (Node 22 does).
5053
- run: npm install -g npm@latest
5154
- run: pnpm install --frozen-lockfile
5255
# Inline CI gate: re-run the same checks the CI workflow does on push to

.github/workflows/self-check.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
- uses: pnpm/action-setup@v6
2121
- uses: actions/setup-node@v6
2222
with:
23-
node-version: 20
23+
node-version: 24
2424
cache: pnpm
2525
- run: pnpm install --frozen-lockfile
2626
- run: pnpm build

CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ the same rules every session.
99
- **What it is.** A CLI (`ghau`) that scans `.github/workflows/*.{yml,yaml}` for outdated
1010
remote `uses:` references and optionally rewrites them in place. Think `ncu`, but
1111
for GitHub Actions.
12-
- **Stack.** TypeScript ESM, Node 20+, pnpm. Vitest + `@vitest/coverage-v8`. ESLint
12+
- **Stack.** TypeScript ESM, Node 22+, pnpm. Vitest + `@vitest/coverage-v8`. ESLint
1313
(strict-type-checked + unicorn) + Prettier. VitePress for docs. Changesets for
1414
releases. Targets `github-actions-updater` on npm; binary is `ghau`.
1515
- **Architecture.** `src/core/` (scanner, parser, comparator, resolvers, auth) is the

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ pnpm build
1010
pnpm test:coverage
1111
```
1212

13-
You need Node 20+ and pnpm 9+.
13+
You need Node 22+ and pnpm 9+.
1414

1515
## Development loop
1616

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
},
2121
"type": "module",
2222
"engines": {
23-
"node": ">=20.0.0"
23+
"node": ">=22.0.0"
2424
},
2525
"bin": {
2626
"ghau": "./dist/cli.js"

0 commit comments

Comments
 (0)