chore: release 4.0.0 — drop Node <22 support#687
Merged
Conversation
BREAKING: raises engines.node from >=16 to >=22 across root + all 14 plugin packages. Tracks #686. Rationale: - Node 18 EOL: 2025-04-30 (14mo ago); Node 20 EOL: 2026-04-30 (2mo ago). Our CI was testing two EOL versions. - Three dependabot PRs in one week (#683 eslint@10, #684 @eslint/js@10, #685 which@7) closed for the same Node-floor mismatch. Cheaper to align with active LTS once than to keep gating major bumps weekly. Changes: - engines.node >=22.0.0, engines.npm >=10.0.0 in 15 package.json files - All @claudeautopm/plugin-* bumped to 4.0.0 (plugin-obsidian to 2.0.0) - CI matrix [18.x,20.x] -> [22.x,24.x] in test.yml - Single-version Node pins -> '22' (commands-sync-check, scripts-sync-check, deploy-docs, npm-publish test job). plugin-publish stays on 24. - package-lock.json regenerated against npm 10
Contributor
There was a problem hiding this comment.
✅ Approved
🤖 Claude Sonnet 4.6 (OpenRouter) (anthropic/claude-sonnet-4.6) via OpenRouter
This is a clean semver-major release PR that raises the Node.js engine floor from >=16 to >=22, bumps all 14 plugin packages to 4.0.0, updates CI matrices from [18.x, 20.x] to [22.x, 24.x], regenerates package-lock.json with npm 10, and adds a CHANGELOG entry. The diff is purely mechanical version/engine metadata changes with no logic, security surface, or framework payload modifications.
1 finding:
- 🟡 MEDIUM CONFIDENCE package.json:14 — The
postinstallscript emoji was changed from a literal 🎉 to escaped Unicode surrogate pairs (\ud83c\udf89), which is the UTF-16 encoding of 🎉. In a JSON file this is technically valid but unusual; if the file is not saved as UTF-8 or is processed by a tool that interprets the escape sequences literally, the output could render as the raw escape sequences rather than the emoji. The original literal emoji is the safer and more conventional form.- Fix: Revert to the literal emoji character
🎉in the postinstall echo string, consistent with the prior value. - Evidence:
'- "postinstall": "echo '🎉 ClaudeAutoPM installed! Run: autopm --help'",' → '+ "postinstall": "echo '\ud83c\udf89 ClaudeAutoPM installed! Run: autopm --help'",'
- Fix: Revert to the literal emoji character
Gate wrong or a false positive? Do not edit this workflow to pass — open an issue on lagowski/pr-review-gate.
rlagowski
approved these changes
Jun 22, 2026
4 tasks
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.
Release v4.0.0 prep. Implements #686 — drops Node 16/18/20 support, aligns with active LTS (Node 22/24).
What changed
engines.node>=16.0.0>=22.0.0engines.npm>=8.0.0>=10.0.0engines.node>=18.0.0>=22.0.0[18.x, 20.x][22.x, 24.x]'20''22'(4 workflows)plugin-publish.yml'24'3.25.74.0.03.13.x4.0.0(plugin-obsidian:1.0.0→2.0.0)package-lock.jsonWhy
eslint@10, deps-dev(deps-dev): bump @eslint/js from 9.39.4 to 10.0.1 #684@eslint/js@10, deps(deps): bump which from 5.0.0 to 7.0.0 #685which@7) all closed for the same Node-floor mismatch — pattern was structural, not transientCompatibility scan
Source tree grepped for known-removed/deprecated Node APIs:
util.isArray— nonenew Buffer(...)constructor — noneprocess.binding(...)— nonepunycodebuiltin — noneNo Node 22+ landmines found. Real proof comes from CI on this PR (matrix runs on 22.x and 24.x now).
Migration notes for users
npm install -g claude-autopm@4works unchanged.nvm install 22 && nvm use 22) before upgrading. v3.25.7 stays on npm for the lagging tail; no patches will be backported.Promotion path
This PR lands on
develop. After it merges + CI is green, open a separateRelease: v4.0.0 (promote develop → main)PR with head =develop(theEnforce main sourcegate only allows promotion from a branch literally nameddevelop). After main merge, tagv4.0.0to trigger npm publish.Test plan
Plugin-core script syncpassesCommands sync checkpassesVerify PR source is developskips (PR targets develop, not main)npm install -g claude-autopm@4from a fresh shell on Node 22Closes #686.