# バッチ設計書 1-install.sh

## 概要

本ドキュメントは、Oh My Zshのインストール処理を実行するシェルスクリプト`install.sh`のバッチ設計書である。このスクリプトはOh My Zshフレームワークをユーザー環境にセットアップするための中核的なインストーラーとして機能する。

### 本バッチの処理概要

このバッチはOh My Zshフレームワークのインストールを自動化し、Zshシェル環境の強化を実現する。curl、wget、またはfetchコマンドを通じてリモートから実行可能であり、ユーザーの介入を最小限に抑えながら完全なセットアップを行う。

**業務上の目的・背景**：Oh My ZshはZshシェルの拡張フレームワークであり、プラグイン、テーマ、便利なエイリアスを提供する。このインストールスクリプトは、新規ユーザーがフレームワークを容易に導入できるようにし、手動設定の複雑さを排除することを目的としている。開発者やシステム管理者の生産性向上に寄与する重要なツールである。

**バッチの実行タイミング**：ユーザーによる手動実行（随時）。新規インストール時に1回実行される。curl/wget/fetchコマンドを介してリモートから直接実行するか、ローカルにダウンロード後に実行する。

**主要な処理内容**：
1. 環境変数の初期化と検証（USER、HOME、ZSH、ZDOTDIR等）
2. Zshのインストール有無確認
3. 既存のOh My Zshディレクトリの存在チェック
4. GitHubからOh My Zshリポジトリをクローン（git init、remote add、fetch、checkout）
5. 既存の.zshrcファイルのバックアップと新規.zshrcの生成
6. デフォルトシェルのZshへの変更（オプション）
7. インストール完了メッセージの表示
8. 新しいZshセッションの起動（オプション）

**前後の処理との関連**：このスクリプトは単独で実行される初期セットアップバッチである。インストール後は`upgrade.sh`（No.3）による更新、`uninstall.sh`（No.2）によるアンインストールが可能になる。

**影響範囲**：ユーザーのホームディレクトリ（$HOME/.oh-my-zsh、$HOME/.zshrc）、シェル設定（/etc/shells、デフォルトシェル）

## バッチ種別

インストール処理 / 環境構築

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（初回インストール時） |
| 実行時刻 | 任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動実行（curl/wget/fetch経由またはローカル実行） |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Zshインストール済み | zshコマンドが利用可能であること |
| Gitインストール済み | gitコマンドが利用可能であること |
| インターネット接続 | GitHubへのアクセスが可能であること |
| $ZSHディレクトリ未存在 | 既存のOh My Zshがインストールされていないこと |

### 実行可否判定

1. `command -v zsh`でZshの存在を確認。存在しない場合はエラー終了
2. `$ZSH`ディレクトリ（デフォルト: `$HOME/.oh-my-zsh`）が既に存在する場合はエラー終了
3. `command -v git`でGitの存在を確認。存在しない場合はエラー終了

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| --unattended | フラグ | No | - | 非対話モード（RUNZSH=no, CHSH=no, OVERWRITE_CONFIRMATION=no） |
| --skip-chsh | フラグ | No | - | デフォルトシェル変更をスキップ |
| --keep-zshrc | フラグ | No | - | 既存の.zshrcを保持 |

### 環境変数

| 環境変数名 | 必須 | デフォルト値 | 説明 |
|-----------|-----|-------------|------|
| ZDOTDIR | No | 未設定 | Zsh dotfilesディレクトリのパス |
| ZSH | No | $HOME/.oh-my-zsh | Oh My Zshリポジトリのパス |
| REPO | No | ohmyzsh/ohmyzsh | GitHubリポジトリ名 |
| REMOTE | No | https://github.com/${REPO}.git | Gitリモートの完全URL |
| BRANCH | No | master | チェックアウトするブランチ |
| CHSH | No | yes | デフォルトシェル変更の可否 |
| RUNZSH | No | yes | インストール後にZsh実行の可否 |
| KEEP_ZSHRC | No | no | 既存.zshrc保持の可否 |
| OVERWRITE_CONFIRMATION | No | yes | .zshrc上書き時の確認の可否 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| GitHubリポジトリ | Git | ohmyzsh/ohmyzshリポジトリ |
| $ZSH/templates/zshrc.zsh-template | テキスト | .zshrcテンプレートファイル |
| /etc/shells | テキスト | 有効なシェル一覧 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| $ZSH | ディレクトリ | Oh My Zshリポジトリ（クローン） |
| $zdot/.zshrc | テキスト | Zsh設定ファイル |
| $zdot/.zshrc.pre-oh-my-zsh | テキスト | 既存.zshrcのバックアップ |
| $zdot/.shell.pre-oh-my-zsh | テキスト | 以前のデフォルトシェル情報 |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | .zshrc |
| 出力先 | $ZDOTDIR または $HOME |
| 文字コード | UTF-8 |
| 備考 | テンプレートから生成、$ZSH変数を適切に置換 |

