# バッチ設計書 30-runformat.cmd

## 概要

OpenConsole.psm1のInvoke-CodeFormatを呼び出し、C++コードおよびXAMLファイルにコードフォーマットを適用するバッチファイルの設計書。

### 本バッチの処理概要

本バッチは、OpenConsoleプロジェクトのC++ソースコード（.cpp, .hpp, .h）およびXAMLファイルにコードフォーマッターを適用するラッパースクリプトである。PowerShellモジュール `OpenConsole.psm1` の `Invoke-CodeFormat` 関数を呼び出すことで、clang-formatによるC++コードフォーマットとxstylerによるXAMLフォーマットを実行する。

**業務上の目的・背景**：プロジェクト全体でコードスタイルの一貫性を維持するため、自動フォーマッターの適用が必要である。コミット前やプルリクエスト作成前にフォーマッターを実行することで、コードレビューの効率を向上させ、スタイルの不統一によるノイズを排除する。

**バッチの実行タイミング**：コード変更後、コミット前に随時手動で実行する。GenerateTests.ps1（No.29）でテストコードを生成した後にも実行が推奨される。

**主要な処理内容**：
1. PowerShellをno-profileモードで起動する
2. `OpenConsole.psm1` モジュールをインポートする
3. `Invoke-CodeFormat` 関数を呼び出す
4. Invoke-CodeFormat内部では:
   - NuGetパッケージからclang-formatを取得する
   - `src` ディレクトリ配下の全C++ファイル（*.cpp, *.hpp, *.h）に対してclang-formatを適用する
   - 自動生成ファイル（"Generated Files"を含むパス）は除外する
   - XAMLファイルにもxstylerを適用する

**前後の処理との関連**：コード変更後に実行する。CI/CDでは `Invoke-FormattingCheck.ps1`（No.32）によりフォーマットの適用状態が検証される。

**影響範囲**：`src` ディレクトリ配下の全C++ファイルおよびXAMLファイルが対象。ファイルが直接上書きされる。

## バッチ種別

コード整形（フォーマッター適用）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | 任意 |
| 実行曜日 | N/A |
| 実行日 | N/A |
| トリガー | 手動（コミット前） |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| 環境変数 `OPENCON_TOOLS` | OpenConsoleのtoolsディレクトリを指す環境変数が設定済みであること（`razzle.cmd` による設定） |
| PowerShell | PowerShellが利用可能であること |
| NuGet | clang-formatパッケージの取得にNuGetが必要 |
| packages.config | `tools/packages.config` にclang-formatパッケージが定義されていること |

### 実行可否判定

特別な実行可否判定ロジックはない。環境変数が設定されていれば実行可能。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | 本バッチは引数を受け取らない |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| `src/**/*.cpp`, `src/**/*.hpp`, `src/**/*.h` | C++ソースファイル | フォーマット対象のC++ファイル群 |
| `src/**/*.xaml` | XAMLファイル | フォーマット対象のXAMLファイル群 |
| `tools/packages.config` | XML | clang-formatのNuGetパッケージ定義 |
| `tools/OpenConsole.psm1` | PowerShellモジュール | Invoke-CodeFormat関数の定義元 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| ソースファイル（上書き） | C++/XAML | フォーマット適用済みのソースファイル |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | 入力ファイルと同一（上書き） |
| 出力先 | 入力ファイルと同一パス |
| 文字コード | 元のファイルのエンコーディングを維持 |
| 区切り文字 | N/A |

## 処理フロー

### 処理シーケンス

```
1. PowerShell起動
   └─ powershell -noprofile で起動（ユーザープロファイル読み込みをスキップ）
2. モジュールインポート
   └─ import-module %OPENCON_TOOLS%\openconsole.psm1
3. Invoke-CodeFormat実行
   ├─ NuGetでclang-formatパッケージをリストア
   ├─ packages.configからclang-formatのパス取得
   ├─ src配下のC++ファイルを再帰検索（*.cpp, *.hpp, *.h）
   ├─ "Generated Files"パスを除外
   ├─ clang-formatを各ファイルに適用
   └─ Invoke-XamlFormatを呼び出してXAMLファイルにも適用
```

### フローチャート

```mermaid
flowchart TD
    A[runformat.cmd 起動] --> B["PowerShell -noprofile 起動"]
    B --> C["OpenConsole.psm1 インポート"]
    C --> D["Invoke-CodeFormat 実行"]
    D --> E["NuGet restore でclang-format取得"]
    E --> F["src配下のC++ファイルを検索"]
    F --> G["Generated Files を除外"]
    G --> H["clang-format を適用"]
    H --> I["Invoke-XamlFormat でXAML整形"]
    I --> J[バッチ終了]
```

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

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

データベース操作はない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| N/A | 環境変数未設定 | `OPENCON_TOOLS` が設定されていない | `razzle.cmd` を事前に実行する |
| N/A | モジュール読み込み失敗 | `OpenConsole.psm1` が見つからない | 環境変数のパスを確認する |
| N/A | NuGetリストア失敗 | ネットワーク接続がない場合 | ネットワーク接続を確認する |
| N/A | clang-format未取得 | NuGetパッケージのリストアが完了していない | NuGet restoreを手動で実行する |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

### 障害時対応

環境変数やモジュールの問題の場合は `razzle.cmd` を再実行する。NuGet関連の問題の場合はネットワーク接続を確認し、手動でNuGet restoreを実行する。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A（各ファイルを個別に上書き） |
| コミットタイミング | N/A |
| ロールバック条件 | N/A（git restore等でフォーマット前の状態に戻すことは可能） |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | srcディレクトリ配下の全C++/XAMLファイル |
| 目標処理時間 | ファイル数に依存（数分〜十数分） |
| メモリ使用量上限 | 特に制限なし |

## 排他制御

排他制御は行わない。実行中に対象ファイルを編集しないこと。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 実行ログ | 処理中 | clang-formatの適用状況 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| N/A | N/A | N/A |

## 備考

- ソースファイルパス: `tools/runformat.cmd`
- 実装コード: `powershell -noprofile "import-module %OPENCON_TOOLS%\openconsole.psm1; Invoke-CodeFormat"`
- `-noprofile` オプションにより、PowerShellのユーザープロファイルをスキップして起動する
- `Invoke-CodeFormat` は `OpenConsole.psm1` からエクスポートされた関数である
- clang-formatの設定は `.clang-format` ファイル（プロジェクトルート）で管理される
- 自動生成ファイル（パスに "Generated Files" を含むもの）はフォーマット対象から除外される
- XAML整形は `Invoke-XamlFormat` が内部的に呼び出す xstyler を使用する
- CI/CDパイプラインでは `Invoke-FormattingCheck.ps1`（No.32）でフォーマットの適用状態が検証される
