# 機能設計書 16-initコマンド

## 概要

本ドキュメントは、対話形式でプロジェクト設定を初期化する`@liam-hq/cli init`コマンドの設計を記述する。

### 本機能の処理概要

**業務上の目的・背景**：Liam ERDを初めて使用するユーザーに対して、データベース/ORMの選択からGitHub Actions生成までをガイド形式で案内することで、導入の敷居を下げ、迅速なセットアップを実現する。

**機能の利用シーン**：
- 新規プロジェクトでLiam ERDを導入する際の初期設定
- CI/CDパイプラインにERD生成を組み込む際のワークフロー生成
- 使用中のデータベース/ORMに応じた適切な設定の案内

**主要な処理内容**：
1. ウェルカムメッセージとプロジェクト概要の表示
2. データベース/ORM選択の対話プロンプト
3. 選択に応じたスキーマファイルパスの入力
4. GitHub Actionsワークフロー生成の確認
5. 次のステップの案内

**関連システム・外部連携**：
- inquirerライブラリによる対話UI
- GitHub Actions（.github/workflows/erd.yml生成）

**権限による制御**：ファイルシステムへの書き込み権限が必要（GitHub Actionsワークフロー生成時）。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | CLI専用機能（画面なし） |

## 機能種別

対話型設定ウィザード

## 入力仕様

### 入力パラメータ

本コマンドはパラメータなしで実行し、対話形式で入力を受け付ける。

### 対話入力項目

| 項目 | 型 | 説明 | 選択肢/デフォルト |
|------|-----|------|------------------|
| dbOrOrm | string | 使用するデータベース/ORM | PostgreSQL, Rails, Prisma, Drizzle, tbls, MySQL/SQLite/BigQuery(via tbls), Others |
| usePgDump | boolean | pg_dumpの.sqlファイルを使用するか | true/false |
| dumpFilePath | string | ダンプファイルのパス | schema.sql |
| schemaFilePath | string | スキーマファイルのパス | 選択に応じたデフォルト値 |
| addGhActions | boolean | GitHub Actionsを生成するか | true/false |

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 標準出力 | string | ガイダンスメッセージと次のステップ |
| ファイル | .github/workflows/erd.yml | GitHub Actionsワークフロー（オプション） |

### 出力先

- 標準出力（コンソール）
- ファイルシステム（.github/workflows/erd.yml）

## 処理フロー

### 処理シーケンス

