Quellcode durchsuchen

remove migrate-to-node24 spec

Yuki Takei vor 1 Monat
Ursprung
Commit
680da71402

+ 0 - 317
.kiro/specs/migrate-to-node24/design.md

@@ -1,317 +0,0 @@
-# Design Document
-
-## Overview
-
-**Purpose**: GROWI プロジェクトの Node.js ランタイムを v18/v20 から v24 に移行し、全環境(開発・CI・Docker)で一貫して v24 を使用する。
-
-**Users**: 開発者、デプロイ担当者、コントリビューターが影響を受ける。開発環境のセットアップ、Docker ビルド、CI パイプラインの全てが v24 ベースに統一される。
-
-**Impact**: package.json のエンジン制約、Docker ベースイメージ、CI ワークフローの Node.js バージョン指定、およびドキュメントのバージョン記載を変更する。アプリケーションコード自体には変更不要(コードベース分析で非推奨 API の使用なしを確認済み)。
-
-### Goals
-- Node.js v24 のみ対応に移行する
-- 全構成ファイル(package.json、Dockerfile、CI)のバージョン指定を v24 に統一する
-- 将来の v26 追加に備えて複数バージョン対応の仕組みを維持する
-- ドキュメントを最新のバージョン情報に更新する
-
-### Non-Goals
-- アプリケーションコードのリファクタリング(v24 非推奨 API の使用なしを確認済み)
-- Node.js v24 の新機能(Float16Array、URLPattern 等)の積極的な採用
-- pnpm バージョンのアップグレード(v10.4.1 は v24 互換)
-- TypeScript 設定の変更(ESNext ターゲットは v24 互換)
-- 依存パッケージの大規模アップグレード(互換性問題が発生した場合のみ対応)
-
-## Architecture
-
-> 詳細な調査結果は `research.md` を参照。
-
-### Existing Architecture Analysis
-
-GROWI の Node.js バージョン管理は以下の構成ファイルで制御されている:
-
-| 構成レイヤー | ファイル | 現在の設定 |
-|-------------|---------|-----------|
-| エンジン制約 | `package.json` (root) | `"node": "^18 \|\| ^20"` |
-| Docker ビルド | `apps/*/docker/Dockerfile` (3 ファイル) | `FROM node:20-slim` (ハードコード) |
-| CI テスト | `.github/workflows/ci-*.yml` (3 ファイル) | `node-version: [20.x]` |
-| CI 本番テスト | `.github/workflows/ci-app-prod.yml` | 個別ジョブ(node18, node20) |
-| CI 再利用ワークフロー | `.github/workflows/reusable-app-prod.yml` | `default: 22.x` |
-| リリース | `.github/workflows/release-subpackages.yml` | `node-version: '20'` |
-| ドキュメント | `README.md`, `README_JP.md` | `Node.js v18.x or v20.x` |
-
-**既存パターンの保持**:
-- `ci-app-prod.yml` の個別ジョブパターン(`test-prod-nodeXX`)を維持
-- `reusable-app-prod.yml` の `workflow_call` / `workflow_dispatch` の入力パラメータ構造を維持
-- Dockerfile のマルチステージビルド構造を維持
-
-### Architecture Pattern & Boundary Map
-
-```mermaid
-graph TB
-    subgraph Configuration
-        PKG[package.json engines]
-        README_EN[README.md]
-        README_JP[README_JP.md]
-    end
-
-    subgraph Docker
-        DF_APP[app Dockerfile]
-        DF_PDF[pdf-converter Dockerfile]
-        DF_SLACK[slackbot-proxy Dockerfile]
-    end
-
-    subgraph CI
-        CI_APP[ci-app.yml]
-        CI_PDF[ci-pdf-converter.yml]
-        CI_SLACK[ci-slackbot-proxy.yml]
-        CI_PROD[ci-app-prod.yml]
-        CI_REUSE[reusable-app-prod.yml]
-        CI_REL[release-subpackages.yml]
-    end
-
-    PKG -->|engines check| CI
-    CI_PROD -->|calls| CI_REUSE
-    DF_APP -->|ARG NODE_VERSION| Docker
-```
-
-**Architecture Integration**:
-- **Selected pattern**: 構成ファイル一括更新。v24 のみ対応に切り替え、将来の拡張性は機構レベルで維持
-- **Domain boundaries**: 構成変更は 3 レイヤー(package.json、Docker、CI)に分離されており、各レイヤーは独立して変更可能
-- **Existing patterns preserved**: CI の個別ジョブパターン、Docker のマルチステージビルド、pnpm の `ignoredBuiltDependencies` 設定
-- **New components**: なし(既存ファイルの値変更のみ)
-- **Steering compliance**: モノレポ構造の原則に従い、ルート `package.json` でエンジン制約を一元管理
-
-### Technology Stack
-
-| Layer | Choice / Version | Role in Feature | Notes |
-|-------|------------------|-----------------|-------|
-| Runtime | Node.js v24 LTS (Krypton) | アプリケーション実行環境 | 2028 年 4 月まで LTS サポート |
-| Container | node:24-slim (bookworm) | Docker ベースイメージ | Docker Hub で利用可能 |
-| Package Manager | pnpm 10.4.1 | 依存管理 | 変更なし、v24 互換 |
-| CI Runner | actions/setup-node@v4 | CI での Node.js セットアップ | v24.x をサポート |
-
-## Requirements Traceability
-
-| Requirement | Summary | Components | Interfaces | Flows |
-|-------------|---------|------------|------------|-------|
-| 1.1 | engines.node を `^24` に設定 | PackageJsonConfig | — | — |
-| 1.2 | v24 未満でのインストール拒否 | PackageJsonConfig | — | — |
-| 1.3 | ワークスペースの engines 統一 | PackageJsonConfig | — | — |
-| 2.1 | app Dockerfile を node:24-slim に | DockerConfig | — | DockerBuildFlow |
-| 2.2 | pdf-converter Dockerfile を node:24-slim に | DockerConfig | — | DockerBuildFlow |
-| 2.3 | slackbot-proxy Dockerfile を node:24-slim に | DockerConfig | — | DockerBuildFlow |
-| 2.4 | 全ステージで node:24-slim を使用 | DockerConfig | — | DockerBuildFlow |
-| 3.1 | ci-app.yml を 24.x に | CIConfig | — | — |
-| 3.2 | ci-pdf-converter.yml を 24.x に | CIConfig | — | — |
-| 3.3 | ci-slackbot-proxy.yml を 24.x に | CIConfig | — | — |
-| 3.4 | ci-app-prod.yml を v24 のみに | CIConfig | — | — |
-| 3.5 | reusable-app-prod.yml のデフォルトを 24.x に | CIConfig | — | — |
-| 3.6 | release-subpackages.yml を 24 に | CIConfig | — | — |
-| 4.1 | CI マトリクス構造の維持 | CIConfig | — | — |
-| 4.2 | engines の SemVer 範囲指定維持 | PackageJsonConfig | — | — |
-| 4.3 | Docker ARG によるバージョン外部指定 | DockerConfig | — | DockerBuildFlow |
-| 5.1 | README.md を v24.x に更新 | DocumentationConfig | — | — |
-| 5.2 | README_JP.md を v24.x に更新 | DocumentationConfig | — | — |
-| 5.3 | その他ドキュメントの更新 | DocumentationConfig | — | — |
-| 6.1 | pnpm install が v24 で成功 | CompatibilityVerification | — | VerificationFlow |
-| 6.2 | turbo run build が v24 で成功 | CompatibilityVerification | — | VerificationFlow |
-| 6.3 | テストスイートが v24 で合格 | CompatibilityVerification | — | VerificationFlow |
-| 6.4 | 非互換パッケージの解消 | CompatibilityVerification | — | — |
-| 7.1 | 非推奨 API を使用しない | CompatibilityVerification | — | — |
-| 7.2 | デフォルト動作変更への適合 | CompatibilityVerification | — | — |
-| 7.3 | deprecation warning の排除 | CompatibilityVerification | — | VerificationFlow |
-
-## Components and Interfaces
-
-| Component | Domain/Layer | Intent | Req Coverage | Key Dependencies | Contracts |
-|-----------|-------------|--------|--------------|------------------|-----------|
-| PackageJsonConfig | Configuration | engines.node の v24 制約設定 | 1.1, 1.2, 1.3, 4.2 | — | — |
-| DockerConfig | Infrastructure | 全 Dockerfile の v24 ベースイメージ化 + ARG パラメータ化 | 2.1-2.4, 4.3 | node:24-slim (P0) | — |
-| CIConfig | Infrastructure | 全 CI ワークフローの v24 対応 | 3.1-3.6, 4.1 | actions/setup-node@v4 (P0) | — |
-| DocumentationConfig | Documentation | README 等のバージョン記載更新 | 5.1-5.3 | — | — |
-| CompatibilityVerification | Validation | v24 環境での install/build/test 検証 | 6.1-6.4, 7.1-7.3 | Node.js v24 runtime (P0) | — |
-
-### Configuration Layer
-
-#### PackageJsonConfig
-
-| Field | Detail |
-|-------|--------|
-| Intent | ルート package.json の engines.node を v24 のみに変更 |
-| Requirements | 1.1, 1.2, 1.3, 4.2 |
-
-**Responsibilities & Constraints**
-- ルート `package.json` の `engines.node` フィールドを `"^24"` に設定
-- ワークスペース内の個別 `package.json` に `engines` フィールドが存在する場合は `"^24"` に統一
-- SemVer 範囲指定形式を維持し、将来 `"^24 || ^26"` への拡張を容易にする
-
-**Dependencies**
-- External: pnpm 10.4.1 — engines チェックの実行主体 (P0)
-
-**Implementation Notes**
-- 変更箇所: `package.json` line 120 の `"node": "^18 || ^20"` → `"node": "^24"`
-- ワークスペース内の `package.json` には独自の `engines` フィールドは存在しないことを確認済み(変更不要)
-- pnpm はデフォルトで `engine-strict=false` のため、`.npmrc` に `engine-strict=true` が設定されていない場合は警告のみ。厳密な制約にはこの設定が必要
-
-#### DockerConfig
-
-| Field | Detail |
-|-------|--------|
-| Intent | 全 Dockerfile のベースイメージを node:24-slim に変更し、ARG でバージョンをパラメータ化 |
-| Requirements | 2.1, 2.2, 2.3, 2.4, 4.3 |
-
-**Responsibilities & Constraints**
-- 3 つの Dockerfile(app, pdf-converter, slackbot-proxy)の全ステージで `node:24-slim` を使用
-- `ARG NODE_VERSION=24` を導入し、`FROM node:${NODE_VERSION}-slim` で参照
-- マルチステージビルドの全ステージで同一バージョンを使用
-- pnpm バージョン(10.4.1)のピン留めは変更しない
-
-**Dependencies**
-- External: Docker Hub node:24-slim — ベースイメージ (P0)
-- External: node-gyp — ネイティブモジュールビルド (P1)
-
-**Implementation Notes**
-- 各 Dockerfile の変更パターン:
-  ```dockerfile
-  # Before
-  FROM node:20-slim AS base
-
-  # After
-  ARG NODE_VERSION=24
-  FROM node:${NODE_VERSION}-slim AS base
-  ```
-- release ステージも同様に ARG を参照:
-  ```dockerfile
-  # Before
-  FROM node:20-slim
-
-  # After
-  ARG NODE_VERSION=24
-  FROM node:${NODE_VERSION}-slim
-  ```
-- 注意: Docker の `ARG` はステージをまたぐ場合、各 `FROM` の前に再宣言が必要。グローバル ARG として `FROM` 前に宣言し、各ステージ内で `ARG NODE_VERSION` で再参照する
-- 対象ファイル:
-  - `apps/app/docker/Dockerfile` (lines 9, 75)
-  - `apps/pdf-converter/docker/Dockerfile` (lines 9, 66)
-  - `apps/slackbot-proxy/docker/Dockerfile` (lines 6, 55)
-
-#### CIConfig
-
-| Field | Detail |
-|-------|--------|
-| Intent | 全 CI ワークフローの Node.js バージョンを v24 に更新し、マトリクス拡張性を維持 |
-| Requirements | 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 4.1 |
-
-**Responsibilities & Constraints**
-- 開発 CI(ci-app, ci-pdf-converter, ci-slackbot-proxy)のマトリクスを `[24.x]` に変更
-- 本番 CI(ci-app-prod.yml)の個別ジョブを v24 のみに変更(`test-prod-node24` に統合)
-- reusable ワークフローのデフォルト node-version を `24.x` に変更
-- リリースワークフローの node-version を `24` に変更
-- 個別ジョブパターンを維持し、将来 v26 追加時にジョブ追加で拡張可能にする
-
-**Dependencies**
-- External: actions/setup-node@v4 — Node.js v24 のセットアップ (P0)
-- External: GitHub Actions Ubuntu runner — Node.js v24 の実行環境 (P0)
-
-**Implementation Notes**
-- `ci-app.yml`, `ci-pdf-converter.yml`, `ci-slackbot-proxy.yml`:
-  - `node-version: [20.x]` → `node-version: [24.x]`(全マトリクス箇所)
-- `ci-app-prod.yml`:
-  - `test-prod-node18` と `test-prod-node20` の 2 ジョブを `test-prod-node24` の 1 ジョブに統合
-  - E2E テスト(skip-e2e-test)の制御は node20 ジョブのロジックを引き継ぐ
-- `reusable-app-prod.yml`:
-  - `workflow_dispatch.inputs.node-version.default` を `22.x` → `24.x` に変更
-- `release-subpackages.yml`:
-  - `node-version: '20'` → `node-version: '24'`
-
-#### DocumentationConfig
-
-| Field | Detail |
-|-------|--------|
-| Intent | Node.js バージョン記載のあるドキュメントを v24 に更新 |
-| Requirements | 5.1, 5.2, 5.3 |
-
-**Responsibilities & Constraints**
-- `README.md` と `README_JP.md` の Node.js バージョン記載を `v24.x` に更新
-- その他のドキュメントに Node.js バージョン参照がある場合も同様に更新
-
-**Implementation Notes**
-- `README.md` line 84: `Node.js v18.x or v20.x` → `Node.js v24.x`
-- `README_JP.md` line 84: `Node.js v18.x or v20.x` → `Node.js v24.x`
-
-### Validation Layer
-
-#### CompatibilityVerification
-
-| Field | Detail |
-|-------|--------|
-| Intent | Node.js v24 環境での install/build/test の成功を検証 |
-| Requirements | 6.1, 6.2, 6.3, 6.4, 7.1, 7.2, 7.3 |
-
-**Responsibilities & Constraints**
-- Node.js v24 環境で `pnpm install --frozen-lockfile` が成功することを確認
-- `turbo run build` が全ワークスペースで成功することを確認
-- 既存テストスイートが全て合格することを確認
-- deprecation warning が出力されないことを確認
-- 非互換パッケージが発見された場合はアップデートまたは代替で解消
-
-**Dependencies**
-- External: Node.js v24 runtime — 実行環境 (P0)
-- Inbound: PackageJsonConfig — engines 制約による互換性チェック (P0)
-
-**Implementation Notes**
-- 検証コマンド(Node.js v24 環境で実行):
-  1. `pnpm install --frozen-lockfile`
-  2. `turbo run build --filter @growi/app`
-  3. `turbo run test --filter @growi/app`
-  4. `turbo run lint:typecheck --filter @growi/app`
-- コードベース分析の結果、以下の v24 非推奨/削除 API は GROWI ソースコードでは未使用:
-  - `url.parse()`, `Buffer()`, `require('punycode')`, `util.is*()`, `tls.createSecurePair()`, `dirent.path`, `SlowBuffer`, `domain` module
-- ネイティブ依存パッケージ(@swc/core 等)はプリビルドバイナリ方式のため、v24 対応版が自動的にインストールされる想定
-- 依存パッケージ内部での非推奨 API 使用による警告は `--redirect-warnings` オプションで監視可能
-- OpenSSL 3.5 のセキュリティレベル 2 により、LDAP/SAML 連携で 2048 bit 未満の RSA 鍵を使用する外部サービスとの接続に影響する可能性がある(運用レベルの確認事項)
-
-## Error Handling
-
-### Error Strategy
-この機能は構成ファイルの変更が主であり、ランタイムのエラーハンドリング変更は不要。
-
-### Error Categories and Responses
-- **Install Failure**: `pnpm install` 時にネイティブモジュールのビルド失敗 → 依存パッケージのアップデートまたは `ignoredBuiltDependencies` への追加
-- **Build Failure**: TypeScript コンパイルエラーまたは webpack/turbo エラー → エラーメッセージに基づく個別対応
-- **Test Failure**: v24 の動作変更(AsyncLocalStorage、fetch() 等)に起因するテスト失敗 → テストコードまたはアプリケーションコードの修正
-- **Docker Build Failure**: ベースイメージのプルエラーまたは node-gyp ビルドエラー → イメージタグの確認、node-gyp バージョンの更新
-
-## Testing Strategy
-
-### Compatibility Tests(互換性検証)
-1. `pnpm install --frozen-lockfile` が Node.js v24 環境で成功する
-2. `turbo run build --filter @growi/app` が成功する
-3. `turbo run lint:typecheck --filter @growi/app` が成功する
-4. `turbo run test --filter @growi/app` が全テスト合格する
-5. Node.js v24 起動時に deprecation warning が出力されない
-
-### Docker Build Tests
-1. `docker build --build-arg NODE_VERSION=24 -f apps/app/docker/Dockerfile .` が成功する
-2. `docker build --build-arg NODE_VERSION=24 -f apps/pdf-converter/docker/Dockerfile .` が成功する
-3. `docker build --build-arg NODE_VERSION=24 -f apps/slackbot-proxy/docker/Dockerfile .` が成功する
-4. デフォルト(ARG なし)でも v24 イメージでビルドされる
-
-### CI Validation
-1. 各ワークフローの YAML が GitHub Actions のスキーマに準拠している
-2. `ci-app-prod.yml` の `test-prod-node24` ジョブが `reusable-app-prod.yml` を正しく呼び出す
-
-## Migration Strategy
-
-```mermaid
-graph LR
-    A[Phase 1: 構成ファイル更新] --> B[Phase 2: 互換性検証]
-    B --> C[Phase 3: Docker ビルド検証]
-    C --> D[Phase 4: CI パイプライン検証]
-```
-
-- **Phase 1**: package.json、Dockerfile、CI ワークフロー、ドキュメントの値変更
-- **Phase 2**: ローカルの Node.js v24 環境で install/build/test を実行
-- **Phase 3**: Docker ビルドの成功を確認
-- **Phase 4**: CI パイプラインの全ジョブが成功することを確認
-- **Rollback**: 全変更は Git revert で即座にロールバック可能

