メインコンテンツへスキップ
  1. 記事/

30 Days of Vibe Coding - Day 6 - Pomodoro

Nuno Coração
著者
Nuno Coração
Principal Product Manager @ Docker
目次
30 Days of Vibe Coding - この記事は連載の一部です
パート 6: この記事

6日目。ブラウザから離れる時が来た――そして完全にコンフォートゾーンを抜け出す時でもある。

これまでのプロジェクトはすべて TypeScript、React、Canvas だった。知っている言語とフレームワーク。今日は別のことを試したかった。AIに自分が一度も触れたことのないツールで構築させたら、何が起きるのか?

プロンプト
#

「Go と Bubble Tea を使ってターミナル用ポモドーロタイマーを作成すること。大きな ASCII カウントダウン、SQLite によるセッション追跡、日次・週次統計、タスクラベル、カスタマイズ可能な時間設定を含めること。」

Go を書いたことがない。Bubble Tea を使ったことがない。Lip Gloss に触れたこともない。goroutinechannel の違いを調べずに説明できる自信もない。このプロンプトに含まれる技術スタック全体が、私にとって未知の領域だ。

それが狙いだった。慣れ親しんだ領域でウェブゲームを5日間作り続けてきて、ある疑問が浮かんできた。AIは自分がすでに理解しているものにしか使えないのか?ちゃんとレビューもできないようなスタックを投げたらどうなる?

どう作られたか
#

Watchfire はプロンプトを受け取り、TypeScript プロジェクトと同様に分解した。Go であっても TypeScript であっても、関係なさそうだった。TUI フレームワークとして Bubble Tea を、スタイリングに Lip Gloss を、永続化に SQLite を選択した。Webサーバーなし、Electron ラッパーなし、ブラウザなし。どこからでも実行できる単一バイナリだ。

プロジェクトは、6つのパッケージにまたがる11のソースファイルを持つクリーンな Go モジュールとして出来上がった。パッケージは mainasciiconfigdbstatstimerui だ。各パッケージの責務は明確に分かれている。timer パッケージはステートマシン(アイドル、実行中、一時停止、終了)を担う。UI パッケージは Bubble Tea を使ってすべてをレンダリングする。database パッケージは SQLite の永続化を管理する。stats パッケージは日次・週次ビュー用にセッションデータを集計する。

インストールスクリプト、Makefile、そして YAML 設定ファイルとコマンドライン引数をマージするカスタム設定ローダーを使った適切な CLI フラグも付いていた。これらを Go で自分でセットアップする方法は知らない。

得られたもの
#

開始前のポモドーロタイマー

大きな ASCII 数字。 カウントダウン表示はカスタムのブロック文字の数字を使っており、5行の高さがある。部屋の向こう側からでも読めるほどで、それがポモドーロタイマーの本来の目的だ。ちらっと見るだけで残り時間がわかるべきだ。

プログレスバーとともにタイマーが動いている

色分けされたセッション。 作業セッションは赤く光る。短い休憩は緑になる。長い休憩は異なる色合いになる。どのフェーズにいるかによって UI 全体の色が変わるため、今が作業中なのか休憩中なのかが一目でわかる。

短い休憩の準備ができている

すべてを記録する。 すべてのセッションは ~/.pomo/sessions.db のローカル SQLite データベースに保存される。ヘッダーバーにはリアルタイムで日次統計が表示される。完了したポモドーロ数と合計集中時間だ。pomo stats を実行すると、ASCII 棒グラフ付きの週次内訳が表示される。

短い休憩が走っている

セッションサイクルが機能する。 4回の作業セッションの後に長い休憩が入る。右上の進捗バッジにサイクル内の位置が表示される(例:[WORK 1/4])。4回目の作業セッションの後は、通常の5分間の短い休憩ではなく、15分間の長い休憩に自動で切り替わる。

タスクラベル。 pomo -t "ブログ記事を書く" と実行すると、タスク名がヘッダーに表示される。データベースにも保存されるため、後で統計を確認したとき、実際に何をしていたかがわかる。

ターミナルベル。 セッションが終了するとターミナルベルが鳴る。シンプルで効果的で、ターミナルがサポートするどんな通知システムとも連携する。

バグレポート
#

今回はなし。タイマーは最初のビルドで正しく動作した。開始、一時停止、再開、スキップ、リセット、セッション遷移——すべてが期待通りに機能した。キーボード操作はレスポンシブで、ステートマシンはエッジケースもきれいに処理した。

数字で見る
#

  • 11個の Go ソースファイル(6パッケージにわたる)
  • 1つのテストファイル(タイマーステートマシンのテスト)
  • 4種類のセッションタイプ: 作業、短い休憩、長い休憩、それらの間の遷移
  • SQLite 永続化(セッション履歴用)
  • YAML + CLI 設定(25/5/15分サイクルのデフォルト値付き)
  • 実際の作業時間: プロンプトのテストと調整に約20分

試してみる
#

次のコマンドでインストール:

go install github.com/nunocoracao/Vibe30-day06-pomodoro@latest

またはインストールスクリプトを使う:

curl -sSL https://raw.githubusercontent.com/nunocoracao/Vibe30-day06-pomodoro/main/install.sh | bash

あとはターミナルで pomo を実行するだけ。

Day 6 の総評
#

この日は1日目から抱えていた疑問に答えてくれた。AI を使ったコーディングは、すでにスタックを知っている時しか機能しないのか?

違った。そうじゃない。Go を書けない。Bubble Tea で TUI を作れない。6つのパッケージを持つ Go モジュールの構造化、SQLite バインディングのセットアップ、クロスコンパイル用の Makefile の書き方もわからない。それでもこのツールは存在し、動き、自分が毎日実際に使うものができた。単一バイナリ、実行時に依存関係なし、どのターミナルでも動く。

最も驚いたのはアーキテクチャだった。境界が明確な6つのパッケージ。タイマー用の適切なステートマシン。SQLite が失敗してもタイマーは動き続けるという graceful なデータベース処理——統計が取れないだけで済む。これはシニア開発者が下すような判断で、それがその言語を知らない人間が書いたプロンプトから生まれた。

「非標準」の意味が変わった。Go を知らずに洗練された Go TUI アプリを出荷できるなら、慣れないスタックを試す障壁は消えたも同然だ。実験のコストはほぼゼロになった。

6日経って、ブログ記事を書き終えた後も動かし続けているのはこれが最初のプロジェクトだ。


これは 30 Days of Vibe Coding の6日目です。AI を使ったコーディングで30日間に30プロジェクトを出荷する様子をフォローしてください。

30 Days of Vibe Coding - この記事は連載の一部です
パート 6: この記事

関連記事