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

Watchfire: AIコーディングエージェントのための管制室

Nuno Coração
著者
Nuno Coração
Principal Product Manager @ Elastic
目次

AIコーディングエージェントがデモであることをやめてから、だいたい一年になります。Claude Code、Codex、opencode、Gemini CLI、Copilot CLI、Cursor Agent - どれも本当にコードを書きます。ボトルネックは移りました。「エージェントにこれが作れるか」ではありません。「六つのリポジトリで五つのエージェントが何をしているのか、正気を保ったまま把握できるか」です。

私は毎日その壁にぶつかるようになりました。だから道具を作りました。Watchfireと名づけました。

Watchfireは、複数のプロジェクトにまたがってAIコーディングエージェントを走らせるためのオープンソースの管制室です。作業を隔離し、タスクとgitのworktreeを管理し、本当に人の手が要るときだけ知らせます。 想定しているのは、長時間走るエージェントのタスクをすでに何本も抱えている個人開発者か小さなチームです。IDEの代わりにはなりませんし、Claude Codeを一度だけ使うような用途には大げさです。

六か月たって、この道具には落ち着かない性質が備わりました。WatchfireがWatchfireを作るのです。以下に出てくる機能はすべて、Watchfire自身が指揮するエージェントによって仕様化され、実行され、マージされました - あなたのエージェントにも同じことをさせるためのリリースを含めて。このループこそがこの記事を書いた理由で、証拠もお見せします。

ただ、六か月で学んだいちばん役に立つことは、コード生成とはまるで関係がありません。タスクがエージェントに「決めるな」と指示するプロジェクトについてです。それがこの記事の後半で、私なら先に読む半分です。

オープンソース、Apache 2.0、macOS・Linux・Windowsで動きます。

現在のWatchfireダッシュボード
今日のWatchfireダッシュボード - 稼働中/待機/本日完了のパルス、問題がないときは黙っている注意バナー、そして直近一週間のフリート指標: 69タスク、202コミット、正味+64,979行。最後の数字はchurnであって、生産性の主張ではありません。

この道具を作らせた問題
#

年明けの数週間、私は五つのプロジェクトと三つのターミナルウィンドウの間を行き来していました。プロジェクトごとにClaude Codeのセッションがあり、セッションごとに許可のプロンプトがあり、レートリミットのしゃっくりがあり、ウィンドウを切り替えた瞬間に忘れてしまう中途半端なタスクがありました。エージェントの仕事ぶりは見事でした。遅い部品は私でした。

とくに次の点です。

  • プロンプトのお守り。 シェルコマンドのたびに承認が要る。ファイル書き込みのたびに承認が要る。コーヒーから戻ると、50ステップのタスクの2番目のプロンプトで止まったエージェントがいる。
  • 全体像がない。 いま実際に何が動いている? 何が詰まっている? エージェント#1を見ている間、エージェント#3はこの一時間で何をした? それを教えてくれるものが何もない。
  • 静かな失敗。 エージェントはマージ衝突、レートリミット、壊れたYAMLで死んで、そのまま……止まる。気づくのは一時間後。
  • 失われる文脈。 プロジェクトを移るたびに、規約を説明し直し、CLAUDE.mdを貼り直し、何がどこにあるかの頭の中の地図を読み込み直す。

Watchfireは、その痛みからの日曜午後の逃避として始まりました。

いまのWatchfire
#

実際にやってくれることは四つです。

  • 承認をやめられる。 作業はプロンプトと受け入れ基準を持つタスクとして登録され、無人で実行されます。戻ってくると、止まったプロンプトではなくマージ済みのブランチがあります。
  • フリート全体をひと目で見られる。 全プロジェクトを横断する一枚のダッシュボード。何が動き、何が詰まり、今日何が終わり、いくらかかったか。注意バナーは、本当にあなたが必要なとき以外は黙っています。
  • 何も衝突しない。 各タスクはOSのサンドボックスの内側で、それぞれ専用のgit worktreeで動きます。だから複数プロジェクトの並列エージェントが互いの作業を壊すことはなく、あなたの資格情報に到達する能力も大きく制限されます。
  • 作業が記録に残る。 タスクごとの指標 - 所要時間、コスト、コミット、ファイル、行数、マージの結末 - がプロジェクト単位とフリート全体のInsightsに集約され、CSV/Markdownのエクスポートと週次まとめも付きます。

