Yuki Takei 1 ay önce
ebeveyn
işleme
c49b46a255

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

@@ -0,0 +1,317 @@
+# 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 で即座にロールバック可能

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

@@ -0,0 +1,74 @@
+# 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 が出力されない状態を達成する
+

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

@@ -0,0 +1,142 @@
+# 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 情報

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

@@ -0,0 +1,22 @@
+{
+  "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
+}

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

@@ -0,0 +1,70 @@
+# 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_