オーブンにはタイマーが付いています。ダイヤルを回して、鳴ったら開ける。そのあいだ台所を離れていてかまいません。
コンロにタイマーは付いていません。付いていないのが不親切なのではなく、要らないからです。コンロで何かを煮るときは、横に立って鍋を見ています。吹きこぼれそうになったら火を弱めるので、鳴らす相手がそこにいます。
同じ台所の道具で、片方だけに知らせる機構があるのは、離れるかどうかの違いです。そしてもう一つ、オーブンには終わりがあってコンロには無い、という違いもあります。鍋はいつまでも火にかけていられます。
終わりがある道具にだけ、終わりを知らせる機構が付きます。
五分後、音は鳴らなかった
テストに五分かかるプロジェクトがあります。走らせているあいだ、別のマスで作業したい。失敗したら音で知りたい。
MulmoTerminal は AI を何枚ものマスに並べて見張るための画面で、一マスが一体の AI にあたります。無料で、オープンソースとして公開されています。通知音の設定にコマンドが異常に終わったときという項目があるので、有効にします。
素のターミナルのマスで yarn test と打ちます。五分後、失敗しました。音は鳴りませんでした。
シェルの中では、終わりが分からない
理由があります。素のターミナルのマスでは対話するシェルが生き続けるので、その中のコマンドがいつ終わったかを誰も知りません。
シェルはプロンプトに戻っただけです。外から見ると、シェルはまだ生きています。何かが終わったという出来事が発生していません。成功だったのか失敗だったのかも、外からは分かりません。
火にかけたままの鍋と同じです。終わりがないので、知らせようがありません。
一コマンドだけのマスなら、分かる
鳴らせるのは、一つのコマンドだけを走らせるために開いたマスです。
そのマスは、コマンドが終わると終わります。終了の合図が残るので、成功も失敗も検知できます。
オーブンのほうです。
登録する場所が二つある
ここでどこに書くかの話になります。空いているマスには、似たものが二つ並んでいます。
一つはプロジェクトのスクリプトで、プロジェクトに置くファイルに書きます。もう一つはよく使うコマンドで、パソコン全体の設定に書きます。
見た目が似ているので、どちらに書けばいいか迷います。
置き場所が、そのまま性質の違い
| プロジェクトのスクリプト | よく使うコマンド | |
|---|---|---|
| どこに書くか | プロジェクトの中 | パソコン全体の設定 |
| 誰のものか | プロジェクトのもの(取ってきた人にも出る) | 自分のもの(どのプロジェクトでも出る) |
| マスの中身 | 一コマンド専用の使い捨て | 永続のターミナル |
| 終了の合図 | ある | シェルなら無い |
| 通知音 | 鳴ります | 鳴りません |
置き場所と性質が対応しているのが、この二つの整理です。
だから使い分けはこうなる
結果を知りたいコマンドは、プロジェクトのスクリプトです。テスト、ビルド、lint、デプロイ。
中で作業したいものは、よく使うコマンドです。htop、node の対話画面、lazygit。
走らせて終わるものと、入って操作するものの区別です。オーブンとコンロの区別と同じです。
冒頭のテストは、走らせて終わるものなので前者です。
プロジェクトに置く意味
プロジェクトのスクリプトは、プロジェクトの中に書きます。
{
"scripts": [
{ "label": "dev", "command": "yarn dev" },
{ "label": "test", "command": "yarn test", "cwd": "." }
]
}
取ってきた人にも同じボタンが出ます。
package.json のスクリプトを自動で読むのではなく、別のファイルにしているのには理由があると思います。package.json には内部用のスクリプトも入っているので、格子のマスで開く価値があるものを選ぶためです。
素のシェルは登録しなくていい
一つ注記があります。ここに書くのは自分で足したものだけで、素のシェルは起動画面の選択肢が担当します。
bash や zsh を登録する必要はありません。
ヘッダーのボタンにもできる
プロジェクトのスクリプトは、マスのヘッダーのボタンにもできます。
そうすると空いているマスを探さずに、作業中のマスのヘッダーから一クリックで走らせられます。テストを一日二十回走らせるなら、これが効きます。
フォルダのボタンには、色の線が付く
小さいけれど便利な仕様があります。
よく使うフォルダのボタンの左端に、細い線が出ます。その色は、そのプロジェクトに設定した色です。
起動する前から、プロジェクトを色で見分けられます。
ボタンの並び順
よく使うフォルダのボタンは、並び順の宣言があればその順です。宣言していないものは、後ろに最後に開いた順で続きます。
毎日開く五つに宣言しておけば、手が位置を覚えられます。
使ってみる
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 の使用量はその契約から引かれます。
プロジェクト用のほうは、そのプロジェクトのフォルダに script.json を置きます。無ければ作ります。
{
"scripts": [
{ "label": "test", "command": "yarn test" }
]
}
自分の道具を登録するほうは、~/.mulmoterminal/config.json の launchers です。無ければ作ります。
{
"launchers": [
{ "label": "htop", "command": "htop" },
{ "label": "lazygit", "command": "lazygit" }
]
}
こちらはどのプロジェクトでも出ます。そして開いたマスは永続のターミナルなので、終わったことを検知できず、音も鳴りません。
プロジェクトの script.json は、空いているマスを開き直せば出ます。launchers のほうは、アプリの再起動が要ります。
空いているマスの OR RUN A SCRIPT に test が並べば成功です。そこから走らせると、終わったときに音が鳴ります。音の設定をしていれば、です。
やめるときは、その項目を消せばボタンが消えます。
まとめ
オーブンにタイマーがあってコンロに無いのは、離れるかどうかの違いと、終わりがあるかどうかの違いです。
コマンドをボタンにする場所が二つあるのも同じ区別です。一コマンドだけのマスには終わりがあるので音が鳴り、シェルのマスには終わりがないので鳴りません。
結果を知りたいものはプロジェクトのスクリプトに、中で作業したいものはよく使うコマンドに書きます。音が鳴るかどうかは、どちらに登録したかで決まっていた、という話でした。
