# 実装計画タスクリスト

## 概要

`article-lint` を新アーキテクチャに移行するための実装タスクリストです。
各フェーズは依存関係を考慮した順序で設計されています。

## 凡例

- [ ] 未着手
- [x] 完了
- 🔴 高優先度（ブロッカー）
- 🟡 中優先度
- 🟢 低優先度（オプション）

---

## Phase 1: コア基盤の構築

**目的**: 全ドメインで共有する基盤コンポーネントを構築する

### 1.1 ディレクトリ構造の作成 🔴

- [x] `src/core/` ディレクトリを作成
- [x] `src/domain/` ディレクトリを作成
- [x] `src/domain/shared/` ディレクトリを作成
- [x] `src/usecase/` ディレクトリを作成
- [x] `src/usecase/base/` ディレクトリを作成
- [x] `src/presentation/` ディレクトリを作成
- [x] `src/presentation/cli/commands/` ディレクトリを作成
- [x] `src/presentation/cli/formatters/` ディレクトリを作成
- [x] `src/infrastructure/` ディレクトリを作成

### 1.2 共通型定義の実装 🔴

- [x] `src/core/types.ts` を作成
  - [x] `LintResult` インターフェース（拡張版）を定義
  - [x] `DocumentMetadata` インターフェースを定義
  - [x] `LintContext` インターフェースを定義
  - [x] `Validator` インターフェースを定義
  - [x] `Severity` 型を定義

### 1.3 パーサーの実装 🔴

- [x] `src/core/parser.ts` を作成
  - [x] `MarkdownParser` クラスを実装
  - [x] unified/remark プラグインの設定
  - [x] frontmatter 抽出機能を実装

### 1.4 インフラ層の実装 🔴

- [x] `src/infrastructure/FileReader.ts` を作成
  - [x] ファイル読み込み機能を実装
  - [x] エンコーディング対応
  - [x] エラーハンドリング

### 1.5 UseCase基底の実装 🔴

- [x] `src/usecases/LintUseCase.ts` を作成
  - [x] `LintUseCaseInput` インターフェースを定義
  - [x] `LintUseCaseOutput` インターフェースを定義
  - [x] `LintUseCase` クラスを実装

### 1.6 フォーマッターの実装 🔴

- [x] `src/presentation/formatters.ts` を作成
  - [x] 詳細表示モードを実装
  - [x] 重要度別表示を実装
  - [x] 位置情報の表示を実装
  - [x] 修正提案の表示を実装
  - [x] JSON形式出力を実装

---

## Phase 2: テキスト教材ドメインの実装

**目的**: 最初のドメインとしてテキスト教材を完全実装し、パターンを確立する

### 2.1 ドメインモデルの作成 🔴

- [x] `src/domain/text/` ディレクトリを作成
- [x] `src/domain/text/validators/` ディレクトリを作成
- [x] `src/domain/text/TextDocument.ts` を作成
  - [x] DocumentType インターフェースを実装
  - [x] バリデーター配列を定義

### 2.2 バリデーターの実装 🔴

- [x] `src/domain/text/validators/FrontmatterValidator.ts` を作成
  - [x] frontmatter存在チェック
  - [x] title フィールドチェック
  - [x] draft フィールドチェック
  - [x] YAML構文チェック
  - [x] 詳細なエラーメッセージ生成

- [x] `src/domain/text/validators/TocValidator.ts` を作成
  - [x] `{{ toc }}` 存在チェック
  - [x] 位置チェック（frontmatter直後）

- [x] `src/domain/text/validators/StructureValidator.ts` を作成
  - [x] `### 学習目標` セクションチェック
  - [x] `## まとめ` セクションチェック
  - [x] セクション順序チェック
  - [x] まとめが最後のH2かチェック

- [x] `src/domain/text/validators/StepDirectiveValidator.ts` を作成
  - [x] `:::step` ブロック構造チェック
  - [x] 番号付きリスト存在チェック
  - [x] 空ブロックチェック
  - [x] インデントチェック（追加）
  - [x] 各ステップ説明文チェック（追加）

- [x] `src/domain/text/validators/CodeBlockValidator.ts` を作成
  - [x] 言語指定チェック
  - [x] ファイルパス記述チェック（_path/to/file_形式）
  - [x] コマンド実行タイトルチェック（bash用）
  - [ ] addstart/addend マーカーチェック

### 2.3 UseCaseの実装 🔴

- [x] 汎用 `src/usecases/LintUseCase.ts` で対応
  - [x] ファイル読み込み処理
  - [x] パース処理
  - [x] メタデータ抽出
  - [x] バリデーション実行
  - [x] 結果集約

