feat!: migrate the node.js baseline from lts iron to lts jod - #88
Conversation
idd-skill's minimum supported runtime moved to ^22.22.2 || >=24.2.0, so this repository can no longer stay on lts iron and pnpm 10 while adopting idd-skill's workflow (blocking #49). Re-import the named gaps between this repository and pnpm-project-template@8c19c5f (2026-07-22) rather than a blind file-for-file resync: - raise .node-version/.nvmrc/.tool-versions to 22.23.1, drop the ref:v20.19.5 token upstream also removed, and widen every engines.node field to ^22.23.1 || ^24.2.0 || >=26.0.0 - swap the ci matrix from 20.x/22.x/24.x to 22.x/24.x/26.x (upstream dropped 25.x as eol) and update the root and package readmes' system requirements sections to match - pin packageManager to pnpm@11.15.1 and migrate .npmrc into pnpm-workspace.yaml under pnpm 11's camelcase keys, carrying over this repository's own workspace-concurrency rationale as workspaceConcurrency - enable pnpm 11's global virtual store and opt every ci job that runs pnpm install out of it via PNPM_CONFIG_ENABLE_GLOBAL_VIRTUAL_STORE, matching upstream; drop COREPACK_INTEGRITY_KEYS since upstream's pnpm 11 setup no longer needs it - raise vite-lib-config's build target and example-cli's sea --node flag off node 20 - rename biome.json/cspell.config.yml to biome.jsonc/.cspell.config.yml, add .gitmessage, and replace the legacy issue_template.md with the upstream ISSUE_TEMPLATE form set, adapted with this repository's multi-language CONTRIBUTING notice - import AGENTS.md/CLAUDE.md/GEMINI.md/.github/copilot-instructions.md/ docs/ai-strategy.md describing this monorepo's own packages and tooling instead of upstream's generic template prose - fix .vscode/settings.json references left dangling by the .npmrc removal and cspell rename, and extend its file nesting for the new .gitmessage and AI-agent files Deliberately not carried over: upstream's pnpm-workspace.yaml now also sets configDependencies for @pnpm/plugin-types-fixer, which is a new gap beyond this issue's enumerated scope, left for a future issue. actions/checkout is already v7 and sha-pinned (#55); the pnpm/action-setup@v6 and actions/setup-node@v6 bumps are left to the already-open dependabot PRs #81/#79 rather than duplicated here. The dev dependency floor drift (biome, commitlint, cspell, lint-staged, markdownlint-cli2, typescript) is reconciled in a following separate commit, and vite-lib-config/docs/README.md is regenerated once pnpm install succeeds under pnpm 11, per the issue's own acceptance criteria. BREAKING CHANGE: node 20 (lts iron) is no longer a supported engines range, and the >=24 floor is raised to >=24.2.0. Consumers must upgrade to node ^22.23.1, ^24.2.0, or >=26.0.0. pnpm 10 is no longer the pinned package manager; use pnpm 11.15.1 (corepack enable will pick it up automatically). Refs #48
pnpm-project-template@8c19c5f raised its own dev dependency floors since this repository's last import. Bump the root devDependencies to match: @biomejs/biome ^2.5.2 (and its schema url in biome.jsonc), @commitlint/cli and @commitlint/config-conventional ^21.2.0, cspell and its paired @cspell/cspell-types ^10.0.1, lint-staged ^17.0.8, markdownlint-cli2 ^0.23.0, and typescript ~6.0.3. Left untouched, deliberately: the @kurone-kito/*-config lint packages (biome-config, commitlint-config, cspell-config, lint-staged-config, markdownlint-config), since upstream's current pin for these is a 0.23.0-alpha.x prerelease from kurone-kito/lints-config and adopting a prerelease range here needs its own deliberate decision, not a side effect of this floor bump. Refs #48
Enabling pnpm 11's global virtual store (part of this issue's own migration) relocates typedoc into a store slot shared across every project on the machine, so its internal bare-specifier lookup for typedoc-plugin-markdown can no longer walk up to a node_modules tree that has the plugin installed as a sibling: `pnpm run build` broke with "Cannot find package 'typedoc-plugin-markdown'" for this reason alone. This is a documented pnpm 11 gvs limitation, not something version-bumping typedoc or the plugin can fix, since typedoc's plugin loader always resolves relative to its own install location. Resolve the plugin's absolute path from this package instead, where normal workspace module resolution still applies, and pass it to typedoc explicitly via --plugin rather than relying on typedoc.json's bare-specifier plugin list. Regenerate packages/vite-lib-config/docs via the fixed build:doc script, per this issue's own acceptance criteria; the diff beyond the Node baseline System Requirements text is from typedoc-plugin-markdown rendering optional parameters as `name?` instead of `name` in this newer version. Refs #48
Regenerating pnpm-lock.yaml from scratch under pnpm 11.15.1 (deleting
it and reinstalling, since a straight upgrade only verifies the
existing entries rather than re-resolving them) surfaced three pnpm
11 behaviors this repository had not hit before, each addressed in
pnpm-workspace.yaml:
- pnpm 11's new minimum-release-age supply-chain check rejects
lockfile entries published too recently. magicast (a
@vitest/coverage-v8 dependency) resolves the newest matching
@babel/parser and @babel/types on any fresh install, and both
happened to publish same-day. Override both to 7.29.7, the prior
patch, which both magicast's ^7.29.7 range and
@vue/compiler-core's ^7.28.4 range already accept, deduplicating to
one resolved version instead of two. This pin is time-boxed: drop
the overrides entry and re-resolve once 2026-08-01T15:07Z passes,
after which the newer patch clears the age check on its own.
- pnpm 11 requires explicit approval for dependencies with install
scripts; esbuild had none. Add `allowBuilds: { esbuild: true }`,
equivalent to the onlyBuiltDependencies entry already present.
- undici-types ships a triple-slash reference to `@types/node` that
it never declares as a real dependency, relying on ambient
node_modules co-location to find it. Under the global virtual
store, undici-types resolves into a slot shared across every
project on the machine, so that ambient lookup can no longer reach
any project's own @types/node and `pnpm run test`'s tsc step failed
with "Cannot find type definition file for 'node'" for every
package except the two that already depend on @types/node directly.
This is a documented pnpm 11 gvs limitation. Add a packageExtensions
entry declaring @types/node as a real dependency of undici-types,
so it resolves inside undici-types' own store slot instead.
Also adopt upstream's configDependencies entry for
@pnpm/plugin-types-fixer, matching pnpm-project-template, as a general
safety net for @types/* promotion issues under pnpm 11 — it did not
by itself fix the undici-types case above, which needed the
packageExtensions entry on top.
biome.jsonc's $schema now points at 2.5.6 (via `biome migrate`),
matching the patch this lockfile resolves for the ^2.5.2 range bumped
in the prior commit.
Beyond the version ranges this issue and the prior commit changed
directly, this fresh resolution also moved rimraf 6.0.1 -> 6.1.3 and
semver 7.8.1 -> 7.8.5 within their existing ^ ranges; both are
incidental to a from-scratch resolution, not deliberate bumps.
Refs #48
📝 WalkthroughWalkthroughThe repository migrates to Node.js 22, 24, and 26 support, upgrades pnpm and development tooling, updates CI, adds agent guidance and issue forms, and changes the Vite documentation build process. ChangesRepository baseline and tooling
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related issues
Possibly related PRs
Sequence Diagram(s)sequenceDiagram
participant PackageScript
participant BuildDoc
participant MarkdownPlugin
participant TypeDoc
PackageScript->>BuildDoc: start documentation build
BuildDoc->>MarkdownPlugin: resolve plugin path
BuildDoc->>TypeDoc: invoke TypeDoc with plugin path
TypeDoc-->>PackageScript: return exit status
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Warning Billing warning: we have not been able to collect payment for this subscription for more than 72 hours. Please update the payment method or pay any pending invoices in Billing to avoid service interruption. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Pull request overview
This PR performs a template-aligned, breaking toolchain migration for the @kurone-kito/builder-config pnpm-workspace monorepo, moving the supported runtime baseline to Node.js LTS Jod and upgrading the repository’s package-manager/configuration to pnpm 11 (including global virtual store enablement and CI opt-out).
Changes:
- Raise the Node.js baseline across version files,
engines.node, docs, build targets, and CI (drop 20.x; add 26.x). - Migrate pnpm configuration to pnpm 11 (
pnpm-workspace.yamlsettings, build approvals, overrides/extensions) and update root dev dependency floors. - Add/rename template-aligned repo meta/docs (AI agent entrypoints, canonical Copilot instructions, issue forms,
.gitmessage), plus a typedoc plugin-resolution workaround script for gvs.
Reviewed changes
Copilot reviewed 38 out of 40 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| README.md | Updates documented supported Node.js versions. |
| pnpm-workspace.yaml | Migrates pnpm config to pnpm 11 keys; enables gvs; adds overrides/extensions/build approvals. |
| packages/vite-lib-config/typedoc.json | Removes typedoc plugin config (now provided via CLI wrapper). |
| packages/vite-lib-config/src/vite.mts | Raises Vite/esbuild target to the new Node baseline. |
| packages/vite-lib-config/scripts/buildDoc.mjs | Adds typedoc wrapper to resolve markdown plugin path under gvs. |
| packages/vite-lib-config/README.md | Updates documented supported Node.js versions. |
| packages/vite-lib-config/package.json | Updates engines range; routes doc build through the new wrapper script. |
| packages/vite-lib-config/docs/README.md | Regenerates docs with updated Node support text. |
| packages/vite-lib-config/docs/interfaces/ViteConfigOptions.md | Regenerated typedoc markdown output (optional param rendering). |
| packages/vite-lib-config/docs/functions/vitestConfig.md | Regenerated typedoc markdown output (optional param rendering). |
| packages/vite-lib-config/docs/functions/viteConfig.md | Regenerated typedoc markdown output (optional param rendering). |
| packages/typescript-config/README.md | Updates documented supported Node.js versions. |
| packages/typescript-config/package.json | Updates engines range to the new baseline. |
| packages/sea-builder/README.md | Updates documented supported Node.js versions and --node examples. |
| packages/sea-builder/package.json | Updates engines range to the new baseline. |
| packages/example-lib/README.md | Updates documented supported Node.js versions. |
| packages/example-lib/package.json | Updates engines range to the new baseline. |
| packages/example-cli/README.md | Updates documented supported Node.js versions. |
| packages/example-cli/package.json | Updates SEA build script to use Node 22 baseline; updates engines range. |
| package.json | Updates root engines and packageManager; raises dev dependency floors. |
| GEMINI.md | Adds Gemini CLI entrypoint guidance for repo AI policies. |
| docs/ai-strategy.md | Adds human-facing AI tooling strategy and cross-file maintenance notes. |
| CLAUDE.md | Adds Claude Code entrypoint guidance for repo AI policies. |
| biome.jsonc | Updates Biome schema reference for the newer Biome line. |
| AGENTS.md | Adds Codex/OpenCode entrypoint guidance for repo AI policies. |
| .vscode/settings.json | Updates VS Code nesting/associations for renamed/added meta files and cspell config rename. |
| .tool-versions | Updates Node tool version to 22.23.1 and drops upstream-removed tokens. |
| .nvmrc | Updates Node version and LTS alias to Jod. |
| .npmrc | Removes legacy pnpm-10-style config (migrated to pnpm-workspace.yaml). |
| .node-version | Updates Node version to 22.23.1. |
| .gitmessage | Adds Conventional Commits template and reminders. |
| .github/workflows/push-feature.yml | Updates CI matrix to 22/24/26; sets pnpm gvs opt-out env; keeps SHA-pinned actions. |
| .github/workflows/common-release.yml | Adds pnpm gvs opt-out env to release/publish jobs. |
| .github/ISSUE_TEMPLATE/feature_request.yml | Adds YAML issue form for feature requests. |
| .github/ISSUE_TEMPLATE/config.yml | Disables blank issues. |
| .github/ISSUE_TEMPLATE/bug_report.yml | Adds YAML issue form for bug reports. |
| .github/issue_template.md | Removes legacy issue template (replaced by forms). |
| .github/copilot-instructions.md | Adds canonical, detailed AI agent guidance for the repo. |
| .cspell.config.yml | Adds renamed cspell config file and custom dictionary entries. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Actionable comments posted: 12
🧹 Nitpick comments (1)
.github/workflows/push-feature.yml (1)
23-23: 🗄️ Data Integrity & Integration | 🔵 Trivial | 🏗️ Heavy liftAdd CI coverage for the enabled global virtual store.
pnpm-workspace.yamlsetsenableGlobalVirtualStore: true, butpush-feature.ymlforcesPNPM_CONFIG_ENABLE_GLOBAL_VIRTUAL_STORE: 'false'for every Build-Check job, and no workflow uses the default enabled store. Add one Build-Check job or a separate verification job with the environment variable unset/truthy so the default global-store dependency layout and thepackages/vite-lib-config/scripts/buildDoc.mjsworkaround are covered.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.github/workflows/push-feature.yml at line 23, Add CI coverage for the enabled global virtual store by adding a Build-Check or verification job that does not set PNPM_CONFIG_ENABLE_GLOBAL_VIRTUAL_STORE to false, allowing pnpm-workspace.yaml’s enableGlobalVirtualStore setting to apply. Keep the existing disabled-store jobs intact and ensure the new job exercises the packages/vite-lib-config/scripts/buildDoc.mjs workaround.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/ISSUE_TEMPLATE/bug_report.yml:
- Line 44: Add the same redaction warning to the terminal-output/log prompt at
.github/ISSUE_TEMPLATE/bug_report.yml lines 44-44, the
screenshots/additional-context prompt at .github/ISSUE_TEMPLATE/bug_report.yml
lines 66-66, and the corresponding prompt at
.github/ISSUE_TEMPLATE/feature_request.yml lines 42-42, instructing contributors
to remove secrets, credentials, tokens, and personal data before submitting.
- Around line 53-59: Update the required environment textarea configuration in
the bug report template so the example lines are supplied through placeholder
rather than value, leaving the field empty for validation while preserving the
guidance shown to reporters.
In @.nvmrc:
- Around line 1-2: Update the .nvmrc contents to contain only the valid 22.23.1
selector, removing the lts/jod and node lines; do not leave multiple selectors
in the file.
In @.tool-versions:
- Line 1: Update the nodejs entry in .tool-versions to retain the pinned version
22.23.1 and remove unsupported dynamic selectors lts-jod, lts, and latest;
preserve system only if the project requires a system fallback.
In `@packages/example-cli/package.json`:
- Line 26: Ensure SEA Node.js resolution enforces the documented Node 22.23.1
minimum: update resolveNodeVersion to use >=22.23.1, and update the build:sea
script in packages/example-cli/package.json (line 26) plus the corresponding
version ranges in packages/sea-builder/README.md (lines 47-48) so older Node 22
patches cannot be selected.
In `@packages/vite-lib-config/scripts/buildDoc.mjs`:
- Around line 9-11: Update the TypeDoc invocation around pluginPath and
spawnSync to resolve the explicit typedoc/bin/typedoc file path, invoke it
through the Node executable, and set shell to false. Preserve the existing
plugin argument and status handling while avoiding require.resolve on the
unavailable typedoc/bin/typedoc subpath.
In `@packages/vite-lib-config/typedoc.json`:
- Line 3: Update the TypeDoc configuration associated with the entryPoints
setting so external UserConfig and ViteUserConfig return types from vite and
vitest/config render as descriptive text instead of unresolved symbols;
alternatively, add external symbol link mappings for those packages if the
documentation should link to their definitions.
In `@pnpm-workspace.yaml`:
- Line 21: Update the pnpmOnFail configuration in pnpm-workspace.yaml from warn
to download or error so pnpm stops or retrieves the required version when a
package-manager version mismatch occurs, preventing workspace commands from
continuing with an incompatible version.
- Around line 10-11: Remove the obsolete onlyBuiltDependencies configuration
from pnpm-workspace.yaml, retaining allowBuilds.esbuild: true as the sole
build-script approval, then regenerate the pnpm lockfile using pnpm 11.
- Around line 23-26: Update the comment above workspaceConcurrency to accurately
state that the value is intentionally kept at 1 to enforce serial recursive
publish execution, removing the contradictory wording about increasing it.
- Line 7: Update the workspace configuration’s gitChecks setting from false to
true so pnpm publish performs its configured branch, clean-tree, and up-to-date
checks; preserve the existing publish scripts’ explicit --no-git-checks
behavior.
In `@README.md`:
- Around line 26-28: Update the Node.js 26 “Latest” installation instructions to
account for Corepack no longer being bundled: add a userland Corepack
installation step before corepack enable, or document direct installation of
pnpm 11.15.1 for that runtime while preserving the existing instructions for
other Node.js versions.
---
Nitpick comments:
In @.github/workflows/push-feature.yml:
- Line 23: Add CI coverage for the enabled global virtual store by adding a
Build-Check or verification job that does not set
PNPM_CONFIG_ENABLE_GLOBAL_VIRTUAL_STORE to false, allowing pnpm-workspace.yaml’s
enableGlobalVirtualStore setting to apply. Keep the existing disabled-store jobs
intact and ensure the new job exercises the
packages/vite-lib-config/scripts/buildDoc.mjs workaround.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: f9f246a5-7b07-4746-93df-f48f685014dd
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (39)
.cspell.config.yml.github/ISSUE_TEMPLATE/bug_report.yml.github/ISSUE_TEMPLATE/config.yml.github/ISSUE_TEMPLATE/feature_request.yml.github/copilot-instructions.md.github/issue_template.md.github/workflows/common-release.yml.github/workflows/push-feature.yml.gitmessage.node-version.npmrc.nvmrc.tool-versions.vscode/settings.jsonAGENTS.mdCLAUDE.mdGEMINI.mdREADME.mdbiome.jsoncdocs/ai-strategy.mdpackage.jsonpackages/example-cli/README.mdpackages/example-cli/package.jsonpackages/example-lib/README.mdpackages/example-lib/package.jsonpackages/sea-builder/README.mdpackages/sea-builder/package.jsonpackages/typescript-config/README.mdpackages/typescript-config/package.jsonpackages/vite-lib-config/README.mdpackages/vite-lib-config/docs/README.mdpackages/vite-lib-config/docs/functions/viteConfig.mdpackages/vite-lib-config/docs/functions/vitestConfig.mdpackages/vite-lib-config/docs/interfaces/ViteConfigOptions.mdpackages/vite-lib-config/package.jsonpackages/vite-lib-config/scripts/buildDoc.mjspackages/vite-lib-config/src/vite.mtspackages/vite-lib-config/typedoc.jsonpnpm-workspace.yaml
💤 Files with no reviewable changes (2)
- .npmrc
- .github/issue_template.md
CI on windows-latest failed after the pnpm 11 upgrade: pnpm 11 apparently propagates `pnpm run --no-bail`'s exit code correctly, where pnpm 10 silently swallowed it, surfacing a pre-existing, windows-only bug in this test rather than a regression from this issue's other changes (confirmed by finding the identical vitest failure already present, unnoticed, in the immediately prior merged PR's own windows-latest log). The fixture passed the literal string `'file:///entry.mjs'` to `fileURLToPath`, which is not a valid Windows file URL (Windows file URLs need a drive letter) even though it's a valid POSIX one — a value `import.meta.url` itself would never actually produce on either platform, so production code was never affected. Build the entry path and its URL with `pathToFileURL`/a platform check instead, so the pair round-trips correctly on both platforms. Refs #48
a4d13eb to
b6c750f
Compare
Four Copilot/CodeRabbit review findings on PR #88's pnpm 11 config: - pin the packageExtensions entry for undici-types' @types/node to the same ^24.6.2 range sea-builder/vite-lib-config already use, instead of '*', so a lockfile regeneration cannot resolve a different major for different importers - note in-file that the @babel/parser/@babel/types overrides are a time-boxed minimumReleaseAge workaround with the exact date they stop being needed, so it isn't forgotten - remove the onlyBuiltDependencies entry: pnpm 11 no longer reads it (consolidated into allowBuilds, which this file already sets for esbuild) — dead config now that pnpm 11 is the pinned version - reword the workspaceConcurrency comment; "we're increasing the number from 1" read as if the value would change, when the setting intentionally stays at 1 to keep publish serialized Refs #48
Two CodeRabbit findings on PR #88's typedoc/gvs workaround: - buildDoc.mjs invoked `typedoc` via `spawnSync(..., { shell: true })` with an args array, which node deprecates (DEP0190) since it only concatenates the array into a shell string instead of escaping it. Resolve typedoc's own bin script path via its package.json's `bin` field and spawn node directly against it, shell disabled. - typedoc.json's build emitted unresolved-symbol warnings for vite's UserConfig/mergeConfig (referenced via @link from vitestConfig's own re-exported ViteUserConfig alias) since the build only processes this package's own entry point. Add externalSymbolLinkMappings so those render as links instead of warnings; regenerated docs accordingly. Refs #48
… range CodeRabbit finding on PR #88: `--node=22` maps to `^22` in sea-builder's resolveNodeVersion, which still matches Node 22 patches below the `^22.23.1` engines floor this issue raises the workspace to. Use an explicit `>=22.23.1` range instead, which resolveNodeVersion passes through unchanged, so the SEA binary can't embed an older, unsupported patch. Refs #48
Three CodeRabbit findings on PR #88: - the ISSUE_TEMPLATE forms asked for logs/screenshots/context without ever telling contributors to strip secrets, credentials, tokens, or personal data first. Add one shared warning to each form's intro. - bug_report.yml's required Environment Details field pre-filled the example block via `value`, so `required: true` would still pass on an unedited submission. Switch it to `placeholder` so the field is actually empty until a reporter fills it in. - Node.js 26, newly added to this issue's CI matrix, no longer bundles Corepack. `corepack enable` alone fails there; document installing Corepack from npm first for that runtime. Refs #48
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/vite-lib-config/typedoc.json`:
- Around line 3-9: Add a “vitest/config” entry to the externalSymbolLinkMappings
object in typedoc.json, mapping ViteUserConfig to the appropriate vitest/config
documentation URL while preserving the existing vite mappings.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 3df17ef8-0933-4f5e-b5c9-3ad09356f0fb
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (10)
.github/ISSUE_TEMPLATE/bug_report.yml.github/ISSUE_TEMPLATE/feature_request.ymlREADME.mdpackages/example-cli/package.jsonpackages/sea-builder/src/utils/runIfMain.spec.mtspackages/vite-lib-config/docs/functions/viteConfig.mdpackages/vite-lib-config/docs/functions/vitestConfig.mdpackages/vite-lib-config/scripts/buildDoc.mjspackages/vite-lib-config/typedoc.jsonpnpm-workspace.yaml
🚧 Files skipped from review as they are similar to previous changes (7)
- .github/ISSUE_TEMPLATE/feature_request.yml
- packages/vite-lib-config/docs/functions/viteConfig.md
- packages/vite-lib-config/scripts/buildDoc.mjs
- packages/example-cli/package.json
- packages/vite-lib-config/docs/functions/vitestConfig.md
- .github/ISSUE_TEMPLATE/bug_report.yml
- pnpm-workspace.yaml
Chatgpt-codex flagged the shared Breaking entry on PR #114: it only described dropping Node.js 20, hiding that #88 also raised the floor within Node.js 22/24 and dropped Node.js 25 entirely, verified against the actual engines.node diff in all three package.json files. State the exact before/after ranges in each of the three CHANGELOGs. Refs #107
Chatgpt-codex flagged a second breaking change from #88 on PR #114, distinct from the engines.node floor: packages/vite-lib-config/src/ vite.mts's shared viteConfig raised its Vite build target from node20.11 to node22.23, verified against the actual diff. This affects the compiled output syntax of every package built through that shared config, including this repository's own sea-builder, independent of which Node.js version runs the build itself. Refs #107
Proactively audited every entry-bearing PR (#19, #41, #42, #44, #66, #70-#76, #88) against actual package.json diffs, applying the same "runtime dep / breaking config / vague wording" lens Codex used across five prior review rounds, instead of waiting for another round-trip. Found: #19 also bumped cpy-cli and typescript devDependencies in all three target packages (plus type-fest and undici for sea-builder), none previously recorded under 0.21.0. Also replaced the vague "grouped Dependabot update (#44)" wording in sea-builder and vite-lib-config with the actual packages/versions it bumped, matching this backfill's established granularity for every other dependency bump entry. Refs #107
Chatgpt-codex flagged three more gaps in the reviewed release notes, each verified against the actual PR diff before accepting: - typescript-config's peerDependencies still advertises `>=5.7.x`, but erasableSyntaxOnly (enabled in #19) requires TypeScript 5.8+; noted the effective floor so consumers on 5.7 know to upgrade. - #88 also fixed vite-lib-config's TypeDoc build (resolving typedoc-plugin-markdown under pnpm's virtual store) and added working external link mappings for Vite symbols in the generated docs, previously undocumented. - #70's JSDoc fix entry only mentioned the shebang/library-mode branch inversion; broadened it to cover the filtered-entries and mixed-entries behavior it also documented, and vitestConfig's wholesale rewrite from a copy-pasted, incorrect description to its actual test.environment merge behavior. Refs #107
Summary
Named-gap re-import of
pnpm-project-template@8c19c5f(2026-07-22):migrates the Node.js baseline from LTS Iron to LTS Jod, migrates pnpm
config to pnpm 11, enables pnpm 11's global virtual store (gvs), and
imports the AI-agent entry files / config-file renames / ISSUE_TEMPLATE
form set the template also carries. This is the issue #49/#50 blocker
in the IDD adoption roadmap.
Changes
Commit 1 — Node/pnpm baseline (breaking):
.node-version/.nvmrc/.tool-versions→22.23.1(Jod), droppingthe
ref:v20.19.5token upstream also droppedengines.node(root + all 5 packages) →^22.23.1 || ^24.2.0 || >=26.0.020.x/22.x/24.x→22.x/24.x/26.x; root + 5 packageREADMEs' System Requirements sections updated to match
packageManager→pnpm@11.15.1;.npmrcdeleted, its settings(including this repo's own
workspace-concurrencyrationale)migrated into
pnpm-workspace.yamlunder pnpm 11 camelCase keysenableGlobalVirtualStore: true) withPNPM_CONFIG_ENABLE_GLOBAL_VIRTUAL_STORE: 'false'added to every CIjob that runs
pnpm install; droppedCOREPACK_INTEGRITY_KEYS,matching upstream's pnpm 11 setup
vite-lib-config's build target andexample-cli's SEA--nodeflag raised off Node 20
biome.json→biome.jsonc,cspell.config.yml→.cspell.config.yml,new
.gitmessage,.github/issue_template.mdreplaced with the.github/ISSUE_TEMPLATE/form set (adapted with this repo'smulti-language CONTRIBUTING notice)
AGENTS.md/CLAUDE.md/GEMINI.md/.github/copilot-instructions.md/docs/ai-strategy.mdadded, describing this monorepo's own packagesand tooling rather than upstream's generic template prose
.vscode/settings.jsonfixed up for the.npmrcremoval and cspellrename, extended for the new
.gitmessage/AI-agent filesCommit 2 — dev dependency floors (separate, non-breaking): Biome
^2.5.2, commitlint^21.2.0, cspell +@cspell/cspell-types^10.0.1, lint-staged^17.0.8, markdownlint-cli2^0.23.0,TypeScript
~6.0.3. Left the@kurone-kito/*-configlint packagesalone — upstream's current pin for those is a
0.23.0-alpha.xprerelease, which the issue says not to adopt without a deliberate
decision.
Commit 3 — typedoc fix: enabling gvs broke
vite-lib-config'sbuild:doc— typedoc's own plugin loader resolvestypedoc-plugin-markdownrelative to typedoc's install location,which gvs relocates to a store slot shared across every project on
the machine, so the bare-specifier lookup can't find the plugin
anymore. Added a small script that resolves the plugin's absolute path
from this package (where normal workspace resolution still works) and
passes it to typedoc via
--plugin.packages/vite-lib-config/docsregenerated accordingly (the diff beyond the Node baseline text is
typedoc-plugin-markdownrendering optional params asname?insteadof
namein the newer version this lockfile resolves).Commit 4 — lockfile regen: a straight
pnpm installunder pnpm 11only verifies the existing lockfile rather than re-resolving it, so
getting to pnpm 11 required deleting
pnpm-lock.yamland reinstallingfrom scratch. That surfaced two more pnpm 11 behaviors, both addressed
in
pnpm-workspace.yaml:same-day
@babel/parser/@babel/typespatch pulled in by@vitest/coverage-v8'smagicastdependency. Overrode both to7.29.7, the prior patch (already satisfies every consumer's range,and deduplicates two resolved versions to one). This pin is
time-boxed — the newer patch clears the age check on its own at
2026-08-01T15:07Z; the override should be dropped and the lockfilere-resolved after that.
undici-typescarries a triple-slash reference to@types/nodethat it never declares as a real dependency, relying on ambient
node_modules co-location — the same class of gvs limitation as the
typedoc case, this time breaking
test:ts("Cannot find typedefinition file for 'node'") for every package that doesn't already
depend on
@types/nodedirectly. Fixed with apackageExtensionsentry declaring the dependency explicitly. Also adopted upstream's
configDependenciesentry for@pnpm/plugin-types-fixeras ageneral safety net for this class of issue — it didn't by itself
fix this specific case.
esbuildnow needs explicitallowBuildsapproval under pnpm 11;added, equivalent to the existing
onlyBuiltDependenciesentry.rimraf6.0.1→6.1.3,semver7.8.1→7.8.5.Deliberately deferred
pnpm/action-setup@v4→@v6andactions/setup-node@v5→@v6: leftto the already-open Dependabot PRs chore(deps): bump actions/setup-node from 5.0.0 to 7.0.0 #79/chore(deps): bump pnpm/action-setup from 4.3.0 to 6.0.9 #81 rather than duplicated
here (
actions/checkoutis already@v7and SHA-pinned via Pin third-party GitHub Actions to commit SHAs in release-critical workflows #55).pnpm-workspace.yamlconfigDependenciesblock alsopins
@pnpm/plugin-types-fixer's version differently acrossreleases; used the version this issue's sync point (
8c19c5f)carries.
Verification
From a clean
rm -rf node_modules packages/*/node_modules+pnpm install --frozen-lockfile, all under Node 22.23.1 /pnpm@11.15.1 with gvs enabled (no opt-out env set, matching a local
developer's default):
pnpm install --frozen-lockfile— passespnpm run lint— passes (Biome, cspell, markdownlint-cli2)pnpm run build— passes (all 5 packages, includingvite-lib-config's doc generation)git diff --exit-code packages/vite-lib-config/docs— cleanpnpm run test(test:ts+vitest run --coverage) — 20 files, 68tests pass, 94.01% statement coverage
grep -rn 'Iron LTS\|\^20\.11\|node20\|--node=20\|20\.19\.5'overtracked files (excluding
pnpm-lock.yamland theparseArgs.spec.mtsfixture) — no matches22.x/24.x/26.x× ubuntu/windows) run on this PRBREAKING CHANGE: Node 20 (LTS Iron) is no longer a supported engines
range; the
>=24floor is raised to>=24.2.0. pnpm 10 is no longerthe pinned package manager.
Closes #48
Summary by CodeRabbit
Documentation
Developer Experience
Maintenance