本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。
第2回 | 育てて終わりにしない。Term-gotchi に成長記録を足した開発記 | UNIX Cafe

Term-gotchi 第2回は、成長記録と分岐進化の追加編です。tg_history、sage / builder、専用コマンド、CHANGELOG.md を通して、CLI ツールに「変化の履歴」を持たせる面白さを紹介します。
前回は、zsh の中で育つ小さな相棒アプリ Term-gotchi を作るところまでを書きました。
ls や cd、git といった普段のコマンドが経験値になって、egg -> sprout -> buddy と進化していく。そこまでは、ミニ育成アプリとしてかなり素直な形です。
でも、実際に使い始めると、次の疑問が出てきました。
- いま何が起きて成長したのか、あとから追えるようにしたい
- 進化しても見た目以外の違いが少ない
- 続けて育てたくなる分岐がほしい
- 開発の経緯そのものも、あとから参照できるようにしたい
そこで第2回では、Term-gotchi に成長記録と分岐進化、そして履歴として残る開発ログを足しました。
今回は「どうやって最初の MVP を、長く触りたくなる道具に育てたか」を中心に紹介します。
MVP の次に必要だったのは、派手な機能ではなく記録だった
最初の版は、ちゃんと遊べました。
tg_statusで状態を見るtg_feedやtg_trainで世話をする- 普段のコマンドで経験値が増える
eggからsprout、buddyへ進化する
ただ、しばらく使ってみると、数字だけでは物足りなくなります。
例えば、
- さっき何の操作でレベルが上がったのか
- 進化した瞬間のメッセージをあとから見返せない
- コマンドが増えているのに、育ち方の違いが見えにくい
という「遊びの手触り」の弱さがありました。
ここで面白かったのは、次に必要だったのが AI でも、画面を豪華にすることでもなく、ログだったことです。
育成アプリにとって、記録はかなり重要です。
なぜなら、育つという現象は「変化の履歴」が見えて初めて気持ちよくなるからです。
まず tg_status を見やすくした
最初にやったのは、記録専用機能ではなく、状態表示そのものの改善でした。実際にしばらく使っていると、Term-gotchi はこのような状態になりました。
ASCII アートも含めて表示されるので、数字だけでなく、いまの姿も一緒に確認できます。
___
(o o)
/|#|\
/ \
_| |_
Term-gotchi
Form: builder
Level: 28
XP: [#####.....] 131/290
Hunger: [########..] 80
Health: [##########] 100
Mood: [##########] 100
Commands: 2956 total / 108 unique
Vocab: 10
Trait: tough hands-on finisher
Final form reached
Message: Let us trace it step by step and see what jumps out.追加したのは次の要素です。
- XP のゲージ表示
- hunger / health / mood のゲージ表示
Commands: total / unique- 次の進化条件を示すヒント
- form ごとの
Trait:行
これで、単に「数値が増えている」ではなく、
- あとどれくらいで次に進むのか
- どんな育ち方をしているのか
- 今の形態は何が得意なのか
が、一目で分かるようになりました。
こういう改善は地味ですが、毎回触るコマンドほど効きます。
進化後の差を、見た目以外にも持たせた
次にやったのが、形態ごとの個性付けです。
最初の頃は、進化しても主な違いは ASCII アートだけでした。
もちろん、それだけでも楽しいのですが、継続して使うと「育て方の違い」が欲しくなります。
そこで、まず tg_talk と tg_train を form ごとに変えました。
tg_talk の変化
egg: まだ素直で小さな相棒sprout: 成長意欲が強いbuddy: 一緒に作業する相棒らしさが出るsage: 学習や理解に寄った台詞になるbuilder: 実務や作業推進に寄った台詞になる
tg_train の変化
egg:XP +3, Vocab +1sprout:XP +4, Vocab +1buddy:XP +5, Vocab +2sage:XP +6, Vocab +3builder:XP +6, Vocab +2
これで、育つほど行動の意味が少しずつ変わるようになりました。
単純な数値上昇でも、文脈が乗ると急に楽しくなります。
buddy の先に分岐進化を作った
ここが第2回の中心です。
buddy の先に、
sagebuilder
という 2 つの最終形を追加しました。
sage
学習寄りの進化です。
vocab_levelを伸ばすtg_trainを多めに使う- 言葉や理解に寄った育ち方をする
builder
実務寄りの進化です。
command_countを積む- 普段の作業をたくさんこなす
- 手を動かして前に進むタイプになる
条件はシンプルにしています。
buddy -> sage:level >= 5かつvocab_level >= 8buddy -> builder:level >= 5かつcommand_count >= 30
もし両方の条件に近い場合でも、どの操作で進んだかによって分岐先が決まるようにしました。
- 訓練で進んだら
sage - 通常コマンドの積み上げで進んだら
builder
これはゲーム的な演出でもありますが、同時に「使い方がそのまま個性になる」設計です。
最終形には専用コマンドも足した
分岐進化を入れるなら、見た目と台詞だけでは足りません。
そこで最終形には専用コマンドを用意しました。
tg_study
sage 専用です。
XP +4Vocab +4
学習特化らしく、語彙成長が大きく伸びます。
tg_build
builder 専用です。
XP +8Vocab +1
作業寄りの勢いを、そのまま強い進行力に変えています。
しかも、別 form で呼ぶと明示的にエラーにしています。
termgotchi: tg_study is available only in sage form. Current form: eggここを曖昧にしなかったのは重要でした。
「何でも実行できる」より、「今の形態だからこそ使える」のほうが、育成として気持ちよくなります。
成長記録として tg_history を足した
今回いちばん実用的だった追加がこれです。
tg_history は、直近 12 件の成長イベントを表示します。
対象になるのは、
- 通常コマンドによる成長
tg_feedtg_cleantg_traintg_studytg_build- idle 時のメッセージ
- 進化イベント
です。
例えば、こんな形で見えます。
Recent growth log:
2026-05-15T23:15:19+0900 tg_train: I can feel new skills taking root.
2026-05-15T23:15:19+0900 last_fed_at: Yum! Thanks for the snack.これで「何が起きて今の姿になったのか」が、ようやくストーリーとして見えるようになりました。
育成アプリにログを付けると、ただの state 管理が一気に“記録”になります。
実装して初めて見つかった不具合もあった
今回の追加で、むしろ良かったのはバグが見つかったことです。
代表例は 2 つありました。
1. source ~/.zshrc しても新しいコマンドが増えない
原因は、termgotchi.zsh の先頭にあったロード済みガードです。
if [[ -n "${TERM_GOTCHI_LOADED:-}" ]]; then
return 0
fiこれがあると、いったん読み込んだあと source ~/.zshrc しても、新しい関数定義が再読込されません。
つまり、tg_history を追加しても、今のシェルでは「command not found」のままです。
ここは修正して、source ~/.zshrc で新しい定義が上書きされるようにしました。
2. whence が成長ログに入ってしまう
tg_history を試すために whence -w tg_history を打ったら、それ自体が成長ログに入ってしまいました。
これは、内部コマンド除外リストに whence、type、which が入っていなかったためです。
こういうのは、実際に触って初めて見つかります。
小さい不具合ですが、シェル拡張ではかなり大事です。
開発そのものも、CHANGELOG.md に残すようにした
育成記録を付けるなら、開発記録も残したくなります。
そこで今回、リポジトリ側には CHANGELOG.md も追加しました。
内容は、
v0.1.0: safe install と基本表示v0.2.0: passive XP と care commandsv0.4.0: ゲージ表示と成長バランス調整v0.6.0:sage/builder分岐進化v0.8.0:tg_historyと reload 修正
のように、段階ごとの進化が追える形です。
個人開発では、完成品だけを見ると「最初からこうだった」ように見えます。
でも実際は、
- 小さく作る
- 使ってみる
- 違和感を見つける
- それを記録しながら直す
の積み重ねです。
この流れを残しておくと、あとで自分でも助かります。
今回の追加で見えたこと
第1回では、「安全に動くミニ育成アプリを作る」ことが主題でした。
第2回で見えてきたのは、育成アプリは機能追加よりも、変化の見え方が大切だということです。
数値を増やすだけなら簡単です。
でも、
- 何が起きたかを残す
- 育て方で進化先が変わる
- 形態ごとに言葉と役割が変わる
- 開発の過程そのものも記録する
といった層が足されると、アプリ全体に時間の流れが生まれます。
これは小さな CLI ツールでも同じです。
ターミナルの中の遊びでも、履歴があると世界が少し深くなります。
おわりに
Term-gotchi は、最初から大きなものを目指して作ったアプリではありません。
むしろ、
- 壊さない
- 小さく始める
- 使いながら伸ばす
- 記録を残す
という、かなり UNIX 的な育て方をしてきました。
今回、第2回として成長記録や分岐進化を足したことで、ようやく「作って終わり」ではなく、「付き合っていけるアプリ」になってきた気がします。
もし自分でターミナルツールを作るなら、最初から豪華にしなくて大丈夫です。
まずは小さく作って、次に記録を足してください。
変化が見えるようになるだけで、道具はかなり面白くなります。
最初の実装から読みたい方へ
今回は、Term-gotchi に成長記録と分岐進化を追加しました。
その前の第1回では、zsh の中で育つ小さな相棒アプリとして、Term-gotchi を最初に動かすところまでを紹介しています。安全なシェル設計、.zshrc への追加方法、状態ファイルの扱いなど、今回の機能追加の土台になる部分です。
👉 第1回「ターミナルで育つ相棒を作ろう。zsh製ミニ育成アプリ『Term-gotchi』開発記」へ戻る