現在、単一のBackendインターフェースを通じて六つのエージェントバックエンドに対応しています - Claude Code、OpenAI Codex、opencode、Gemini CLI、GitHub Copilot CLI、Cursor Agent。それぞれが独立した設定ディレクトリ(CODEX_HOMEOPENCODE_CONFIG_DIRCOPILOT_HOME)に収まり、資格情報やプロンプトがセッションをまたいで混ざらないようになっています。エージェントはタスク単位で上書きできます。

二層の影響範囲
#

これは、もし他人が作っていたら私が知りたい部分です。「放っておいて走らせる」が理にかなうのは、その「それ」がどこまで手を伸ばせるかを知っているときだけだからです。

各タスクは二つの独立した隔離層の内側で動きます。一つ目はgit worktreeです。タスクごとに専用のwatchfire/<task_number>チェックアウトが与えられるので、同じリポジトリの二つのエージェントが互いの書きかけを見ることはなく、実行が成功してマージされるまであなたのブランチには何も届きません。二つ目はエージェントプロセスを包むOSレベルのサンドボックスです - macOSではSeatbelt、Linux 5.13以降ではLandlock、それより古いカーネルではbubblewrapによるマウント名前空間へのフォールバック。

サンドボックスは、はっきりした方針を持つファイルシステムの許可リストです。書き込み可: プロジェクトディレクトリ、一時領域、実際のビルドが必要とするキャッシュ(~/.npm~/.cargo~/go~/.rustup)。読み取り可: コンパイラ、システムライブラリ、ツールの設定。全面的にブロック: ~/.ssh~/.aws~/.gnupg.netrc.npmrc.envファイル、.git/hooks、そしてmacOSでは個人フォルダ。保護されたこれらの場所でデプロイ鍵を探すエージェントは、そこには何も見つけられません。

正直な留保が二つあります。どちらもサンドボックスについての記事が、埋もれさせずにはっきり書いているものです。サンドボックスはファイルシステム中心で、現時点で外向きのHTTPSはブロックしません。そしてWindowsは現在サンドボックスなしで動きます - worktreeによる隔離は効きますが、OSの層は効きません。どちらも対応予定です。

この組み合わせがあるからこそ、この記事の他のすべてが擁護できます。許可プロンプトを飛ばすのが正気でいられるのは、影響範囲が使い捨てのworktreeと、エージェントが外へ出られないファイルシステムに限られているときだけです。

内部構造
#

Goのデーモン(watchfired)が、オーケストレーション、サンドボックス、PTYエミュレーション、worktree、そしてgRPCサーバーを受け持ちます。話しかけるクライアントは三つ。ターミナルとSSH作業のためのBubble TeaのTUI、プロジェクトごとにOSウィンドウを一つ開くElectron + ReactのGUI、そして薄いCLIです。デーモンは~/.watchfire/daemon.yamlを通じてポートを知らせ、ロックファイルへのflockがユーザーごとに一つのデーモンを保証します - 「二つのウィンドウが同じworktreeを取り合う」はもうありません。エージェントの出力はPTYを通り、デーモン側で本物のVTエミュレータ(hinshun/vt10x)が解釈するので、ANSIはどこでも正しく表示されます。

状態はどこもかしこもディスク上のYAMLです - レジストリ、グローバル設定、連携、そしてプロジェクトごとのproject.yaml.watchfire/tasks/<n>.yaml。v6.0以降は原子的な書き込み(tmp + fsync + rename)で、データ消失の競合状態を痛い目に遭ってから塞ぎました。すべてgrepでき、diffでき、gitを生き延びます。

そしてv9からは、そもそもUIですらない四つ目のクライアントがあります。watchfire mcp serveが、オーケストレータ全体をMCPサーバーとして公開します。これは節を改めます。

ざっと一巡り
#

