# 画面設計書 18-koch nimble

## 概要

本ドキュメントは、Nimコンパイラプロジェクトにおける`koch nimble`サブコマンドの画面設計書です。Nimbleパッケージマネージャをビルドする処理について説明します。

### 本画面の処理概要

`koch nimble`は、Nim言語の公式パッケージマネージャであるNimbleをビルドするCLIサブコマンドです。GitHubからNimbleのソースコードをクローンし、コンパイルして`bin/nimble`を生成します。

**業務上の目的・背景**：NimbleはNim言語のエコシステムにおいて中心的な役割を果たすパッケージマネージャです。サードパーティライブラリのインストール、プロジェクトの依存関係管理、パッケージの公開などを担当します。`koch nimble`は、Nimbleを最新のコンパイラでビルドし、開発環境に統合するために使用されます。

**画面へのアクセス方法**：ターミナルから以下のコマンドを実行します。
```
koch nimble [options]
```

**主要な操作・処理内容**：
1. GitHubからNimbleリポジトリをクローン
2. サブモジュール（zippy等）の更新
3. Nimbleソースコードのコンパイル
4. 不要なテストディレクトリの削除
5. bin/nimbleへの出力

**画面遷移**：
- 遷移元: kochメイン画面（No.10）からサブコマンドとして呼び出し
- 遷移先: なし（Nimbleビルド完了後は自動的に終了）
- 関連: koch tools（No.12）からも呼び出される

**権限による表示制御**：特別な権限制御はありません。ネットワーク接続と書き込み権限が必要です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 20 | Koch | 主機能 | Nimbleパッケージマネージャのビルド処理 |

## 画面種別

CLIコマンド実行画面（バッチ処理型）

## URL/ルーティング

```
koch nimble [options]
```

コマンドラインオプション:
- `--latest`: 最新版（HEAD）のNimbleを使用
- `--stable`: 安定版（NimbleStableCommit）を使用（デフォルト）
- 標準のNimコンパイラオプションがそのまま渡される

## 入出力項目

### 入力項目

| 項目名 | 型 | 必須 | 説明 |
|--------|-----|------|------|
| args | string | いいえ | Nimコンパイラに渡す追加オプション |
| --latest | flag | いいえ | 最新版Nimble使用フラグ |

### 出力項目

| 項目名 | 型 | 説明 |
|--------|-----|------|
| bin/nimble | executable | 生成されたNimbleパッケージマネージャ |
| dist/nimble/ | directory | Nimbleソースコード |

## 表示項目

| 項目名 | 説明 |
|--------|------|
| クローンコマンド | git cloneコマンド |
| コンパイルコマンド | Nimbleのコンパイルコマンド |

## イベント仕様

### 1-Nimbleビルド開始

```
koch nimble
```

1. `bundleNimbleExe()`関数が呼び出される
2. NimbleStableCommitでリポジトリをクローン
3. サブモジュールを更新
4. Nimbleをコンパイル
5. zippyのテストディレクトリを削除

### 2-最新版Nimbleビルド

```
koch nimble --latest
```

1. latestフラグがtrueで関数呼び出し
2. HEADコミットでリポジトリをクローン
3. 他は同様の処理

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

本コマンドはデータベースを使用しません。

### ファイル操作詳細

| 操作 | 対象ファイル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| クローン | dist/nimble | CREATE | Nimbleリポジトリ |
| 更新 | dist/nimble (サブモジュール) | UPDATE | zippy等のサブモジュール |
| ビルド | bin/nimble | CREATE/UPDATE | Nimble実行ファイル |
| 削除 | dist/nimble/vendor/zippy/tests | DELETE | 不要なテストディレクトリ |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 発生条件 |
|-------------|------|---------------|---------|
| MSG001 | 情報 | git clone ... nimble.git | リポジトリクローン開始 |
| MSG002 | 情報 | git submodule update --init | サブモジュール更新 |
| MSG003 | 情報 | nim c -d:release ... nimble.nim | Nimbleコンパイル開始 |
| MSG004 | 成功 | (コマンド正常終了) | ビルド完了 |

