# 通知設計書 10-アップデート完了メッセージ（最新版）

## 概要

本ドキュメントは、Oh My Zshのアップデート機能における「既に最新版」の場合のメッセージ通知について、その設計仕様を定義するものである。

### 本通知の処理概要

Oh My Zshは、更新処理（omz updateまたは自動更新）を実行した結果、既にローカルのコードが最新版である場合に、その旨をユーザーに通知するメッセージを表示する機能を提供する。

**業務上の目的・背景**：ユーザーが更新コマンドを実行した際、実際に更新が行われたのか、既に最新だったのかを明確に区別して伝えることは重要である。「既に最新版」のメッセージを表示することで、ユーザーは自分の環境が最新であることを確認でき、更新が正常に完了したことを理解できる。また、不要な更新作業を行わなかったことも認識できる。

**通知の送信タイミング**：upgrade.shスクリプトが実行され、git pullが成功した後、ローカルHEADと更新後のHEADが同一である場合（つまり、更新が行われなかった場合）にメッセージが表示される。

**通知の受信者**：更新コマンドを実行したユーザー自身。ターミナル上にテキストメッセージとして表示される。

**通知内容の概要**：「Oh My Zsh is already at the latest version.」というメッセージがターミナルに表示される。verbose_mode設定により、アスキーアートの有無や表示スタイルが変わる。

**期待されるアクション**：受信者は自分の環境が最新であることを認識し、通常の作業を継続する。

## 通知種別

ターミナルテキスト出力

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（printf によるテキスト出力） |
| 優先度 | 低 |
| リトライ | 無し |

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

現在のシェルセッションの標準出力に対してメッセージを出力する。verbose_mode設定により表示形式が変わる。

## 通知テンプレート

### ターミナル出力の場合

| 項目 | 内容 |
|-----|------|
| メッセージ | `Oh My Zsh is already at the latest version.` |
| 色 | 青色（${BLUE}...${RESET}） |
| 表示形式 | verbose_modeにより異なる |

### verbose_mode別の表示形式

| verbose_mode | 表示内容 |
|--------------|---------|
| default | アスキーアート + メッセージ + SNS/ショップ案内 |
| minimal | メッセージのみ |
| silent | 表示なし |

### 本文テンプレート（default/minimal）

```
Oh My Zsh is already at the latest version.
```

### 本文テンプレート（default完全版）

```
         __                                     __
  ____  / /_     ____ ___  __  __   ____  _____/ /_
 / __ \/ __ \   / __ `__ \/ / / /  /_  / / ___/ __ \
/ /_/ / / / /  / / / / / / /_/ /    / /_(__  ) / / /
\____/_/ /_/  /_/ /_/ /_/\__, /    /___/____/_/ /_/
                        /____/

Oh My Zsh is already at the latest version.

To keep up with the latest news and updates, follow us on X: @ohmyzsh
Want to get involved in the community? Join our Discord: Discord server
Get your Oh My Zsh swag at: CommitGoods Shop
```

### 添付ファイル

| ファイル名 | 形式 | 条件 | 説明 |
|----------|------|------|------|
| N/A | - | - | 添付ファイルなし |

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| message | 表示メッセージ | 固定文字列 | Yes |
| verbose_mode | 表示詳細度 | zstyle :omz:update verbose | No（デフォルトdefault） |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| スクリプト実行 | upgrade.sh内のgit pull成功後 | last_commit == HEAD（更新なし） | 既に最新版の場合 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| verbose_mode=silent | サイレントモードの場合は表示なし |
| 更新あり | last_commit != HEAD の場合は別のメッセージ（更新成功）を表示 |
| git pull失敗 | エラーメッセージを表示 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[upgrade.sh実行] --> B[git pull --quiet --rebase]
    B --> C{pull成功?}
    C -->|No| D[エラーメッセージ表示]
    C -->|Yes| E{HEADが変わった?}
    E -->|Yes| F[更新成功メッセージ表示]
    E -->|No| G[message='Oh My Zsh is already at the latest version.']
    G --> H{verbose_mode?}
    H -->|default| I[アスキーアート + メッセージ + SNS案内表示]
    H -->|minimal| J[メッセージのみ表示]
    H -->|silent| K[表示なし]
    D --> L[終了]
    F --> L
    I --> L
    J --> L
    K --> L
```

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

### 参照テーブル一覧

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

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| N/A | - | データベース不使用 |

### シェル変数・zstyle一覧

| 設定名 | 用途 | デフォルト値 |
|--------|------|-------------|
| :omz:update verbose | 表示詳細度（default/minimal/silent） | default |
| last_commit | git pull前のHEAD | git rev-parseで取得 |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| git操作エラー | git rev-parse等が失敗 | エラーメッセージを表示 |

