# 機能設計書 83-uninstall.sh

## 概要

本ドキュメントは、Oh My Zshをシステムから完全にアンインストールする`uninstall.sh`スクリプトの機能設計について記述する。

### 本機能の処理概要

Oh My Zshのインストールを完全に取り消し、ユーザーの環境をOh My Zshインストール前の状態に復元する機能である。ディレクトリの削除、設定ファイルの復元、デフォルトシェルの復元を行う。

**業務上の目的・背景**：ユーザーがOh My Zshを使用しなくなった場合や、別のzsh設定フレームワークに移行する場合に、クリーンなアンインストールを提供する必要がある。特に、インストール時にバックアップした元の設定ファイルを確実に復元することで、ユーザーが以前の環境にスムーズに戻れるようにする。

**機能の利用シーン**：ユーザーが明示的にOh My Zshのアンインストールを希望する場合に、手動でスクリプトを実行する。または`omz`コマンド経由でアンインストール処理が呼び出される場合もある。

**主要な処理内容**：
1. デフォルトシェルの復元（chshコマンド使用）
2. ユーザーへの確認プロンプト表示
3. ~/.oh-my-zshディレクトリの削除
4. 現在の.zshrcのバックアップ（タイムスタンプ付き）
5. インストール前の.zshrcの復元
6. 完了メッセージの表示

**関連システム・外部連携**：chshコマンドを使用してデフォルトシェルを復元する。システムの/etc/passwdファイルに影響を与える可能性がある。

**権限による制御**：chshコマンドの実行にはユーザー権限が必要。一部のシステムではパスワード入力が求められる場合がある。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 18 | uninstall.sh | 主画面 | OMZをアンインストールする（ディレクトリ削除、.zshrc復元、シェル復元） |

## 機能種別

アンインストール処理 / 設定復元

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| なし | - | - | 引数は受け取らない | - |

### 入力データソース

- `~/.shell.pre-oh-my-zsh`：インストール前のデフォルトシェル情報
- `~/.zshrc.pre-oh-my-zsh`：インストール前のzsh設定ファイル
- ユーザー入力（確認プロンプトへの応答）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 画面出力 | 文字列 | 処理進捗メッセージ |
| .zshrc.omz-uninstalled-{timestamp} | ファイル | アンインストール時の.zshrcバックアップ |

### 出力先

- 標準出力：処理進捗メッセージ
- ファイルシステム：設定ファイルの復元・バックアップ

## 処理フロー

### 処理シーケンス