## 例外処理

| 例外 | 発生条件 | 対処 |
|------|---------|------|
| ネットワークエラー | GitHubへの接続失敗 | ネットワーク設定を確認 |
| コンパイルエラー | Nimbleソースにエラーがある | Nimbleリポジトリの問題を報告 |
| 権限エラー | dist/またはbin/への書き込み権限がない | 権限を設定 |

## 備考

- NimbleStableCommit（L14）でバージョンが固定されている
- zippyのテストディレクトリはサイズが大きいため削除される
- `--noNimblePath`オプションでシステムのNimbleパスを無視

---

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

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

### 推奨読解順序

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

Nimbleビルドで使用される定数を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | koch.nim | `koch.nim` | L14: NimbleStableCommit定数（固定バージョン） |
| 1-2 | koch.nim | `koch.nim` | L151: distDir定数（クローン先ディレクトリ） |

**読解のコツ**: NimbleStableCommitは特定のコミットハッシュで、安定版のNimbleを指定しています。

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

nimbleコマンドの呼び出し処理を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | koch.nim | `koch.nim` | L766: "nimble"コマンドの処理 |
| 2-2 | koch.nim | `koch.nim` | bundleNimbleExe関数（L163-172）: Nimbleビルドのメインロジック |

**主要処理フロー**:
1. **L165**: コミットを決定（latestならHEAD、そうでなければNimbleStableCommit）
2. **L166**: `cloneDependency()`でNimbleをクローン
3. **L167**: `updateSubmodules()`でサブモジュールを更新
4. **L168-169**: `nimCompile()`でNimbleをコンパイル
5. **L170-172**: zippyのテストディレクトリを削除

#### Step 3: 依存関係クローンを理解する

cloneDependency関数を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | tools/deps.nim | `tools/deps.nim` | cloneDependency関数（L23-48）: Gitリポジトリのクローン処理 |
| 3-2 | tools/deps.nim | `tools/deps.nim` | updateSubmodules関数（L50-61）: サブモジュールの更新 |

**主要処理フロー**:
- **L31-34**: ディレクトリが存在しない場合、git cloneを実行
- **L35-44**: Gitリポジトリの場合、指定コミットをチェックアウト
- **L50-57**: git submodule update --initを実行

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

```
koch nimble [--latest]
    │
    └─ bundleNimbleExe(latest, args)
           │
           ├─ commit = if latest: "HEAD" else: NimbleStableCommit
           │
           ├─ cloneDependency(distDir, "https://github.com/nim-lang/nimble.git", commit)
           │      │
           │      ├─ git clone -q <url> dist/nimble
           │      │
           │      └─ git checkout -q <commit>
           │
           ├─ updateSubmodules(distDir / "nimble")
           │      │
           │      └─ git submodule update --init
           │
           ├─ nimCompile("dist/nimble/src/nimble.nim", options = "-d:release --noNimblePath")
           │      │
           │      └─ nim c -o:bin/nimble -d:release dist/nimble/src/nimble.nim
           │
           └─ removeDir("dist/nimble/vendor/zippy/tests")
                  └─ 不要なテストディレクトリを削除
```

### データフロー図

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

--latest/--stable ────────▶ コミット選択 ───────────────▶ commitハッシュ

GitHub/nimble ────────────▶ cloneDependency() ──────────▶ dist/nimble/

dist/nimble/.gitmodules ──▶ updateSubmodules() ─────────▶ dist/nimble/vendor/

dist/nimble/src/nimble.nim ▶ nimCompile() ──────────────▶ bin/nimble

dist/nimble/vendor/zippy/tests ▶ removeDir() ───────────▶ (削除)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| koch.nim | `koch.nim` | ソース | nimbleコマンドの実装 |
| deps.nim | `tools/deps.nim` | ソース | 依存関係のクローン・更新処理 |
| kochdocs.nim | `tools/kochdocs.nim` | ソース | nimCompile関数の定義 |
| nimble.nim | `dist/nimble/src/nimble.nim` | ソース | Nimble本体（クローン後） |
