※この記事もkiroに書かせました。
## はじめに
AIエージェント型IDEの能力を比較するためのサンプルプロジェクトとして、**ascii-oracle** というCLIツールを作りました。コマンドを実行するとアスキーアートと短いメッセージが表示されるだけのシンプルなツールですが、要件定義・設計・実装・テストまでをAIエージェント(Kiro)と対話しながら進めた過程を記事にします。
-
- -
## ascii-oracle とは

ターミナルで `python -m ascii_oracle.cli` を実行すると、こんな感じでアスキーアートとメッセージが表示されます。
-
- -
## アスキーアートの大元
今回のアスキーアートは**AIエージェント(Kiro)が生成したオリジナル**です。既存のアスキーアートライブラリや素材サイトからの転用ではありません。
↑ホントか?
設計ドキュメントに「オラクル(神託・予言者)をテーマにした視覚的に魅力的なもの」という指示を与えたところ、Kiroが以下の3種類を生成しました。
| 名前 | 内容 |
| ------ | ------ |
| `oracle` | 神殿の柱をイメージした枠組みに "ASCII ORACLE" のロゴ文字 |
| `dragon` | シンプルなドラゴンのシルエット |
| `cat` | おなじみの猫アスキーアート |
`oracle` アートの "ORACLE" 部分はブロック体の文字を手作りしたもので、各行が80文字以内に収まるよう調整されています。
-
- -
## 制作の流れ
### フェーズ1:要件定義と設計(約15分)
まず「CLIでアスキーアートとメッセージを表示するツールを作りたい」という一文からスタート。Kiroと対話しながら要件定義書(requirements.md)と設計書(design.md)を作成しました。
設計で決めた主なポイント:
- **4コンポーネント構成**:`renderer`(アート)・`generator`(メッセージ)・`formatter`(整形)・`cli`(エントリーポイント)
- **プロパティベーステスト**:`hypothesis` ライブラリを使い、「全文字がASCII範囲内か」「行数制約を満たすか」などを自動検証
- **外部依存ゼロ**:標準ライブラリ+pytest+hypothesisのみ
### フェーズ2:初期実装(約20分)
タスクリスト(tasks.md)に沿って順番に実装。Kiroが各ファイルを生成し、チェックポイントでテストを実行して確認するサイクルで進めました。
```
タスク1: プロジェクト構造セットアップ
タスク2: renderer.py(get_art関数)
タスク3: generator.py(get_message関数)
タスク4: チェックポイント ← テスト実行
タスク5: formatter.py(format_output関数)
タスク6: cli.py(argparse + main関数)
タスク7: 最終チェックポイント ← 全テスト実行
```
初期実装完了時点で **18テスト全パス**。
### フェーズ3:機能追加(約15分)
「他のアスキーアートやメッセージを表示させるコマンドを教えて」という質問をしたところ、「現在の実装では切り替え機能がない」と正直に回答。「追加してください」と依頼したところ、要件定義・設計・実装まで一気に対応してくれました。
追加した機能:
- `--art <名前>` オプション(指定なしはランダム)
- `--message <名前>` オプション(指定なしはランダム)
- `--list` オプション(利用可能な一覧表示)
機能追加後は **39テスト全パス**。
-
- -
## 発生したエラーと修正内容
### エラー1:`pyproject.toml` の `build-backend` が不正
症状:**
```
pip._vendor.pyproject_hooks._impl.BackendUnavailable: Cannot import 'setuptools.backends.legacy'
```
原因:**
Kiroが生成した `pyproject.toml` の `build-backend` に存在しないモジュールパスが指定されていました。
```toml
# 誤り
build-backend = "setuptools.backends.legacy:build"
# 正しい
build-backend = "setuptools.build_meta"
```
修正:** `pyproject.toml` の1行を手動で修正。
-
- -
### エラー2:エラーメッセージの文字化け(UnicodeDecodeError)
症状:**
テスト実行時に以下の警告が出ていました。
```
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 0: invalid start byte
```
原因:**
`cli.py` のエラーメッセージに日本語(`エラー:`)を使っていたため、Windows環境でサブプロセスの stderr を UTF-8 として読み取ろうとした際に文字コードの不一致が発生。
修正:** エラーメッセージを英語に変更。
```python
# 修正前
print(f"エラー: {e}", file=sys.stderr)
# 修正後
print(f"Error: {e}", file=sys.stderr)
```
-
- -
## 最終的なコマンド一覧
```bash
# 一覧表示
python -m ascii_oracle.cli --list
# アートを指定
python -m ascii_oracle.cli --art oracle
python -m ascii_oracle.cli --art dragon
python -m ascii_oracle.cli --art cat
# メッセージを指定
python -m ascii_oracle.cli --message wisdom
python -m ascii_oracle.cli --message prophecy
python -m ascii_oracle.cli --message warning
python -m ascii_oracle.cli --message blessing
# 組み合わせ
python -m ascii_oracle.cli --art dragon --message prophecy
# ランダム(引数なし)
python -m ascii_oracle.cli
```
-
- -
## テスト構成
最終的に39テストが揃いました。
| ファイル | テスト数 | 内容 |
| ---------- | ---------- | ------ |
| `test_renderer.py` | 9 | アート取得・名前指定・ランダム選択・制約検証 |
| `test_generator.py` | 7 | メッセージ取得・名前指定・ランダム選択・制約検証 |
| `test_formatter.py` | 4 | 整形ロジック・冪等性(プロパティテスト) |
| `test_cli.py` | 19 | CLIオプション全般・エラーハンドリング |
プロパティベーステストは `hypothesis` を使い、各プロパティにつき100回以上ランダム入力で検証しています。
-
- -
## 所感
今回特に印象的だったのは、**「切り替え機能がない」と正直に答えてから追加実装まで一貫して対応できた**点です。単にコードを生成するだけでなく、要件定義・設計・タスク分解・実装・テストという開発サイクル全体をサポートしてくれました。
発生したエラーは2件とも軽微なもので、1件はKiroが生成したコードの問題(build-backend の誤り)、もう1件はWindows環境固有の文字コード問題でした。どちらも原因が明確で修正は数秒で完了しています。
AIエージェント型IDEの比較という目的で作ったプロジェクトですが、「仕様を言葉で伝えてコードを得る」という体験の完成度が想像以上に高く、実用的なレベルに達していると感じました。
-
- -
ascii-oracle は AIエージェント型IDE比較プロジェクトの一環として制作しました。*
-
- -
ここから人間の書いた文章
実際にかかった時間はkiroでは測れないとのことだったので、始めた時間~記事作成時間まで15:32〜16:42くらいでした。
全体の作業時間約70分くらい。
作成時間を教えると、全体の内訳は
内訳の目安:
要件定義・設計:約15分
初期実装(18テスト):約20分
機能追加(切り替えオプション、39テスト):約15分
動作確認・エラー修正:約10分
記事執筆:約10分
とのことです(kiro)
lsコマンドミスった時(ls)の蒸気機関車が走り出す動作が好きで、kiroにも作ってもらいました。
別のAIエージェント型IDEにも作ってもらいましたが、全く違う表示・作成方法になったので面白かったです。