### リトライ仕様

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

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 表示頻度 | 更新実行ごとに1回 |

### 配信時間帯

制限なし（更新実行時）

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

- メッセージは固定文字列であり、機密情報は含まれない
- ローカル出力のみであり、ネットワーク経由での送信は行われない

## 備考

- アスキーアートは7色のレインボーカラーで表示される（truecolor対応端末の場合はより多くの色を使用）
- SNS案内にはX（旧Twitter）、Discord、CommitGoods Shopへのリンクが含まれる
- ハイパーリンク対応端末では、リンクがクリック可能な形式で表示される
- p10k instant promptが有効な場合は自動的にsilentモードになる
- -iオプション（interactive）と-vオプション（verbose）でモードを指定可能

---

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

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

### 推奨読解順序

#### Step 1: verbose_mode設定を理解する

表示詳細度の設定方法を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | upgrade.sh | `tools/upgrade.sh` | 23行目、26-35行目のverbose_mode設定を確認 |

**読解のコツ**: コマンドライン引数（-v オプション）でverbose_modeを指定できる。

#### Step 2: 更新判定ロジックを理解する

git pullの結果による分岐を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | upgrade.sh | `tools/upgrade.sh` | 245-263行目の更新判定ロジックを確認 |

**主要処理フロー**:
- **239行目**: `last_commit=$(git rev-parse "$branch")` - 更新前のHEAD取得
- **245行目**: `if LANG= git pull --quiet --rebase $remote $branch; then` - git pull実行
- **247行目**: `if [[ "$(git rev-parse HEAD)" = "$last_commit" ]]; then` - 更新有無判定
- **248行目**: `message="Oh My Zsh is already at the latest version."` - 最新版メッセージ設定

#### Step 3: メッセージ表示処理を理解する

verbose_mode別の表示処理を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | upgrade.sh | `tools/upgrade.sh` | 265-279行目のメッセージ表示処理を確認 |

**主要処理フロー**:
- **265行目**: `if [[ $verbose_mode == default ]]; then` - defaultモード判定
- **266-272行目**: アスキーアート表示
- **273行目**: `printf "${BLUE}%s${RESET}\n\n" "$message"` - メッセージ表示
- **274-276行目**: SNS/ショップ案内表示
- **277-278行目**: minimalモードの表示

#### Step 4: アスキーアート表示を理解する

レインボーカラーのアスキーアート表示を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | upgrade.sh | `tools/upgrade.sh` | 161-192行目のRAINBOW配列と色設定を確認 |

**主要処理フロー**:
- **163-184行目**: truecolor/256色の判定とRAINBOW配列設定
- **186-191行目**: RED/GREEN/YELLOW/BLUE/BOLD/RESET変数設定

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

```
[omz update 実行] または [自動更新]
    │
    └─ upgrade.sh 実行
           │
           ├─ verbose_mode設定 (23行目, 26-35行目)
           │
           ├─ last_commit取得 (239行目)
           │
           ├─ git pull --quiet --rebase (245行目)
           │      │
           │      └─ 成功
           │
           └─ [HEAD == last_commit?] (247行目)
                  │
                  ├─ Yes ──▶ message="Oh My Zsh is already at the latest version."
                  │          │
                  │          └─ [verbose_mode?]
                  │                 │
                  │                 ├─ default ──▶ アスキーアート表示 (266-272行目)
                  │                 │              printf "$message" (273行目)
                  │                 │              SNS案内表示 (274-276行目)
                  │                 │
                  │                 ├─ minimal ──▶ printf "$message" (278行目)
                  │                 │
                  │                 └─ silent ──▶ 表示なし
                  │
                  └─ No ──▶ message="Hooray! Oh My Zsh has been updated!"
```

### データフロー図

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

git rev-parse HEAD ─────────▶ upgrade.sh
(last_commit)                      │
                                   │
git pull 結果 ────────────────────▶├─ 更新判定
                                   │
git rev-parse HEAD ───────────────▶├─ 新HEAD取得
(更新後)                           │
                                   │
zstyle :omz:update verbose ───────▶├─ verbose_mode判定
                                   │
                                   └─ [last_commit == 新HEAD?]
                                          │
                                          └─ Yes ──▶ message設定
                                                    │
                                                    └─ 表示処理 ──▶ stdout
                                                                    │
                                                                    ├─ アスキーアート
                                                                    ├─ "Oh My Zsh is already..."
                                                                    └─ SNS案内
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| upgrade.sh | `tools/upgrade.sh` | ソース | メイン更新スクリプト、メッセージ表示ロジックを含む |
| check_for_upgrade.sh | `tools/check_for_upgrade.sh` | ソース | 更新確認とupgrade.sh呼び出し |
