Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 28 additions & 11 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22.x'
node-version: '24.x'
cache: npm
- run: npm ci
- run: npm run ci:rebuild-native
- run: npm run lint

security:
Expand All @@ -26,9 +27,10 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22.x'
node-version: '24.x'
cache: npm
- run: npm ci
- run: npm run ci:rebuild-native
- name: npm audit (high severity)
run: npm audit --audit-level=high
continue-on-error: true
Expand All @@ -39,14 +41,21 @@ jobs:
needs: typecheck
strategy:
matrix:
node-version: [18.x, 20.x, 22.x]
# Node 18/20/22 dropped — all EOL by May 2026:
# - v18 EOL Apr 2025 (1+ year dead)
# - v20 (Iron) Maintenance EOL Mar 2026
# - v22 (Jod) Maintenance EOL May 2026 (this month)
# Active LTS = v24 (Krypton, until May 2027). v26 = Current.
# better-sqlite3 v12.10.0 prebuilds: v24 + v26 (v20/v23 removed).
node-version: [24.x, 26.x]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: npm
- run: npm ci
- run: npm run ci:rebuild-native
- name: Run core tests
run: npx vitest run tests/core/ tests/agents/
timeout-minutes: 5
Expand All @@ -57,14 +66,15 @@ jobs:
needs: typecheck
strategy:
matrix:
node-version: [18.x, 20.x, 22.x]
node-version: [24.x, 26.x]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: npm
- run: npm ci
- run: npm run ci:rebuild-native
- name: Run orchestra tests
# Orchestra suite is large (~118 test files) — historical OOM on default
# 2GB heap. Bumped to 8GB + forks pool (isolated workers, no shared state).
Expand All @@ -80,14 +90,15 @@ jobs:
needs: typecheck
strategy:
matrix:
node-version: [18.x, 20.x, 22.x]
node-version: [24.x, 26.x]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: npm
- run: npm ci
- run: npm run ci:rebuild-native
- name: Run CLI tests
run: npx vitest run tests/cli/
timeout-minutes: 10
Expand All @@ -98,14 +109,15 @@ jobs:
needs: typecheck
strategy:
matrix:
node-version: [18.x, 20.x, 22.x]
node-version: [24.x, 26.x]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: npm
- run: npm ci
- run: npm run ci:rebuild-native
- name: Run remaining tests
run: npx vitest run tests/mcp/ tests/api/ tests/integration/ tests/security/ tests/providers/ tests/monitor/ tests/skills/ tests/analytics/ tests/github/
timeout-minutes: 10
Expand All @@ -122,9 +134,10 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22.x'
node-version: '24.x'
cache: npm
- run: npm ci
- run: npm run ci:rebuild-native
- name: Run docs and scripts tests
run: npx vitest run tests/docs/ tests/scripts/ --pool=forks
timeout-minutes: 5
Expand All @@ -137,9 +150,10 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22.x'
node-version: '24.x'
cache: npm
- run: npm ci
- run: npm run ci:rebuild-native
- name: Install dashboard dependencies
run: npm install --prefix src/dashboard --ignore-scripts 2>/dev/null || true
- name: Run dashboard tests
Expand All @@ -156,9 +170,10 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22.x'
node-version: '24.x'
cache: npm
- run: npm ci
- run: npm run ci:rebuild-native
- name: Run core tests (Windows informational)
run: npx vitest run tests/core/ tests/agents/
timeout-minutes: 10
Expand All @@ -172,9 +187,10 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22.x'
node-version: '24.x'
cache: npm
- run: npm ci
- run: npm run ci:rebuild-native
- name: Run tests with coverage
run: npm run test:coverage
timeout-minutes: 20
Expand All @@ -193,9 +209,10 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22.x'
node-version: '24.x'
cache: npm
- run: npm ci
- run: npm run ci:rebuild-native
- name: Install dashboard dependencies
run: npm install --prefix src/dashboard --ignore-scripts 2>/dev/null || true
- run: npm run build
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/cross-platform-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,11 @@ jobs:

- uses: actions/setup-node@v4
with:
node-version: '20'
node-version: '24'
cache: npm

- run: npm ci
- run: npm run ci:rebuild-native

- run: npm run build

Expand Down
19 changes: 11 additions & 8 deletions .github/workflows/dashboard-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,9 @@ jobs:
strategy:
fail-fast: false
matrix:
# Node 18 dropped: Tailwind 4 @tailwindcss/oxide native binding is
# delivered as a per-platform optionalDependency, npm bug #4828 fails
# to resolve it on Node 18 in CI. Tailwind 4 officially supports
# Node 20+. engines.node remains >=18 for the library; only the
# dashboard build needs 20+. Sprint 175 PR #16 CI confirmed.
node-version: [20.x, 22.x]
# Node 18/20/22 dropped: all EOL by May 2026. Tailwind 4 + better-
# sqlite3 12.10.0 prebuilds target Node 24 (Active LTS) + 26 (Current).
node-version: [24.x, 26.x]
env:
ARTIFACT_SIZE_LIMIT_BYTES: 5242880
steps:
Expand All @@ -54,6 +51,9 @@ jobs:
- name: Install root dependencies
run: npm ci

- name: Rebuild native binding (better-sqlite3)
run: npm run ci:rebuild-native

