Repository navigation
feat!: declare real engines.node across all packages - #603
Merged
Merged
Conversation
Every package carried a non-standard top-level "node" field (">=16",
">=18" or ">=20"). npm and pnpm read engines.node, not that field, so
none of these floors were ever enforced — a consumer on Node 18 could
install @node-cli/logger with engine-strict enabled and get no warning,
despite ora@9 requiring Node 20 at runtime.
All 14 packages now declare a real engines.node of ">=22", replacing the
inert field in place. The floor is uniform rather than per-package: Node
20 reached EOL on 2026-04-30, CI only ever tests 24.x, and @node-cli/run
already required 22 via execa 10 — so a single rule is both honest and
immune to drift as dependencies raise their own floors.
The root manifest declares the same floor so contributor installs are
gated too.
Verified by packing @node-cli/logger and installing it with
engine-strict=true: the old "node" field at ">=99" installs silently,
while engines.node at ">=99" correctly fails with EBADENGINE, and the
real ">=22" installs cleanly on Node 24. Full build, lint and test
suites pass.
BREAKING CHANGE: all @node-cli/* packages now require Node.js 22 or later.
This was referenced Jul 21, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follow-up to #601. Replaces the inert top-level
"node"field with a realengines.nodeof>=22across all 14 packages.The bug
Every package declared a top-level
"node"field —">=16",">=18"or">=20"depending on the package. npm and pnpm readengines.node, not that field. None of these floors were ever enforced.Proven by packing
@node-cli/loggerand installing it withengine-strict=trueon Node 24:"node": ">=99""engines": { "node": ">=99" }EBADENGINE, hard fail"engines": { "node": ">=22" }The declared values were also simply wrong.
@node-cli/loggerclaimed>=16while depending onora@9, which requires Node 20.What the dependency graph actually requires
run,npmrc,searchexeca@10, directly or viarunlogger,parser,perf,comments,timer,bundlesize,static-serverora,meow,glob,openbundlecheck,secret@inquirer/*,better-sqlite3utilities,envtoolslodash-es/ no runtime depsWhy a uniform
>=22rather than per-package floors>=20floor declares support for an unsupported runtime.@node-cli/runalready requires 22 via execa 10, andsearchandnpmrcinherit it.The root manifest declares the same floor so contributor installs are gated too.
Verification
pnpm install,pnpm build(14 projects),pnpm lint(13 projects),pnpm test(12 projects) — all passRelease impact
feat!with aBREAKING CHANGEfooter — release-please will cut a major for each touched package. This is a genuine narrowing of the supported runtime contract: installs that were previously silent will now warn, or fail underengine-strict.🤖 Generated with Claude Code
https://claude.ai/code/session_01WxPdHpfW5B4evcecAmHHqa