ヘッダーをカスタマイズする
- 1. まずヘッダーを読む
- 2. 最初のボタンを 1 個足す
- 3. アイコンとツールチップ
- 4.
runの 3 種類 - 5.
${変数}とwhen— 状況に合わせる - 6. 並び順と、2 つの設定ファイルの関係
- 7. チップ — ヘッダーに情報を出す
- 8. Skill メニューを絞り込む
- 関連
よく使う操作が「ターミナルに打ち込む」しかないと、1 日に何十回も同じ文字を打つことになります。 MulmoTerminal は、稼働中セッションのヘッダーに自分のボタンを足せます。設定ファイルに数行 書くだけで、/compact の送信も、テストの実行も、社内 wiki を開くのも、ワンクリックになります。
このページは最初の 1 個を足すところから順に説明します。全フィールドの一覧は 設定 → ヘッダーのカスタマイズに。
1. まずヘッダーを読む
何も設定していないセルのヘッダーです。2 段あります。

| 場所 | 何が出ているか | 設定でどうなるか |
|---|---|---|
| 1 段目 左 | 状態ドット、⎇ main などの情報チップ | chips で並べ替え・非表示・追加 |
| 1 段目 右 | 拡大・寝かせる・閉じるなどセルの操作 | 変えられません(アプリの構造) |
| 2 段目 左 | ~/acme-api ▾ — パスメニュー(後述) | 変えられません |
| 2 段目 右 | Skill ドロップダウンとアイコンのボタン列 | buttons がここに入ります |
カスタマイズできるのは、この 2 段目の右側です。上の画像で ⚡ Skill の右にある小さな アイコンのうち、いちばん左のクリップが唯一の既定ボタン(Insert a file path)で、 残りはアプリ側の固定ボタンです。
既定のボタンは 2 つだけです — Insert a file path と、Open this branch’s PR (そのブランチに開いている PR があるときだけ出ます)。以前ここにあった Reveal in the file manager / Browse files in the app / New terminal here / GitHub は、下のパスメニューへ 移りました。
パスメニュー — ディレクトリに対する操作はここ
2 段目の左にあるパス(~/acme-api ▾)はボタンです。押すと、そのセルのディレクトリに対する 操作が出ます。

GitHub のリモートが解決できるリポジトリなら、区切り線の下に Repository / Issues / Pull requests も並びます。ここは固定なので設定では変わりません。同じことをボタンでも やりたい場合は、buttons に自分で書けば両方出ます。
2. 最初のボタンを 1 個足す
どのファイルに書くか
| ファイル | 効く範囲 |
|---|---|
~/.mulmoterminal/config.json | すべてのターミナル |
<プロジェクト>/.mulmoterminal.json | そのディレクトリで開いたセルだけ |
まずはプロジェクト側で試すのが安全です。プロジェクトのルートに .mulmoterminal.json を作って、 こう書きます。
{
"buttons": [
{
"id": "compact",
"icon": "compress",
"label": "Compact this conversation",
"run": "input",
"text": "/compact"
}
]
}
サーバの再起動は要りません。 ヘッダーは、作業ディレクトリ・セッション・エージェントが 変わったときと、ブラウザのウィンドウに戻ってきたときに読み直されます。エディタで保存して ブラウザに切り替えれば、それで反映されます。
押すと何が起きるか
run: "input" なので、そのセルで動いている Claude / Codex に /compact と打ち込んで送信します。 自分でターミナルに切り替えて打つのと同じことが、1 クリックで済みます。
大事な落とし穴 — buttons を書くと既定は消えます
buttons をどこかに 1 つでも書くと、組み込みの既定セットは丸ごと置き換わります(足されません)。 上の例だけを書くと、Insert a file path が消えます。残したいなら自分で並べてください。
{
"buttons": [
{ "id": "pick-file", "icon": "attach_file", "label": "Insert a file path", "run": "open", "open": { "pickFile": true } },
{ "id": "compact", "icon": "compress", "label": "Compact this conversation", "run": "input", "text": "/compact" }
]
}
3. アイコンとツールチップ
ここが最初につまずくところです。
label は画面に出ません。 ボタンが描くのはアイコンだけで、label は マウスを乗せたときに出るツールチップ(ブラウザ標準のもの)になります。
つまり label は「そのボタンが何なのか」を伝える唯一の手段です。Build のような単語より、 Run the tests のように動作が分かる文にしてください。ホバーするまで読めないのですから。
| キー | 役割 |
|---|---|
icon | Material Symbols の名前(compress、science、menu_book …)。画面に出るのはこれだけ |
emoji | 絵文字を 1 つ。icon より優先されます |
label | 必須。ホバーで出るツールチップ。読み上げ(aria-label)にも使われます |
icon も emoji も書かないと、bolt(稲妻)が出ます。全部これだと見分けが付かないので、 必ず icon を指定してください。
下は、5 個のボタンを設定したヘッダーです。文字は 1 つも出ていないことに注目してください。

同じ画面を、設定していないセルと並べるとこうなります。左が未設定、右が上の設定を入れたもの。

4. run の 3 種類
ボタンが何をするかは run で決めます。3 つしかありません。
run: "input" — エージェントに送る
text をそのセッションに打ち込んで送信します。スラッシュコマンドや、決まり文句のプロンプトに。
{ "id": "compact", "icon": "compress", "label": "Compact this conversation", "run": "input", "text": "/compact" }
run: "shell" — コマンドを実行する
cmd をコマンドセルで実行します。エージェントのセッションは邪魔されません。
{ "id": "test", "icon": "science", "label": "Run the tests", "run": "shell", "cmd": "yarn test" }
押すと、こういうセルが開いて結果が出ます。