ターミナルだけだったあの頃にいちばん恋しかったのはダッシュボードでした。プロジェクトの一覧ではなく - 状態です。いまどこにいる? 何が詰まっている? 今日エージェントは何をした? それがこの記事の冒頭のスクリーンショットです。稼働中 / 要対応 / 待機 / 本日完了のパルス線、異常なしのバナー、7日/30日/90日/全期間の窓を持つフリート指標、フィルター、そしてプロジェクトごとのカードにそのタスク数とコードのchurnが載ります。

プロジェクトをクリックすると専用ウィンドウで開きます - v8「Inferno」の再設計です。レイアウトはチャット中心で、エージェントとの会話が広いペイン、Tasks / Definition / Insights / Secrets / Trash / Settingsは右側のタブ付きサイドバーに収まります。

左にエージェントのストリーム、右にタスクキューを配したWatchfireのプロジェクトウィンドウ
プロジェクトウィンドウ: まずチャット、あとはすべて参照情報。これはWatchfire自身のリポジトリで、129タスク分の蓄積があり、真新しいClaude Codeセッションで待機中です。

各プロジェクトはmarkdownのDefinitionを持ち、これがプロンプトの文脈に織り込まれます。プロジェクトの常設ブリーフ - それが何で、どの規約が重要で、どのファイルが重要か - であり、複数プロジェクトのワークフローを成立させているのはこれです。エージェントが空っぽの頭ではなく文脈から始められるからです。

プロジェクトのDefinitionタブ
Definitionタブ。その場で編集するか、$EDITORに飛ばします。

プロジェクトごとのInsightsは「今週実際に何をしたのか」に答えます - 日別タスク数、エージェント別内訳、所要時間の分布、コスト、そしてv8からはコード指標も。

プロジェクト別のInsights
プロジェクト別Insights: KPI、日別タスク数、エージェント別のドーナツ、所要時間の分布。メインダッシュボードにはフリート全体の集計もあります。

Wildfireは自律モードです。Watchfireが準備済みのタスクを実行し、下書きを磨き、新しいものを生成する、というループを、プロジェクトの定義が完了と言うまで回します。v8で一人前のGUIを得ました - 確認モーダル付きの開始ボタンと、実行中のライブなフェーズ表示です。仕組みの全体はInside Wildfire modeの記事にあります。

Start Wildfireの確認モーダル
このモーダルは、普通なら言わずにおくことをはっきり言います。無人で走り、トークンを消費し続け、いまプロジェクトにいるエージェントを置き換える自律ループだと。この二文に、自分自身から救われたことが何度もあります。

グローバルなSettingsは検索可能なサブページを得て、フリート全体の既定値を持つようになりました - 新規プロジェクトがどのエージェントを受け取るか、自動マージ・ブランチ自動削除・準備済みタスクの自動開始をするかどうか。すべてプロジェクト単位で上書きできます。分割ボタンのOpenは、実際にインストールされているエディタのCLIを検出します。VS CodeやCursorからZed、JetBrains、Xcodeまで。GUIのPATHが剥ぎ取られていても動きます。

Watchfireが画面の主役であるべきでない時間のために、v8はMini Monitor - 枠なしで常に最前面にある帯 - と、同じ状態にデーモンのポートを添えたトレイメニューを追加しました。

Mini Monitorのウィンドウ
Mini Monitor: 付箋ほどの帯にフリート全体が収まります。オレンジの線が、実際に何かをしている唯一のプロジェクトです。

同じワークフローはTUIにもあります。私の開発の半分はLinuxマシンへのSSH越しに起きるからで、そこでもタスクはGUIと同じように編集できます。薄いCLIはデーモンができることをすべて覆います。

WatchfireのTUI
TUIはGUIの二ペイン構成を写します。左にタスク、右にエージェントのストリーム、chat / generate / plan / run all / wildfire / stopのショートカット付き。
watchfire --help
CLIの表面: chat、configure、daemon、define、generate、init、integrations、metrics、plan、run、task、update、wildfire - そしてv9からはmcp。

証拠: 30日間のvibe coding
#