### 2.4 コマンドの実装 🔴

- [x] `src/presentation/cli/commands/textCommand.ts` を作成
  - [x] Commander.js コマンド定義
  - [x] ファイル存在チェック
  - [x] UseCase呼び出し
  - [x] フォーマッター選択
  - [x] 終了コード制御

### 2.5 CLIエントリーポイントの更新 🔴

- [x] `src/index.ts` を更新
  - [x] サブコマンド形式に変更
  - [x] text コマンドを登録
  - [x] ヘルプメッセージを更新
  - [x] バージョンを 2.0.0 に更新

### 2.6 テスト 🟡

- [x] `tests/domain/text/` ディレクトリを作成
- [x] 各バリデーターのユニットテストを作成（83テスト全てパス）
- [x] UseCaseの統合テストを作成
- [ ] CLIの E2E テストを作成

---

## Phase 3: 理解度確認問題ドメインの実装

**目的**: クイズ形式文書のリンティングを実装する

### 3.1 ドメインモデルの作成 🔴

- [ ] `src/domain/quiz/` ディレクトリを作成
- [ ] `src/domain/quiz/validators/` ディレクトリを作成
- [ ] `src/domain/quiz/QuizDocument.ts` を作成

### 3.2 バリデーターの実装 🔴

- [ ] `src/domain/quiz/validators/FrontmatterValidator.ts` を作成
  - [ ] frontmatter チェック（text と類似）

- [ ] `src/domain/quiz/validators/TocValidator.ts` を作成
  - [ ] `{{ toc }}` チェック

- [ ] `src/domain/quiz/validators/QuizStructureValidator.ts` を作成
  - [ ] `:::quiz` ブロック存在チェック
  - [ ] `:::question` ブロックチェック
  - [ ] `:::select` ブロックチェック
  - [ ] `:::correct` ブロックチェック
  - [ ] 構造順序チェック

- [ ] `src/domain/quiz/validators/SelectOptionsValidator.ts` を作成
  - [ ] 選択肢数チェック
  - [ ] 番号形式チェック

- [ ] `src/domain/quiz/validators/CorrectAnswerValidator.ts` を作成
  - [ ] 正解番号範囲チェック
  - [ ] 解説文存在チェック

### 3.3 UseCaseの実装 🔴

- [ ] `src/usecase/LintQuizUseCase.ts` を作成

### 3.4 コマンドの実装 🔴

- [ ] `src/presentation/cli/commands/quizCommand.ts` を作成
- [ ] `src/index.ts` に quiz コマンドを登録

### 3.5 テスト 🟡

- [ ] バリデーターのユニットテストを作成
- [ ] 統合テストを作成

---

## Phase 4: スライド教材ドメインの実装

**目的**: Marp形式スライドのリンティングを実装する

### 4.1 ドメインモデルの作成 🔴

- [ ] `src/domain/slides/` ディレクトリを作成
- [ ] `src/domain/slides/validators/` ディレクトリを作成
- [ ] `src/domain/slides/SlidesDocument.ts` を作成

### 4.2 バリデーターの実装 🔴

- [ ] `src/domain/slides/validators/MarpFrontmatterValidator.ts` を作成
  - [ ] `marp: true` チェック
  - [ ] title チェック

- [ ] `src/domain/slides/validators/SlideDelimiterValidator.ts` を作成
  - [ ] `---` 区切りチェック

- [ ] `src/domain/slides/validators/SlideStructureValidator.ts` を作成
  - [ ] タイトルスライド（H1）チェック
  - [ ] 「この章で学ぶこと」スライドチェック
  - [ ] 「この章のまとめ」スライドチェック

- [ ] `src/domain/slides/validators/ContentDensityValidator.ts` を作成
  - [ ] 1スライドあたりの項目数チェック

### 4.3 UseCaseの実装 🔴

- [ ] `src/usecase/LintSlidesUseCase.ts` を作成

### 4.4 コマンドの実装 🔴

- [ ] `src/presentation/cli/commands/slidesCommand.ts` を作成
- [ ] `src/index.ts` に slides コマンドを登録

### 4.5 テスト 🟡

- [ ] バリデーターのユニットテストを作成
- [ ] 統合テストを作成

---

## Phase 5: 演習問題ドメインの実装

**目的**: 演習問題文書のリンティングを実装する

### 5.1 ドメインモデルの作成 🔴