cmdの中身はブラウザに渡りません。押した時にサーバがidから引き直し、${変数}を シェルエスケープしてから実行します。
run: "open" — 何かを開く
open の中に書いたキー 1 つで、開くものが決まります。
表は、複数書いてしまったときに効く順(上ほど強い)でもあります。
| キー | 開くもの |
|---|---|
pr | 現在のブランチの PR をブラウザで(PR が無いときはボタン自体が出ません)。サーバ側で url に解決されるため、url を一緒に書いていても PR のほうが勝ちます |
url | ブラウザで URL(http / https のみ) |
reveal | OS のファイルマネージャ(Finder / エクスプローラ / xdg-open) |
files | アプリ内のファイルエクスプローラ |
view | アプリ内のビュー:prs / wiki / collections / accounting(diff も受け付けますが、現状は専用の画面が無くファイルビューが開きます。worktree の差分は差分バッジから) |
terminal | そのディレクトリで新しい端末セル |
pickFile | OS のファイル選択ダイアログ。選んだパスを入力欄に挿入します |
{ "id": "handbook", "icon": "menu_book", "label": "Open the team handbook", "run": "open", "open": { "url": "https://example.com/handbook" } }
1 つのボタンには 1 つだけ書いてください。 複数書くと上の順で最初の 1 つだけが効き、 残りは黙って無視されます。
5. ${変数} と when — 状況に合わせる
${変数}
text / cmd / open の値と、カスタムチップの text で使えます。
dir dirName branch repo remoteUrl ahead behind dirty agent model task session
{ "id": "files", "icon": "folder_open", "label": "Browse this project's files", "run": "open", "open": { "files": "${dir}" } }
when — 出す条件
条件を満たさないボタンはそもそも描かれません(押せないボタンが並ぶより良いので)。
| 書き方 | 意味 |
|---|---|
isGitRepo | git リポジトリのとき |
agent == claude | このセルが Claude のとき(codex / antigravity も) |
repo == owner/name | そのリポジトリのとき |
&& と || で繋げられます(&& が優先)。
{ "id": "compact", "icon": "compress", "label": "Compact this conversation", "run": "input", "text": "/compact", "when": "agent == claude" }
whenは表示の出し分けだけで、セキュリティの境界ではありません。run: "shell"を 実行できる根拠は「そのコマンドがあなたの設定ファイルに書いてある」ことです。
6. 並び順と、2 つの設定ファイルの関係
order(数値)で並びます。書かなかったボタンは後ろに回り、同じ値どうしは書いた順のままです。- global と project は
idでマージされます。 同じidがあればプロジェクト側が勝ち、 無ければ足されます。つまり全体に共通のボタンを global に置き、プロジェクト固有のものだけ.mulmoterminal.jsonに書けます。 - ただし組み込みの既定セットは、どちらか一方でも
buttonsを書いた時点で置き換わります (→ 落とし穴)。 chipsはマージされません。プロジェクト側があれば、そちらが丸ごと勝ちます。- 上限は
buttonsが 32 個、chipsが 16 個です。
7. チップ — ヘッダーに情報を出す
chips は 1 段目の情報表示を並べ替え・非表示にし、自分のものを足します。書かなければ既定のままです。
{ "chips": ["git", "ctx", { "label": "Which environment this project deploys to", "text": "env staging" }] }
効くのは 5 つだけ
| id | 出るもの | |
|---|---|---|
git | ブランチと未保存の数(⎇ main ●1) | ✅ 制御できます |
work | このセルがやっている PR / issue(#977 → #966) | ✅ |
diff | worktree の差分バッジ(+2 ●5) | ✅ worktree のセルで、変更があるときだけ |
ctx | モデルとコンテキスト使用率 | ✅ エージェントが報告してから |
usage | レート制限の消費率 | ✅ 同上 |
dir / status / tools | プロジェクトバッジ / 状態ドット / ツール履歴 | ❌ 構造なので、書いても効かず、書かなくても消えません |
dir / status / tools を書いてもエラーにはならず、黙って無視されます。
カスタムチップ
{ "label": …, "text": …, "when": … } で読み取り専用のテキストを足せます。
表示されるのは text です。label はここでもツールチップ(ボタンと同じ)。 text では ${変数} が展開されます。
上のスクリーンショットの右のセルにある env staging が、このカスタムチップです。
chipsを書いたら、欲しいものは全部書いてください。 書いたリストがそのまま全部になるので、workを落とすと PR / issue の表示も消えます。
8. Skill メニューを絞り込む
ヘッダーの ⚡ Skill は、そのディレクトリで使えるスキルを一覧します(プロジェクトの .claude/skills が先、次に ~/.claude/skills。それぞれの中はアルファベット順で、同じ slug が 両方にあればプロジェクト側が勝ちます)。選ぶと今のセッションでそれを実行します (Claude は /<slug>、Codex は Use the "<slug>" skill.)。

数が増えて選びにくくなったら、プロジェクトの .mulmoterminal.json に skills を書くと、 その slug だけを、その並び順で出す許可リストになります。
{ "skills": ["review-diff", "commit-msg"] }
- 書かなければ全部出ます。
- 存在しない slug は無視されます。
- これはプロジェクト単位の設定です。 global の
config.jsonには書けません。
関連
- 設定 → ヘッダーのカスタマイズ — 全フィールドのリファレンス
- 設定 → プロジェクトごとの設定 — 色・名前・並び順など、同じファイルの他のキー
- 設定 → 「よく使うコマンドを Run メニューに」 —
script.jsonで Run メニューを足す /mulmoterminal-headerスキル — 対話で書いてもらう場合はこちら