## 処理フロー

### 処理シーケンス

```
1. main関数開始
   └─ 引数解析（--unattended, --skip-chsh, --keep-zshrc）

2. setup_color
   └─ ターミナルカラーサポートの検出と色変数の設定

3. Zsh存在確認
   └─ command -v zshで確認、なければエラー終了

4. 既存$ZSHディレクトリ確認
   └─ 存在する場合はエラー終了

5. ZDOTDIRディレクトリ作成
   └─ $ZDOTDIRが指定されている場合、mkdir -pで作成

6. setup_ohmyzsh
   └─ umask設定、git init、remote add、fetch、checkout

7. setup_zshrc
   └─ 既存.zshrcのバックアップ、テンプレートから新規.zshrc生成

8. setup_shell
   └─ デフォルトシェルをZshに変更（オプション）

9. print_success
   └─ インストール完了メッセージ表示

10. exec zsh -l
    └─ 新しいZshセッション起動（RUNZSH=yesの場合）
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[引数解析]
    B --> C[カラー設定初期化]
    C --> D{Zshインストール済み?}
    D -->|No| E[エラー終了]
    D -->|Yes| F{$ZSHディレクトリ存在?}
    F -->|Yes| G[エラー終了]
    F -->|No| H[ZDOTDIRディレクトリ作成]
    H --> I[setup_ohmyzsh: リポジトリクローン]
    I --> J[setup_zshrc: .zshrc設定]
    J --> K{CHSH=yes?}
    K -->|Yes| L[setup_shell: シェル変更]
    K -->|No| M[スキップ]
    L --> N[成功メッセージ表示]
    M --> N
    N --> O{RUNZSH=yes?}
    O -->|Yes| P[exec zsh -l]
    O -->|No| Q[終了]
    P --> Q
```

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

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

該当なし（本スクリプトはデータベース操作を行わない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | 前提条件エラー | Zshがインストールされていない | Zshをインストールしてから再実行 |
| 1 | 前提条件エラー | Gitがインストールされていない | Gitをインストールしてから再実行 |
| 1 | 競合エラー | $ZSHディレクトリが既に存在 | 既存ディレクトリを削除するか別パスを指定 |
| 1 | ネットワークエラー | Gitクローン失敗 | ネットワーク接続を確認して再実行 |
| 1 | 環境エラー | Windows/MSYS GitがCygwinで検出 | Cygwin版Gitを使用 |
| 1 | ファイルエラー | .zshrcバックアップ作成失敗 | 数秒待って再実行 |

### リトライ仕様

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

### 障害時対応

1. Gitクローン失敗時：作成途中の$ZSHディレクトリを自動削除
2. スクリプト失敗後の手動リカバリ：
   - `rm -rf $HOME/.oh-my-zsh`
   - .zshrc.pre-oh-my-zshが存在すれば.zshrcに復元

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし（ファイル操作） |
| コミットタイミング | 各ファイル操作の完了時 |
| ロールバック条件 | Gitクローン失敗時に$ZSHディレクトリを削除 |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回の実行 |
| 目標処理時間 | ネットワーク状況に依存（通常30秒〜2分） |
| メモリ使用量上限 | 通常のシェルスクリプト実行範囲 |

## 排他制御

同一ユーザーによる同時実行は想定されていない。$ZSHディレクトリの存在チェックにより、重複インストールは防止される。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 進捗ログ | リポジトリクローン開始時 | "Cloning Oh My Zsh..." |
| 進捗ログ | .zshrc検索時 | "Looking for an existing zsh config..." |
| 進捗ログ | シェル変更時 | "Time to change your default shell to zsh:" |
| 成功ログ | インストール完了時 | Oh My Zshロゴと完了メッセージ |
| エラーログ | エラー発生時 | "Error: [エラー内容]"（赤色で標準エラー出力） |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 該当なし | - | - |

（インタラクティブなインストールスクリプトのため、監視・アラート機能は実装されていない）

## 備考

- `set -e`により、コマンドエラー発生時は即座に終了する
- TTYが接続されていない場合（パイプ実行時など）は自動的に非対話モードで実行
- ターミナルのハイパーリンクサポート、TrueColorサポートを検出し、対応ターミナルでは拡張表示を行う
- sudo権限が利用可能な場合、シェル変更時にsudoを使用する
- Termux環境では特別な処理パスが適用される
