# 画面設計書 14-インストールログ通知

## 概要

DCD等のコンポーネントのインストール進捗を `coded/logInstall` 通知でクライアントに送信し、エディタ上でインストール状況をログ表示する通知画面の設計書である。

### 本画面の処理概要

本画面は、DCDのコンパイルまたはダウンロードによる更新処理中に、進捗メッセージを `coded/logInstall` カスタム通知としてクライアントに逐次送信する処理を担当する。エディタ側ではこのログをOutput Channel等に表示し、ユーザーがインストールの進行状況を確認できるようにする。

**業務上の目的・背景**：DCDの更新処理（ソースからのコンパイルまたはバイナリのダウンロード）は時間がかかる操作であり、処理中にユーザーに進捗を通知することで、処理が正常に進行していることを確認でき、安心感を提供する。

**画面へのアクセス方法**：本通知はDCD更新処理（served/updateDCD）の実行時に自動的にトリガーされる。ユーザーがDCD更新を開始する操作（DCD更新確認ダイアログでのコンパイル/ダウンロード選択、またはaggressiveUpdate設定による自動更新）を行うと、updateDCD関数内で複数回のcoded/logInstall通知が送信される。

**主要な操作・処理内容**：
1. DCD更新処理の開始メッセージ送信（"Installing DCD" または理由付きメッセージ）
2. 既存DCDファイルのクリーンアップ
3. ソースからのコンパイルまたはバイナリダウンロードの進捗通知
4. ダウンロードURLの通知
5. 展開処理の進捗通知
6. 成功または失敗のメッセージ送信

**画面遷移**：DCD更新確認ダイアログ（No.4）からの遷移で本通知が発生する。更新完了後は設定更新通知（No.15）が送信される。

**権限による表示制御**：権限による表示制御は存在しない。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 63 | DCD更新 (served/updateDCD) | 主機能 | DCD更新処理の進捗をcoded/logInstall通知でクライアントに送信する |

## 画面種別

通知（ログ通知）

## URL/ルーティング

LSPカスタム通知: `coded/logInstall`（サーバーからクライアントへの通知）

トリガー元: `served/updateDCD`

## 入出力項目

| 項目名 | 型 | 入力/出力 | 説明 |
|--------|-----|----------|------|
| message | string | 出力 | ログメッセージ文字列 |

## 表示項目

| 項目名 | 表示形式 | 説明 |
|--------|----------|------|
| インストールログ | テキスト（Output Channel） | coded/logInstallで受信した各メッセージをログとして表示 |

## イベント仕様

### 1-DCD更新開始

updateDCD関数開始時に初期メッセージを送信する。

1. dcdUpdateReasonが設定されている場合: "Installing DCD: {理由}" を送信
2. 設定されていない場合: "Installing DCD" を送信

### 2-ダウンロード進捗通知

バイナリダウンロード方式の場合:

1. "Downloading from {URL} to {outputFolder}" メッセージ送信
2. 既存ファイルが存在する場合: "Zip file already exists! Trying to install existing zip." 送信
3. "Extracting download..." メッセージ送信
4. tar展開の場合: "> tar xvfz {ファイル名}" および展開出力の各行を逐次送信

### 3-結果通知

1. 成功時: "Successfully installed DCD" 送信
2. 失敗時: "DCD install failed" 送信
3. 実行ファイルが見つからない場合: 手動設定を促すメッセージを送信

## データベース更新仕様

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| なし | なし | なし | データベースアクセスなし |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 条件 |
|-------------|------|---------------|------|
| MSG-14-01 | ログ | "Installing DCD: {dcdUpdateReason}" | DCD更新開始時（理由あり） |
| MSG-14-02 | ログ | "Installing DCD" | DCD更新開始時（理由なし） |
| MSG-14-03 | ログ | "Downloading from {url} to {outputFolder}" | バイナリダウンロード時 |
| MSG-14-04 | ログ | "Zip file already exists! Trying to install existing zip." | 既存アーカイブファイルがある場合 |
| MSG-14-05 | ログ | "Extracting download..." | 展開処理開始時 |
| MSG-14-06 | ログ | "> tar xvfz {baseName}" | tar展開コマンド表示 |
| MSG-14-07 | ログ | "Successfully installed DCD" | DCD更新成功時 |
| MSG-14-08 | ログ | "DCD install failed" | DCD更新失敗時 |
| MSG-14-09 | ログ | "Successfully downloaded DCD, but could not find the executables." | 実行ファイル未検出時 |
| MSG-14-10 | ログ | "Failed installing: {exception}" | ダウンロード/展開中の例外発生時 |

