# 通知設計書 15-coded/updateDubTree

## 概要

本ドキュメントは、カスタム通知 `coded/updateDubTree` の設計仕様を定義する。この通知はサーバー（serve-d）からクライアント（エディタ）に送信され、Dubの依存関係ツリーが更新されたことを通知する。

### 本通知の処理概要

`coded/updateDubTree` 通知は、Dubプロジェクトの依存関係ツリーに変更があった際にクライアントへ送信される通知である。クライアントはこの通知を受けて、依存関係ツリーのUI表示を再取得・更新する。パラメータはなし。

**業務上の目的・背景**：D言語のパッケージマネージャーであるDubの依存関係ツリーは、dub.json/dub.sdlの編集やインポートパスの更新によって変化する。エディタ側の依存関係ツリービューを最新状態に保つため、変更があったことをクライアントに通知する必要がある。

**通知の送信タイミング**：(1) `served/updateImports` リクエストで依存関係の更新が成功した場合、(2) `textDocument/didSave` でdub.json/dub.sdlが保存された場合に送信される。

**通知の受信者**：LSPクライアント（エディタ拡張機能）が受信する。クライアントはDubの依存関係ツリービューを再描画する。

**通知内容の概要**：パラメータなし。依存関係ツリーが更新されたという事実のみを通知する。

**期待されるアクション**：クライアントは `served/listDependencies` リクエストを再度発行して最新の依存関係ツリーを取得し、UIを更新する。

## 通知種別

LSPカスタム通知（JSON-RPC notification）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 非同期 |
| 優先度 | 中 |
| リトライ | 無し |

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

サーバーからクライアントへの一方向通知。LSP接続で確立されたクライアントプロセスに固定。

## 通知テンプレート

### JSON-RPC通知メッセージ

| 項目 | 内容 |
|-----|------|
| メソッド名 | `coded/updateDubTree` |
| パラメータ型 | なし |
| レスポンス | なし（通知） |

### メッセージ構造

```json
{
  "jsonrpc": "2.0",
  "method": "coded/updateDubTree"
}
```

### 添付ファイル

該当なし。

## テンプレート変数

該当なし（パラメータなし）。

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| API | served/updateImports成功 | DubComponent.update成功 | updateImports関数でDub更新が成功した場合（dub.d L224） |
| ファイル保存 | dub.json/dub.sdl保存 | DubComponent稼働中 | onDidSaveDubRecipe関数の最終ステップ（dub.d L324） |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| updateImportsでDub更新失敗 | Dub更新が失敗した場合、updateImports内では送信されない |
| DubComponent未稼働 | ワークスペースにDubComponentがない場合は送信されない |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A{トリガー種別} --> B[updateImports呼び出し]
    A --> C[dub.json/dub.sdl保存]
    B --> D[DubComponent.update実行]
    D --> E{更新成功?}
    E -->|Yes| F[coded/updateDubTree送信]
    E -->|No| G[送信スキップ]
    C --> H[Dubレシピ更新処理]
    H --> I[coded/updateDubTree送信]
    F --> J[終了]
    G --> J
    I --> J
```

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

### 参照テーブル一覧

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

### 更新テーブル一覧

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

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| クライアント未対応 | クライアントがcoded/updateDubTreeをハンドリングしない | 通知は無視される。依存関係ツリーは手動更新が必要 |

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

制限なし。

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

- パラメータなしのため、個人情報漏洩のリスクはない

## 備考

- `coded/initDubTree`（No.16）はDubプロジェクト初回ロード時の初期化通知であり、`coded/updateDubTree` は以降の更新通知として機能する
- dub.d L324の送信はsetTimeoutの外で直接呼ばれるため、Dubレシピ保存時に即座に送信される

---

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

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

### 推奨読解順序

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

本通知にはパラメータがないため、特別なデータ構造はない。

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

coded/updateDubTreeの送信箇所を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | dub.d | `source/served/commands/dub.d` | updateImports関数（L213-232）でのDub更新成功時の送信（L224） |
| 2-2 | dub.d | `source/served/commands/dub.d` | onDidSaveDubRecipe関数（L234-325）でのDubレシピ保存時の送信（L324） |

**主要処理フロー（updateImports）**:
1. **L220-222**: DubComponent.update()を実行
2. **L223-224**: 更新成功時に `coded/updateDubTree` を送信

**主要処理フロー（onDidSaveDubRecipe）**:
1. **L237-239**: 保存されたファイルがdub.json/dub.sdlか確認
2. **L246-286**: Dub更新処理の実行
3. **L324**: `coded/updateDubTree` を送信

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

```
[パターン1: updateImports]
updateImports (dub.d:213)
    |
    +-- DubComponent.update()
    |
    +-- [成功時] rpc.notifyMethod("coded/updateDubTree") (L224)

[パターン2: onDidSaveDubRecipe]
onDidSaveDubRecipe (dub.d:234)
    |
    +-- DubComponent更新処理
    |
    +-- rpc.notifyMethod("coded/updateDubTree") (L324)
```

### データフロー図

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

served/updateImports      updateImports()           coded/updateDubTree
リクエスト           --> (dub.d:213-232) --------> (パラメータなし)

textDocument/didSave      onDidSaveDubRecipe()      coded/updateDubTree
(dub.json/dub.sdl)   --> (dub.d:234-325) --------> (パラメータなし)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| dub.d | `source/served/commands/dub.d` | ソース | coded/updateDubTreeの送信元（updateImportsおよびonDidSaveDubRecipe） |
