From ccf0fc0444dd02275c72a9e544c9e7693fc50ead Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 08:58:33 +0000 Subject: [PATCH 1/4] Initial plan From 443678aabcd635c7169dc1ff726491ef587be6c2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 09:40:35 +0000 Subject: [PATCH 2/4] chore: upgrade to Node.js 25 across all workflows, configs, and documentation Co-authored-by: pethers <1726836+pethers@users.noreply.github.com> --- .github/skills/ci-cd-security/SKILL.md | 2 +- .../gh-aw-github-actions-integration/SKILL.md | 18 ++-- .../workflows/check-cia-schema-updates.yml | 2 +- .../workflows/compile-agentic-workflows.yml | 2 +- .github/workflows/copilot-setup-steps.yml | 2 +- .github/workflows/data-pipeline.yml | 2 +- .github/workflows/deploy-s3.yml | 2 +- .github/workflows/javascript-testing.yml | 6 +- .github/workflows/jsdoc-validation.yml | 4 +- .github/workflows/lighthouse-ci.yml | 2 +- .../workflows/news-article-generator.lock.yml | 2 +- .github/workflows/news-article-generator.md | 2 +- .../workflows/news-committee-reports.lock.yml | 2 +- .github/workflows/news-committee-reports.md | 2 +- .../workflows/news-evening-analysis.lock.yml | 2 +- .github/workflows/news-evening-analysis.md | 2 +- .../workflows/news-interpellations.lock.yml | 2 +- .github/workflows/news-interpellations.md | 2 +- .github/workflows/news-month-ahead.lock.yml | 2 +- .github/workflows/news-month-ahead.md | 2 +- .../workflows/news-monthly-review.lock.yml | 2 +- .github/workflows/news-monthly-review.md | 2 +- .github/workflows/news-motions.lock.yml | 2 +- .github/workflows/news-motions.md | 2 +- .github/workflows/news-propositions.lock.yml | 2 +- .github/workflows/news-propositions.md | 2 +- .../workflows/news-realtime-monitor.lock.yml | 2 +- .github/workflows/news-realtime-monitor.md | 2 +- .github/workflows/news-translate.lock.yml | 2 +- .github/workflows/news-translate.md | 2 +- .github/workflows/news-week-ahead.lock.yml | 2 +- .github/workflows/news-week-ahead.md | 2 +- .github/workflows/news-weekly-review.lock.yml | 2 +- .github/workflows/news-weekly-review.md | 2 +- .github/workflows/quality-checks.yml | 6 +- .github/workflows/release.yml | 4 +- .github/workflows/sync-cia-schemas.yml | 2 +- .github/workflows/test-dashboard.yml | 4 +- .github/workflows/test-homepage.yml | 4 +- .github/workflows/test-news.yml | 4 +- .github/workflows/translation-validation.yml | 2 +- .github/workflows/update-cia-stats.yml | 2 +- .github/workflows/validate-cia-data.yml | 2 +- .nvmrc | 1 + End-of-Life-Strategy.md | 96 +++++++++++++------ FUTURE_ARCHITECTURE.md | 2 +- FUTURE_WORKFLOWS.md | 26 ++--- README.md | 4 +- TESTING.md | 4 +- WORKFLOWS.md | 34 +++---- package-lock.json | 2 +- package.json | 2 +- 52 files changed, 166 insertions(+), 125 deletions(-) create mode 100644 .nvmrc diff --git a/.github/skills/ci-cd-security/SKILL.md b/.github/skills/ci-cd-security/SKILL.md index 927dc07d1..88c8908e2 100644 --- a/.github/skills/ci-cd-security/SKILL.md +++ b/.github/skills/ci-cd-security/SKILL.md @@ -99,7 +99,7 @@ jobs: - name: Setup Node uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install Dependencies diff --git a/.github/skills/gh-aw-github-actions-integration/SKILL.md b/.github/skills/gh-aw-github-actions-integration/SKILL.md index 579092abb..22af6e2d0 100644 --- a/.github/skills/gh-aw-github-actions-integration/SKILL.md +++ b/.github/skills/gh-aw-github-actions-integration/SKILL.md @@ -106,7 +106,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install Dependencies @@ -323,7 +323,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install Dependencies @@ -465,7 +465,7 @@ jobs: - name: Setup Environment uses: actions/setup-node@v4 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install Dependencies @@ -532,7 +532,7 @@ steps: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install Dependencies @@ -615,7 +615,7 @@ steps: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Setup Python @@ -781,7 +781,7 @@ jobs: - name: Setup Environment uses: actions/setup-node@v4 with: - node-version: '24' + node-version: '25' - name: Run Agent Analysis env: @@ -903,7 +903,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] - node-version: ['24'] + node-version: ['25'] fail-fast: false steps: @@ -961,7 +961,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install Dependencies @@ -1261,7 +1261,7 @@ jobs: my-task: uses: ./.github/workflows/reusable-agent-setup.yml with: - node-version: '24' + node-version: '25' python-version: '3.11' secrets: anthropic-key: ${{ secrets.ANTHROPIC_API_KEY }} diff --git a/.github/workflows/check-cia-schema-updates.yml b/.github/workflows/check-cia-schema-updates.yml index 96543ec91..8763a62a3 100644 --- a/.github/workflows/check-cia-schema-updates.yml +++ b/.github/workflows/check-cia-schema-updates.yml @@ -31,7 +31,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install dependencies diff --git a/.github/workflows/compile-agentic-workflows.yml b/.github/workflows/compile-agentic-workflows.yml index 0e4afc69c..9c32cf9bb 100644 --- a/.github/workflows/compile-agentic-workflows.yml +++ b/.github/workflows/compile-agentic-workflows.yml @@ -30,7 +30,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' - name: Install gh-aw CLI run: | diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml index b4f05fbd3..32bcbea5c 100644 --- a/.github/workflows/copilot-setup-steps.yml +++ b/.github/workflows/copilot-setup-steps.yml @@ -67,7 +67,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: "24" + node-version: "25" - name: Cache dependencies uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 diff --git a/.github/workflows/data-pipeline.yml b/.github/workflows/data-pipeline.yml index 2f2820660..1619aa6a4 100644 --- a/.github/workflows/data-pipeline.yml +++ b/.github/workflows/data-pipeline.yml @@ -40,7 +40,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install dependencies diff --git a/.github/workflows/deploy-s3.yml b/.github/workflows/deploy-s3.yml index f4c211c7f..db933267e 100644 --- a/.github/workflows/deploy-s3.yml +++ b/.github/workflows/deploy-s3.yml @@ -87,7 +87,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install dependencies diff --git a/.github/workflows/javascript-testing.yml b/.github/workflows/javascript-testing.yml index ea5eca26e..8a7d18787 100644 --- a/.github/workflows/javascript-testing.yml +++ b/.github/workflows/javascript-testing.yml @@ -64,7 +64,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install dependencies @@ -113,7 +113,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install dependencies @@ -163,7 +163,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install dependencies diff --git a/.github/workflows/jsdoc-validation.yml b/.github/workflows/jsdoc-validation.yml index 8eaef7ee3..827e3636b 100644 --- a/.github/workflows/jsdoc-validation.yml +++ b/.github/workflows/jsdoc-validation.yml @@ -23,10 +23,10 @@ jobs: - name: Checkout Repository uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - name: Setup Node.js 24 + - name: Setup Node.js 25 uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install Dependencies diff --git a/.github/workflows/lighthouse-ci.yml b/.github/workflows/lighthouse-ci.yml index 05dc6cf2b..07d3d76dd 100644 --- a/.github/workflows/lighthouse-ci.yml +++ b/.github/workflows/lighthouse-ci.yml @@ -48,7 +48,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' - name: Prepare audit URLs id: urls diff --git a/.github/workflows/news-article-generator.lock.yml b/.github/workflows/news-article-generator.lock.yml index 71030c4f2..3cb5c53e5 100644 --- a/.github/workflows/news-article-generator.lock.yml +++ b/.github/workflows/news-article-generator.lock.yml @@ -320,7 +320,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' package-manager-cache: false - name: Create gh-aw temp directory run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh diff --git a/.github/workflows/news-article-generator.md b/.github/workflows/news-article-generator.md index 46901fd17..57d87b993 100644 --- a/.github/workflows/news-article-generator.md +++ b/.github/workflows/news-article-generator.md @@ -97,7 +97,7 @@ steps: - name: Setup Node.js uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: - node-version: '24' + node-version: '25' - name: Install dependencies run: | diff --git a/.github/workflows/news-committee-reports.lock.yml b/.github/workflows/news-committee-reports.lock.yml index 63b01c165..b2d118146 100644 --- a/.github/workflows/news-committee-reports.lock.yml +++ b/.github/workflows/news-committee-reports.lock.yml @@ -296,7 +296,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' package-manager-cache: false - name: Create gh-aw temp directory run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh diff --git a/.github/workflows/news-committee-reports.md b/.github/workflows/news-committee-reports.md index 8ed5d2295..112690096 100644 --- a/.github/workflows/news-committee-reports.md +++ b/.github/workflows/news-committee-reports.md @@ -82,7 +82,7 @@ steps: - name: Setup Node.js uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: - node-version: '24' + node-version: '25' - name: Install dependencies run: | diff --git a/.github/workflows/news-evening-analysis.lock.yml b/.github/workflows/news-evening-analysis.lock.yml index 04d4e4ce3..ed7f12219 100644 --- a/.github/workflows/news-evening-analysis.lock.yml +++ b/.github/workflows/news-evening-analysis.lock.yml @@ -304,7 +304,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' package-manager-cache: false - name: Create gh-aw temp directory run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh diff --git a/.github/workflows/news-evening-analysis.md b/.github/workflows/news-evening-analysis.md index 7fe446aaa..35bc3e7e9 100644 --- a/.github/workflows/news-evening-analysis.md +++ b/.github/workflows/news-evening-analysis.md @@ -93,7 +93,7 @@ steps: - name: Setup Node.js uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: - node-version: '24' + node-version: '25' - name: Install dependencies run: | diff --git a/.github/workflows/news-interpellations.lock.yml b/.github/workflows/news-interpellations.lock.yml index d1fa61f70..b86b4d0a5 100644 --- a/.github/workflows/news-interpellations.lock.yml +++ b/.github/workflows/news-interpellations.lock.yml @@ -296,7 +296,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' package-manager-cache: false - name: Create gh-aw temp directory run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh diff --git a/.github/workflows/news-interpellations.md b/.github/workflows/news-interpellations.md index e82507df3..a7411fc7f 100644 --- a/.github/workflows/news-interpellations.md +++ b/.github/workflows/news-interpellations.md @@ -82,7 +82,7 @@ steps: - name: Setup Node.js uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: - node-version: '24' + node-version: '25' - name: Install dependencies run: | diff --git a/.github/workflows/news-month-ahead.lock.yml b/.github/workflows/news-month-ahead.lock.yml index f119eef60..a26cca780 100644 --- a/.github/workflows/news-month-ahead.lock.yml +++ b/.github/workflows/news-month-ahead.lock.yml @@ -296,7 +296,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' package-manager-cache: false - name: Create gh-aw temp directory run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh diff --git a/.github/workflows/news-month-ahead.md b/.github/workflows/news-month-ahead.md index a8e557685..5c9c2f9e7 100644 --- a/.github/workflows/news-month-ahead.md +++ b/.github/workflows/news-month-ahead.md @@ -82,7 +82,7 @@ steps: - name: Setup Node.js uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: - node-version: '24' + node-version: '25' - name: Install dependencies run: | diff --git a/.github/workflows/news-monthly-review.lock.yml b/.github/workflows/news-monthly-review.lock.yml index bf3d0c9c7..6fcefd7dd 100644 --- a/.github/workflows/news-monthly-review.lock.yml +++ b/.github/workflows/news-monthly-review.lock.yml @@ -296,7 +296,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' package-manager-cache: false - name: Create gh-aw temp directory run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh diff --git a/.github/workflows/news-monthly-review.md b/.github/workflows/news-monthly-review.md index 00e88270b..e15578e9d 100644 --- a/.github/workflows/news-monthly-review.md +++ b/.github/workflows/news-monthly-review.md @@ -82,7 +82,7 @@ steps: - name: Setup Node.js uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: - node-version: '24' + node-version: '25' - name: Install dependencies run: | diff --git a/.github/workflows/news-motions.lock.yml b/.github/workflows/news-motions.lock.yml index 90629b1bc..c51c324fe 100644 --- a/.github/workflows/news-motions.lock.yml +++ b/.github/workflows/news-motions.lock.yml @@ -296,7 +296,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' package-manager-cache: false - name: Create gh-aw temp directory run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh diff --git a/.github/workflows/news-motions.md b/.github/workflows/news-motions.md index de5a96b24..c0977452f 100644 --- a/.github/workflows/news-motions.md +++ b/.github/workflows/news-motions.md @@ -82,7 +82,7 @@ steps: - name: Setup Node.js uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: - node-version: '24' + node-version: '25' - name: Install dependencies run: | diff --git a/.github/workflows/news-propositions.lock.yml b/.github/workflows/news-propositions.lock.yml index e3d637f3c..9bfd224f7 100644 --- a/.github/workflows/news-propositions.lock.yml +++ b/.github/workflows/news-propositions.lock.yml @@ -296,7 +296,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' package-manager-cache: false - name: Create gh-aw temp directory run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh diff --git a/.github/workflows/news-propositions.md b/.github/workflows/news-propositions.md index 4231bbaaf..b625aea3f 100644 --- a/.github/workflows/news-propositions.md +++ b/.github/workflows/news-propositions.md @@ -82,7 +82,7 @@ steps: - name: Setup Node.js uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: - node-version: '24' + node-version: '25' - name: Install dependencies run: | diff --git a/.github/workflows/news-realtime-monitor.lock.yml b/.github/workflows/news-realtime-monitor.lock.yml index 2469e2c3c..602408383 100644 --- a/.github/workflows/news-realtime-monitor.lock.yml +++ b/.github/workflows/news-realtime-monitor.lock.yml @@ -305,7 +305,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' package-manager-cache: false - name: Create gh-aw temp directory run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh diff --git a/.github/workflows/news-realtime-monitor.md b/.github/workflows/news-realtime-monitor.md index cae7ec697..0e91366c8 100644 --- a/.github/workflows/news-realtime-monitor.md +++ b/.github/workflows/news-realtime-monitor.md @@ -96,7 +96,7 @@ steps: - name: Setup Node.js uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: - node-version: '24' + node-version: '25' - name: Install dependencies run: | diff --git a/.github/workflows/news-translate.lock.yml b/.github/workflows/news-translate.lock.yml index 307faadf9..ab1638bf3 100644 --- a/.github/workflows/news-translate.lock.yml +++ b/.github/workflows/news-translate.lock.yml @@ -312,7 +312,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' package-manager-cache: false - name: Create gh-aw temp directory run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh diff --git a/.github/workflows/news-translate.md b/.github/workflows/news-translate.md index 0f1f7a9fb..3c198389d 100644 --- a/.github/workflows/news-translate.md +++ b/.github/workflows/news-translate.md @@ -94,7 +94,7 @@ steps: - name: Setup Node.js uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: - node-version: '24' + node-version: '25' - name: Install dependencies run: | diff --git a/.github/workflows/news-week-ahead.lock.yml b/.github/workflows/news-week-ahead.lock.yml index 726813391..25cefffae 100644 --- a/.github/workflows/news-week-ahead.lock.yml +++ b/.github/workflows/news-week-ahead.lock.yml @@ -296,7 +296,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' package-manager-cache: false - name: Create gh-aw temp directory run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh diff --git a/.github/workflows/news-week-ahead.md b/.github/workflows/news-week-ahead.md index dccc4c9a5..0594e2b04 100644 --- a/.github/workflows/news-week-ahead.md +++ b/.github/workflows/news-week-ahead.md @@ -82,7 +82,7 @@ steps: - name: Setup Node.js uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: - node-version: '24' + node-version: '25' - name: Install dependencies run: | diff --git a/.github/workflows/news-weekly-review.lock.yml b/.github/workflows/news-weekly-review.lock.yml index 69bbb1b24..d2015429f 100644 --- a/.github/workflows/news-weekly-review.lock.yml +++ b/.github/workflows/news-weekly-review.lock.yml @@ -296,7 +296,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' package-manager-cache: false - name: Create gh-aw temp directory run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh diff --git a/.github/workflows/news-weekly-review.md b/.github/workflows/news-weekly-review.md index 10076f5d8..bc0da10a3 100644 --- a/.github/workflows/news-weekly-review.md +++ b/.github/workflows/news-weekly-review.md @@ -82,7 +82,7 @@ steps: - name: Setup Node.js uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: - node-version: '24' + node-version: '25' - name: Install dependencies run: | diff --git a/.github/workflows/quality-checks.yml b/.github/workflows/quality-checks.yml index c50799d36..7f124c471 100644 --- a/.github/workflows/quality-checks.yml +++ b/.github/workflows/quality-checks.yml @@ -31,7 +31,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install dependencies @@ -83,7 +83,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' - name: Cache npm global packages uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 @@ -158,7 +158,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' - name: Cache npm packages uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8869a8bc5..3a34d0f85 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -100,7 +100,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: "24" + node-version: "25" cache: "npm" - name: Cache dependencies @@ -389,7 +389,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: "24" + node-version: "25" cache: "npm" - name: Cache dependencies diff --git a/.github/workflows/sync-cia-schemas.yml b/.github/workflows/sync-cia-schemas.yml index b7b5e49e5..70a7bf9fb 100644 --- a/.github/workflows/sync-cia-schemas.yml +++ b/.github/workflows/sync-cia-schemas.yml @@ -32,7 +32,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install dependencies diff --git a/.github/workflows/test-dashboard.yml b/.github/workflows/test-dashboard.yml index 206f138c4..2a9db1f54 100644 --- a/.github/workflows/test-dashboard.yml +++ b/.github/workflows/test-dashboard.yml @@ -45,7 +45,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install dependencies @@ -86,7 +86,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install dependencies diff --git a/.github/workflows/test-homepage.yml b/.github/workflows/test-homepage.yml index b6f7c3a59..7bb800c7c 100644 --- a/.github/workflows/test-homepage.yml +++ b/.github/workflows/test-homepage.yml @@ -45,7 +45,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install dependencies @@ -85,7 +85,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install dependencies diff --git a/.github/workflows/test-news.yml b/.github/workflows/test-news.yml index 1acc78171..12e3333e6 100644 --- a/.github/workflows/test-news.yml +++ b/.github/workflows/test-news.yml @@ -45,7 +45,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install dependencies @@ -86,7 +86,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install dependencies diff --git a/.github/workflows/translation-validation.yml b/.github/workflows/translation-validation.yml index c86a460df..59980c7e4 100644 --- a/.github/workflows/translation-validation.yml +++ b/.github/workflows/translation-validation.yml @@ -37,7 +37,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Validate all translation files diff --git a/.github/workflows/update-cia-stats.yml b/.github/workflows/update-cia-stats.yml index bb77f36f2..10efa3360 100644 --- a/.github/workflows/update-cia-stats.yml +++ b/.github/workflows/update-cia-stats.yml @@ -44,7 +44,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install dependencies diff --git a/.github/workflows/validate-cia-data.yml b/.github/workflows/validate-cia-data.yml index 43b92dd45..d777aa3c0 100644 --- a/.github/workflows/validate-cia-data.yml +++ b/.github/workflows/validate-cia-data.yml @@ -42,7 +42,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: - node-version: '24' + node-version: '25' cache: 'npm' - name: Install dependencies diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..7273c0fa8 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +25 diff --git a/End-of-Life-Strategy.md b/End-of-Life-Strategy.md index 968c05df5..1af2f17ac 100644 --- a/End-of-Life-Strategy.md +++ b/End-of-Life-Strategy.md @@ -6,24 +6,26 @@

