一枚の紙を二人で書くと、あとの人の字しか残らない

一枚の紙を二人で書くと、あとの人の字しか残らない

銀行の窓口には、昔は台帳がありました。旅館には宿帳があり、工場には作業日誌がありました。どれも一冊しかなく、書き込むのは一度に一人です。

二人で同時に書いたほうが早いはずなのに、そうはしませんでした。同じ行を二人が書くと、あとに書いた人の字だけが残ってしまうからです。しかも先に書いた人は、自分が書いたことを覚えているので、消えているとは思いません。

そこで帳簿の世界は、紙を分けるほうを選びました。担当ごとに冊子を持って、あとで一つにまとめる。手間は増えますが、消えるより安いという判断です。

同じ判断を、いまコードでもう一度することになります。

15分後に消えている

AI にコードを書かせる道具が増えて、一体に頼んで待つのが当たり前になりました。待っているあいだに別のことも頼めるので、二体に別の作業を渡すところまでは自然に進みます。

一体目にはログイン画面のバグ。二体目には検索機能の追加。

15分ほどして、一体目が「直しました」と言います。二体目も「できました」と言います。確かめると、一体目の修正が消えています。

二体目が途中で枝を切り替えたときに、一体目が編集していたファイルが別の中身に戻っていました。枝というのは git の言葉で、この作業のための変更を他と混ぜずに積んでおく場所のことです。

順番を気をつけても直らない

原因は単純で、一つのフォルダは一つの枝しか開けないというところにあります。

二体が同じフォルダにいると、枝を取り合うことになります。AI は必要だと思えば枝を切り替えるので、他の AI が作業中だから待つ、ということはしません。

厄介なのは、壊れたことが分かりにくいところです。一体目は直しましたと言っていて、実際に直したので嘘ではありません。ただ残っていない。冒頭の台帳で、先に書いた人が消えたと気づかないのと同じ形です。

AI を並列にして最初に諦める理由は、たいていこれです。

フォルダを増やすのは、昔は重かった

ではフォルダを二つ用意すればいい、というのは正しい方向です。ただ、プロジェクトを丸ごと取ってくると数百メガバイトが増えるので、五体動かしたいなら五倍になります。五本とも自分で最新にしておく必要もあります。

紙を分けるほうが安いはずなのに、分けるコストのほうが高くついていた時期がありました。

git が持っている、二冊目の作り方

git には、一つのプロジェクトに複数の作業フォルダを持たせる機能があります。それぞれが別の枝を開いていて、履歴のほうは共有します。丸ごと取ってこなくても独立した作業場所が増えるので、容量はほとんど変わりません。worktree と呼ばれている機能です。

MulmoTerminal は、これを画面から使えるようにしています。ターミナルで動く AI を何枚ものマスに並べて見張るための画面で、一マスが一体の AI にあたります。無料で、オープンソースとして公開されています。

名前を一つ入れるだけ

git のプロジェクトを開いたマスの起動フォームに、作業を隔離する欄が出ます。作業の名前を入れてボタンを押すと、その作業専用のフォルダができて、そこで AI が起動します。

git のコマンドは打ちません。すでにある作業フォルダはその下に一覧で出るので、続きはそこから開きます。

入口によって、分岐元が変わる

実用上いちばん効くのはこの仕様です。

作業の名前を手で入れたときは、枝の名前が agent/<名前> になり、分岐元は手元のもとの枝になります。issue の行から始めたときは、枝の名前が issue/<番号>-<内容> になり、分岐元は取ってきた最新のものになります。

なぜ後者だけ最新から分岐するのか。同じプロジェクトの複製を何本も持っていると、最新にしているのは今使っている一本だけで、別の複製は一週間前のままかもしれません。そこから手元で分岐すると、一週間前のコードの上で作業を始めてしまいます。

issue から始める作業はこれから人に見せる提案になるものなので、そこだけ最新に合わせています。最新が取れなかったときは手元から分岐して、フォルダの作成自体は成功するので、黙って止まることはありません。

作られる場所

作業フォルダは、プロジェクトの中には作られません。このアプリの管理下に作られます。

プロジェクトの中に作ると、変更していないのに知らないフォルダが増えている、という状態になって git の状態が汚れるからです。

一つのフォルダに一体まで

冒頭の事故を根本から防ぐ仕組みがあって、一つの作業フォルダで二体は起動しません。

一覧の行は、状態によって意味が変わります。何も出ていない行はその作業フォルダで最初の一体を起動する行で、resume と出ている行はすでにいる会話を再開する行です。in use と出ている行は押せません。別のところで開かれています。