四月、私は30日間、AIで作る30個のプロジェクトに取り組みました。一日一つ、毎日。Max 20xプランのClaude Code、指揮はWatchfire、Context7 MCPがエージェントに新鮮なドキュメントを供給します。

計画はサイドプロジェクトを出すことでした。予想していなかったのは、Watchfire自身が毎日ストレステストされる対象になったことで、自分のために切ったissueの列は、私が回した中でもっとも攻撃的なプロダクトロードマップになりました。

シリーズから代表的な場面をいくつか。

  • 1日目 (Platformer) - 「ファイル変更を一つずつ承認して座っていたわけではありません。Watchfireがタスクを並べて片づけていきました。戻ってきたら動くゲームがありました。」 立ち去るループは初日から機能しました。同時に、準備できていないものも即座に露呈しました。文字化けしたターミナル出力、レートリミットでのエージェント再起動ループ、macOSで~/Desktopを塞ぐサンドボックス。
  • 12日目 (Wordle) - 「各タスクが特定の種類の磨きを重ね、どれも前の成果を壊しませんでした。」 あれが成立した唯一の理由が、この積み増し型のタスクモデルです。一発勝負のプロンプトは壊れ続けましたが、小さく範囲を切ったタスクの群れは壊れませんでした。
  • 27-28日目 (Terminal、ideA) - クロスプラットフォームのネイティブCI/CD地獄。「ここではWatchfireがとても助けになりました。デバッグし、テストし、実行し、失敗し、また繰り返す、という終わりのないループに入り、パイプラインがついに通るまで続けたのです。あの粘りがなければ、クロスプラットフォームのリリースは諦めていたでしょう。」
  • 30日目 (miniOs) - 「1日目、一文からプラットフォーマーを作りました。30日目、そのプラットフォーマーと、その間に作ったすべてを内包するオペレーティングシステムを作りました。」

30日を通じて: Watchfire経由で実行したタスクは約450、コミットは約1,200、変更行数はおよそ32万6千行 - これはWatchfire自身が数えた挿入と削除の合計で、生産性の主張ではなくchurnの指標です。このチャレンジの期間だけでWatchfireのメジャーバージョンが五つ出ました(Ember → Spark → Blaze → Beacon → Flare)。

そのどこかで、この道具は私が想定していなかった一線を越えました。

メタな部分
#

ある瞬間 - 二週目のどこか - でループが閉じます。あなたはWatchfireを使ってプロジェクトを作っている。そのプロジェクトがWatchfireのバグを露わにする。あなたはそのバグをWatchfireのタスクとして登録する。WatchfireがエージェントをまわしてWatchfireを直す。修正が出る。そして元のプロジェクトに戻ると、それは別のタブでまだ待っている。

最初は笑えます。十回目にはただのワークフローです。振り返りの時点では、それこそが本題になっています。

より正確には、いまやWatchfireがWatchfireを作っています。この道具は自分自身の開発を指揮しています。

これが書かれたのは五月です。七月には、それは記事の中の一文であることをやめ、リリース手順になりました。v9のキューにあったすべてのタスク - MCPサーバーの骨格、タスク工場のツール群、実行系のツール、検査系のツール - が、Watchfireを通じて書かれ、実行され、マージされました。

開発中のv9タスクキューが並ぶWatchfire自身のプロジェクトウィンドウ
v8がv9を作る: 開発中の九つのタスク、そのどれもがMCPサーバーの一部で、Watchfire自身のリポジトリの中を、Watchfireの中で走っています。

そしてキューが空になると、エージェントが自分でリリースを用意しました。

v9.0.0がドラフトリリースとして用意できたと報告するWatchfireのエージェント
v9.0.0の終盤、そのままの記録: バージョンを上げ、CHANGELOGを書き、22コミットをプッシュし、リリースのワークフローは緑、20個の成果物をドラフトとして用意 - そして取り消せない唯一の手順の直前で完全に停止し、「はい」を待っている。境界の引き方が正しかった。私が本当に気にしていたのはそこです。