## 例外処理

| 例外条件 | 処理内容 |
|----------|----------|
| ダウンロード失敗 | "Failed installing: {例外情報}" をログ送信。手動ダウンロードを案内するメッセージも送信 |
| 実行ファイルが見つからない | 手動パス設定を案内するメッセージを送信 |
| --version実行失敗 | 実行結果を含むエラーメッセージを送信 |

## 備考

- coded/logInstallはserve-d独自のカスタムLSP通知であり、標準LSPプロトコルには含まれない
- クライアント側（code-d拡張機能）では、この通知をOutput Channelに表示する
- DCD更新はソースコンパイルとバイナリダウンロードの2方式があり、プラットフォームに応じて自動選択される

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | dcd_update.d | `source/served/commands/dcd_update.d` | dcdUpdateReason, dcdUpdatingグローバル変数（80-81行目） |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | dcd_update.d | `source/served/commands/dcd_update.d` | updateDCD関数（82-307行目）がメイン処理 |

**主要処理フロー**:
1. **91-94行目**: 開始メッセージをcoded/logInstallで送信
2. **96-112行目**: 既存DCDファイルのクリーンアップ
3. **133-153行目**: ソースからのコンパイル処理
4. **155-237行目**: バイナリダウンロード処理（URL構築、ダウンロード、展開）
5. **185行目**: "Downloading from..." ログ送信
6. **277行目**: 成功時の "Successfully installed DCD" ログ送信
7. **305行目**: 失敗時の "DCD install failed" ログ送信

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

```
served/updateDCD [dcd_update.d:82]
    |
    +-- rpc.notifyMethod("coded/logInstall", 開始メッセージ) [dcd_update.d:92-94]
    |
    +-- [ソースコンパイルの場合]
    |       +-- compileDependency() [dcd_update.d:135]
    |
    +-- [バイナリダウンロードの場合]
    |       +-- rpc.notifyMethod("coded/logInstall", "Downloading...") [dcd_update.d:185]
    |       +-- downloadFile() [dcd_update.d:191]
    |       +-- rpc.notifyMethod("coded/logInstall", "Extracting...") [dcd_update.d:193]
    |       +-- tar/zip展開 [dcd_update.d:196-213]
    |       +-- rpc.notifyMethod("coded/logInstall", 各行出力) [dcd_update.d:200]
    |
    +-- rpc.notifyMethod("coded/logInstall", 結果メッセージ) [dcd_update.d:277/305]
    +-- rpc.notifyMethod("coded/updateSetting", ...) [dcd_update.d:270-273]
```

### データフロー図

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

served/updateDCD       +-- updateDCD()                  +-- coded/logInstall通知
（DCD更新リクエスト）        |                                  （複数回）
                             +-- ソースコンパイル
dcdUpdateReason             または                       +-- coded/updateSetting通知
（更新理由文字列）           +-- バイナリダウンロード            （DCDパス設定）
                             +-- 展開・検証
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| dcd_update.d | `source/served/commands/dcd_update.d` | ソース | updateDCD関数（82-307行目）メイン実装 |
| git_build.d | `source/served/io/git_build.d` | ソース | compileDependency関数（ソースからのビルド） |
| http_wrap.d | `source/served/io/http_wrap.d` | ソース | downloadFile関数（バイナリダウンロード） |
| extension.d | `source/served/extension.d` | ソース | doGlobalStartup内でのupdateDCD呼び出し（438-439行目） |
