From 9ce16313cee532d2430cc0800d98315bb6f71748 Mon Sep 17 00:00:00 2001 From: Fabio Gartenmann <137318798+artiphishle@users.noreply.github.com> Date: Sat, 22 Aug 2026 19:43:44 +0200 Subject: [PATCH 01/10] feat(policy): add canonical Node 24 tooling baseline --- src/policy/bunRuntimePolicy.ts | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/policy/bunRuntimePolicy.ts b/src/policy/bunRuntimePolicy.ts index 3c1fe3a..909d5ec 100644 --- a/src/policy/bunRuntimePolicy.ts +++ b/src/policy/bunRuntimePolicy.ts @@ -1,11 +1,25 @@ /** - * Canonical Bun runtime policy for Ankhorage repositories. + * Canonical runtime/tooling policies for Ankhorage repositories. * - * Import this from `@ankhorage/devtools/policy` when another package needs to inspect - * the managed Bun version without defining an independent version authority. + * Import these from `@ankhorage/devtools/policy` when another package needs to inspect + * the managed Bun or Node baseline without defining an independent version authority. */ export const bunRuntimePolicy = { packageManager: 'bun@1.3.14', typesRange: '^1.3.14', version: '1.3.14', } as const; + +/** + * Canonical Node LTS baseline for Node-based Ankhorage tooling and CI execution. + * + * Bun remains the repository package manager/primary command runtime where configured; + * this policy makes Node-based tooling deterministic instead of inheriting the ambient + * Node version from a CI runner image. + */ +export const nodeRuntimePolicy = { + engineRange: '24.x', + major: 24, + setupVersion: '24', + typesRange: '^24.13.3', +} as const; From 707e9f4c025ef867bd6c382c4575e4eb598b963b Mon Sep 17 00:00:00 2001 From: Fabio Gartenmann <137318798+artiphishle@users.noreply.github.com> Date: Sat, 22 Aug 2026 19:43:52 +0200 Subject: [PATCH 02/10] feat(workflows): render managed Node baseline --- src/tools/workflows/index.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/tools/workflows/index.ts b/src/tools/workflows/index.ts index 7e4c341..f6a5a20 100644 --- a/src/tools/workflows/index.ts +++ b/src/tools/workflows/index.ts @@ -1,9 +1,10 @@ import { readFile } from 'node:fs/promises'; -import { bunRuntimePolicy } from '../../policy/bunRuntimePolicy.js'; +import { bunRuntimePolicy, nodeRuntimePolicy } from '../../policy/bunRuntimePolicy.js'; import type { ManagedFileDefinition } from '../shared/managedFiles.js'; const BUN_VERSION_TOKEN = '__ANKH_BUN_VERSION__'; +const NODE_VERSION_TOKEN = '__ANKH_NODE_VERSION__'; export const workflowManagedFiles = [ createWorkflowDefinition('.github/workflows/ci.yml', './files/ci.yml'), @@ -16,7 +17,9 @@ function createWorkflowDefinition(relativePath: string, sourcePath: string): Man relativePath, render: async () => { const template = await readFile(sourceUrl, 'utf8'); - return template.replaceAll(BUN_VERSION_TOKEN, bunRuntimePolicy.version); + return template + .replaceAll(BUN_VERSION_TOKEN, bunRuntimePolicy.version) + .replaceAll(NODE_VERSION_TOKEN, nodeRuntimePolicy.setupVersion); }, }; } From 21dbe11f4ee0f9e3b91489bdd55418ad6340be1c Mon Sep 17 00:00:00 2001 From: Fabio Gartenmann <137318798+artiphishle@users.noreply.github.com> Date: Sat, 22 Aug 2026 19:44:04 +0200 Subject: [PATCH 03/10] feat(workflows): pin Node 24 in managed CI --- src/tools/workflows/files/ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/tools/workflows/files/ci.yml b/src/tools/workflows/files/ci.yml index b5881ae..220a2b2 100644 --- a/src/tools/workflows/files/ci.yml +++ b/src/tools/workflows/files/ci.yml @@ -24,6 +24,11 @@ jobs: with: bun-version: '__ANKH_BUN_VERSION__' + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: '__ANKH_NODE_VERSION__' + - name: Install dependencies run: bun install --frozen-lockfile From dbe36108e26a8918b4d890750395d91af3395271 Mon Sep 17 00:00:00 2001 From: Fabio Gartenmann <137318798+artiphishle@users.noreply.github.com> Date: Sat, 22 Aug 2026 19:44:13 +0200 Subject: [PATCH 04/10] refactor(workflows): render release Node version from policy --- src/tools/workflows/files/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/workflows/files/release.yml b/src/tools/workflows/files/release.yml index b3b60ec..45ad211 100644 --- a/src/tools/workflows/files/release.yml +++ b/src/tools/workflows/files/release.yml @@ -32,7 +32,7 @@ jobs: - name: Setup Node for npm publishing uses: actions/setup-node@v4 with: - node-version: 24 + node-version: '__ANKH_NODE_VERSION__' registry-url: https://registry.npmjs.org - name: Update npm From ca4242086deb507b00c4c1a2f6ee6d26e0930005 Mon Sep 17 00:00:00 2001 From: Fabio Gartenmann <137318798+artiphishle@users.noreply.github.com> Date: Sat, 22 Aug 2026 19:44:24 +0200 Subject: [PATCH 05/10] chore: add Node policy changeset --- .changeset/bright-nodes-align.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/bright-nodes-align.md diff --git a/.changeset/bright-nodes-align.md b/.changeset/bright-nodes-align.md new file mode 100644 index 0000000..00dc533 --- /dev/null +++ b/.changeset/bright-nodes-align.md @@ -0,0 +1,5 @@ +--- +'@ankhorage/devtools': minor +--- + +Add the canonical Node 24 LTS tooling policy and render managed CI/release workflows from the shared Bun and Node runtime baselines. From ceace9d325610835a4fbb42145961e5ac6dec7fd Mon Sep 17 00:00:00 2001 From: Fabio Gartenmann <137318798+artiphishle@users.noreply.github.com> Date: Sat, 22 Aug 2026 19:44:32 +0200 Subject: [PATCH 06/10] test(workflows): verify managed runtime policy rendering --- src/tools/workflows/index.test.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/tools/workflows/index.test.ts diff --git a/src/tools/workflows/index.test.ts b/src/tools/workflows/index.test.ts new file mode 100644 index 0000000..df6956f --- /dev/null +++ b/src/tools/workflows/index.test.ts @@ -0,0 +1,17 @@ +import { describe, expect, test } from 'bun:test'; + +import { bunRuntimePolicy, nodeRuntimePolicy } from '../../policy/bunRuntimePolicy'; +import { workflowManagedFiles } from './index'; + +describe('managed workflows', () => { + test('render the canonical Bun and Node runtime policies', async () => { + for (const definition of workflowManagedFiles) { + expect(definition.render).toBeDefined(); + const rendered = await definition.render?.('.'); + expect(rendered).toContain(`bun-version: '${bunRuntimePolicy.version}'`); + expect(rendered).toContain(`node-version: '${nodeRuntimePolicy.setupVersion}'`); + expect(rendered).not.toContain('__ANKH_BUN_VERSION__'); + expect(rendered).not.toContain('__ANKH_NODE_VERSION__'); + } + }); +}); From a85651499b2da5e59a79df410619adfeb59e6989 Mon Sep 17 00:00:00 2001 From: Fabio Gartenmann <137318798+artiphishle@users.noreply.github.com> Date: Sat, 22 Aug 2026 19:44:46 +0200 Subject: [PATCH 07/10] fix(test): use ESM import paths --- src/tools/workflows/index.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tools/workflows/index.test.ts b/src/tools/workflows/index.test.ts index df6956f..3599a7d 100644 --- a/src/tools/workflows/index.test.ts +++ b/src/tools/workflows/index.test.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from 'bun:test'; -import { bunRuntimePolicy, nodeRuntimePolicy } from '../../policy/bunRuntimePolicy'; -import { workflowManagedFiles } from './index'; +import { bunRuntimePolicy, nodeRuntimePolicy } from '../../policy/bunRuntimePolicy.js'; +import { workflowManagedFiles } from './index.js'; describe('managed workflows', () => { test('render the canonical Bun and Node runtime policies', async () => { From da9c1bccbbd55553ea9f94a76365e0be6010240a Mon Sep 17 00:00:00 2001 From: Fabio Gartenmann <137318798+artiphishle@users.noreply.github.com> Date: Sat, 22 Aug 2026 19:45:13 +0200 Subject: [PATCH 08/10] chore(policy): align Node typings with Node 24 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 410f5dd..c17fcb0 100644 --- a/package.json +++ b/package.json @@ -121,7 +121,7 @@ "@ankhorage/doctor": "0.3.0", "@changesets/cli": "^2.30.0", "@types/bun": "^1.3.14", - "@types/node": "^25.2.3", + "@types/node": "^24.13.3", "typescript": "^5.9.3" }, "packageManager": "bun@1.3.14" From 45faa2419cdd9b0852fdc1eb609d5d522d4f0165 Mon Sep 17 00:00:00 2001 From: Fabio Gartenmann <137318798+artiphishle@users.noreply.github.com> Date: Sat, 22 Aug 2026 19:45:28 +0200 Subject: [PATCH 09/10] refactor(policy): keep Node policy execution-focused --- src/policy/bunRuntimePolicy.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/policy/bunRuntimePolicy.ts b/src/policy/bunRuntimePolicy.ts index 909d5ec..5529198 100644 --- a/src/policy/bunRuntimePolicy.ts +++ b/src/policy/bunRuntimePolicy.ts @@ -21,5 +21,4 @@ export const nodeRuntimePolicy = { engineRange: '24.x', major: 24, setupVersion: '24', - typesRange: '^24.13.3', } as const; From ba4068d40f7c41c337a701600907e9055f615b69 Mon Sep 17 00:00:00 2001 From: Fabio Gartenmann <137318798+artiphishle@users.noreply.github.com> Date: Sat, 22 Aug 2026 19:45:49 +0200 Subject: [PATCH 10/10] revert: keep Devtools package typings unchanged --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c17fcb0..410f5dd 100644 --- a/package.json +++ b/package.json @@ -121,7 +121,7 @@ "@ankhorage/doctor": "0.3.0", "@changesets/cli": "^2.30.0", "@types/bun": "^1.3.14", - "@types/node": "^24.13.3", + "@types/node": "^25.2.3", "typescript": "^5.9.3" }, "packageManager": "bun@1.3.14"