```
1. デフォルトシェルの復元確認
   └─ ~/.shell.pre-oh-my-zshが存在し、chshが利用可能な場合
2. chshによるシェル変更
   └─ 成功時は~/.shell.pre-oh-my-zshを削除
3. アンインストール確認プロンプト
   └─ y/Y以外の入力でキャンセル
4. ~/.oh-my-zshディレクトリの削除
   └─ rm -rfで強制削除
5. 現在の.zshrcのバックアップ
   └─ タイムスタンプ付きファイル名でリネーム
6. 元の.zshrcの復元
   └─ ~/.zshrc.pre-oh-my-zshから復元
7. 完了メッセージの表示
   └─ ターミナル再起動の案内
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{chsh利用可能 & .shell.pre-oh-my-zsh存在?}
    B -->|Yes| C[元のシェルに復元]
    C --> D{chsh成功?}
    D -->|Yes| E[.shell.pre-oh-my-zsh削除]
    D -->|No| F[手動変更の案内]
    F --> G[終了]
    B -->|No| H[確認プロンプト表示]
    E --> H
    H --> I{y/Y入力?}
    I -->|No| J[キャンセルメッセージ]
    J --> G
    I -->|Yes| K{~/.oh-my-zsh存在?}
    K -->|Yes| L[~/.oh-my-zsh削除]
    K -->|No| M[.zshrcバックアップ処理へ]
    L --> M
    M --> N{~/.zshrc存在?}
    N -->|Yes| O[.zshrcをタイムスタンプ付きでリネーム]
    N -->|No| P[元の.zshrc確認へ]
    O --> P
    P --> Q{.zshrc.pre-oh-my-zsh存在?}
    Q -->|Yes| R[元の.zshrcを復元]
    Q -->|No| S[元の設定なしメッセージ]
    R --> T[完了メッセージ]
    S --> T
    T --> G
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-83-001 | 確認必須 | アンインストール前に必ず確認を求める | 常時 |
| BR-83-002 | バックアップ保持 | 現在の.zshrcはタイムスタンプ付きでバックアップ | ~/.zshrcが存在する場合 |
| BR-83-003 | 元設定復元 | インストール前の.zshrcを可能な限り復元 | .zshrc.pre-oh-my-zshが存在する場合 |
| BR-83-004 | シェル復元優先 | ディレクトリ削除前にシェル復元を試行 | chshが利用可能な場合 |

### 計算ロジック

バックアップファイル名生成：
- 形式: `.zshrc.omz-uninstalled-YYYY-MM-DD_HH-MM-SS`
- コマンド: `date +%Y-%m-%d_%H-%M-%S`

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| - | - | - | データベース操作なし |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | chsh失敗 | シェル変更権限なし、パスワード不正 | 手動変更の案内メッセージを表示して終了 |
| - | キャンセル | ユーザーがy/Y以外を入力 | キャンセルメッセージを表示して終了 |

### リトライ仕様

リトライは行わない。エラー時は適切なメッセージを表示して終了。

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

トランザクション管理なし。各ファイル操作は独立して実行される。削除・リネーム操作は取り消し不可能なため、事前確認を必須としている。

## パフォーマンス要件

特になし。対話的なスクリプトであり、即時性は求められない。

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

- rm -rfコマンドは~/.oh-my-zshディレクトリに限定
- chshコマンド実行時にパスワード入力が求められる場合がある
- バックアップファイルにはユーザーのzsh設定が含まれる可能性がある

## 備考

- アンインストール後はターミナルの再起動が必要
- ~/.oh-my-zshが存在しない場合でも処理は継続
- バックアップファイルは自動削除されないため、手動で管理が必要

---

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

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

### 推奨読解順序

#### Step 1: 全体構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | uninstall.sh | `tools/uninstall.sh` | 全42行のシンプルなスクリプト。上から順に読む |

**読解のコツ**: POSIX sh互換のシンプルなスクリプト。zsh固有の構文は使用されていない。

#### Step 2: シェル復元処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | uninstall.sh | `tools/uninstall.sh` | 1-11行目: デフォルトシェルの復元処理 |

**主要処理フロー**:
1. **1行目**: chshコマンドと.shell.pre-oh-my-zshの存在確認
2. **2行目**: 元のシェルパスを変数に読み込み
3. **3行目**: 復元開始メッセージの表示
4. **4-10行目**: chshコマンドによるシェル変更と結果処理

#### Step 3: アンインストール処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | uninstall.sh | `tools/uninstall.sh` | 13-17行目: 確認プロンプト処理 |
| 3-2 | uninstall.sh | `tools/uninstall.sh` | 19-22行目: ディレクトリ削除 |
| 3-3 | uninstall.sh | `tools/uninstall.sh` | 24-28行目: .zshrcバックアップ |
| 3-4 | uninstall.sh | `tools/uninstall.sh` | 30-38行目: 元の.zshrc復元 |

**主要処理フロー**:
- **13行目**: read -r -pで確認プロンプト表示
- **14-17行目**: y/Y以外はキャンセル
- **20-22行目**: ~/.oh-my-zshの削除（存在確認付き）
- **24-28行目**: 現在の.zshrcをタイムスタンプ付きでバックアップ
- **31-35行目**: .zshrc.pre-oh-my-zshから復元

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

```
uninstall.sh
    │
    ├─ chsh (外部コマンド)
    │      └─ /etc/passwd の更新
    │
    ├─ rm -rf ~/.oh-my-zsh
    │
    ├─ mv ~/.zshrc ~/.zshrc.omz-uninstalled-{timestamp}
    │
    └─ mv ~/.zshrc.pre-oh-my-zsh ~/.zshrc
```

### データフロー図

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

~/.shell.pre-oh-my-zsh ──┐
                         │
~/.zshrc ────────────────┼─▶ uninstall.sh ────────────▶ 画面メッセージ
                         │         │
~/.zshrc.pre-oh-my-zsh ──┤         │
                         │         ├─▶ ~/.zshrc (復元)
ユーザー入力 ────────────┘         │
                                   └─▶ ~/.zshrc.omz-uninstalled-{timestamp}
                                       (バックアップ)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| uninstall.sh | `tools/uninstall.sh` | ソース | アンインストール処理のメインスクリプト |
| .shell.pre-oh-my-zsh | `~/.shell.pre-oh-my-zsh` | 設定 | インストール前のデフォルトシェル情報 |
| .zshrc.pre-oh-my-zsh | `~/.zshrc.pre-oh-my-zsh` | 設定 | インストール前のzsh設定ファイル |
| .zshrc | `~/.zshrc` | 設定 | 現在のzsh設定ファイル |
| install.sh | `tools/install.sh` | ソース | インストール処理（バックアップファイルを作成） |