- [ ] `src/domain/practice/` ディレクトリを作成
- [ ] `src/domain/practice/validators/` ディレクトリを作成
- [ ] `src/domain/practice/PracticeDocument.ts` を作成

### 5.2 バリデーターの実装 🔴

- [ ] `src/domain/practice/validators/FrontmatterValidator.ts` を作成

- [ ] `src/domain/practice/validators/TocValidator.ts` を作成

- [ ] `src/domain/practice/validators/ProblemStructureValidator.ts` を作成
  - [ ] `### 概要` セクションチェック
  - [ ] `### 問題` セクションチェック
  - [ ] `### 解答形式` セクションチェック
  - [ ] `### 解答例` セクションチェック

- [ ] `src/domain/practice/validators/SolutionValidator.ts` を作成
  - [ ] コードブロック存在チェック
  - [ ] addstart/addend マーカーチェック

### 5.3 UseCaseの実装 🔴

- [ ] `src/usecase/LintPracticeUseCase.ts` を作成

### 5.4 コマンドの実装 🔴

- [ ] `src/presentation/cli/commands/practiceCommand.ts` を作成
- [ ] `src/index.ts` に practice コマンドを登録

### 5.5 テスト 🟡

- [ ] バリデーターのユニットテストを作成
- [ ] 統合テストを作成

---

## Phase 6: 研修要件定義書ドメインの実装

**目的**: 研修要件定義書のリンティングを実装する

### 6.1 ドメインモデルの作成 🔴

- [ ] `src/domain/requirements/` ディレクトリを作成
- [ ] `src/domain/requirements/validators/` ディレクトリを作成
- [ ] `src/domain/requirements/RequirementsDocument.ts` を作成

### 6.2 バリデーターの実装 🔴

- [ ] `src/domain/requirements/validators/FrontmatterValidator.ts` を作成
  - [ ] title, logo, duration, capacity, featureImage チェック

- [ ] `src/domain/requirements/validators/StructureValidator.ts` を作成
  - [ ] `## 研修概要` チェック
  - [ ] `## 研修の特徴` チェック
  - [ ] `## 学習目標` チェック
  - [ ] `## カリキュラム` チェック
  - [ ] `## 研修詳細` チェック
  - [ ] `## 会社情報` チェック
  - [ ] `## タイムスケジュール` チェック

- [ ] `src/domain/requirements/validators/LearningGoalsValidator.ts` を作成
  - [ ] 学習目標の数チェック（3-5個推奨）

- [ ] `src/domain/requirements/validators/CurriculumValidator.ts` を作成
  - [ ] 各章の学習項目存在チェック

### 6.3 UseCaseの実装 🔴

- [ ] `src/usecase/LintRequirementsUseCase.ts` を作成

### 6.4 コマンドの実装 🔴

- [ ] `src/presentation/cli/commands/requirementsCommand.ts` を作成
- [ ] `src/index.ts` に requirements コマンドを登録

### 6.5 テスト 🟡

- [ ] バリデーターのユニットテストを作成
- [ ] 統合テストを作成

---

## Phase 7: 研修設計書ドメインの実装

**目的**: 研修設計書のリンティングを実装する

### 7.1 ドメインモデルの作成 🔴

- [ ] `src/domain/design/` ディレクトリを作成
- [ ] `src/domain/design/validators/` ディレクトリを作成
- [ ] `src/domain/design/DesignDocument.ts` を作成

### 7.2 バリデーターの実装 🔴

- [ ] `src/domain/design/validators/FrontmatterValidator.ts` を作成

- [ ] `src/domain/design/validators/StructureValidator.ts` を作成
  - [ ] `## 1. 研修設計の基本方針` チェック
  - [ ] `## 2. 章構成と学習設計` チェック
  - [ ] `## 3. タイムスケジュール` チェック
  - [ ] `## 4. フォルダ・ファイル構成` チェック

- [ ] `src/domain/design/validators/ChapterDesignValidator.ts` を作成
  - [ ] 各章の学習概要チェック
  - [ ] 各章の学習目標チェック
  - [ ] 各章のハンズオンチェック
  - [ ] 各章の演習問題チェック

- [ ] `src/domain/design/validators/ScheduleValidator.ts` を作成
  - [ ] タイムスケジュール形式チェック

### 7.3 UseCaseの実装 🔴

- [ ] `src/usecase/LintDesignUseCase.ts` を作成

### 7.4 コマンドの実装 🔴

- [ ] `src/presentation/cli/commands/designCommand.ts` を作成
- [ ] `src/index.ts` に design コマンドを登録

### 7.5 テスト 🟡