サイトもループの中にいます。watchfire.io - ドキュメント、ツアー、changelog、ブログ - は他と同じWatchfireのプロジェクトで、それが説明している当のものによってタスクごとに作られています。それについての記事もまるごとあり、しかもその記事が説明している手順によって書かれています: Watchfire eats its own dogfood

watchfire.ioをv9.1に更新するWatchfireのエージェント
プロンプトは四語 - 「update watchfire website to 9.1」 - それでエージェントはバージョンが書かれている箇所をすべて見つけ(ヒーローのバッジ、JSON-LD、changelog、RSS)、リリースノートを書き、ビルドを検証し、コミットの手前で止まります。途中の判断に注目: バッジを一つだけ9.0のままにしました。あれが依然として看板リリースで、9.1はバグ修正だからです。

これのどれもが小手先の芸ではない理由は、ごく平凡です。私が感じたかすり傷はすべて、それを引き起こしたのと同じ機構によって記録され、直されました。「こうしてくれたらいいのに」はすべて数秒で下書きタスクになり、欠けに気づいてから修正が出るまでの距離は数時間に縮みました。これは、Watchfireがあなたの仕事に対して正しい形をしていることの証明にはなりません - 六か月間、毎日、細部まで観察できたただ一つのワークフローに対して正しい形をしている、ということの証明です。たまたまそれは、道具を作るやり方としては良いやり方です。そしてv9は、その観察を製品にしたものです。WatchfireがすでにWatchfireを作れていたのなら、あとはあなたのエージェントにもハンドルを握らせるだけでした。

チャットを工場につなぐ
#

そこで、v9でいちばん楽しんでいる部分の話になります。エージェントを工場につなぐのは、設定ファイルを探し回る宝探しではありません - 設定ページです。WatchfireはあなたのマシンにあるエージェントのCLIを検出し、それぞれの設定にMCPのエントリをワンクリックで書き込みます。

エージェントごとのワンクリックインストールが並ぶSettings → MCPページ
Settings → MCP: エージェントCLIごとに一枚のカード。Claude Codeはクリック一つ - Watchfireが~/.claude.jsonにエントリを書き込みます。CodexとCopilotは自動検出され、Installを押すだけでした。それ以外にはコピーできるスニペットがあります。stdioのみ、ホストローカル、ネットワークには何も出しません。

Claude Codeのボタンを押し、セッションを再起動すると、ただのターミナルがWatchfireのクライアントになりました。何が動いているか尋ねれば、登録済みのプロジェクトをすべて挙げ、どれがWildfireループの実行フェーズにあるかを教え、そのプロジェクトのタスクキュー全体を引いてきます - Watchfireのウィンドウをどこにも開かないまま。

それが手に入ると、いくつものワークフローがSFでなくなります。

  • 外で計画し、中で製造する。 チャットでエージェントとアイデアを練り - どのチャットでも構いません - コードを投げつけられる代わりに、受け入れ基準つきの範囲を切ったタスクが登録され、Watchfireがそれをサンドボックスで、worktreeで、マージと指標つきで実行します。会話は会話のまま。コードは工場で起きます。
  • 一つの席から複数プロジェクトを横断する。 このブログのリポジトリに座っているセッションが、Watchfireのリポジトリでいま見つけたバグを登録したり、サイトのプロジェクトでドキュメント更新を起動したりできます。ディレクトリもウィンドウも変えずに。
  • エージェントがエージェントをレビューする。 外側のエージェントが実行後にget_task_diffを読み、追加タスクを起こすかどうかを判断します - レビュアーがworktreeに一切触れないレビューループです。
  • 自分で書かれるバグ報告。 つないだセッションに最初に頼んだのはあるプロジェクトのinsightsで、返ってきたのはゼロの壁でした。過去のタスクにはcompleted_atが一度も刻まれておらず、それに依存する指標がすべて空だったのです。それがタスクになり、そのタスクが二日後にv9.1になりました。外側のエージェントは、工場を使うことでバグを見つけたわけです。

この時点で、工場という比喩は比喩であることをやめます。Watchfireが製造を担い - 隔離、実行、マージ、記帳 - MCPを話せるものなら何でも受注カウンターに立てます。

