問屋を一つ挟んだ注文には、独特の事故があります。
注文票には、品番と数量のほかに、末端の工場向けの特記事項が書いてあります。梱包の向き、納品の日付、検査票の要否。問屋はそれを読んで、自分のところで処理できるものを処理します。
そのとき、工場向けの一行も自分宛てだと思って処理してしまうことがあります。悪意はありません。同じ紙に書いてあるので、区別する理由がないだけです。工場には品番と数量だけが届いて、納品は普通に完了します。おかしいと分かるのは、箱を開けたあとです。
だから注文票には、ここから下は自分で処理せずそのまま渡す、という線を引きます。線があれば、挟んだ人は迷いません。
マスが灰色のまま
手元のパソコンで動くモデルを試したくなりました。Claude Code は中で使うモデルを差し替えられるので、そういうコマンドを打つだけです。
ollama launch claude --model llama3.1:8b --
これをよく使うコマンドとして登録して、空いているマスから起動しました。MulmoTerminal は AI を何枚ものマスに並べて見張るための画面で、一マスが一体の AI にあたります。無料で、オープンソースとして公開されています。
動きます。AI と会話できます。でもマスが灰色のままです。考えているのか、答えを待っているのか、色で分かりません。
そして翌日、その会話を再開できません。
ただのターミナルでコマンドを動かした状態
何が起きているか。
そのコマンドをよく使うコマンドとして登録すると、MulmoTerminal は素のターミナルでそのコマンドを実行しているだけになります。再開できる履歴もコストの表示も会話の残量も、入力待ちの状態も GUI の道具もありません。
AI としては動いていますが、この道具の機能が全部効いていません。九枚並べる意味の半分が消えています。
引数を付け足すと、本物のマスになる
MulmoTerminal には、この形のための設定があります。同じコマンドを実行して、そのあとに Claude Code 自身の引数を付け足します。
{
"customAgents": [
{
"id": "nemotron",
"label": "Nemotron",
"agent": "claude",
"command": "ollama launch claude --model llama3.1:8b --"
}
]
}
すると、そのマスは本物の会話になります。色も、再開も、使用量の表示も効きます。起動するときのボタンの列にも並びます。
-- の位置が全部を決める
実際に起動されるのは、こういう形です。
ollama launch claude --model llama3.1:8b -- \
--session-id <番号> --settings <設定> --permission-mode … --mcp-config …
自分のコマンドの後ろに、Claude Code 用の引数が続きます。つまり自分のコマンドは、Claude Code の引数が始まる位置で引数の解釈をやめる必要があります。
末尾の -- がその役目です。ollama は --model llama3.1:8b までを自分のものとして受け取り、-- 以降はそのまま素通しします。
注文票に引く線と、まったく同じものです。
--model が二つあっても衝突しない
これが理解できると気持ちがいいところです。
書いたほうは -- の前なので ollama のものです。起動画面で選ぶモデルは -- の後ろなので Claude Code のものです。
同じ名前の指定が二回出てきても、境目の前後で別のプログラムが受け取ります。
後ろの引数を飲み込むと、静かに壊れる
冒頭の灰色のままがここに繋がります。後ろの引数を飲み込んでしまうコマンドは、静かに会話を壊します。
何が壊れるかは一つずつ分かっています。会話の番号が届かないと再開できません。設定が届かないとマスが色を表示しません。道具の設定が届かないと図やフォームが使えません。
診断の仕方も決まっていて、起動はするのに灰色のままなら原因はこれです。
起動はするのがいやなところです。エラーが出ないので、設定が正しく見えてしまいます。問屋が特記事項を飲み込んでも納品が完了するのと、同じ形の事故です。
何が受け付けられたかを確かめられる
設定を書いても、ボタンが出ないことがあります。弾かれた項目は単に無い状態になるので、ファイルを保存し忘れたのと見分けがつきません。
確かめる方法があります。
curl -s "http://localhost:34567/api/config" | jq .customAgents
ファイルにあってこの出力に無いものが、弾かれたものです。設定が黙って捨てられる仕組みでは、これが唯一の答え合わせになります。
ボタンが出ないときの、可能性の高い順
一つ目は、何として起動するかの指定が無い場合。これは必須です。コマンドのどこにも -- の向こう側がどの CLI かは書かれていないので、推測しません。
二つ目は、識別子が名前として使えない場合。大文字や空白が入っている、組み込みの名前と同じ、といったところです。
三つ目は、アプリを再起動していない、またはタブを再読み込みしていない場合です。
シェルを通さない
一つ制約があります。書かれたまま実行されて、シェルを通しません。
引用符は解釈しますが、$HOME やパイプや && は展開されません。シェルの書き方を使いたいなら、よく使うコマンドとして登録するほうを使います。
二つの登録先の違い
同じコマンドを登録するですが、性質が違います。
| 引数を付け足す設定 | よく使うコマンドの登録 | |
|---|---|---|
| 実行するもの | 自分のコマンド + Claude Code の引数 | 自分のコマンドを書かれたまま |
| マスの中身 | 本物の会話(再開・使用量・状態) | ただのターミナル |
| シェルの書き方 | 使えない | 使える |
選び方は、マスに本物の会話が要るかどうかです。htop を出したいだけなら後者。モデルを差し替えて Claude Code を動かすなら前者。
再開はボタンの選択に影響されない
一つ知っておくと混乱しません。
起動画面の選択が決めるのは、新しく始める会話だけです。前の会話を再開する場合は、選択の表示に関係なく、その会話を最初に始めたときの形で再開されます。
どの会話がどれで始まったかはディスクに記録されているので、マスを閉じても、アプリを再起動しても残ります。
使ってみる
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 の使用量はその契約から引かれます。
この記事の例は ollama を使っています。無ければ先に入れます。
# macOS(Homebrew)
brew install ollama
Windows と、Homebrew を使っていない場合は ollama.com/download からインストーラを落とします。
入れたらモデルを一つ取ってきます。数ギガバイトあるので時間がかかります。
ollama pull llama3.1:8b
手元にあるものは、これで見えます。
ollama list
NAME ID SIZE MODIFIED
llama3.1:8b 46e0c10c039e 4.9 GB 2 months ago
この一覧に出ているものが、手元のパソコンで動くモデルです。ollama にはサーバー側で動かす形もあって、そちらは名前が違います。どちらで動かすかはモデル名で決まるので、手元で動かしたいならこの一覧の名前を使います。
ここは例なので、他のやり方でもかまいません。この設定が扱うのは自分のコマンドで Claude Code を起動することで、そのコマンドが何かは問いません。
書く場所は ~/.mulmoterminal/config.json です。無ければ作ります。
{
"customAgents": [
{
"id": "nemotron",
"label": "Nemotron",
"agent": "claude",
"command": "ollama launch claude --model llama3.1:8b --"
}
]
}
この設定は起動時に一度だけ読まれるので、アプリを再起動してタブを再読み込みします。
起動フォームのタブに Nemotron が増えて、起動したマスに色が付けば成功です。灰色のままなら、コマンドの末尾の -- が足りていません。
受け付けられたかどうかは、さきほどの curl で分かります。
やめるときは、その項目を消して再起動します。始めた会話は、その形のまま再開されます。
まとめ
問屋を挟むと、末端向けの特記事項が途中で処理されてしまうことがあります。悪意ではなく、同じ紙に書いてあるので区別する理由がないだけです。だから、ここから下はそのまま渡すという線を引きます。
Claude Code を自分のコマンドから起動するときも同じで、末尾の -- がその線です。線が無いと、会話の番号も設定も届かず、マスが灰色のまま、翌日再開できません。
いやなのは、それでも起動することです。エラーが出ないので、設定が正しく見えます。灰色のままならこれだと決まっているので、そこだけ覚えておけば済みます。
