# 通知設計書 64-WINDOW_APPLY_WHIT_SETTING

## 概要

本ドキュメントは、Lua Language Server における `WINDOW_APPLY_WHIT_SETTING` 通知の設計仕様を定義する。この通知は、サードパーティライブラリの設定を適用する際に、設定ファイルへの永続化を伴う選択肢としてユーザーに表示されるボタンラベルとして使用される。

### 本通知の処理概要

**業務上の目的・背景**：Lua Language Serverは、ユーザーが使用しているサードパーティライブラリ（例：Defold、Love2D、OpenResty等）を自動検出し、適切な設定を適用する機能を持つ。この際、ユーザーに対して設定を適用するかどうか、そして設定を永続化するかどうかの選択肢を提示する。本通知は、設定を適用し、かつ設定ファイル（`.luarc.json`など）に保存する選択肢のボタンラベルとして使用される。

**通知の送信タイミング**：サードパーティライブラリが検出され、ユーザーに設定適用の確認を求める際に、`window/showMessageRequest`の選択肢の一つとして表示される。

**通知の受信者**：IDEやエディタを使用している開発者（ユーザー）に対して、ダイアログのボタンとして表示される。

**通知内容の概要**：「設定を変更して適用」という意味のボタンラベル。このボタンを選択すると、サードパーティライブラリの設定が適用され、設定ファイルに永続的に保存される。

**期待されるアクション**：ユーザーがこのボタンをクリックすると、サードパーティライブラリの設定（ライブラリパスの追加、プラグインの有効化など）が適用され、`.luarc.json`などの設定ファイルに書き込まれる。これにより、次回以降も同じ設定が自動的に適用される。

## 通知種別

アプリ内通知（LSP window/showMessageRequestの選択肢ボタン）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 非同期（ユーザー入力待ち） |
| 優先度 | 中（Info） |
| リトライ | 無 |

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

LSPプロトコルを通じて、接続中のクライアント（IDE/エディタ）に直接送信される。

## 通知テンプレート

### メール通知の場合

該当なし（LSP通知のみ）

### 本文テンプレート

英語:
```
Apply and modify settings
```

日本語:
```
設定を変更して適用します
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| なし | テンプレート変数は使用されない | - | - |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ファイル更新 | ファイル保存時にサードパーティライブラリのキーワード検出 | checkThirdParty設定が'Ask'の場合 | check3rdByWords関数で検出 |
| ファイル更新 | ファイル名パターンによるサードパーティライブラリ検出 | checkThirdParty設定が'Ask'の場合 | check3rdByFileName関数で検出 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| checkThirdParty='Disable' | サードパーティチェックが無効化されている |
| checkThirdParty='Apply' | 自動適用が有効で、ダイアログ表示しない |
| checkThirdParty='ApplyInMemory' | メモリ内適用が有効で、ダイアログ表示しない |
| hasAsked[cfg.name]=true | 既にそのライブラリについて確認済み |
| ライブラリが既に設定済み | workspace.libraryに既に含まれている |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[ファイル更新イベント] --> B[check3rd呼び出し]
    B --> C{サードパーティライブラリ検出?}
    C -->|No| D[終了]
    C -->|Yes| E{checkThirdParty設定}
    E -->|Disable| D
    E -->|Apply| F[apply3rd自動適用]
    E -->|ApplyInMemory| G[メモリ内適用]
    E -->|Ask| H[askFor3rd呼び出し]
    H --> I[window/showMessageRequest送信]
    I --> J{ユーザー選択}
    J -->|WINDOW_APPLY_WHIT_SETTING| K[apply3rdで永続化]
    J -->|WINDOW_APPLY_WHITOUT_SETTING| L[メモリ内のみ適用]
    J -->|WINDOW_DONT_SHOW_AGAIN| M[checkThirdParty無効化]
    K --> D
    L --> D
    M --> D
    F --> D
    G --> D
```

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

### 参照テーブル一覧

該当なし（データベースは使用しない）

### 更新テーブル一覧

該当なし（設定ファイルへの書き込みのみ）

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 設定ファイル書き込み失敗 | 権限不足やファイルロック | エラーメッセージを表示 |

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

制限なし（随時送信）

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

- サードパーティライブラリの設定変更は、ユーザーの明示的な同意を得てから行われる
- 設定ファイルの変更はユーザーのワークスペース内に限定される
- プラグインの有効化など、コード実行を伴う設定変更には信頼確認が別途必要

## 備考

- このボタンは`WINDOW_ASK_APPLY_LIBRARY`メッセージとともに表示される
- `WINDOW_APPLY_WHITOUT_SETTING`（設定を変更せずに適用）と`WINDOW_DONT_SHOW_AGAIN`（再度表示しない）との3択で表示される
- 設定の永続化は`.luarc.json`または`.luarc.jsonc`ファイルへの書き込みで行われる

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | library.lua | `script/library.lua` | サードパーティライブラリの設定構造（cfg）を理解する |

**読解のコツ**: `loadSingle3rdConfig`関数（340-383行目）で読み込まれる設定構造を確認する

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | library.lua | `script/library.lua` | check3rd関数（604-626行目）がサードパーティライブラリ検出の起点 |

**主要処理フロー**:
1. **609-615行**: checkThirdParty設定値の確認
2. **620-621行**: load3rdConfigでサードパーティ設定を読み込み

#### Step 3: ダイアログ表示ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | library.lua | `script/library.lua` | askFor3rd関数（476-517行目）でダイアログが表示される |

**主要処理フロー**:
- **490行**: WINDOW_APPLY_WHIT_SETTINGがボタンラベルとして設定される
- **493-495行**: window/showMessageRequestの送信
- **502-503行**: このボタンが選択された場合、apply3rdが呼び出される

#### Step 4: 設定適用ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | library.lua | `script/library.lua` | apply3rd関数（420-473行目）で設定が適用される |

**主要処理フロー**:
- **421-453行**: 設定変更内容の構築
- **472行**: client.setConfigで設定を適用

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

```
files.watch (658行)
    |
    └─ check3rd (605行)
           |
           ├─ load3rdConfig (620行)
           |
           ├─ check3rdByWords (624行)
           |      └─ askFor3rd (558行)
           |             |
           |             ├─ WINDOW_APPLY_WHIT_SETTING (490行)
           |             |
           |             └─ apply3rd (503行, onlyMemory=false)
           |                    └─ client.setConfig (472行)
           |
           └─ check3rdByFileName (625行)
                  └─ askFor3rd (598行)
```

### データフロー図

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

ファイル更新       ───▶  check3rd                 ───▶  (サードパーティ未検出)
                           |
                           v
                    load3rdConfig
                           |
                           v
                  check3rdByWords/FileName
                           |
                           v
                    askFor3rd (490行)
                           |
                           v
                window/showMessageRequest ───▶ ユーザー選択待ち
                           |
                           v (WINDOW_APPLY_WHIT_SETTING選択)
                    apply3rd
                           |
                           v
                  client.setConfig ───▶ 設定ファイル更新
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| library.lua | `script/library.lua` | ソース | サードパーティライブラリ検出と設定適用 |
| client.lua | `script/client.lua` | ソース | 設定変更処理とメッセージ送信 |
| script.lua | `locale/en-us/script.lua` | ローカライズ | 英語メッセージテンプレート |
| script.lua | `locale/ja-jp/script.lua` | ローカライズ | 日本語メッセージテンプレート |