- [ ] バリデーターのユニットテストを作成
- [ ] 統合テストを作成

---

## Phase 8: フライヤー要件ドメインの実装

**目的**: フライヤー要件のリンティングを実装する

### 8.1 ドメインモデルの作成 🔴

- [ ] `src/domain/flyer/` ディレクトリを作成
- [ ] `src/domain/flyer/validators/` ディレクトリを作成
- [ ] `src/domain/flyer/FlyerDocument.ts` を作成

### 8.2 バリデーターの実装 🔴

- [ ] `src/domain/flyer/validators/FrontmatterValidator.ts` を作成
  - [ ] title, logo, duration, capacity, featureImage チェック

- [ ] `src/domain/flyer/validators/StructureValidator.ts` を作成
  - [ ] `## 研修のキャッチ文章` チェック
  - [ ] `## 研修の特徴` チェック
  - [ ] `## 学習目標` チェック
  - [ ] `## カリキュラム` チェック
  - [ ] `## 研修詳細` チェック
  - [ ] `## 会社情報` チェック

- [ ] `src/domain/flyer/validators/ContentLengthValidator.ts` を作成
  - [ ] キャッチ文章の文字数チェック（100文字程度）
  - [ ] 研修の特徴の文字数チェック（400文字程度）
  - [ ] 学習目標の数チェック（5個以内）

### 8.3 UseCaseの実装 🔴

- [ ] `src/usecase/LintFlyerUseCase.ts` を作成

### 8.4 コマンドの実装 🔴

- [ ] `src/presentation/cli/commands/flyerCommand.ts` を作成
- [ ] `src/index.ts` に flyer コマンドを登録

### 8.5 テスト 🟡

- [ ] バリデーターのユニットテストを作成
- [ ] 統合テストを作成

---

## Phase 9: プロモーションドメインの実装

**目的**: プロモーション文書のリンティングを実装する

### 9.1 ドメインモデルの作成 🔴

- [ ] `src/domain/promotion/` ディレクトリを作成
- [ ] `src/domain/promotion/validators/` ディレクトリを作成
- [ ] `src/domain/promotion/PromotionDocument.ts` を作成

### 9.2 バリデーターの実装 🔴

- [ ] `src/domain/promotion/validators/FrontmatterValidator.ts` を作成

- [ ] `src/domain/promotion/validators/StructureValidator.ts` を作成
  - [ ] 必須セクションチェック

### 9.3 UseCaseの実装 🔴

- [ ] `src/usecase/LintPromotionUseCase.ts` を作成

### 9.4 コマンドの実装 🔴

- [ ] `src/presentation/cli/commands/promotionCommand.ts` を作成
- [ ] `src/index.ts` に promotion コマンドを登録

### 9.5 テスト 🟡

- [ ] バリデーターのユニットテストを作成
- [ ] 統合テストを作成

---

## Phase 10: 共有バリデーターの抽出

**目的**: 重複コードを共有バリデーターに統合する

### 10.1 共有バリデーターの実装 🟡

- [ ] `src/domain/shared/BaseFrontmatterValidator.ts` を作成
  - [ ] 共通のfrontmatterチェックロジックを抽出

- [ ] `src/domain/shared/TocValidator.ts` を作成
  - [ ] 共通のtocチェックロジックを抽出

- [ ] `src/domain/shared/MarkdownSyntaxValidator.ts` を作成
  - [ ] 共通のMarkdown構文チェック

- [ ] `src/domain/shared/CodeBlockLanguageValidator.ts` を作成
  - [ ] 言語指定チェック

### 10.2 各ドメインのリファクタリング 🟡

- [ ] text ドメインを共有バリデーター利用に更新
- [ ] quiz ドメインを共有バリデーター利用に更新
- [ ] slides ドメインを共有バリデーター利用に更新
- [ ] practice ドメインを共有バリデーター利用に更新
- [ ] requirements ドメインを共有バリデーター利用に更新
- [ ] design ドメインを共有バリデーター利用に更新
- [ ] flyer ドメインを共有バリデーター利用に更新
- [ ] promotion ドメインを共有バリデーター利用に更新

---

## Phase 11: 追加機能の実装

**目的**: ユーザビリティを向上させる追加機能を実装する

### 11.1 CLIオプションの拡張 🟡

- [ ] `--quiet` オプションを実装（簡易出力）
- [ ] `--severity <level>` オプションを実装（重要度フィルタ）
- [ ] `--no-color` オプションを実装（カラー無効化）
- [ ] `--fix` オプションの基盤を実装（将来拡張用）