負荷試験: Neon Fable
#

v9が本当に持ちこたえるかを確かめるため、意図的に無茶なものに向けました。rpg-fable-testNeon Fableというブラウザ上のサイバーパンクRPGです。ほぼ全部をWildfireが作り、私はもっぱらプロジェクトのDefinitionを書いて、キューが減っていくのを眺めていました。

Neon Fableのプロジェクト定義を開いたままWildfireが実行中
仕掛け全体: ゲームを記述したDefinition(三幕の分岐する物語、アイソメトリックのレンダラ、ターン制戦闘、サイバーウェアのインベントリ)と、それをタスクに変えるWildfireループ。v1 - 遊べる一連の流れ一式 - はタスク#1-18として出ました。

v1のキューは、ゲームをnpm create viteから完成した一巡りまで運びました。キャラクター作成、三幕の分岐する物語、シード付きのターン制戦闘、インベントリとサイバー強化、複数のエンディング、エンディング図鑑、New Game+。ピクセルアートはすべてコードの中で、パレット参照の文字列グリッドとして書かれています。エージェントが反復できるのがそれだからです。v2のキュー - 高精細なグラフィック刷新と、モジュール式のキャラクター外見システム - はWildfire自身が生成しました。プロジェクトはいま119タスク、うち103が完了しマージ済みで、テストスイートはタスク#40のあたりで902件を通し、以来増える一方です。

Neon Fableのアート系タスクを実行するWildfire
Wildfireが「Day-phase neon states - dusk, night, late-night」の実行フェーズで、TypeScriptの発光カラーランプを手書きしているところ。ドッキングされたシェルのVite開発サーバーが、変更が入るたびにゲームをホットリロードします。

そして反対側から出てくるのがこれです。キャラクタークリエイターは、v2の外見システムまるごとを目に見える形にしたものです - 重ねるスプライト合成、スロットごとのカタログ、ライブプレビュー、ロック可能なランダマイズ。

Neon Fableのキャラクター作成における外見の工程
タスク#33-53が一画面に: 重ねるスプライト合成、髪/目/眉/口/顔の細部のカタログ、カラーチャンネル、回転するライブプレビュー、そしてスロットごとのロックを尊重する「surprise me」。各スプライトはTypeScriptファイル内の文字列グリッドです。
Cinder Row Plazaでのアイソメトリックなゲームプレイ
Cinder Row Plaza: 64×32のアイソメトリックタイル、動くネオン看板、同じレイヤーシステムで作られた十数体の異なるNPC、ミニマップ、分岐する会話 - 一ピクセル残らず、見ることのできないエージェントがコードとして書きました。
Neon Fableのターン制戦闘
戦闘: 上部に行動順、移動と行動の予算、流れていくログ。その下で動くシード付き乱数はタスク#6、v1のキューの頃のものです。

Neon Fableは製品ではないし、製品になる予定もありません。工場を扱いにくいものに向けたら何が起きるかを見るために作ったデモ用のプロジェクトです。ブラウザで遊べますし、コードも読めます。負荷試験としては、すでに問いに答えました。自分のバグを直し自分のドキュメントを書くだけではない - ピクセルアートとゲームの手触りのような厄介なものを渡されても、出し続けるのです。

もう半分: ほとんど考えることでできているプロジェクト
#

Neon Fableは派手な事例であり、同時に誤解を招く事例でもあります。Watchfireを、自分が書いていないコードを生成する機械のように見せてしまう - それは写真映えする側の半分で、私がいちばん信用していない半分です。

ダッシュボードにある最新の二つのプロジェクトは、その正反対です。Animaは個人向けエージェントの製品 - 一人に一体の永続的なエージェント - で、FitQuestは手持ちのあらゆる機器の数値をゲーム化するフィットネストラッカーです。どちらも本気の野心があります。どちらもまだ製品のコードがありません。あるのはdocs/ディレクトリ、決定の記録、そして第一のルールがドキュメントが真実の源であり、コードがドキュメントに従う。逆は決してないであるプロジェクトDefinitionです。

