# 機能設計書 21-omz shop

## 概要

本ドキュメントは、Oh My Zshの`omz shop`コマンドの機能設計を定義するものである。このコマンドは、Oh My Zshグッズショップをユーザーのデフォルトブラウザで開くためのCLI機能を提供する。

### 本機能の処理概要

`omz shop`コマンドは、Oh My Zshプロジェクトの公式グッズショップURLをシステムのデフォルトブラウザで開く機能を提供する。

**業務上の目的・背景**：Oh My Zshはオープンソースプロジェクトであり、グッズ販売を通じてプロジェクトのサポートおよびコミュニティへの貢献を促進する。ユーザーが簡単にショップにアクセスできるよう、CLIから直接ブラウザを起動する機能を提供している。

**機能の利用シーン**：ユーザーがOh My Zshプロジェクトを支援するためにグッズを購入したい場合、ターミナルから`omz shop`と入力するだけでショップページにアクセスできる。コマンドラインで作業中に、ブラウザを手動で開いてURLを入力する手間を省く。

**主要な処理内容**：
1. ショップURLの定義（commitgoods.comのOh My Zshコレクションページ）
2. 情報ログの出力（ショップを開く旨とURLを表示）
3. `open_command`関数を使用してクロスプラットフォーム対応でブラウザを起動

**関連システム・外部連携**：
- `open_command`関数（lib/functions.zsh）を使用してブラウザを起動
- 外部URL（https://commitgoods.com/collections/oh-my-zsh）へのアクセス

**権限による制御**：特になし。すべてのユーザーが利用可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 16 | omz shop | 主画面 | omzコマンドの統合CLIインターフェースを通じてショップを開く |

## 機能種別

外部連携（ブラウザ起動）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| なし | - | - | このコマンドは引数を取らない | - |

### 入力データソース

コマンドライン引数（引数なし）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 情報メッセージ | 文字列 | 「Opening Oh My Zsh shop in your browser...」のログメッセージ |
| URL | 文字列 | ショップのURL |

### 出力先

- 標準エラー出力（ログメッセージ）
- システムのデフォルトブラウザ（ショップページ）

## 処理フロー

### 処理シーケンス

```
1. ショップURLを定義
   └─ shop_url="https://commitgoods.com/collections/oh-my-zsh"
2. ログメッセージを出力（情報レベル）
   └─ "Opening Oh My Zsh shop in your browser..."
3. URLをログに出力
   └─ shop_urlの内容を表示
4. open_command関数を呼び出し
   └─ ブラウザでショップURLを開く
```

### フローチャート

```mermaid
flowchart TD
    A[開始: omz shop] --> B[ショップURLを定義]
    B --> C[情報ログを出力]
    C --> D[URLをログに出力]
    D --> E[open_command関数を呼び出し]
    E --> F[ブラウザでショップページを表示]
    F --> G[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-21-01 | 固定URL使用 | ショップURLはハードコードされており、変更不可 | 常時 |
| BR-21-02 | クロスプラットフォーム対応 | open_commandを使用してOS毎に適切なコマンドでブラウザを起動 | 常時 |

### 計算ロジック

該当なし

## データベース操作仕様

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

該当なし（データベース操作は行わない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | プラットフォーム非対応 | 未対応のOSで実行した場合 | open_commandが「Platform $OSTYPE not supported」メッセージを出力 |
| - | ブラウザ起動失敗 | ブラウザが見つからない、または起動できない場合 | open_commandの戻り値で検出可能 |

### リトライ仕様

リトライ機能なし

## トランザクション仕様

該当なし

## パフォーマンス要件

特になし（ブラウザ起動のみの軽量処理）

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

- 固定URLのみを開くため、URLインジェクションのリスクはない
- 外部サイトへのアクセスとなるため、ネットワーク接続が必要

## 備考

- ショップはCommit Goods社のプラットフォーム上でホストされている
- 売上の一部がOh My Zshプロジェクトの維持に使用される

---

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

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

### 推奨読解順序

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

`_omz::shop`関数がこの機能のエントリーポイントである。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | cli.zsh | `lib/cli.zsh` | _omz::shop関数の実装を確認 |

**主要処理フロー**:
1. **726行目**: `_omz::shop`関数の定義開始
2. **727行目**: ショップURLを`shop_url`変数に格納
3. **729-730行目**: `_omz::log info`で情報メッセージを出力
4. **732行目**: `open_command`関数を呼び出してブラウザを起動

**読解のコツ**: この関数は非常にシンプルで、3つのステップ（URL定義、ログ出力、ブラウザ起動）のみで構成されている。

#### Step 2: 依存関数を理解する

`open_command`関数がブラウザ起動の実装を担当している。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | functions.zsh | `lib/functions.zsh` | open_command関数の実装を確認 |

**主要処理フロー**:
- **16行目**: `open_command`関数の定義開始
- **20-34行目**: `$OSTYPE`に基づいてプラットフォーム毎のopenコマンドを決定
  - darwin (macOS): `open`
  - cygwin: `cygstart`
  - linux: `xdg-open`（WSLの場合は`cmd.exe /c start`）
  - msys: `start`
- **38-41行目**: `$BROWSER`環境変数が設定されている場合はそれを使用
- **43行目**: 決定したコマンドでURLを開く

#### Step 3: ログ出力関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | cli.zsh | `lib/cli.zsh` | _omz::log関数の実装を確認 |

**主要処理フロー**:
- **137-162行目**: `_omz::log`関数の実装
- **155-161行目**: ログタイプに応じた色付き出力の実装
- **158行目**: `info`タイプは緑色で出力

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

```
omz shop (ユーザー入力)
    │
    └─ _omz::shop (lib/cli.zsh:726-733)
           │
           ├─ _omz::log info (lib/cli.zsh:137-162)
           │      └─ print -P (色付きログ出力)
           │
           └─ open_command (lib/functions.zsh:16-44)
                  └─ OS固有のopenコマンド実行
```

### データフロー図

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

                     ┌─────────────────┐
なし ──────────────▶│ _omz::shop      │──────▶ ログメッセージ (stderr)
                     │                 │
                     │ shop_url定義    │
                     │ ログ出力        │
                     │ open_command    │──────▶ ブラウザ (外部プロセス)
                     └─────────────────┘
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| cli.zsh | `lib/cli.zsh` | ソース | omzコマンドのメインCLI実装、_omz::shop関数を含む |
| functions.zsh | `lib/functions.zsh` | ソース | open_command関数の実装を含むユーティリティ集 |
