# 通知設計書 80-CLI_CHECK_SUCCESS

## 概要

本ドキュメントは、Lua Language Serverにおける `CLI_CHECK_SUCCESS` 通知の設計を記述する。この通知は、CLIでの診断チェック機能が正常に完了し、問題が見つからなかった場合に表示される成功メッセージとして使用される。

### 本通知の処理概要

この通知は、コマンドラインから診断チェック機能を実行し、すべてのファイルの診断が完了した後、診断結果に問題が0件だった場合に表示される成功メッセージである。

**業務上の目的・背景**：Lua Language Serverの診断チェック機能は、ワークスペース内のLuaファイルを静的解析して問題を検出する。問題が見つからなかった場合、ユーザーに明確な成功メッセージを表示することで、コードの品質が確認されたことを伝える。CI/CDパイプラインでの品質ゲートとして利用する際にも、正常終了を明示的に示すことが重要である。

**通知の送信タイミング**：CLIモードでcheck機能を実行し、すべてのファイルの診断が完了した後、診断結果のカウントが0の場合に表示される。

**通知の受信者**：CLIを使用してLua Language Serverの診断機能を実行している開発者またはCI/CDシステム。

**通知内容の概要**：「診断が完了しました。問題は見つかりませんでした」という成功メッセージ。

**期待されるアクション**：ユーザーはコードの品質が確認されたことを認識する。CI/CDでは次のステップに進む。

## 通知種別

CLI出力（標準出力）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（print関数） |
| 優先度 | 通常（成功） |
| リトライ | なし |

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

標準出力（stdout）に直接出力される。

## 通知テンプレート

### CLI出力の場合

| 項目 | 内容 |
|-----|------|
| 出力先 | stdout |
| 形式 | プレーンテキスト |

### 本文テンプレート

```
日本語: 診断が完了しました。問題は見つかりませんでした
英語: Diagnosis completed, no problems found
```

### 添付ファイル

なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| - | テンプレート変数なし | - | - |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| CLI実行 | check_worker.runCLI() | quiet == false かつ count == 0 | 診断完了で問題なし |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| quiet モード | quiet変数がtrueの場合、メッセージは表示されない |
| 問題あり | count > 0 の場合、代わりにCLI_CHECK_RESULTS系メッセージが表示される |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[診断処理完了] --> B[結果カウント]
    B --> C{count == 0?}
    C -->|No| D[CLI_CHECK_RESULTS系表示]
    C -->|Yes| E{quiet?}
    E -->|Yes| F[メッセージ表示スキップ]
    E -->|No| G[CLI_CHECK_SUCCESS表示]
    D --> H[終了コード1で終了]
    F --> I[終了コード0で終了]
    G --> I
```

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

### 参照テーブル一覧

本通知はデータベースを使用しない。

### テーブル別参照項目詳細

該当なし

### 更新テーブル一覧

該当なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 出力エラー | stdout への書き込み失敗 | Luaランタイムエラー |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0回（リトライなし） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし

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

- 固定メッセージのため、機密情報の漏洩リスクはない
- ユーザー入力は含まれない

## 備考

- 終了コード0で正常終了する
- count > 0 の場合は終了コード1で異常終了となり、別のメッセージが表示される
- JSON出力モード（CHECK_FORMAT == 'json'）でも、成功メッセージは表示される

---

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

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

### 推奨読解順序

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

まず、通知で使用されるローカライズ文字列の定義を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | script.lua | `locale/ja-jp/script.lua` | CLI_CHECK_SUCCESSの日本語定義（673-674行目）を確認 |
| 1-2 | script.lua | `locale/en-us/script.lua` | CLI_CHECK_SUCCESSの英語定義（672-673行目）を確認 |

**読解のコツ**: このメッセージにはテンプレート変数がなく、固定文字列である。

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

処理の起点となるCLI処理を特定する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | check_worker.lua | `script/cli/check_worker.lua` | runCLI関数（178-293行目） |

**主要処理フロー**:
1. **267-273行目**: 診断結果のカウント処理
2. **283行目**: quietフラグのチェック
3. **284行目**: count == 0のチェック
4. **285行目**: print(lang.script('CLI_CHECK_SUCCESS'))の実行
5. **292行目**: 終了コードの決定（count == 0 ? 0 : 1）

#### Step 3: 結果カウント処理を理解する

診断結果のカウント方法を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | check_worker.lua | `script/cli/check_worker.lua` | 結果カウント処理（267-273行目） |

**主要処理フロー**:
- resultsテーブルをイテレートして診断件数をカウント
- 空の結果（#result == 0）は結果テーブルから削除

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

```
CLI起動 (main.lua)
    |
    +-- check_worker.runCLI() (check_worker.lua:178)
           |
           +-- 診断処理実行 (246-261行目)
           |      |
           |      +-- files.getChildFiles(rootUri)
           |      +-- diag.doDiagnostic(uri, true)
           |      +-- results に診断結果格納
           |
           +-- 結果カウント (267-273行目)
           |      |
           |      +-- count = count + #result
           |
           +-- if not quiet then (283行目)
                  |
                  +-- if count == 0 then (284行目)
                         |
                         +-- print(lang.script('CLI_CHECK_SUCCESS')) (285行目)
                         |
                         +-- return 0 (292行目: count == 0 and 0 or 1)
```

### データフロー図

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

診断結果 ─────────▶ 結果カウント
(results)                  |
                           v
                     count = sum(#result)
                           |
                           v
                     count == 0 ? ────▶ count > 0 → CLI_CHECK_RESULTS系
                           |
                           | count == 0
                           v
                     quiet チェック ────▶ quiet == true → 出力なし
                           |
                           | quiet == false
                           v
                     lang.script() ─────▶ ロケールから
                           |               メッセージ取得
                           v
                     print() ───────────▶ stdout: "診断が完了しました..."
                           |
                           v
                     return 0 ──────────▶ 終了コード: 0
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| check_worker.lua | `script/cli/check_worker.lua` | ソース | CLIチェック処理のワーカー |
| diag.lua | `script/core/diagnostics/diag.lua` | ソース | 診断処理 |
| files.lua | `script/files.lua` | ソース | ファイル管理 |
| script.lua | `locale/ja-jp/script.lua` | ローカライズ | 日本語メッセージ定義 |
| script.lua | `locale/en-us/script.lua` | ローカライズ | 英語メッセージ定義 |