だからタスクはNeon Fableのものとはまるで似ていません。

  • 「くさびを研ぐ - 最初のユーザー、中心的なユースケース、インターフェースのモデル(推奨せよ、確定させるな)」
  • 「KMPとFlutterの決定のための根拠資料 - 調査のみ、決定するな
  • 「HUDパレットのコントラストと色覚の監査」
  • 「MDRに適合する文言規則をブランドボイスに落とし込み、PoC内のユーザーに見えるすべての文字列を監査する」

その括弧をもう一度読んでください。あれは自律的であるなという指示です - 根拠を集め、トレードオフを示し、決定は私に残せ、と。AnimaのDefinitionは同じ姿勢を常設ルールとして持っています。ロック済みと記されたものは決着済みで、タスクが欠けや矛盾を露わにしたら、エージェントは方向をでっち上げるのではなく止まり、それを表に出し、ドキュメントを直し、それから続けるよう指示されます。FitQuestのほうは、文書化された道筋から外れるくらいならタスクをきっぱり失敗させろ - 理由を添えたsuccess: falseで - と言っています。

これは同じ機構を、記録の残る調査助手に近いものへ変えます。作業は以前とまったく同じように範囲を切られ、隔離され、実行され、マージされますが、diffに着地するのは機能ではなく、判断のための資料かドキュメントの更新です。その時点でDefinitionは文脈の詰め物ではありません。統治です。

どちらのプロジェクトにも成果物はあります。いずれは現物を見なければならないからです。

Animaのオンボーディング画面
Animaの孵化: 漂う光の塊が生き物へと凝集し、そのあと六つの質問をします - どの質問も、その存在を形づくるか、最初の記憶になるかのどちらかです。docs/explorations/以下の自己完結したWebGLプロトタイプとして作りました。設計文書が、コードが存在する前にプロトタイプで物事を確かめよと言っているからです。
iOS上のFitQuestの今日の画面
FitQuestの使い捨てSwiftUI実証: 本物のHealthKitデータ、段階と連続記録を持つクエスト、XPバー。これは明示的に製品ではありません。クエストの仕組みが実機との接触に耐えるかを試すために存在し、学びはコードが捨てられる前にドキュメントへ還ります。

ゲームではマージ済みタスクが百三件。他の二つでは、慎重に囲いを設けたものが三十八件。同じデーモン、同じworktree、同じサンドボックス。違いはひとえにDefinitionの書き方にあります - それが六か月たっての本当の教訓であり、これから始める人に渡したい一つでもあります。道具は、与えるブリーフの質までしか良くならない。そして、決めるなと言うべきときを知ることが、技術の大半である。

ここまでの道のり
#

最初のバージョンはWatchfireという名前ですらありませんでした。FORGEという名前で - プロジェクトセレクタ、タスク一覧、Claude Codeを動かす埋め込みターミナルを備えた、Electronの一枚窓でした。粗削りで、タスクモデルは薄く、出力は文字化けし、プロジェクトを変えるにはアプリを再起動する必要がありました。それでも中心の考えはもうそこにありました - 作業を並べ、実行を眺め、ターミナルを直接触らない。

2026年1月12日のFORGE
1月12日: FORGE。一度に一プロジェクト、タブ式レイアウト、ダッシュボードなし、指標なし、マルチエージェントなし。ウェルカムメッセージのClaude Codeのドット絵アバターは、必要以上に長く居座りました。