### 11.2 設定ファイル対応 🟢

- [ ] `src/infrastructure/ConfigLoader.ts` を作成
- [ ] `.article-lint.yml` 形式のサポート
- [ ] ルール別の severity カスタマイズ
- [ ] ルール別の有効/無効設定

### 11.3 追加フォーマッター 🟢

- [ ] `src/presentation/cli/formatters/SarifFormatter.ts` を作成
  - [ ] GitHub Actions 連携用SARIF形式

### 11.4 ウォッチモード 🟢

- [ ] `--watch` オプションを実装
- [ ] ファイル変更検知と再チェック

---

## Phase 12: ドキュメントと仕上げ

**目的**: ドキュメント整備とリリース準備

### 12.1 ドキュメント作成 🟡

- [ ] README.md を更新
  - [ ] 新しいCLI使用方法
  - [ ] サブコマンド一覧
  - [ ] オプション説明
- [ ] CHANGELOG.md を作成
- [ ] 各ルールの詳細ドキュメントを作成

### 12.2 旧コードのクリーンアップ 🔴

- [ ] `src/rules/` ディレクトリを削除
- [ ] `src/linter.ts` を削除
- [ ] 不要な依存関係を削除

### 12.3 パッケージ更新 🔴

- [ ] `package.json` を更新
  - [ ] バージョンを 2.0.0 に更新
  - [ ] 依存関係を整理
  - [ ] bin 設定を確認
- [ ] `tsconfig.json` を確認・更新

### 12.4 CI/CD 設定 🟢

- [ ] GitHub Actions ワークフローを作成
- [ ] テスト自動実行
- [ ] npm publish 自動化

---

## 依存関係グラフ

```
Phase 1 (コア基盤)
    │
    ├─── Phase 2 (text) ─────┐
    │                        │
    ├─── Phase 3 (quiz) ─────┤
    │                        │
    ├─── Phase 4 (slides) ───┤
    │                        │
    ├─── Phase 5 (practice) ─┼─── Phase 10 (共有バリデーター抽出)
    │                        │           │
    ├─── Phase 6 (requirements)          │
    │                        │           │
    ├─── Phase 7 (design) ───┤           │
    │                        │           │
    ├─── Phase 8 (flyer) ────┤           │
    │                        │           │
    └─── Phase 9 (promotion)─┘           │
                                         │
                                         ▼
                              Phase 11 (追加機能)
                                         │
                                         ▼
                              Phase 12 (ドキュメント・仕上げ)
```

---

## 進捗トラッキング

| フェーズ | 説明 | ステータス | 完了日 |
|---------|------|-----------|--------|
| Phase 1 | コア基盤の構築 | ✅ 完了 | 2025-12-13 |
| Phase 2 | テキスト教材ドメイン | 🔄 進行中 | - |
| Phase 3 | 理解度確認問題ドメイン | 未着手 | - |
| Phase 4 | スライド教材ドメイン | 未着手 | - |
| Phase 5 | 演習問題ドメイン | 未着手 | - |
| Phase 6 | 研修要件定義書ドメイン | 未着手 | - |
| Phase 7 | 研修設計書ドメイン | 未着手 | - |
| Phase 8 | フライヤー要件ドメイン | 未着手 | - |
| Phase 9 | プロモーションドメイン | 未着手 | - |
| Phase 10 | 共有バリデーター抽出 | 未着手 | - |
| Phase 11 | 追加機能 | 未着手 | - |
| Phase 12 | ドキュメント・仕上げ | 未着手 | - |

---

## 見積もり

| フェーズ | 工数目安 | 備考 |
|---------|---------|------|
| Phase 1 | 0.5日 | 基盤構築 |
| Phase 2 | 1日 | 最初のドメイン、パターン確立 |
| Phase 3 | 0.5日 | Phase 2 のパターン踏襲 |
| Phase 4 | 0.5日 | Phase 2 のパターン踏襲 |
| Phase 5 | 0.5日 | Phase 2 のパターン踏襲 |
| Phase 6 | 0.5日 | Phase 2 のパターン踏襲 |
| Phase 7 | 0.5日 | Phase 2 のパターン踏襲 |
| Phase 8 | 0.5日 | Phase 2 のパターン踏襲 |
| Phase 9 | 0.5日 | Phase 2 のパターン踏襲 |
| Phase 10 | 0.5日 | リファクタリング |
| Phase 11 | 1日 | 追加機能（オプション） |
| Phase 12 | 0.5日 | ドキュメント・仕上げ |
| **合計** | **約7日** | テスト込み |
