You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
ci: run on Node 24 and smoke-test the bundle on Node 20 - #78
Move CI and the release workflow from Node 20 (EOL) to Node 24, and add a bundle-compat CI job that builds the bundle on Node 24 and smoke-tests it on Node 20.0.0, the exact engines minimum. engines.node stays at >=20.0.0, so this has no user-facing change. It unblocks #73 (vitest 5 requires Node ^22.12.0 || ^24.0.0 || >=26.0.0).
scripts/smoke-bundle.mjs (new): dependency-free script that spawns the bundle with the current Node, sends initialize and tools/list over stdio, and checks the server name and that a non-empty, well-formed tool list comes back. It points HOME / XDG_CONFIG_HOME / APPDATA at an empty temp directory so a locally stored token is never read. It fails on an early exit, a 15s timeout, an error response, or any stdout line that is not a JSON-RPC 2.0 object.
.github/workflows/ci.yml: check runs on Node 24. New bundle-compat job: npm ci && npm run bundle on Node 24, then copy plugin/ to $RUNNER_TEMP and run node scripts/smoke-bundle.mjs against the copy on Node 20.0.0. The copy matches what the Claude Code plugin cache installs, so neither node_modules nor the root package.json ("type": "module") is visible to the bundle.
.github/workflows/release.yml: both node-version: 20 entries → 24.
Failure cases all exit 1 with a clear message: a bundle that crashes on start, one that never responds (timeout), one that returns no tools, one that prints a non-JSON-RPC line to stdout ({}, null, [], {"jsonrpc":"1.0"}), and a missing bundle path.
A bundle built with zod left as an external import passes when run inside the checkout but fails with ERR_MODULE_NOT_FOUND once copied out, which confirms the job now catches bundles that are not self-contained.
The bundle-compat job on this PR is the check that runs on GitHub Actions.
Depends on #79. Pinning Node 20.0.0 exposed a real bug: the installed plugin fails to start on Node 20.0–20.18 and 22.0–22.6 because nothing marks bundle.js as ESM outside this repo. #79 fixes it. Until #79 is merged, bundle-compat here fails with SyntaxError: Cannot use import statement outside a module, which is the job catching that bug. After #79 is merged, rebase this PR and the job should pass. A local simulation of the CI steps fails without #79 and passes with it.
After merge, Dependabot will rebase #73, and its CI should no longer log EBADENGINE for vitest@5.0.3.
Checklist
I have updated the plugin version in plugin/.codex-plugin/plugin.json and plugin/.claude-plugin/plugin.json if applicable (not applicable: CI only)
node-version: 20 selects the latest 20.x release, not the declared engine floor of 20.0.0. The job can therefore pass even if the bundle uses an API added during the Node 20 release line, leaving engines.node: >=20.0.0 unverified. Pin the actual minimum here (or raise engines to the version being tested).
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
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.
Summary
Move CI and the release workflow from Node 20 (EOL) to Node 24, and add a
bundle-compatCI job that builds the bundle on Node 24 and smoke-tests it on Node 20.0.0, the exactenginesminimum.engines.nodestays at>=20.0.0, so this has no user-facing change. It unblocks #73 (vitest 5 requires Node^22.12.0 || ^24.0.0 || >=26.0.0).scripts/smoke-bundle.mjs(new): dependency-free script that spawns the bundle with the current Node, sendsinitializeandtools/listover stdio, and checks the server name and that a non-empty, well-formed tool list comes back. It pointsHOME/XDG_CONFIG_HOME/APPDATAat an empty temp directory so a locally stored token is never read. It fails on an early exit, a 15s timeout, an error response, or any stdout line that is not a JSON-RPC 2.0 object..github/workflows/ci.yml:checkruns on Node 24. Newbundle-compatjob:npm ci && npm run bundleon Node 24, then copyplugin/to$RUNNER_TEMPand runnode scripts/smoke-bundle.mjsagainst the copy on Node 20.0.0. The copy matches what the Claude Code plugin cache installs, so neithernode_modulesnor the rootpackage.json("type": "module") is visible to the bundle..github/workflows/release.yml: bothnode-version: 20entries →24.CLAUDE.md: describe the new CI setup.Related Issue
Closes #77
Type of change
Test plan
npm run buildpassesnpm testpasses (234 tests)Run locally:
npm run bundle, thennode scripts/smoke-bundle.mjson Node 20.20.2, 22.23.3, 24.21.0 and 26.5.0: all pass (deploygate 1.5.1, 58 tools).@modelcontextprotocol/sdk1.32.0,zod4.6.5) also passes on Node 20.{},null,[],{"jsonrpc":"1.0"}), and a missing bundle path.zodleft as an external import passes when run inside the checkout but fails withERR_MODULE_NOT_FOUNDonce copied out, which confirms the job now catches bundles that are not self-contained.bundle-compatjob on this PR is the check that runs on GitHub Actions.Depends on #79. Pinning Node 20.0.0 exposed a real bug: the installed plugin fails to start on Node 20.0–20.18 and 22.0–22.6 because nothing marks
bundle.jsas ESM outside this repo. #79 fixes it. Until #79 is merged,bundle-compathere fails withSyntaxError: Cannot use import statement outside a module, which is the job catching that bug. After #79 is merged, rebase this PR and the job should pass. A local simulation of the CI steps fails without #79 and passes with it.After merge, Dependabot will rebase #73, and its CI should no longer log
EBADENGINEforvitest@5.0.3.Checklist
plugin/.codex-plugin/plugin.jsonandplugin/.claude-plugin/plugin.jsonif applicable (not applicable: CI only)🤖 Generated with Claude Code