二月の初めに、リポジトリをGoでゼロから作り直しました - HTTPではなくgRPC、SQLiteではなくYAML、Electronの一枚岩ではなく三つのバイナリ。それが今日も動いているコードベースです。そして四月が来て、バージョン付けにテーマがつきました。メジャーリリースにはすべて火の名前がつき、その刻みを見れば、その月に何が痛かったかが正確にわかります。

  • v1.0「Ember」 (四月初旬) - 最初の本当のリリース。Claude Codeの~/.claude/projects/からのトランスクリプト検出、三回のクラッシュ後に効く再起動ループ防止、~/Desktopのプロジェクト向けSeatbelt修正。
  • v2.0「Spark」 (四月中旬) - 差し替え可能なバックエンドのインターフェース。Codex、opencode、Gemini CLIが同じ日に登場し、タスク単位のエージェント上書きとセッション単位の設定隔離も。
  • v3.0「Blaze」 (四月下旬) - 5つ目のバックエンドとしてCopilot CLI、加えて二週間分の出血を止めました。Linuxの更新を食べていたファイルシステムをまたぐEXDEVバグ、タスク一覧のローテーション、GUIの更新ループ。
  • v4.0「Beacon」 (28日目) - タスク実行器から運用ツールへの転換点。ダッシュボードの作り直し、タスク単位の指標、Insights、エクスポート、週次まとめ、OS通知、署名検証つきのSlack/Discord/webhookリレー、GitHubの自動PR。
  • v5.0「Flare」 (30日目) - SlackとDiscordのOAuthボット、レート制限と冪等性を備えた受信HTTPサーバー、GitLab/Bitbucketのマージ対応、そしてマージ失敗時に黙って止まっていたrun-allの修正。静かなダッシュボードは二番目に最悪のダッシュボードだと判明しました。
  • v6.0「Phoenix」 (五月初旬) - YAMLの原子的書き込み、flockによるシングルトンデーモン、6つ目のバックエンドとしてCursor Agent、そして本物のスクロールバックを得たTUI。
  • v7.0 → v7.4「Forge」 (五月-六月) - ええ、あの最初の名前です。それが属していたものがとうに書き直されて消えたあと、コードネームとして再利用しました。あらゆる場所でのタスク並べ替え、先頭に飛ばなくなったチャットビューポート、集中チャットモード、そしてお気に入りの戦記: あるユーザーのデーモンログが誰にも気づかれないまま300 GBまで育ったあとで、ようやくサイズ上限がついた件(事後検証)。
  • v8.0「Inferno」 (六月末) - プロジェクトごとに一つのOSウィンドウ、管制塔となるホームウィンドウ、WildfireのGUI、Mini Monitor、そして閉じたタスク数ではなく出荷されたコードを測るコード出力指標。(リリース記事)
  • v9.0「Firestorm」 (七月26日) - 役割の反転。18のツールを持つMCP工場、stdioのみ、--read-onlyモードと各所の安全柵つき。(リリース記事)
  • v9.1 (七月29日) - 数節前に出てきたcompleted_atの修正。約580件の過去タスクを遡って埋め、Insights、エクスポート、まとめのすべてに灯をともしました。

もう一枚だけスクリーンショットを。そのあとで、この記事の冒頭の一枚を見返してください。

2026年4月のWatchfire
4月27日: Go書き直し版のGUI - 見覚えはあるものの、Insightsなし、フリートのKPIなし、ライブプレビューなし。30日チャレンジの大半を走らせたのがこのバージョンです。

その二枚のあいだは十四週間。同じ道具です。

この先
#

  • 新しいエージェントのバックエンドが出てきたら随時追加します。Backendインターフェースが唯一の統合点で - シェルを話し、トランスクリプトを出せるものなら何でも仲間になれます。
  • より広いMCPの表面: 検査系ツールの充実と、長時間走る外側のエージェントが単一プロジェクトではなくフリート全体を監督できるようにすること。
  • より良いdiffとレビューの道具立て。埋め込みビューアはもうありますが、人の目が要るタスクのための、きちんとしたPR風の「レビューしてからマージ」の場が欠けています。
  • チームのワークフロー。ファイルベースのタスクモデルはすでにgitを生き延びます - 共有タスク一覧とレビューの場は、その自然な延長です。

試してみる
#

macOSなら、インストールは一行です。

brew tap watchfire-io/tap && brew install --cask watchfire-io/tap/watchfire

その他すべて: 最新リリースをダウンロード · ドキュメント · changelog · ブログ

複数のAIエージェントをやりくりしていて、気づけばターミナルの間をalt-tabしている、という方には、足りなかった一片かもしれません。私にとってはそうでした。

六か月、九つのリリース、そして最後には自分自身を作るようになった道具。一日の終わりに何かを出荷しなければならないほうの「vibe coding」です。

関連記事