ヘッダーをカスタマイズする

よく使う操作が「ターミナルに打ち込む」しかないと、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 の名前(compresssciencemenu_book …)。画面に出るのはこれだけ
emoji 絵文字を 1 つ。icon より優先されます
label 必須。ホバーで出るツールチップ。読み上げ(aria-label)にも使われます

iconemoji も書かないと、bolt(稲妻)が出ます。全部これだと見分けが付かないので、 必ず icon を指定してください。

下は、5 個のボタンを設定したヘッダーです。文字は 1 つも出ていないことに注目してください。

ボタンを 5 個設定したヘッダー

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

未設定のセルと設定済みのセル


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" }

押すと、こういうセルが開いて結果が出ます。

run:"shell" のボタンが開いたコマンドセル

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 / accountingdiff も受け付けますが、現状は専用の画面が無くファイルビューが開きます。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.)。

Skill メニュー

数が増えて選びにくくなったら、プロジェクトの .mulmoterminal.jsonskills を書くと、 その slug だけを、その並び順で出す許可リストになります。

{ "skills": ["review-diff", "commit-msg"] }
  • 書かなければ全部出ます。
  • 存在しない slug は無視されます。
  • これはプロジェクト単位の設定です。 global の config.json には書けません。


This site uses Just the Docs, a documentation theme for Jekyll.