๐Ÿ”„ Technology Lifecycle Management for Static Intelligence Platform
- ๐Ÿ“ฆ Node.js 24 LTS Maintenance โ€ข ๐Ÿ”„ Vite/Vitest Ecosystem โ€ข โšก Future-Ready Architecture + ๐Ÿ“ฆ Node.js 25 Current โ€ข โญ๏ธ Node.js 26 LTS Upgrade Imminent โ€ข โšก Future-Ready Architecture

Owner Version - Effective Date + Effective Date Review Cycle

-**๐Ÿ“‹ Document Owner:** CEO | **๐Ÿ“„ Version:** 1.0 | **๐Ÿ“… Last Updated:** 2026-03-12 (UTC) -**๐Ÿ”„ Review Cycle:** Annual | **โฐ Next Review:** 2027-03-12 +**๐Ÿ“‹ Document Owner:** CEO | **๐Ÿ“„ Version:** 1.1 | **๐Ÿ“… Last Updated:** 2026-03-18 (UTC) +**๐Ÿ”„ Review Cycle:** Annual | **โฐ Next Review:** 2027-03-18 --- ## Overview -**Riksdagsmonitor** is a static HTML5/CSS3 website deployed to AWS CloudFront + S3 (primary) and GitHub Pages (disaster recovery), built with **Vite**, tested with **Vitest** and **Cypress**, and powered by **Node.js 24 LTS**. The platform provides Swedish Parliament transparency through interactive **Chart.js** and **D3.js** visualisations across **14 languages**. +**Riksdagsmonitor** is a static HTML5/CSS3 website deployed to AWS CloudFront + S3 (primary) and GitHub Pages (disaster recovery), built with **Vite**, tested with **Vitest** and **Cypress**, and powered by **Node.js 25 Current**. The platform provides Swedish Parliament transparency through interactive **Chart.js** and **D3.js** visualisations across **14 languages**. + +> **โšก Upgrade Notice (March 2026):** Riksdagsmonitor has been upgraded to Node.js 25 (Current) as a stepping stone in preparation for the imminent **Node.js 26 LTS release (~April 1, 2026)**. Node.js 26 will be adopted immediately upon its release to stay on the supported LTS track. See the [Node.js Migration Roadmap](#๏ธ-nodejs-migration-roadmap) for the full plan. This document defines the technology lifecycle management strategy โ€” covering the current stack, Node.js release schedule evolution, dependency EOL timelines, and migration plans โ€” to ensure stability, compatibility, and security throughout the project's operational life. @@ -36,7 +38,7 @@ This strategy should be read alongside the [Business Continuity Plan](BCPPlan.md **Primary Goal**: Maintain Riksdagsmonitor on a supported, secure technology stack by proactively tracking dependency lifecycles and planning migrations before components reach end-of-life. **Key Principles**: -- Upgrade to new Node.js LTS versions within **6 months** of release +- Upgrade to new Node.js Current versions promptly; adopt LTS within **4 weeks** of promotion - Keep build tooling (Vite, Vitest, TypeScript) on latest stable versions - Maintain zero known critical/high vulnerabilities via automated scanning - Plan major migrations **12 months** before dependency EOL dates @@ -109,7 +111,7 @@ This allows early detection of breaking changes in Node.js alpha while keeping p | Category | Technology | Current Version | EOL Date | Replacement Path | |----------|-----------|----------------|----------|-----------------| -| **Runtime** | [Node.js 24 LTS](https://nodejs.org/) | 24.14.0 | **October 2026** (end of Active LTS) / **April 2028** (Maintenance EOL) | Node.js 26 LTS โ†’ Node.js 27 LTS | +| **Runtime** | [Node.js 25 Current](https://nodejs.org/) | 25.x | **April 2026** (EOL when Node.js 26 releases) | Node.js 26 LTS (**imminent**, ~April 2026) โ†’ Node.js 27 LTS | | **Package Manager** | [npm](https://www.npmjs.com/) | Bundled with Node.js | Follows Node.js | Follows Node.js upgrades | | **Language** | [TypeScript](https://www.typescriptlang.org/) | 5.9.3 | Active (monthly releases) | Track latest stable | | **Build Tool** | [Vite](https://vite.dev/) | 7.3.1 | Active | Track latest major | @@ -149,27 +151,45 @@ This allows early detection of breaking changes in Node.js alpha while keeping p ## ๐Ÿ—“๏ธ Node.js Migration Roadmap -### Current: Node.js 24 LTS (Active) +### โœ… Completed: Node.js 24 LTS -| Milestone | Date | Action | +| Milestone | Date | Status | |-----------|------|--------| | Node.js 24 Current Release | April 2025 | โœ… Adopted | | Node.js 24 LTS Promotion | October 2025 | โœ… Production deployment | -| Node.js 24 Active LTS End | **October 2026** | Begin migration to Node.js 26 LTS | -| Node.js 24 Maintenance End | **April 2028** | Must be off Node.js 24 | +| Node.js 24 โ†’ 25 Migration | March 2026 | โœ… **Completed** (this release) | + +### ๐ŸŸก Current: Node.js 25 Current (Interim) + +Node.js 25 is an **odd-numbered Current release** under the old model โ€” it will not receive LTS status. It serves as an interim upgrade to test Node.js 25 features and prepare for the imminent Node.js 26 LTS. + +| Milestone | Date | Action | +|-----------|------|--------| +| Node.js 25 Current Release | October 2025 | โœ… Available | +| Riksdagsmonitor upgrade to 25 | **March 2026** | โœ… **Completed** | +| Node.js 25 EOL | **~April 2026** | Node.js 26 releases โ†’ 25 reaches EOL | -### Next: Node.js 26 LTS (Old Schedule) +> โš ๏ธ **Node.js 25 is short-lived.** Riksdagsmonitor will be on Node.js 25 for only ~2 weeks before upgrading to Node.js 26 LTS upon its release. -Node.js 26 is the **last release under the old two-per-year schedule**. +### ๐Ÿ”œ Imminent: Node.js 26 LTS (Action: Upgrade in ~2 weeks) + +Node.js 26 is the **last release under the old two-per-year schedule** and will become LTS in October 2026. We plan to upgrade **immediately after Node.js 26 is released**. | Milestone | Date | Action | |-----------|------|--------| -| Node.js 26 Current Release | April 2026 | Evaluate in CI | -| Node.js 26 LTS Promotion | October 2026 | Plan migration | -| Migration Window | Oct 2026 โ€“ Mar 2027 | Upgrade riksdagsmonitor to Node.js 26 | +| Node.js 26 Current Release | **~April 1, 2026** | ๐Ÿš€ **Upgrade riksdagsmonitor immediately after release** | +| Node.js 26 LTS Promotion | October 2026 | โœ… Already on Node.js 26 | | Node.js 26 Active LTS End | **October 2027** | Begin evaluating Node.js 27 | | Node.js 26 Maintenance End | **April 2029** | Must be off Node.js 26 | +**Upgrade preparation checklist (for Node.js 26):** +- [ ] Monitor [Node.js 26 release notes](https://nodejs.org/en/blog/) for breaking changes +- [ ] Test `npm ci` and build/test suite on Node.js 26 RC in CI matrix +- [ ] Update all `node-version: '25'` โ†’ `'26'` across workflows +- [ ] Update `package.json` `engines.node` from `>=25` to `>=26` +- [ ] Update `.nvmrc` from `25` to `26` +- [ ] Update documentation (End-of-Life-Strategy.md, WORKFLOWS.md, FUTURE_WORKFLOWS.md) + ### Future: Node.js 27 LTS (New Schedule) Node.js 27 is the **first release under the new one-per-year schedule** where every release becomes LTS. @@ -182,6 +202,16 @@ Node.js 27 is the **first release under the new one-per-year schedule** where ev | Migration Window | Oct 2027 โ€“ Mar 2028 | Upgrade riksdagsmonitor to Node.js 27 | | Node.js 27 EOL | ~April 2030 | Plan next migration | +### Future: Node.js 28 LTS (New Schedule) + +| Milestone | Date | Action | +|-----------|------|--------| +| Node.js 28 Alpha Phase | October 2027 โ€“ March 2028 | Add alpha to CI matrix | +| Node.js 28 Current Release | April 2028 | Evaluate compatibility | +| Node.js 28 LTS Promotion | October 2028 | Plan migration from Node.js 27 | +| Migration Window | Oct 2028 โ€“ Mar 2029 | Upgrade riksdagsmonitor to Node.js 28 | +| Node.js 28 EOL | ~April 2031 | Plan next migration | + ### Long-Term Node.js Upgrade Calendar ```mermaid @@ -190,25 +220,31 @@ gantt dateFormat YYYY-MM axisFormat %Y-%m - section Node.js 24 (old model) - Active LTS :active, n24lts, 2025-10, 2026-10 - Maintenance :n24maint, 2026-10, 2028-04 - Migration Off 24 :crit, m24, 2026-10, 2027-03 + section Node.js 24 (completed) + Active LTS :done, n24lts, 2025-10, 2026-03 + Migration Off 24 :done, m24, 2026-03, 2026-03 + + section Node.js 25 (interim โ€” Current only) + Current (interim) :active, n25curr, 2025-10, 2026-04 + Riksdagsmonitor on 25:crit, rm25, 2026-03, 2026-04 - section Node.js 26 (last old-model) - Current :n26curr, 2026-04, 2026-10 - Active LTS :n26lts, 2026-10, 2027-10 - Maintenance :n26maint, 2027-10, 2029-04 + section Node.js 26 (last old-model โ€” LTS) + Current :n26curr, 2026-04, 2026-10 + Active LTS :n26lts, 2026-10, 2027-10 + Maintenance :n26maint, 2027-10, 2029-04 + Riksdagsmonitor on 26:active, rm26, 2026-04, 2027-10 section Node.js 27 (new model โ€” first annual LTS) Alpha (27.0.0-alpha.x):n27alpha, 2026-10, 2027-04 Current :n27curr, 2027-04, 2027-10 LTS :n27lts, 2027-10, 2030-04 + Riksdagsmonitor on 27 :rm27, 2027-10, 2030-04 section Node.js 28 (new model) Alpha (28.0.0-alpha.x):n28alpha, 2027-10, 2028-04 Current :n28curr, 2028-04, 2028-10 LTS :n28lts, 2028-10, 2031-04 + Riksdagsmonitor on 28 :rm28, 2028-10, 2031-04 ``` --- @@ -252,7 +288,7 @@ Riksdagsmonitor outputs **static HTML5, CSS3, and ES2020+ JavaScript**. Browser | GitHub Actions runners | `ubuntu-latest` | Auto-updated by GitHub | | Action versions | SHA-pinned | Update via Dependabot | | step-security/harden-runner | SHA-pinned | Update via Dependabot | -| Node.js in CI | `node-version: '24'` | Update with LTS migrations | +| Node.js in CI | `node-version: '25'` | Update with each Node.js migration | --- @@ -262,7 +298,8 @@ Riksdagsmonitor outputs **static HTML5, CSS3, and ES2020+ JavaScript**. Browser | Risk | Likelihood | Impact | Mitigation | |------|-----------|--------|------------| -| Node.js 24 reaches EOL before migration | Low | High | Migration planned 12+ months before Maintenance EOL (April 2028) | +| Node.js 25 reaches EOL before Node.js 26 upgrade | **Very Low** | Medium | Node.js 26 upgrade planned immediately (~2 weeks); automated process ready | +| Node.js 26 breaking changes | Low | Medium | Test on Node.js 26 RC in CI matrix before it releases | | Vite major breaking changes | Medium | Medium | Pin to major version, test upgrades in branch | | Chart.js/D3.js API deprecation | Low | Medium | Abstraction layer isolates visualisation logic | | Cypress major breaking changes | Medium | Low | E2E tests are supplementary; can temporarily skip | @@ -273,7 +310,8 @@ Riksdagsmonitor outputs **static HTML5, CSS3, and ES2020+ JavaScript**. Browser | Migration | Complexity | Estimated Effort | Risk Level | |-----------|-----------|-----------------|------------| -| Node.js 24 โ†’ 26 | Low | 1โ€“2 days | ๐ŸŸข Low | +| Node.js 24 โ†’ 25 | Very Low | < 1 day | ๐ŸŸข Very Low | +| Node.js 25 โ†’ 26 (**imminent**) | Very Low | < 1 day | ๐ŸŸข Very Low | | Node.js 26 โ†’ 27 (new schedule) | Low | 1โ€“2 days | ๐ŸŸข Low | | Vite 7 โ†’ next major | Medium | 2โ€“5 days | ๐ŸŸก Medium | | TypeScript 5 โ†’ 6 | Lowโ€“Medium | 1โ€“3 days | ๐ŸŸข Low | @@ -355,6 +393,6 @@ The ongoing maintenance strategy aligns with Hack23 AB's [ISMS-PUBLIC framework] **โœ… Approved by:** James Pether Sรถrling, CEO **๐Ÿ“ค Distribution:** Public **๐Ÿท๏ธ Classification:** [![Confidentiality: Public](https://img.shields.io/badge/C-Public-lightgrey?style=flat-square&logo=shield&logoColor=black)](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md#confidentiality-levels) [![Integrity: Moderate](https://img.shields.io/badge/I-Moderate-yellow?style=flat-square&logo=check-circle&logoColor=black)](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md#integrity-levels) [![Availability: Standard](https://img.shields.io/badge/A-Standard-lightgreen?style=flat-square&logo=server&logoColor=white)](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md#availability-levels) -**๐Ÿ“… Effective Date:** 2026-03-12 -**โฐ Next Review:** 2027-03-12 +**๐Ÿ“… Effective Date:** 2026-03-18 +**โฐ Next Review:** 2027-03-18 **๐ŸŽฏ Framework Compliance:** [![ISO 27001](https://img.shields.io/badge/ISO_27001-2022_Aligned-blue?style=flat-square&logo=iso&logoColor=white)](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md) [![NIST CSF 2.0](https://img.shields.io/badge/NIST_CSF-2.0_Aligned-green?style=flat-square&logo=nist&logoColor=white)](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md) [![CIS Controls](https://img.shields.io/badge/CIS_Controls-v8.1_Aligned-orange?style=flat-square&logo=cisecurity&logoColor=white)](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md) diff --git a/FUTURE_ARCHITECTURE.md b/FUTURE_ARCHITECTURE.md index 334643580..63ebfdca8 100644 --- a/FUTURE_ARCHITECTURE.md +++ b/FUTURE_ARCHITECTURE.md @@ -604,7 +604,7 @@ Amplify Hosting (SSR) โ†’ CloudFront **Compute:** | Current | Future | Rationale | |---------|--------|-----------| -| Static HTML | AWS Lambda (Python 3.12, Node.js 24) | Serverless functions, pay-per-request | +| Static HTML | AWS Lambda (Python 3.12, Node.js 25) | Serverless functions, pay-per-request | | N/A | AWS Amplify Hosting | Server-side rendering (SSR), edge functions | **API:** diff --git a/FUTURE_WORKFLOWS.md b/FUTURE_WORKFLOWS.md index e4b1ebefa..0f326407b 100644 --- a/FUTURE_WORKFLOWS.md +++ b/FUTURE_WORKFLOWS.md @@ -1,7 +1,7 @@ # ๐Ÿ”ฎ Riksdagsmonitor โ€” Future Workflows Vision -**Document Version:** 2.1 -**Last Updated:** 2026-03-10 +**Document Version:** 2.2 +**Last Updated:** 2026-03-18 **Classification:** Public **Owner:** Hack23 AB (Org.nr 5595347807) **Horizon:** 2026โ€“2037 @@ -602,10 +602,11 @@ architecture: | Year | Node.js | TypeScript | Bundler | Test Runner | |------|---------|------------|---------|-------------| -| 2026 | 24 | 5.9 | Vite 7 | Vitest 4 | -| 2027 | 26 | 6.x | Vite 8 | Vitest 5 | -| 2028 | 28 | 7.x | Vite 9 / Turbopack | Vitest 6 | -| 2029 | 30 | 8.x | Next-gen bundler | Native test runner | +| 2026 Q1 | 25 (Current) | 5.9 | Vite 7 | Vitest 4 | +| 2026 Q2 | **26 LTS** (upgrade ~Apr 1) | 5.9 | Vite 7 | Vitest 4 | +| 2027 | 27 LTS (new model) | 6.x | Vite 8 | Vitest 5 | +| 2028 | 28 LTS (new model) | 7.x | Vite 9 / Turbopack | Vitest 6 | +| 2029 | 29 LTS (new model) | 8.x | Next-gen bundler | Native test runner | ### AI & ML @@ -667,11 +668,12 @@ gantt | Year | Projected Total | New Capabilities | |------|----------------|------------------| -| 2026 Q1 | **43** | TypeScript foundation, 10 agentic workflows โœ… | +| 2026 Q1 | **43** | TypeScript foundation, 10 agentic workflows, Node.js 25 โœ… | +| 2026 Q2 | **44** | **Node.js 26 LTS upgrade** (immediately after ~Apr 1 release) | | 2026 Q4 | **50** | CIA pipeline v2, preview deploys, visual regression | -| 2027 Q4 | **55** | OSINT pipeline, ML predictions, real-time streams | -| 2028 Q4 | **65** | Self-healing, canary deploy, AI editorial board | -| 2029 Q4 | **75+** | Intelligence API, multi-parliament, federation | +| 2027 Q4 | **55** | Node.js 27 LTS, OSINT pipeline, ML predictions, real-time streams | +| 2028 Q4 | **65** | Node.js 28 LTS, self-healing, canary deploy, AI editorial board | +| 2029 Q4 | **75+** | Node.js 29 LTS, intelligence API, multi-parliament, federation | --- @@ -827,7 +829,7 @@ gantt --- -**Document Version:** 2.1 -**Last Updated:** 2026-03-10 +**Document Version:** 2.2 +**Last Updated:** 2026-03-18 **Classification:** Public **Owner:** Hack23 AB diff --git a/README.md b/README.md index 549657d56..01a460baa 100644 --- a/README.md +++ b/README.md @@ -323,7 +323,7 @@ Riksdagsmonitor integrates multiple authoritative Swedish open data sources: - **Hosting:** GitHub Pages with CloudFront CDN - **CI/CD:** GitHub Actions for automated testing and deployment - **Data Platform:** CIA OSINT platform (Java/Spring Boot backend) -- **Runtime:** Node.js 24.x +- **Runtime:** Node.js 25.x ### JavaScript Architecture - **8 Dashboard Modules:** @@ -401,7 +401,7 @@ At Hack23 AB, we believe that true security comes through transparency and demon ## ๐Ÿš€ Development ### Prerequisites -- **Node.js**: 24.x or higher +- **Node.js**: 25.x or higher - **npm**: 10.x or higher (comes with Node.js) - Git with GPG signing configured - GitHub account with MFA enabled diff --git a/TESTING.md b/TESTING.md index 3d496eca6..5b6cf517a 100644 --- a/TESTING.md +++ b/TESTING.md @@ -372,7 +372,7 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: - node-version: '24' + node-version: '25' - run: npm ci - run: npm test - run: npm run test:coverage @@ -394,7 +394,7 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: - node-version: '24' + node-version: '25' - run: npm ci - run: npm run build - run: npm run cypress:run diff --git a/WORKFLOWS.md b/WORKFLOWS.md index de73ab642..c61f2cbea 100644 --- a/WORKFLOWS.md +++ b/WORKFLOWS.md @@ -17,7 +17,7 @@ [![Test Coverage](https://img.shields.io/badge/Coverage-Reports-green?logo=vitest)](https://riksdagsmonitor.com/docs/coverage/) **Document Version:** 6.0 -**Last Updated:** 2026-03-10 +**Last Updated:** 2026-03-18 **Classification:** Public **Owner:** Hack23 AB (Org.nr 5595347807) @@ -25,7 +25,7 @@ This document describes the Continuous Integration and Continuous Deployment (CI/CD) workflows for Riksdagsmonitor. All workflows are implemented using GitHub Actions and follow Hack23 AB's [Secure Development Policy](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Secure_Development_Policy.md). -The project has been migrated from JavaScript to **TypeScript** (31 modules in `src/browser/`) with all workflows updated accordingly. TypeScript compilation is handled by Vite (esbuild) for browser bundles and Node 24's native type-stripping for scripts. +The project has been migrated from JavaScript to **TypeScript** (31 modules in `src/browser/`) with all workflows updated accordingly. TypeScript compilation is handled by Vite (esbuild) for browser bundles and Node 25's native type-stripping for scripts. **Total Workflows: 43** (23 standard YAML + 10 agentic markdown sources + 10 compiled lock files) **Security Compliance: 100%** (all actions SHA-pinned, harden-runner enabled) @@ -35,7 +35,7 @@ The project has been migrated from JavaScript to **TypeScript** (31 modules in ` | Component | Version | Purpose | |-----------|---------|---------| -| Node.js | 24 | Runtime (native TypeScript strip-types) | +| Node.js | 25 | Runtime (native TypeScript strip-types) | | TypeScript | 5.9.3 | Type system | | Vite | 7.3.1 | Build toolchain (esbuild) | | Vitest | 4.0.18 | Unit testing (2890 tests) | @@ -189,7 +189,7 @@ graph TD ```yaml steps: - Checkout - - Setup Node.js 24 + - Setup Node.js 25 - Install dependencies (npm ci) - Run ESLint: npx eslint . - Artifact upload: eslint-results @@ -238,7 +238,7 @@ Generates a consolidated step summary with pass/fail status for all jobs. ```yaml steps: - Checkout - - Setup Node.js 24 + - Setup Node.js 25 - Install dependencies - TypeScript type-check (browser): npx tsc --project tsconfig.browser.json --noEmit - TypeScript type-check (scripts): npx tsc --project tsconfig.scripts.json --noEmit @@ -278,7 +278,7 @@ steps: ```yaml steps: - - Checkout, Setup Node.js 24, Install deps + - Checkout, Setup Node.js 25, Install deps - Generate TypeDoc: npx typedoc - Validate documentation coverage - Check generated TypeDoc files exist @@ -340,7 +340,7 @@ steps: ```yaml steps: - Checkout - - Setup Node.js 24 + - Setup Node.js 25 - Install dependencies: npm ci - Build: npm run build # โ† Critical: Vite build before deploy - Configure AWS credentials @@ -366,13 +366,13 @@ steps: ```yaml steps: - - Checkout, Setup Node.js 24, Install deps - - Fetch: node scripts/load-cia-stats.ts # Node 24 native TS - - Update: node scripts/update-stats-from-cia.ts # Node 24 native TS + - Checkout, Setup Node.js 25, Install deps + - Fetch: node scripts/load-cia-stats.ts # Node 25 native TS + - Update: node scripts/update-stats-from-cia.ts # Node 25 native TS - Commit and push changes (if any) ``` -**Note:** Uses Node 24's native TypeScript type-stripping (`process.features.typescript === "strip"`). No `--experimental-strip-types` flag needed โ€” `.ts` files run directly with `node`. +**Note:** Uses Node 25's native TypeScript type-stripping (`process.features.typescript === "strip"`). No `--experimental-strip-types` flag needed โ€” `.ts` files run directly with `node`. #### 7.2 Data Pipeline (`data-pipeline.yml`) @@ -481,7 +481,7 @@ Compiles `.md` workflow sources to `.lock.yml` using `gh aw compile`. Creates Gi steps: - Checkout - Setup Web Test Environment (Chrome + Xvfb) - - Setup Node.js 24 + - Setup Node.js 25 - Install MCP server packages globally - Install Playwright browsers - Verify all MCP server installations @@ -606,7 +606,7 @@ The following table summarizes how each workflow interacts with TypeScript: | `codeql.yml` | Scans TS for vulnerabilities | `javascript-typescript` matrix | | `release.yml` | Builds TS โ†’ JS bundles | Vite/esbuild | | `deploy-s3.yml` | Builds then deploys bundles | `npm run build` โ†’ S3 sync | -| `update-cia-stats.yml` | Runs `.ts` scripts directly | Node 24 native TS strip | +| `update-cia-stats.yml` | Runs `.ts` scripts directly | Node 25 native TS strip | | `vitest.config.js` | Coverage includes TS source | `src/browser/**/*.ts` in includes | | `test-dashboard.yml` | Triggers on TS changes | `src/browser/**` in path filter | | `test-homepage.yml` | Triggers on TS changes | `src/browser/**` in path filter | @@ -620,7 +620,7 @@ The following table summarizes how each workflow interacts with TypeScript: schedule: - cron: '0 2 * * *' # Update CIA stats daily at 03:00 CET steps: - - node scripts/load-cia-stats.ts # Node 24 native TS + - node scripts/load-cia-stats.ts # Node 25 native TS - node scripts/update-stats-from-cia.ts - git commit + push (if changed) ``` @@ -719,8 +719,8 @@ paths: - 'tsconfig*.json' ``` -#### Issue: Node 24 cannot run .ts scripts -**Solution:** Node 24 has native TypeScript type-stripping. Verify: +#### Issue: Node version cannot run .ts scripts +**Solution:** Node.js 25 has native TypeScript type-stripping. Verify: ```bash node -e "console.log(process.features.typescript)" # Should print "strip" ``` @@ -829,6 +829,6 @@ git commit -m "chore: recompile agentic workflow lock files" --- **Document Version:** 6.0 -**Last Updated:** 2026-03-10 +**Last Updated:** 2026-03-18 **Classification:** Public **Owner:** Hack23 AB diff --git a/package-lock.json b/package-lock.json index 6e7ba4fe0..c3aa88861 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,7 @@ "worldbank-mcp": "1.0.1" }, "engines": { - "node": ">=24" + "node": ">=25" }, "optionalDependencies": { "cypress": "^15.12.0" diff --git a/package.json b/package.json index df5776c95..7437ebb1f 100644 --- a/package.json +++ b/package.json @@ -112,6 +112,6 @@ "glob": "^13.0.0" }, "engines": { - "node": ">=24" + "node": ">=25" } } From b7df8b0c8dab5a43057deebe16f72ba3a3393a1a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 09:42:51 +0000 Subject: [PATCH 3/4] =?UTF-8?q?docs:=20clarify=20Node.js=2026=20Current?= =?UTF-8?q?=E2=86=92LTS=20in-place=20strategy=20and=20expand=20upgrade=20c?= =?UTF-8?q?hecklist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: pethers <1726836+pethers@users.noreply.github.com> --- End-of-Life-Strategy.md | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/End-of-Life-Strategy.md b/End-of-Life-Strategy.md index 1af2f17ac..69a8b89cf 100644 --- a/End-of-Life-Strategy.md +++ b/End-of-Life-Strategy.md @@ -38,7 +38,7 @@ This strategy should be read alongside the [Business Continuity Plan](BCPPlan.md **Primary Goal**: Maintain Riksdagsmonitor on a supported, secure technology stack by proactively tracking dependency lifecycles and planning migrations before components reach end-of-life. **Key Principles**: -- Upgrade to new Node.js Current versions promptly; adopt LTS within **4 weeks** of promotion +- Upgrade to new Node.js Current versions promptly; LTS promotion happens in-place (no second migration needed) - Keep build tooling (Vite, Vitest, TypeScript) on latest stable versions - Maintain zero known critical/high vulnerabilities via automated scanning - Plan major migrations **12 months** before dependency EOL dates @@ -171,24 +171,29 @@ Node.js 25 is an **odd-numbered Current release** under the old model โ€” it wil > โš ๏ธ **Node.js 25 is short-lived.** Riksdagsmonitor will be on Node.js 25 for only ~2 weeks before upgrading to Node.js 26 LTS upon its release. -### ๐Ÿ”œ Imminent: Node.js 26 LTS (Action: Upgrade in ~2 weeks) +### ๐Ÿ”œ Imminent: Node.js 26 (Action: Upgrade in ~2 weeks) -Node.js 26 is the **last release under the old two-per-year schedule** and will become LTS in October 2026. We plan to upgrade **immediately after Node.js 26 is released**. +Node.js 26 is the **last release under the old two-per-year schedule**. It releases as "Current" in April 2026 and will be promoted to **LTS in October 2026** โ€” no additional migration will be needed at that point, as the project will already be on Node.js 26. + +> **Strategy**: Adopt Node.js 26 **immediately after its release** (~April 1, 2026). Since Node.js 26 will become LTS in October 2026, adopting it promptly as "Current" and staying on it satisfies the LTS principle โ€” the project will transition from Current to LTS **in-place** without another upgrade step. | Milestone | Date | Action | |-----------|------|--------| | Node.js 26 Current Release | **~April 1, 2026** | ๐Ÿš€ **Upgrade riksdagsmonitor immediately after release** | -| Node.js 26 LTS Promotion | October 2026 | โœ… Already on Node.js 26 | +| Node.js 26 LTS Promotion | October 2026 | โœ… No migration needed โ€” already on Node.js 26 (Current โ†’ LTS in-place) | | Node.js 26 Active LTS End | **October 2027** | Begin evaluating Node.js 27 | | Node.js 26 Maintenance End | **April 2029** | Must be off Node.js 26 | **Upgrade preparation checklist (for Node.js 26):** -- [ ] Monitor [Node.js 26 release notes](https://nodejs.org/en/blog/) for breaking changes -- [ ] Test `npm ci` and build/test suite on Node.js 26 RC in CI matrix -- [ ] Update all `node-version: '25'` โ†’ `'26'` across workflows +- [ ] Monitor [Node.js 26 release notes](https://nodejs.org/en/blog/) and test against Node.js 26 RC in CI matrix before stable release +- [ ] Validate TypeScript native type-stripping (`process.features.typescript === "strip"`) still works +- [ ] Confirm all 43+ workflows pass on Node.js 26 (blocking CI jobs) +- [ ] Verify GitHub Actions `ubuntu-latest` runners include Node.js 26 +- [ ] Update all `node-version: '25'` โ†’ `'26'` across all workflow YAML, lock, and markdown files - [ ] Update `package.json` `engines.node` from `>=25` to `>=26` - [ ] Update `.nvmrc` from `25` to `26` -- [ ] Update documentation (End-of-Life-Strategy.md, WORKFLOWS.md, FUTURE_WORKFLOWS.md) +- [ ] Update skills documentation (`./github/skills/**SKILL.md`) code examples +- [ ] Update documentation (End-of-Life-Strategy.md, WORKFLOWS.md, FUTURE_WORKFLOWS.md, README.md, TESTING.md) ### Future: Node.js 27 LTS (New Schedule) From 0b98d8d1fab735e4b39961324368364779e67309 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 10:11:08 +0000 Subject: [PATCH 4/4] chore: upgrade TypeScript target and lib from ES2022 to ES2024 in all tsconfigs Co-authored-by: pethers <1726836+pethers@users.noreply.github.com> --- scripts/article-template/registry.ts | 4 ++-- tsconfig.browser.json | 4 ++-- tsconfig.scripts.json | 4 ++-- tsconfig.typedoc.json | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts/article-template/registry.ts b/scripts/article-template/registry.ts index 4f3fd082a..c841c68cf 100644 --- a/scripts/article-template/registry.ts +++ b/scripts/article-template/registry.ts @@ -379,9 +379,9 @@ const REGISTRY: Readonly> = { * breaking-news layout rather than an error, ensuring graceful degradation * across all content generation pipelines. * - * Uses `Object.hasOwn()` (ES2022) for prototype-pollution safety. + * Uses `Object.hasOwn()` (ES2022+) for prototype-pollution safety. * This is compatible with the project's `tsconfig.scripts.json` target - * (`"target": "ES2022"`) and the Node โ‰ฅ24 runtime requirement (`engines.node`). + * (`"target": "ES2024"`) and the Node โ‰ฅ25 runtime requirement (`engines.node`). * * @param type - ArticleType identifier * @returns ArticleTemplate configuration object diff --git a/tsconfig.browser.json b/tsconfig.browser.json index d2eaba39a..2b3e9824a 100644 --- a/tsconfig.browser.json +++ b/tsconfig.browser.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "ES2022", + "target": "ES2024", "module": "ESNext", "moduleResolution": "bundler", "strict": true, @@ -14,7 +14,7 @@ "allowSyntheticDefaultImports": true, "forceConsistentCasingInFileNames": true, "skipLibCheck": true, - "lib": ["ES2022", "DOM", "DOM.Iterable"], + "lib": ["ES2024", "DOM", "DOM.Iterable"], "types": [] }, "include": [ diff --git a/tsconfig.scripts.json b/tsconfig.scripts.json index a7ea229b2..9509ac3f0 100644 --- a/tsconfig.scripts.json +++ b/tsconfig.scripts.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "ES2022", + "target": "ES2024", "module": "ESNext", "moduleResolution": "bundler", "strict": true, @@ -24,7 +24,7 @@ "@scripts/*": ["scripts/*"], "@types/*": ["scripts/types/*"] }, - "lib": ["ES2022"], + "lib": ["ES2024"], "types": ["node"], "isolatedModules": true, "resolveJsonModule": true, diff --git a/tsconfig.typedoc.json b/tsconfig.typedoc.json index 0e48bb604..6b59cfd27 100644 --- a/tsconfig.typedoc.json +++ b/tsconfig.typedoc.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "ES2022", + "target": "ES2024", "module": "ESNext", "moduleResolution": "bundler", "allowJs": true, @@ -12,7 +12,7 @@ "noEmit": true, "resolveJsonModule": true, "baseUrl": ".", - "lib": ["ES2022", "DOM", "DOM.Iterable"], + "lib": ["ES2024", "DOM", "DOM.Iterable"], "types": ["node"] }, "include": [