+ 0 - 74
.kiro/specs/migrate-to-node24/requirements.md

@@ -1,74 +0,0 @@
-# Requirements Document
-
-## Introduction
-GROWI プロジェクトの Node.js 対応バージョンを v18/v20 から v24 のみに移行する。ただし、将来的に v24 と v26 の両対応を見据え、複数バージョン対応に必要な機構(CI マトリクス、engines フィールドの範囲指定パターンなど)は維持する。
-
-## Project Description (Input)
-migrate-to-node24 Node.js v24 に対応させる
-
-- 現状: Node.js v18 と v20 対応
-- 対応後: Node.js v24 のみ対応 (ただし、将来的に v24, v26 両対応できるように、複数対応に必要な機構は残す
-
-## Requirements
-
-### Requirement 1: エンジン制約の更新
-**Objective:** As a 開発者, I want package.json の engines フィールドが Node.js v24 のみを許可する, so that 非対応バージョンでのインストール・実行を防止できる
-
-#### Acceptance Criteria
-1. The GROWI build system shall ルート `package.json` の `engines.node` フィールドを `^24` に設定する
-2. When `npm install` または `pnpm install` を Node.js v24 未満の環境で実行した場合, the GROWI build system shall エンジン互換性エラーを返す
-3. The GROWI build system shall 各ワークスペース(apps/*, packages/*)の `package.json` に独自の `engines` フィールドが存在する場合、それらも `^24` に統一する
-
-### Requirement 2: Docker イメージの更新
-**Objective:** As a デプロイ担当者, I want Docker ビルドが Node.js v24 ベースイメージを使用する, so that 本番環境で Node.js v24 が確実に使用される
-
-#### Acceptance Criteria
-1. The Dockerfile shall `apps/app/docker/Dockerfile` のベースイメージを `node:24-slim` に変更する
-2. The Dockerfile shall `apps/pdf-converter/docker/Dockerfile` のベースイメージを `node:24-slim` に変更する
-3. The Dockerfile shall `apps/slackbot-proxy/docker/Dockerfile` のベースイメージを `node:24-slim` に変更する
-4. When Docker イメージをビルドした場合, the Dockerfile shall 全ステージ(ビルド用・ランタイム用)で `node:24-slim` を使用する
-
-### Requirement 3: CI/CD パイプラインの更新
-**Objective:** As a 開発者, I want CI/CD パイプラインが Node.js v24 でテスト・ビルドを実行する, so that v24 環境での動作が継続的に検証される
-
-#### Acceptance Criteria
-1. The CI pipeline shall `ci-app.yml` のテストマトリクスで `node-version: [24.x]` を使用する
-2. The CI pipeline shall `ci-pdf-converter.yml` のテストマトリクスで `node-version: [24.x]` を使用する
-3. The CI pipeline shall `ci-slackbot-proxy.yml` のテストマトリクスで `node-version: [24.x]` を使用する
-4. The CI pipeline shall `ci-app-prod.yml` の本番テストジョブで Node.js v24 のみを対象とする(v18/v20 ジョブを v24 に置換する)
-5. The CI pipeline shall `reusable-app-prod.yml` のデフォルト node-version を `24.x` に変更する
-6. The CI pipeline shall `release-subpackages.yml` の node-version を `24` に変更する
-
-### Requirement 4: 複数バージョン対応機構の維持
-**Objective:** As a メンテナー, I want 将来の Node.js v26 追加対応に備えて複数バージョン対応の仕組みを残す, so that 最小限の変更で v24/v26 両対応に移行できる
-
-#### Acceptance Criteria
-1. The CI pipeline shall `ci-app-prod.yml` にて Node.js バージョンのマトリクス構造(複数ジョブ定義パターン)を維持する(現時点では v24 のみだが、ジョブ追加で拡張可能な形式を保つ)
-2. The GROWI build system shall ルート `package.json` の `engines.node` を SemVer 範囲指定形式(`^24`)で記述し、将来 `^24 || ^26` への拡張が容易な形式を維持する
-3. The Dockerfile shall ベースイメージのバージョンをビルド引数(`ARG`)として外部から指定可能な構造を維持または導入する
-
-### Requirement 5: ドキュメントの更新
-**Objective:** As a 利用者・貢献者, I want ドキュメントが Node.js v24 対応を正確に反映する, so that 環境構築時に正しいバージョンを使用できる
-
-#### Acceptance Criteria
-1. The documentation shall `README.md` の Node.js バージョン記載を `v24.x` に更新する
-2. The documentation shall `README_JP.md` の Node.js バージョン記載を `v24.x` に更新する
-3. Where プロジェクト内に他の Node.js バージョンを参照するドキュメントが存在する場合, the documentation shall それらも v24 に更新する
-
-### Requirement 6: 依存パッケージの互換性確認
-**Objective:** As a 開発者, I want 全ての依存パッケージが Node.js v24 で動作することを確認する, so that ランタイムエラーや非互換の問題を事前に検出できる
-
-#### Acceptance Criteria
-1. The GROWI build system shall Node.js v24 環境で `pnpm install` が警告なく完了する
-2. The GROWI build system shall Node.js v24 環境で `turbo run build` が全ワークスペースで成功する
-3. The GROWI test suite shall Node.js v24 環境で既存のテストスイートが全て合格する
-4. If 依存パッケージが Node.js v24 と非互換である場合, the GROWI build system shall 代替パッケージへの置換またはバージョンアップで解消する
-
-### Requirement 7: Node.js v24 の新機能・破壊的変更への対応
-**Objective:** As a 開発者, I want Node.js v18/v20 から v24 への破壊的変更に対応する, so that 非推奨 API の使用やランタイムエラーを排除できる
-
-#### Acceptance Criteria
-1. The GROWI application shall Node.js v24 で非推奨(deprecated)となった API を使用しない
-2. If Node.js v24 でデフォルト動作が変更された機能(例: ESM ローダー、パーミッションモデルなど)がある場合, the GROWI application shall 新しいデフォルト動作に適合するか、明示的なオプトアウト設定を行う
-3. The GROWI application shall Node.js v24 起動時に deprecation warning が出力されない状態を達成する
-

+ 0 - 142
.kiro/specs/migrate-to-node24/research.md

@@ -1,142 +0,0 @@
-# Research & Design Decisions
-
----
-**Purpose**: Node.js v24 移行に関する調査結果、破壊的変更の分析、およびアーキテクチャ決定の記録
----
-
-## Summary
-- **Feature**: `migrate-to-node24`
-- **Discovery Scope**: Extension(既存システムの構成変更)
-- **Key Findings**:
-  - GROWI アプリケーションコードには Node.js v24 で問題となる非推奨 API の使用がほぼ存在しない
-  - 主要な変更箇所は構成ファイル(package.json、Dockerfile、CI ワークフロー)に集中している
-  - Node.js v24 は OpenSSL 3.5(セキュリティレベル 2)を採用し、暗号鍵の最小ビット長が引き上げられている
-  - ネイティブアドオン(@swc/core、@rollup/rollup 等)はプリビルドバイナリを使用しており、v24 対応版が利用可能
-
-## Research Log
-
-### Node.js v24 の破壊的変更一覧
-- **Context**: Node.js v18/v20 → v24 移行時に影響する変更を特定する
-- **Sources Consulted**:
-  - [Node.js v22 to v24 Migration Guide](https://nodejs.org/en/blog/migrations/v22-to-v24)
-  - [Node.js 24.0.0 Release Notes](https://nodejs.org/en/blog/release/v24.0.0)
-  - [Node.js 24 Becomes LTS](https://nodesource.com/blog/nodejs-24-becomes-lts)
-- **Findings**:
-  - **OpenSSL 3.5(セキュリティレベル 2)**: RSA/DSA/DH 鍵 < 2048 bit、ECC 鍵 < 224 bit が禁止。RC4 暗号スイートも禁止
-  - **V8 13.6**: NODE_MODULE_VERSION = 137。ネイティブアドオンの再ビルドが必要
-  - **url.parse() ランタイム非推奨**: WHATWG URL API への移行を推奨
-  - **SlowBuffer ランタイム非推奨**: Buffer.allocUnsafe() を使用すべき
-  - **tls.createSecurePair() 削除**: 完全に削除済み
-  - **dirent.path 削除**: dirent.parentPath を使用
-  - **fs.truncate() に fd を渡す用法の削除**: fs.ftruncate() を使用
-  - **HTTP OutgoingMessage._headers / _headersList 削除**: 内部プロパティへの直接アクセス不可
-  - **AsyncLocalStorage のデフォルト変更**: AsyncContextFrame がデフォルトに
-  - **fetch() のコンプライアンス強化**: RFC 準拠の厳格化
-  - **テストランナーの変更**: t.test() がプロミスを返さなくなった
-  - **Permission Model フラグ変更**: `--experimental-permission` → `--permission`
-  - **C++20 が必要になる可能性**: V8 13.6 にリンクするネイティブアドオン
-  - **32-bit Windows/armv7 Linux のサポート終了**
-- **Implications**:
-  - GROWI ソースコードには上記の非推奨/削除 API の直接使用がほぼ見られない(コード分析で確認済み)
-  - 依存パッケージ経由で影響を受ける可能性があるため、install + build + test での検証が必要
-  - OpenSSL 3.5 の暗号鍵制限は LDAP/SAML/OAuth 連携に影響する可能性がある
-
-### GROWI コードベースの互換性分析
-- **Context**: 既存コードが Node.js v24 で問題なく動作するか検証
-- **Sources Consulted**: コードベース全体の Grep/Read 分析
-- **Findings**:
-  - `url.parse()` — GROWI ソースコードでは未使用
-  - `Buffer()` コンストラクタ(new なし)— 未使用
-  - `require('punycode')` — 未使用
-  - `util.is*()` メソッド — 未使用
-  - `crypto.createCipher/Decipher()` — 未使用
-  - `fs.exists()` — 未使用(`fs.existsSync()` は使用されているが安全)
-  - `domain` モジュール — 未使用
-  - `SlowBuffer` — 未使用
-  - `process.binding()` — 未使用
-  - `tls.createSecurePair()` — 未使用
-  - `dirent.path` — 未使用
-  - `__dirname` / `__filename` — CommonJS コンテキストのみで使用(安全)
-- **Implications**: アプリケーションコード自体に互換性の問題はない。変更は構成ファイルに集中する
-
-### Docker イメージの可用性
-- **Context**: `node:24-slim` イメージが Docker Hub で利用可能か確認
-- **Sources Consulted**: [Docker Hub - node:24-slim](https://hub.docker.com/layers/library/node/24-slim/)
-- **Findings**:
-  - `node:24-slim` は Docker Hub で利用可能(bookworm-slim ベース)
-  - `node:24-bookworm-slim`、`node:24-trixie-slim` 等のバリアントも利用可能
-  - Node.js 24 は LTS(コードネーム "Krypton")として 2028 年 4 月までサポート
-- **Implications**: Docker イメージの変更は問題なく実施可能
-
-### ネイティブ依存パッケージの v24 対応状況
-- **Context**: ネイティブバイナリを含むパッケージが v24 で動作するか確認
-- **Sources Consulted**: package.json、node_modules 構造の分析
-- **Findings**:
-  - `@swc/core` — プリビルドバイナリ方式。v24 対応版は新しいリリースで提供される
-  - `@rollup/rollup` — プリビルドバイナリ方式。同上
-  - `@next/swc` — Next.js が管理。Next.js バージョンに依存
-  - `leveldown` — `ignoredBuiltDependencies` に設定済み
-  - `dtrace-provider` — `ignoredBuiltDependencies` に設定済み
-  - `ttf2woff2` — `ignoredBuiltDependencies` に設定済み
-  - `lefthook` — `onlyBuiltDependencies` に設定(ビルド対象)
-- **Implications**: `ignoredBuiltDependencies` 設定により、ほとんどのネイティブ依存はビルドをスキップする。プリビルドバイナリが v24 対応であれば問題なし
-
-### pnpm 互換性
-- **Context**: pnpm 10.4.1 が Node.js v24 をサポートするか確認
-- **Sources Consulted**: pnpm リリースノート
-- **Findings**: pnpm v10.x は Node.js 18+ をサポートしており、v24 との互換性に問題なし
-- **Implications**: パッケージマネージャーの変更は不要
-
-## Architecture Pattern Evaluation
-
-| Option | Description | Strengths | Risks / Limitations | Notes |
-|--------|-------------|-----------|---------------------|-------|
-| 構成ファイル一括更新 | package.json, Dockerfile, CI を一度に v24 のみに変更 | シンプル、一貫性が高い | ロールバックが大きい | 要件に合致(v24 のみ対応) |
-| 段階的移行(v20 + v24 併存) | まず v24 を追加し、後に v20 を削除 | リスクが低い | 複雑、テスト工数増 | 要件は v24 のみ対応だが、機構は残す |
-
-**選択**: 構成ファイル一括更新(v24 のみ)。ただし CI マトリクス構造と Docker ARG パラメータを維持し、将来の v26 追加に備える。
-
-## Design Decisions
-
-### Decision: Dockerfile のバージョンパラメータ化
-- **Context**: 現在の Dockerfile はベースイメージのバージョンがハードコードされている(`node:20-slim`)
-- **Alternatives Considered**:
-  1. ハードコードを `node:24-slim` に直接書き換え — シンプルだが将来の変更時に再度全ファイル編集が必要
-  2. `ARG NODE_VERSION=24` で外部パラメータ化 — ビルド時に `--build-arg` でバージョン指定可能
-- **Selected Approach**: Option 2(ARG によるパラメータ化)
-- **Rationale**: 要件 4.3 で「ベースイメージのバージョンをビルド引数として外部から指定可能な構造」が求められている。将来の v26 対応時に Dockerfile 自体の変更なしにバージョン切り替えが可能
-- **Trade-offs**: Dockerfile が若干複雑になるが、運用の柔軟性が大幅に向上
-- **Follow-up**: CI/CD パイプラインでの `--build-arg` 指定方法を確認
-
-### Decision: CI マトリクス構造の維持方針
-- **Context**: `ci-app-prod.yml` では Node.js バージョンごとに個別ジョブ(`test-prod-node18`, `test-prod-node20`)が定義されている
-- **Alternatives Considered**:
-  1. 個別ジョブパターンを維持し、v24 のみのジョブに変更 — 将来 v26 追加時にジョブ追加で対応
-  2. マトリクス strategy に変更 — `node-version: [24.x]` として将来 `[24.x, 26.x]` に拡張
-- **Selected Approach**: Option 1(個別ジョブパターン維持)
-- **Rationale**: 既存のパターンを踏襲し、変更量を最小化。各バージョンで E2E テストのスキップ有無など個別制御が可能な柔軟性を維持
-- **Trade-offs**: ジョブ追加時の変更箇所が多いが、バージョンごとの設定差異を表現しやすい
-- **Follow-up**: なし
-
-### Decision: engines フィールドの記述形式
-- **Context**: ルート `package.json` の `engines.node` をどの形式で記述するか
-- **Alternatives Considered**:
-  1. `"^24"` — v24.x のみを許可
-  2. `">=24"` — v24 以上すべてを許可
-- **Selected Approach**: Option 1(`"^24"`)
-- **Rationale**: SemVer 範囲指定で明示的にメジャーバージョンを制限。将来 v26 追加時は `"^24 || ^26"` に拡張する想定。`>=24` だと未検証のメジャーバージョンまで許可してしまうリスクがある
-- **Trade-offs**: v26 追加時に engines フィールドの変更が必要だが、安全性が高い
-- **Follow-up**: なし
-
-## Risks & Mitigations
-- **ネイティブアドオンの v24 プリビルドバイナリ未提供リスク** — `pnpm install` 時のビルドエラー。緩和策: 依存パッケージの最新版にアップデートし、プリビルド対応を確認
-- **OpenSSL 3.5 による暗号鍵制限** — LDAP/SAML 連携で 2048 bit 未満の鍵を使用している外部サービスとの接続失敗。緩和策: 事前に暗号鍵サイズを監査
-- **依存パッケージの内部での非推奨 API 使用** — deprecation warning の大量出力。緩和策: `pnpm install` + `turbo run build` + テスト実行で事前検証
-- **Next.js 14.x の Node.js v24 サポート状況** — 公式には Node.js 18-20 がサポート対象。緩和策: Next.js の最新パッチバージョンで v24 動作を確認、必要に応じてアップグレード
-
-## References
-- [Node.js v22 to v24 Migration Guide](https://nodejs.org/en/blog/migrations/v22-to-v24) — 公式移行ガイド
-- [Node.js 24.0.0 Release Notes](https://nodejs.org/en/blog/release/v24.0.0) — 全変更一覧
-- [Node.js 24 Becomes LTS](https://nodesource.com/blog/nodejs-24-becomes-lts) — LTS ステータスの詳細
-- [Docker Hub - node:24-slim](https://hub.docker.com/layers/library/node/24-slim/) — Docker イメージの可用性
-- [Node.js 20 End of Life Playbook](https://dev.to/matheus_releaserun/nodejs-20-end-of-life-migration-playbook-for-april-30-2026-2onh) — v20 EOL 情報

+ 0 - 22
.kiro/specs/migrate-to-node24/spec.json

@@ -1,22 +0,0 @@
-{
-  "feature_name": "migrate-to-node24",
-  "created_at": "2026-02-24T00:00:00.000Z",
-  "updated_at": "2026-02-24T14:00:00.000Z",
-  "language": "ja",
-  "phase": "implementation-complete",
-  "approvals": {
-    "requirements": {
-      "generated": true,
-      "approved": true
-    },
-    "design": {
-      "generated": true,
-      "approved": true
-    },
-    "tasks": {
-      "generated": true,
-      "approved": true
-    }
-  },
-  "ready_for_implementation": true
-}

+ 0 - 70
.kiro/specs/migrate-to-node24/tasks.md

@@ -1,70 +0,0 @@
-# Implementation Plan
-
-- [x] 1. package.json のエンジン制約を Node.js v24 に更新
-- [x] 1.1 (P) ルート package.json の engines.node フィールドを v24 のみ許可に変更する
-  - `engines.node` を `"^18 || ^20"` から `"^24"` に変更する
-  - SemVer 範囲指定形式(`^24`)を使用し、将来 `"^24 || ^26"` への拡張が容易な形式を維持する
-  - ワークスペース内の各 package.json に独自の engines フィールドが存在しないことを確認する(存在する場合は `^24` に統一)
-  - _Requirements: 1.1, 1.2, 1.3, 4.2_
-
-- [x] 2. 全 Dockerfile のベースイメージを node:24-slim に更新し ARG でパラメータ化
-- [x] 2.1 (P) app の Dockerfile を node:24-slim に変更し、NODE_VERSION ARG を導入する
-  - `apps/app/docker/Dockerfile` の base ステージと release ステージの両方でベースイメージを変更する
-  - `ARG NODE_VERSION=24` をグローバル ARG として導入し、`FROM node:${NODE_VERSION}-slim` で参照する
-  - マルチステージビルドの各 FROM 前に ARG を再宣言する(Docker の仕様に従う)
-  - pnpm バージョン(10.4.1)のピン留めは変更しない
-  - _Requirements: 2.1, 2.4, 4.3_
-
-- [x] 2.2 (P) pdf-converter の Dockerfile を node:24-slim に変更し、NODE_VERSION ARG を導入する
-  - `apps/pdf-converter/docker/Dockerfile` の base ステージと release ステージの両方でベースイメージを変更する
-  - app と同じパターンで `ARG NODE_VERSION=24` を導入する
-  - Puppeteer/Chromium 関連の設定は変更しない
-  - _Requirements: 2.2, 2.4, 4.3_
-
-- [x] 2.3 (P) slackbot-proxy の Dockerfile を node:24-slim に変更し、NODE_VERSION ARG を導入する
-  - `apps/slackbot-proxy/docker/Dockerfile` の base ステージと release ステージの両方でベースイメージを変更する
-  - app と同じパターンで `ARG NODE_VERSION=24` を導入する
-  - _Requirements: 2.3, 2.4, 4.3_
-
-- [x] 3. CI/CD ワークフローの Node.js バージョンを v24 に更新
-- [x] 3.1 (P) 開発 CI ワークフロー 3 ファイルの node-version マトリクスを 24.x に変更する
-  - `ci-app.yml` の全マトリクス箇所で `node-version: [20.x]` を `node-version: [24.x]` に変更する
-  - `ci-pdf-converter.yml` の全マトリクス箇所で同様に変更する
-  - `ci-slackbot-proxy.yml` の全マトリクス箇所で同様に変更する
-  - _Requirements: 3.1, 3.2, 3.3_
-
-- [x] 3.2 (P) 本番 CI ワークフローの Node.js バージョンジョブを v24 に統合する
-  - `ci-app-prod.yml` の `test-prod-node18` と `test-prod-node20` の 2 ジョブを `test-prod-node24` の 1 ジョブに統合する
-  - E2E テスト(skip-e2e-test)の制御は既存の node20 ジョブのロジックを引き継ぐ
-  - 個別ジョブパターンの構造を維持し、将来 v26 追加時にジョブをコピーして追加できる形式を保つ
-  - _Requirements: 3.4, 4.1_
-
-- [x] 3.3 (P) reusable ワークフローとリリースワークフローの node-version を更新する
-  - `reusable-app-prod.yml` の `workflow_dispatch.inputs.node-version.default` を `22.x` から `24.x` に変更する
-  - `release-subpackages.yml` の全箇所で `node-version: '20'` を `node-version: '24'` に変更する
-  - _Requirements: 3.5, 3.6_
-
-- [x] 4. (P) ドキュメントの Node.js バージョン記載を v24 に更新する
-  - `README.md` の Node.js バージョン記載を `v24.x` に更新する
-  - `README_JP.md` の Node.js バージョン記載を `v24.x` に更新する
-  - プロジェクト内に他の Node.js バージョンを参照するドキュメントが存在する場合はそれらも v24 に更新する
-  - _Requirements: 5.1, 5.2, 5.3_
-
-- [x] 5. Node.js v24 環境での互換性検証と問題解消
-- [x] 5.1 v24 環境で依存パッケージのインストールとビルドが成功することを確認する
-  - Node.js v24 環境で `pnpm install --frozen-lockfile` を実行し、エラーや互換性警告がないことを確認する
-  - `turbo run build --filter @growi/app` を実行し、全ワークスペースでビルドが成功することを確認する
-  - `turbo run lint:typecheck --filter @growi/app` を実行し、型チェックが通ることを確認する
-  - 非互換パッケージが発見された場合はバージョンアップまたは代替パッケージへの置換で解消する
-  - _Requirements: 6.1, 6.2, 6.4_
-
-- [x] 5.2 v24 環境で既存テストスイートが全て合格することを確認する
-  - `turbo run test --filter @growi/app` を実行し、全テストが合格することを確認する
-  - テスト失敗が v24 の動作変更(AsyncLocalStorage、fetch() の strictness 等)に起因する場合は、テストコードまたはアプリケーションコードを修正する
-  - _Requirements: 6.3_
-
-- [x] 5.3 v24 起動時に deprecation warning が出力されないことを確認する
-  - Node.js v24 でアプリケーションを起動し、コンソール出力に deprecation warning が含まれないことを確認する
-  - GROWI ソースコード内で v24 非推奨 API(url.parse, SlowBuffer, dirent.path 等)が使用されていないことを再確認する
-  - 依存パッケージ由来の deprecation warning が存在する場合は、パッケージのアップデートで解消する
-  - _Requirements: 7.1, 7.2, 7.3_