この制限は行ではなくフォルダに付いているので、パスを手で貼っても、よく使うフォルダのボタンから開いても起動しません。最終的に断るのはサーバー側なので、書き方を変えてもすり抜けません。

AI が二体同じところに入るということが、そもそも起こらないようになっています。

AI 以外は入れる

対象は AI だけです。素のターミナルと、それ以外を走らせる起動コマンドは対象外になっています。開発サーバーや git の道具のことです。

AI が作業しているフォルダこそ、それらを動かしたい場所だからです。

ヘッダーに出る数字

変更が溜まると、マスのヘッダーに +2 ●5 のような表示が出ます。+ がもとの枝より進んだコミットの数で、● がまだ履歴に刻んでいない項目の数です。クリックすると差分が開きます。

この表示は作業フォルダのマスで、かつ変更があるときだけ出ます。見ていないあいだに AI が何をしたかを、数字で知れる部分です。

先に一行足しておく

.gitignore に .mulmoterminal.local.json を入れておきます。

# .gitignore
.mulmoterminal.local.json

作業フォルダには、色や名前を引き継ぐためにプロジェクトの設定のコピーが置かれます。これが .gitignore に入っていないと、git から見て未追跡のファイルとして出ます。未保存の変更があるフォルダは削除が断られるので、掃除できない作業フォルダになってしまいます。一行足すだけで解消します。

使ってみる

MulmoTerminal は、次の一行で立ち上がります。ターミナル(Windows なら PowerShell、Mac ならターミナル)を開いて、そのまま貼り付けます。

npx mulmoterminal@latest

ブラウザが開いて http://localhost:34567 が表示されれば成功です。インストールという作業はなく、合わなければ閉じるだけで終わります。止めるときは、打ったターミナルで Ctrl + C を押します。

動かない場合、足りないものは次の二つのどちらかです。

確かめ方 無ければ
Node.js 22.12 以上 node -v nodejs.org/ja/download の LTS。入れたらターミナルを閉じて開き直す
Claude Code claude --version macOS は curl -fsSL https://claude.ai/install.sh | bash、Windows は irm https://claude.ai/install.ps1 | iex。そのあと claude でログイン

Claude Code は、AI をターミナルから使うためのコマンドです。使うには Claude の有料プラン(Pro / Max / Team / Enterprise)か API のアカウントが必要で、無料プランには含まれていません。MulmoTerminal 自体は無料で、AI の使用量はその契約から引かれます。

この記事は git のプロジェクトで作業する話なので、一つ手元にある前提です。無ければ、まず git を入れます。

# macOS
xcode-select --install

Windows は git-scm.com/downloads/win からインストーラを実行します。そのうえで、GitHub にあるプロジェクトを取ってきます。

gh repo clone <owner>/<repo>

自分のプロジェクトが無ければ、新しく一つ作って試すのでもかまいません。

mkdir -p ~/src/tameshi && cd ~/src/tameshi
git init && echo hello > README.md && git add README.md && git commit -m "first"

枝が一つあれば、この記事の話は全部試せます。立ち上がったら、空いているマスをクリックします。

起動フォーム。上のタブで Claude / Codex / Antigravity / Shell を選び、WORKING DIRECTORY にフォルダのパスを入れて、右の再生ボタンで起動する。下に OR ISOLATE IN A WORKTREE と OR LAUNCH

WORKING DIRECTORY に git のプロジェクトのフォルダを入れると、下のほうに OR ISOLATE IN A WORKTREE (GIT REPO) という欄が出ます。作業の名前を入れて(たとえば fix-login)、+ New worktree を押します。もう一件やるなら、別の空きマスで同じことを別の名前でやります。

二つのマスで別々のファイルを直させて、両方の変更が残っていれば成功です。

マスを閉じるときには、残すか消すかを聞かれます。消すほうを選ぶと、フォルダと枝が一緒に消えます。未保存の変更があるときはその数を出してボタンの文字が変わるので、押す前に何が消えるかが分かります。

まとめ

同じ紙を二人で書かせないという決まりは、台帳の時代にできたものです。あとに書いた人の字しか残らず、しかも先に書いた人が気づけないからでした。

AI を並列で動かすと、一つのフォルダが一つの枝しか開けないというところで同じことが起きます。紙を分けるのが答えで、git はそのための機能を最初から持っています。

MulmoTerminal は、その機能を名前を一つ入れるだけで使えるようにして、そのうえで一つのフォルダに二体入れないようにしています。

この記事をシェア

関連記事

記事一覧に戻る