# 通知設計書 30-Cannot use --file-info with multiple files

## 概要

`--file-info`オプションと複数のファイルパターンを同時に指定した場合に発生するオプション使用制限エラー通知の設計書です。

### 本通知の処理概要

本通知は、ユーザーがPrettierのCLIで`--file-info`オプションを使用しながら、追加のファイルパターン（位置引数）を指定した場合に発生するエラーメッセージです。`--file-info`は単一ファイルに対する情報取得機能であるため、複数ファイルとの併用は許可されていません。

**業務上の目的・背景**：`--file-info`オプションは、指定したファイルに関する情報（無視されているか、推論されるパーサーは何かなど）をJSON形式で出力するユーティリティ機能です。このオプションは1つのファイルパスを引数として受け取り、そのファイルの情報を出力します。複数のファイルパターンが指定された場合、どのファイルの情報を出力すべきかが曖昧になるため、この組み合わせは禁止されています。

**通知の送信タイミング**：CLIのmain関数の冒頭で、コンテキスト初期化後すぐにオプションの使用制限チェックが行われます。具体的には、`index.js`のmain関数内で、findConfigPath制限チェックの直後に実行されます。

**通知の受信者**：CLIを実行している開発者（標準エラー出力経由）。

**通知内容の概要**：エラーメッセージは `Cannot use --file-info with multiple files` という固定文字列で出力されます。

**期待されるアクション**：開発者は、`--file-info`のみを使用するか、ファイルパターンを削除するか、または複数ファイルの情報が必要な場合は個別に実行することを検討します。

## 通知種別

CLI標準エラー出力（stderr）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期 |
| 優先度 | 高（処理を中断するエラー） |
| リトライ | 無 |

### 送信先決定ロジック

main関数内でErrorをthrowし、run関数のcatchブロックで`logger.error`経由でstderrに出力されます。

## 通知テンプレート

### CLI出力の場合

| 項目 | 内容 |
|-----|------|
| 出力先 | stderr |
| プレフィックス | `[error]`（赤色） |
| 形式 | テキスト |

### 本文テンプレート

```
[error] Cannot use --file-info with multiple files
```

### 添付ファイル

なし

## テンプレート変数

なし（固定メッセージ）

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| CLI実行 | main関数開始時 | `context.argv.fileInfo && context.filePatterns.length > 0` | --file-infoと追加ファイルパターンが同時指定された |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| `--file-info`のみ指定 | ファイルパターンがない場合は正常動作 |
| `--file-info`未指定 | 競合が発生しない |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[CLI実行開始] --> B[Context初期化]
    B --> C[main関数開始]
    C --> D[normalized argv出力]
    D --> E[各種競合チェック]
    E --> F[findConfigPath制限チェック]
    F --> G{fileInfo && filePatterns.length > 0?}
    G -->|Yes| H[Error throw]
    G -->|No| I[次のチェックへ]
    H --> J[run関数のcatch]
    J --> K[logger.error呼び出し]
    K --> L[stderr出力]
    L --> M[exitCode = 1]
```

## データベース参照・更新仕様

### 参照テーブル一覧

なし

### 更新テーブル一覧

なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| オプション使用制限エラー | --file-infoと複数ファイルの同時指定 | エラーメッセージを出力し、exitCode=1で終了 |

### リトライ仕様

なし

## 配信設定

### レート制限

なし

### 配信時間帯

制限なし

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

- ファイルパス等の機密情報は出力されない
- 固定メッセージのため情報漏洩のリスクは低い

## 備考

- `--file-info`はファイルパスを引数として受け取る（例: `--file-info src/index.js`）
- `context.filePatterns`は位置引数（`_`）から取得される
- 正常動作時はJSON形式で以下の情報を出力:
  - `ignored`: ファイルが無視リストに含まれているか（boolean）
  - `inferredParser`: 推論されるパーサー名（string | null）
- exitCodeは1（ユーザーエラー）

---

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

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

### 推奨読解順序

#### Step 1: データ構造を理解する

まず、argvオブジェクトとfileInfoオプションの構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | cli-options.evaluate.js | `src/cli/cli-options.evaluate.js` | fileInfoオプションの定義を確認 |
| 1-2 | context.js | `src/cli/context.js` | filePatternsの設定を確認 |

**読解のコツ**: 172-179行目でfileInfoオプション、context.jsの40行目でfilePatterns設定を確認。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | index.js | `src/cli/index.js` | run関数とmain関数の流れを確認 |

**主要処理フロー**:
1. **33-36行目**: run関数のcatchブロック（logger.error呼び出し）
2. **61-63行目**: main関数内のfileInfo制限チェック

#### Step 3: fileInfo機能を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | file-info.js | `src/cli/file-info.js` | ファイル情報取得処理を確認 |

**主要処理フロー**:
- ファイルの情報をJSON形式で出力する処理

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

```
src/cli/index.js::run()
    │
    ├─ new Context()
    │      │
    │      └─ context.filePatterns = argv._
    │
    ├─ context.init()
    │
    └─ main()
           │
           ├─ logger.debug("normalized argv: ...")
           │
           ├─ 各種競合チェック
           │
           ├─ findConfigPath制限チェック
           │
           ├─ fileInfo制限チェック
           │      │
           │      └─ throw new Error("Cannot use --file-info with multiple files")
           │
           └─ (正常時) logFileInfoOrDie()

    catch (error)
           │
           └─ logger.error(error.message)
                  │
                  └─ process.exitCode = 1
```

### データフロー図

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

--file-info path ──────┐
                       ├──▶ main関数 ──▶ 制限判定 ──▶ Error throw
file1.js file2.js ─────┘         │
                                 │
                                 └──▶ catch ──▶ logger.error ──▶ stderr
                                                     │
                                                     └──▶ [error] Cannot use...
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| index.js | `src/cli/index.js` | ソース | CLIエントリーポイント、制限チェック実装 |
| context.js | `src/cli/context.js` | ソース | Contextクラス、filePatterns管理 |
| logger.js | `src/cli/logger.js` | ソース | ログ出力機能 |
| file-info.js | `src/cli/file-info.js` | ソース | ファイル情報取得処理 |
| cli-options.evaluate.js | `src/cli/cli-options.evaluate.js` | ソース | fileInfoオプション定義 |