```
1. バナー表示
   └─ generateBanner()でアスキーアートバナーを表示
2. ウェルカムメッセージ表示
   └─ displayWelcomeMessage()でプロジェクト概要を表示
3. データベース/ORM選択
   └─ inquirer.promptでリスト選択
4. 選択に応じたフォローアップ質問
   └─ PostgreSQL: pg_dumpの使用確認とパス入力
   └─ Rails/Prisma: スキーマファイルパス入力
   └─ Drizzle: スキーマファイルパス入力（実験的機能の注意表示）
   └─ tbls: schema.jsonパス入力
   └─ via tbls: tbls使用方法の案内
   └─ Others: 未サポートメッセージ表示
5. GitHub Actions生成確認
   └─ inquirer.promptで確認
6. 次のステップ表示
   └─ displayNextSteps()でbuildコマンドの使用方法を案内
7. GitHub Actionsファイル生成
   └─ generateGitHubActions()でワークフローファイルを作成
8. 完了メッセージ表示
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[バナー表示]
    B --> C[ウェルカムメッセージ]
    C --> D[DB/ORM選択]
    D --> E{選択内容}
    E -->|PostgreSQL| F[pg_dump確認]
    E -->|Rails/Prisma| G[スキーマパス入力]
    E -->|Drizzle| H[スキーマパス入力+警告]
    E -->|tbls| I[schema.jsonパス入力]
    E -->|via tbls| J[tbls案内表示]
    E -->|Others| K[未サポート終了]
    F --> L[GitHub Actions確認]
    G --> L
    H --> L
    I --> L
    J --> L
    L --> M{GH Actions生成?}
    M -->|Yes| N[ワークフロー生成]
    M -->|No| O[次のステップ表示]
    N --> O
    O --> P[完了メッセージ]
    P --> Q[終了]
    K --> Q
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | フォーマットマッピング | 選択されたDB/ORMから--formatオプション値を導出 | 常に適用 |
| BR-02 | デフォルトパス | DB/ORMに応じたデフォルトスキーマパスを提示 | 常に適用 |
| BR-03 | tbls経由案内 | MySQL/SQLite/BigQueryはtbls経由での使用を案内 | 該当DB選択時 |

### フォーマットマッピング

| 選択項目 | --format値 |
|---------|-----------|
| PostgreSQL | postgres |
| Ruby on Rails (schema.rb) | schemarb |
| Prisma (schema.prisma) | prisma |
| Drizzle (schema.ts) [Experimental] | drizzle |
| MySQL (via tbls) | tbls |
| SQLite (via tbls) | tbls |
| BigQuery (via tbls) | tbls |
| tbls | tbls |

### デフォルトスキーマパス

| 選択項目 | デフォルトパス |
|---------|--------------|
| PostgreSQL | schema.sql |
| Ruby on Rails | db/schema.rb |
| Prisma | prisma/schema.prisma |
| Drizzle | src/db/schema.ts |
| tbls | docs/schema.json |

## データベース操作仕様

### 操作別データベース影響一覧

本機能はデータベースを操作しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ファイル書き込みエラー | ディレクトリ作成またはファイル書き込み失敗 | エラーメッセージを表示して続行 |

### リトライ仕様

リトライ不要（対話型処理のため）

## トランザクション仕様

該当なし

## パフォーマンス要件

- 対話応答：即座に次のプロンプトを表示

## セキュリティ考慮事項

- ファイルパスの検証：ユーザー入力のパスはそのまま使用（パストラバーサルのリスクは低い）
- GitHub Actionsファイルの上書き確認なし（既存ファイルがあれば上書き）

## 備考

- yoctocolorsライブラリで色付きテキストを出力
- inquirerライブラリで対話UIを実装
- "Others"選択時はDiscussionへのリンクを案内

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | index.ts | `frontend/packages/cli/src/cli/index.ts` | CLIのメインエントリーポイント、initコマンドの登録 |

#### Step 2: initコマンドの実装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | index.ts | `frontend/packages/cli/src/cli/initCommand/index.ts` | initコマンドの全実装 |

**主要処理フロー**:
- **15-17行目**: initCommandの定義
- **20-29行目**: formatMapの定義（選択からフォーマットへのマッピング）
- **34-52行目**: displayWelcomeMessage関数
- **58-90行目**: handlePostgresPrompts関数
- **96-118行目**: handleDrizzlePrompts関数
- **124-137行目**: handleTblsPrompts関数
- **143-162行目**: handleTblsViaOtherPrompts関数
- **169-188行目**: handleRailsOrPrismaPrompts関数
- **193-203行目**: displayUnsupportedMessage関数
- **211-256行目**: displayNextSteps関数
- **265-322行目**: generateGitHubActions関数
- **327-407行目**: initCommand.action - メインロジック

### プログラム呼び出し階層図

```
initCommand.action()
    │
    ├─ generateBanner() [banner.ts]
    │
    ├─ displayWelcomeMessage()
    │
    ├─ inquirer.prompt() - DB/ORM選択
    │
    ├─ 選択に応じた処理
    │      ├─ handlePostgresPrompts()
    │      ├─ handleDrizzlePrompts()
    │      ├─ handleTblsPrompts()
    │      ├─ handleTblsViaOtherPrompts()
    │      ├─ handleRailsOrPrismaPrompts()
    │      └─ displayUnsupportedMessage()
    │
    ├─ inquirer.prompt() - GitHub Actions確認
    │
    ├─ displayNextSteps()
    │
    └─ generateGitHubActions()
           └─ fs.mkdirSync() / fs.writeFileSync()
```

### データフロー図

```
[入力]                    [処理]                         [出力]

ユーザー選択 ──▶ dbOrOrm ──▶ formatMap ──▶ selectedFormat
     │              │
     │              └──▶ 各handleXxxPrompts() ──▶ inputFilePath
     │
     └──────▶ addGhActions ──▶ generateGitHubActions() ──▶ .github/workflows/erd.yml
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| index.ts | `frontend/packages/cli/src/cli/initCommand/index.ts` | ソース | initコマンド全実装 |
| index.ts | `frontend/packages/cli/src/cli/index.ts` | ソース | CLIメインエントリー |
| banner.ts | `frontend/packages/cli/src/cli/banner.ts` | ソース | バナー表示 |
| urls.ts | `frontend/packages/cli/src/cli/urls.ts` | ソース | 外部URLの定義 |
