課題:テストに 5 分かかるのに、終わったときに音が鳴らない
テストに 5 分かかるプロジェクトがあります。走らせているあいだは別のセルで作業したい。失敗したら音で知らせてほしい。
MulmoTerminal の通知音設定には「コマンドが異常終了したとき」という項目があり、有効にしてあります。
素のターミナルセルを開いて、yarn test と打つ。5 分後、失敗して戻ります。
音は鳴りません。
これは設定ミスでも環境問題でもなく、素のシェルの中で走らせているから起こります。
なぜシェルの中では終了が検知できないのか
素のターミナルセルの中では、bash や zsh のような対話シェルが生き続けています。その中で yarn test を走らせても、終わったあとシェルはプロンプトに戻るだけで、外から見るとシェルは何も変わっていません。
MulmoTerminal が通知音を鳴らすのは、セルで走っているコマンドが終了したときです。シェルの中で走った子プロセスの終了は、シェルは知っていてもセルの外には伝わりません。成功だったか失敗だったかも分かりません。
鳴らせるのは、セル自体が 1 つのコマンドで、そのコマンドが終わるとセルも終わるタイプのものです。終了の合図がセル境界で発生するので、成功も失敗も検知できます。
MulmoTerminal の解決:1 コマンド専用セルを登録する
空いているセルの起動フォームには OR RUN A SCRIPT と OR LAUNCH という欄があります。ここに登録したコマンドは、1 つのコマンド専用のセルで起動します。そのコマンドが終わればセルも終わるので、通知音が鳴ります。

登録先が二つあって、見た目が似ているので迷いますが、置き場所と性質が一対一で対応しています。
| OR RUN A SCRIPT | OR LAUNCH | |
|---|---|---|
| 書く場所 | プロジェクトの script.json |
全体設定の ~/.mulmoterminal/config.json の launchers |
| 誰のものか | プロジェクトのもの(他の人が clone しても出る) | 自分のもの(どのプロジェクトでも出る) |
| セルの中身 | 1 コマンド専用 | 1 コマンド専用 |
| 典型 | テスト/ビルド/dev サーバ/lint/デプロイ | htop/lazygit/node REPL |
| 通知音 | 鳴る | 鳴る |
どちらも 1 コマンド専用セルなので、通知音は鳴ります。違うのは「プロジェクトごとに違うコマンド」なのか「自分がどのプロジェクトでも使う道具」なのかです。
詳細
script.json — プロジェクトのスクリプト
プロジェクトのルートに script.json を置きます。
{
"scripts": [
{ "label": "dev", "command": "yarn dev" },
{ "label": "test", "command": "yarn test", "cwd": "." }
]
}
package.json のスクリプトを自動で読み込まないのには理由があります。package.json にはビルド補助の内部用スクリプトも入っていて、空きセルの Run メニューに出す価値があるのはそのうちの数件だけです。別ファイルにすることで、「セルで開く価値があるもの」をプロジェクト側が明示できます。
clone した他の人にも同じボタンが出るので、プロジェクトの「標準の動かし方」をコミットできます。
launchers — どのプロジェクトでも出る自分の道具
~/.mulmoterminal/config.json に書きます。
{
"launchers": [
{ "label": "htop", "command": "htop" },
{ "label": "lazygit", "command": "lazygit" }
]
}
launchers に書くのは 自分で足したものだけ で、素のシェルを登録する必要はありません。素のシェルは起動フォームの Shell トグルが担当します。
ヘッダーボタンにも昇格できる
script.json のスクリプトは、稼働中のセルのヘッダーにボタンとして出すこともできます(buttons / commands)。空きセルを探さず、作業中のセルから 1 クリックで走ります。
稼働中セッションの Run ボタン(再生アイコン)から呼び出すと、隣の空きセルで走ります。会話を止めずに裏でテストが回るので、「エージェントに書かせたコードをその場で試す」を 1 クリックに畳めます。
反映のタイミング
script.jsonを書き換えた場合 → 空きセルを開き直すだけで反映launchersを書き換えた場合 → アプリの再起動
launchers は全体設定の ~/.mulmoterminal/config.json にあり、このファイルはサーバ起動時に 1 度だけ読まれます。
使ってみる
MulmoTerminal を立ち上げたら、まずは script.json から試すのが楽です。
- いま開いているプロジェクトのルートに
script.jsonを作る - 普段よく打つ
yarn testなどを 1 行書く - 空きセルを開き直す
- OR RUN A SCRIPT に
testが出れば成功
そこから走らせて、失敗で終わったときに音が鳴れば、通知音も効いています。「コマンドが異常終了したとき」の設定を有効にしておくのを忘れずに。
launchers のほうは、htop のようにどのプロジェクトでも使う道具を 1〜2 件書いて、再起動して空きセルの OR LAUNCH に出れば成功です。
書き方の詳細は MulmoTerminal 公式ガイドの設定ページ に全キーが載っています。
まとめ
- 素のターミナルセルで走らせたコマンドは、終了がセル境界に出ないので通知音が鳴らない
- 鳴らせるのは、セル自体が 1 つのコマンドで、そのコマンドが終わるとセルも終わるタイプのもの
script.jsonはプロジェクト固有の「標準の動かし方」、launchersは自分がどこでも使う道具- 置き場所の違いが、そのまま「プロジェクトのものか/自分のものか」の性質の違いになっている
関連: MulmoTerminal 公式ガイドの設定ページ / Cursor の代替としての MulmoTerminal / tmux で Claude Code を並列に走らせる限界
