From 92e88d1dc0130e4bd6a1b807c2fba44958a73c1b Mon Sep 17 00:00:00 2001 From: Roger Chappel Date: Mon, 31 Aug 2026 07:58:37 +1000 Subject: [PATCH 1/5] deps: upgrade commander for Node 20 --- package.json | 2 +- pnpm-lock.yaml | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 72a0f38..b11929a 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "package:smoke": "pnpm run build && node scripts/package-smoke.mjs" }, "dependencies": { - "commander": "^12.1.0" + "commander": "^14.0.3" }, "devDependencies": { "@types/node": "^22.10.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6f9fe0b..502abbb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: commander: - specifier: ^12.1.0 - version: 12.1.0 + specifier: ^14.0.3 + version: 14.0.3 devDependencies: '@types/node': specifier: ^22.10.2 @@ -183,9 +183,9 @@ packages: '@types/node@22.19.17': resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} esbuild@0.27.7: resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} @@ -300,7 +300,7 @@ snapshots: dependencies: undici-types: 6.21.0 - commander@12.1.0: {} + commander@14.0.3: {} esbuild@0.27.7: optionalDependencies: From 928750a03d6d139e9f833901d09076f1896719ca Mon Sep 17 00:00:00 2001 From: Roger Chappel Date: Mon, 31 Aug 2026 07:58:37 +1000 Subject: [PATCH 2/5] test: cover commander option rejection --- tests/cli-ux-smoke.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/cli-ux-smoke.sh b/tests/cli-ux-smoke.sh index 14cb44c..d5aa4fa 100755 --- a/tests/cli-ux-smoke.sh +++ b/tests/cli-ux-smoke.sh @@ -44,6 +44,13 @@ assert_empty_file templates.err assert_json_file templates.json assert_field templates.json "Array.isArray(data.templates) && data.templates.some((template) => template.key === 'oss-cli')" +if node "$cli" templates --not-an-option > invalid-option.out 2> invalid-option.err; then + fail "unknown option succeeded" +fi +assert_empty_file invalid-option.out +grep -Fq "unknown option '--not-an-option'" invalid-option.err \ + || fail "unknown option error did not identify the rejected option" + node "$cli" init oss-cli smoke-app --dry-run > dry-run.json 2> dry-run.err assert_empty_file dry-run.err assert_json_file dry-run.json From bd54b8c06364346e2c5654b92b787c209816312e Mon Sep 17 00:00:00 2001 From: Roger Chappel Date: Mon, 31 Aug 2026 07:58:37 +1000 Subject: [PATCH 3/5] ci: verify CLI compatibility on Node 20 and 22 --- .github/workflows/ci.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3870f7c..ae9acf4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,34 @@ permissions: contents: read jobs: + node-compatibility: + name: Node ${{ matrix.node-version }} compatibility + runs-on: ubuntu-latest + strategy: + matrix: + node-version: ['20', '22'] + + steps: + - name: Check out repository + uses: actions/checkout@v6 + + - name: Set up pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.13.1 + + - name: Set up Node + uses: actions/setup-node@v6 + with: + node-version: ${{ matrix.node-version }} + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Verify build, templates, and CLI behavior + run: pnpm run build && pnpm test && bash tests/cli-ux-smoke.sh + repository-hygiene: name: Repository hygiene runs-on: ubuntu-latest From 4b95c7ef46050e971dd9fd84dc69b309e8b7e4de Mon Sep 17 00:00:00 2001 From: Roger Chappel Date: Mon, 31 Aug 2026 07:58:37 +1000 Subject: [PATCH 4/5] docs: record supported Node compatibility --- CHANGELOG.md | 2 ++ README.md | 3 +++ 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a0fa03..f63e220 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,8 @@ format and uses semantic versioning when versioned releases are published. ### Changed +- Upgraded Commander to 14.0.3, the newest release compatible with the Node.js + 20 runtime floor, and added Node.js 20 and 22 CLI compatibility coverage. - Aligned template terminology, placeholder documentation, and current V1 surface area across docs, templates, and workflows. - Expanded the optional docs-site template with clearer setup guidance and a diff --git a/README.md b/README.md index 5dca924..cf3aace 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,9 @@ Agent-friendly software project scaffolding CLI for apps, APIs, CLIs, and OSS packages. +StackForge requires Node.js 20 or newer. Its build, template checks, and CLI +smoke tests run in CI on both Node.js 20 and the primary Node.js 22 runtime. + ## Status Early build. StackForge is release-scoped as a CLI-first tool first, with From 29923dadffd8086f8505f26040f792365f958d8f Mon Sep 17 00:00:00 2001 From: Roger Chappel Date: Mon, 31 Aug 2026 08:02:12 +1000 Subject: [PATCH 5/5] ci: initialize pnpm before Node cache --- .github/workflows/release-dry-run.yml | 6 +++--- .github/workflows/release.yml | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release-dry-run.yml b/.github/workflows/release-dry-run.yml index 9f86604..ce3830e 100644 --- a/.github/workflows/release-dry-run.yml +++ b/.github/workflows/release-dry-run.yml @@ -23,13 +23,13 @@ jobs: - uses: actions/checkout@v5 with: fetch-depth: 0 - - uses: actions/setup-node@v5 - with: - node-version: 22 - uses: pnpm/action-setup@v4 with: version: 10.13.1 run_install: false + - uses: actions/setup-node@v5 + with: + node-version: 22 - name: Install dependencies run: pnpm install --frozen-lockfile - name: Install ReleaseBox diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a3305f0..6c317e2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,14 +20,14 @@ jobs: - uses: actions/checkout@v5 with: fetch-depth: 0 - - uses: actions/setup-node@v5 - with: - node-version: 22 - registry-url: https://registry.npmjs.org - uses: pnpm/action-setup@v4 with: version: 10.13.1 run_install: false + - uses: actions/setup-node@v5 + with: + node-version: 22 + registry-url: https://registry.npmjs.org - name: Install dependencies run: pnpm install --frozen-lockfile - name: Install ReleaseBox