- name: Install dashboard dependencies
run: npm install --prefix src/dashboard --ignore-scripts

Expand Down Expand Up @@ -82,7 +82,7 @@ jobs:
run: npx vitest run tests/dashboard/dashboard-build-smoke.test.ts --config vitest.dashboard.config.ts

- name: Upload dashboard artifact
if: matrix.node-version == '22.x'
if: matrix.node-version == '24.x'
uses: actions/upload-artifact@v4
with:
name: dashboard-dist
Expand All @@ -102,12 +102,15 @@ jobs:
- name: Setup Node.js 22.x
uses: actions/setup-node@v4
with:
node-version: '22.x'
node-version: '24.x'
cache: npm

- name: Install root dependencies
run: npm ci

- name: Rebuild native binding (better-sqlite3)
run: npm run ci:rebuild-native

- name: Install dashboard dependencies
run: npm install --prefix src/dashboard --ignore-scripts

Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,15 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22.x'
node-version: '24.x'
cache: npm

- name: Install dependencies
run: npm ci

- name: Rebuild native binding (better-sqlite3)
run: npm run ci:rebuild-native

- name: Install docs dependencies
run: npm install --prefix docs

Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,16 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22.x'
node-version: '24.x'
cache: npm
registry-url: 'https://registry.npmjs.org'

- name: Install dependencies
run: npm ci

- name: Rebuild native binding (better-sqlite3)
run: npm run ci:rebuild-native

- name: Type check
run: npm run lint

Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,16 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22.x'
node-version: '24.x'
cache: npm
registry-url: 'https://registry.npmjs.org'

- name: Install dependencies
run: npm ci

- name: Rebuild native binding (better-sqlite3)
run: npm run ci:rebuild-native

- name: Type check (lint)
run: npm run lint

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/secret-scan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@ jobs:
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: '20'
node-version: '24'
- name: Run secret scan
run: node scripts/security/secret-baseline.mjs
12 changes: 6 additions & 6 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
"lint:errors": "node scripts/check-error-handling.mjs",
"lint:link": "node scripts/lint-links.mjs",
"clean": "rm -rf dist",
"ci:rebuild-native": "npm rebuild better-sqlite3 --ignore-scripts=false",
"validate:publish": "npx tsx scripts/validate-publish.ts",
"docs:generate-cli": "npx tsx scripts/generate-cli-docs.ts",
"docs:ref": "node scripts/gen-reference-docs.mjs --write",
Expand Down Expand Up @@ -64,14 +65,14 @@
"@modelcontextprotocol/sdk": "^1.27.1",
"@noble/ed25519": "^2.3.0",
"@noble/hashes": "^1.8.0",
"better-sqlite3": "^12.9.0",
"better-sqlite3": "^12.10.0",
"commander": "^13.0.0",
"telegraf": "^4.16.0",
"ws": "^8.18.0",
"zod": "^3.25.0"
},
"engines": {
"node": ">=18.0.0"
"node": ">=24.0.0"
},
"files": [
"dist",
Expand Down
4 changes: 2 additions & 2 deletions src/cli/entry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import { killAllSessions } from '../orchestra/tmux.js';

// ─── Node Version Guard ─────────────────────────────────────────────────────
const [major] = process.versions.node.split('.').map(Number);
if ((major ?? 0) < 18) {
if ((major ?? 0) < 24) {
process.stderr.write(
`deckent requires Node.js >= 18. Current version: ${process.versions.node}\n`,
`deckent requires Node.js >= 24 (Active LTS). Current version: ${process.versions.node}\n`,
);
process.exit(1);
}
Expand Down
8 changes: 4 additions & 4 deletions tests/cli/bin-entry-validation.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ describe('bin entry — package.json validation', () => {
expect(pkg['type']).toBe('module');
});

it('engines.node is >= 18 (matches entry.ts runtime guard)', () => {
it('engines.node is >= 24 (Active LTS — Node 18/20/22 EOL by May 2026)', () => {
const engines = pkg['engines'] as Record<string, string>;
expect(engines['node']).toMatch(/^>=\s*18/);
expect(engines['node']).toMatch(/^>=\s*24/);
});

it('files array contains dist so bin target is published', () => {
Expand Down Expand Up @@ -77,8 +77,8 @@ describe('bin entry — src/cli/entry.ts source validation', () => {
expect(source).toContain("'SIGTERM'");
});

it('has Node version guard requiring >= 18', () => {
expect(source).toContain('< 18');
it('has Node version guard requiring >= 24 (Active LTS)', () => {
expect(source).toContain('< 24');
});

it('imports handleCliError from helpers/process', () => {
Expand Down
4 changes: 2 additions & 2 deletions tests/cli/npx-compat.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@ describe('npx deckent compatibility', () => {
expect(pkg.type).toBe('module');
});

it('package.json engines requires node >= 18', () => {
it('package.json engines requires node >= 24 (Active LTS)', () => {
const pkg = JSON.parse(readFileSync(join(PROJECT_ROOT, 'package.json'), 'utf-8'));
expect(pkg.engines.node).toMatch(/>=\s*18/);
expect(pkg.engines.node).toMatch(/>=\s*24/);
});

it('package.json files includes dist', () => {
Expand Down
Loading