Skip to content

コマンドライン ​

ドキュメント作成中

一部の内容はまだ不完全な場合があります。

thinkterm は、シェルから日常的に使うコマンドです。

thinkterm --help

インストールされるバイナリはこれだけではありません。デスクトップ構成にもサーバー構成にも thinkterm-mux-server が入り、リモートクライアントとブラウザに実際に応じるのはこちらです — リモート、ウェブアクセス、そして後述の mux サーバー を参照してください。互換のための wezterm という名前も併せて導入され、補完スクリプトは両方の名前を登録します。デスクトップ構成とサーバー構成には thinkterm-plugin-server も入ります。プラグインはこのもとで動き、組み込みのスニペットプラグインもそのひとつです。必要になったときに起動されるもので、手で実行することはありません — プラグイン を参照してください。

サブコマンド ​

コマンド何をするか
startGUI を起動します。別のプログラムを実行することもできます。別名 -e
tui [DOMAIN…]現在のターミナルで ThinkTerm のインターフェースを開きます
connect <name>ThinkTerm マルチプレクサへ接続します
sshSSH セッションを確立します
serialシリアルポートを開きます
cli <subcommand>動作中のマルチプレクササーバーを通じて、ペイン、タブ、ウィンドウを見たり操作したりし、コーディングエージェントの様子を確認します
update新しいリリースを確認してインストールします。アップデート を参照
pluginプラグインの一覧、オン/オフ、再読み込み、呼び出しの送信を行います。プラグイン を参照
skill setup|status|remove|showThinkTerm のスキルとセッション開始フックをコーディングエージェントに導入します。コーディングエージェントに ThinkTerm を使わせる を参照
config check [FILE]設定ファイルをアプリと同じように読み込み、エラーと警告を報告します。適用はせず、動作中のアプリには触れません。ファイルを省くと、アプリが読み込むファイルを調べます。ファイルが読み込めなければステータス 1 で終了します
imgcat <file>画像をターミナルへ出力します
ls-fonts使用中のフォント情報を表示します
show-keys現在のキー割り当てを表示します
set-working-directoryシェル統合のため、現在の作業ディレクトリをターミナルへ伝えます
recordターミナルセッションを asciicast として記録します
replayasciicast を再生します
shell-completionbash、zsh、fish、elvish、PowerShell、Fig 向けの補完スクリプトを出力します

もうひとつ、--help に出ないサブコマンドがあります。list-files は Project のファイル一覧を書き出すもので、デスクトップがリモートホストのファイルを検索するときにそのホストで実行します — ファイルとノート を参照してください。手で実行するためのものではありませんが、なくてはなりません。これより古い ThinkTerm のホストは検索できません。

動作中のマルチプレクサと対話する ​

thinkterm cli が相手にするのは、すでに動作しているサーバー — GUI ウィンドウの背後にあるもの、あるいはバックグラウンドの mux サーバー — です。マルチプレクサはウィンドウ、Thread、接続中のクライアントをまたいで任意のペインを指定できるため、これらのコマンドは今見ていないセッションにも届きます。

どのサーバーが応じるかは明示されないため、コマンドが何もしていないように見える原因はたいていここにあります。既定では動作中の GUI を優先し、見つからなければ自分でサーバーを起動します。--prefer-mux はバックグラウンドの mux サーバーへ送り、--no-auto-start は応答のためだけにサーバーを起動せず、そのまま失敗させます。

--class <NAME> は、独自のウィンドウクラスで起動した GUI — thinkterm start に --class を付けたもの — を探します。付けなければ、普通に起動した GUI を探します。--class が必要なのは、独自のクラスで別に起動した GUI に届かせたいときだけです。thinkterm tui も同じフラグを同じように受け付けます。

ペインに作用するコマンドは、番号を渡す --pane-id を取り、省略するとコマンドを実行しているペイン(WEZTERM_PANE が指すもの)に作用します。--pane は代わりに、付けたラベルでペインを指名します — ペインに名前を付ける を参照してください。

調べる

コマンド何をするか
listウィンドウ、タブ、ペインを一覧します。ラベルがあれば併せて出します
list-clients接続中のクライアントを一覧します
get-pane-direction指定方向のペインを報告します

作る・壊す

コマンド何をするか
spawn新しいタブまたはウィンドウを開始します。新しいペインの ID を出力します。--label でペインに名前を付け、--wait でそのプログラムの終了を待ってそのステータスで終了します
split-pane既存のペインを分割します。新しいペインの ID を出力し、spawn と同じく --label と --wait を取ります
move-pane-to-new-tabペインを独立したタブへ移します
kill-paneペインを閉じます

移動とサイズ変更

コマンド何をするか
activate-paneペインにフォーカスします
activate-pane-direction指定方向のペインにフォーカスします
activate-tabタブにフォーカスします
adjust-pane-sizeペインのサイズを変更します
zoom-paneペインをタブいっぱいに拡大します

テキストの入出力

コマンド何をするか
send-text貼り付けとしてペインへテキストを書き込みます。中のプログラムが求めていればブラケットペーストになります。Enter は付きません。--enter はテキストの少しあとに Enter を押し、--no-paste はテキストを通常の入力として送ります
send-key名前でキーを順に押します。ペインの中のプログラムが求めた形式で、入力したかのようにエンコードされます。--wait を付けると、そのキーが始めたコマンドの終了を待ちます。キーを押す を参照
get-textペインの画面にあるテキストを読み取ります。--pane-id か --pane でペインを選び、省略時はコマンドを実行しているペインです。--start-line と --end-line で行を選びます。0 は画面の先頭で、負の数はスクロールバックにさかのぼります。--format は text(既定)、--escapes と同じく色や装飾のシーケンスを残す vt、色付きの html のいずれかです。--trim は行末の空白と末尾の空行を省き、--unwrap はターミナルが折り返した行を元の 1 行につなぎ直します

待つ・見張る

コマンド何をするか
waitペインのプログラムの終了を待ち、--command を付けるとシェルで動いているコマンドの終了を待って、そのステータスで終了します。プログラムやコマンドを待つ を参照
events起きたことを、中断されるまで起きた順に出力します。起きていることを見る を参照

名前と基盤

コマンド何をするか
set-tab-titleタブの名前を変更します
set-pane-labelペインにラベルを付け、--pane で見つけられるようにします。空のラベルは外します
set-window-titleウィンドウの名前を変更します
rename-workspaceワークスペースの名前を変更します
agent listコーディングエージェントが検出されたペインと、それぞれの状態を一覧します。読み取り専用です
agent context実行しているペインがどこにあり、同じタブに何があるかを、そこで起動するコーディングエージェント向けに出力します。コーディングエージェントに ThinkTerm を使わせる を参照
tlscredsTLS 資格情報を取得します
proxyRPC プロキシパイプを開始します
color-schemes組み込みのカラースキームを一覧します。バイナリ自身が答えるため、サーバーは不要です。--json で色も出力します
stop-serverバックグラウンドのセッションサーバーを停止します。中のターミナルはすべて終わるため、ターミナルから実行した場合は確認を求めます。--force は確認しません

ウェブアクセス

コマンド何をするか
web-server status|on|offブラウザを受け付けているか、どこで受け付けているか。on は --bind-address を取ります
web-token mint|list|revokeブラウザが入室に使うリンクの発行・一覧・失効

どちらも GUI 内蔵のマルチプレクサではなく mux サーバーを相手にします。発行したリンクは、そのマシンにあなたの資格でログインするのと同じ意味を持ちます。ほかのマシンに接続する機能がオンなら、そのアカウントが SSH で入れるすべてのマシンへの入口にもなります。ウェブアクセス がその意味を説明します。

list、list-clients、agent list、web-token list は既定でテーブルを出力し、--format json で JSON を出力します。最初の 3 つと events には短縮形の --json もあります。

一覧やテキストを出力するコマンド — 上の 4 つのほか get-text、color-schemes など — は、パイプ先が読むのをやめたとき、thinkterm cli list | head のように、成功ステータスで静かに終わります。

セッションサーバーを止める ​

thinkterm cli stop-server は既定のソケットにあるバックグラウンドのセッションサーバーを停止し、中のターミナルはすべて一緒に終わります。サーバーを起動することはありません。動いていなければそう伝え、何も変えません。

ターミナルから実行すると、サーバーのプロセスとソケットを示して先に確認し、y か yes 以外の答えならサーバーはそのまま動き続けます。確認するのは標準入力がターミナルのときだけなので、スクリプトやパイプからは確認なしにサーバーを止めます。--force はターミナルでも確認を省きます。その後、サーバーの終了を最大 10 秒待ち、それでもまだ終了処理中ならそう伝えます。

次にサーバーを必要とする起動、connect、cli コマンドが新しいサーバーを立ち上げます。ほかの止め方は リモート にあります。

ペインに名前を付ける ​

ペインの番号は実行のたびに変わります。ラベルは変わりません。thinkterm cli set-pane-label --pane-id 12 build は 12 番のペインに名前を付け、spawn と split-pane は --label build で作るペインに名前を付け、以後は --pane build で見つかります。

thinkterm cli set-pane-label build
thinkterm cli spawn --label tests -- npm test
thinkterm cli get-text --pane tests --trim

ラベルはウィンドウでペインのタブに付いている名前と同じものなので、そこでタブの名前を変えれば同じラベルが付きます。ラベルはサーバーが保持するため、すべてのウィンドウ、CLI、ブラウザ、復元された Thread から見えます。ラベルに制御文字は入らず、128 文字までで、前後の空白は取り除かれます。数字だけのラベルは受け付けません。--pane は数字をペイン番号と読むからです。空のラベルはラベルを外します。list と agent list はラベルを LABEL 列と label フィールドに出し、events はペインにラベルが付いたことを報告します。

--pane が受け付けるのは次のとおりです。

  • ペイン番号。 数字だけのもの。ほかのペインのラベルがその数字と同じときは、推測せずに、コマンドが止まって両方を一覧します。
  • ラベル。 大文字小文字は区別しません。
  • Thread の名前。 そのままか、サイドバーと同じく Project の名前に続けたもの(my-project · fix login)。その Thread のペインが 1 つのときに限ります。
  • thread/label。 複数の Thread が使っているラベルのために。

複数のペインが同じラベルを持っていて、そのうち 1 つだけがコマンドを実行しているペインの Thread にあるときは、それが指されます。そうでなければコマンドは止まり、名前が指しうるペインの数を伝え、それぞれの番号、ラベル、タイトル、Thread を一覧します。番号で指名してください。--pane は --pane-id と併用できません。ペインを取るコマンドはすべて --pane を取ります。spawn、split-pane、activate-tab も含みます。

キーを押す ​

send-key は 1 つ以上のキーを取ります。それぞれ修飾キーとキーを + でつないで書き、大文字小文字は問いません。

thinkterm cli send-key --pane build ctrl+c
thinkterm cli send-key escape up up enter

修飾キーは ctrl、alt(または opt)、shift、cmd(または super)です。キーは 1 文字、または enter、tab、escape、backspace、delete、space、up、down、left、right、home、end、pageup、pagedown、insert、f1 から f24 です。どれも、ペインの中のプログラムが求めた形式で、入力したかのようにエンコードされます。知らないキーがあれば、何も送らずにコマンドが止まります。

プログラムやコマンドを待つ ​

wait はペインの中の何かが終わるまで待ち、どう終わったかを終了ステータスにします。

thinkterm cli spawn --label tests --wait -- npm test
thinkterm cli wait --pane tests --for 10m
thinkterm cli send-key --pane build --wait enter
  • wait はペインが起動したプログラムの終了を待ち、そのステータスで終了します。
  • wait --command はペインのシェルで動いているコマンドの終了を待ち、そのコマンドのステータスで終了します。直前に入力したコマンドには、始まるまで 1 秒の猶予があります。始まらなければ、最後に終わったコマンドのステータスで終了し、1 つも終わっていなければ 0 です。
  • send-key --wait KEY… はキーを押してから、それが始めたコマンドの終了を待ちます。先にシェルの終了済みコマンド数を数えるので、すぐ終わるコマンドも見逃しません。コマンドを入力して待つなら、send-text のあとに send-key --wait enter とするほうが、あとから wait --command するより確実です。
  • spawn --wait と split-pane --wait は、先に新しいペインの番号を出力し、そのプログラムの終了を待ちます。

--timeout(短縮形は --for)は、秒数、または数に s、m、h を付けた時間(90、30s、10m、1.5h)で待つのをあきらめます。あきらめた待機は timed out と出力してステータス 124 で終了します。終了ステータスが分からないままプログラムやコマンドが終わったときは、そう伝えてステータス 125 で終了します。終了ステータスなしでシェルが終えたコマンドや、--takeover で新しいサーバーに引き継がれたペインのプログラムがそうです。後者は終わり方をもう答えられません。どちらも成功とは読みません。プログラムのステータスが届く前にペインが閉じたときは 1 で終了し、シグナルで終わったプログラムは標準エラー出力にシグナルの名前を出します。

wait --command と send-key --wait には、コマンドの開始と終了を報告するシェルが必要です。それは ThinkTerm のシェル統合です。インストール を参照してください。ないときは、そう伝えるエラーで止まります。spawn --wait はそれがなくても動きます。

起きていることを見る ​

thinkterm cli events は、サーバーで起きたことを 1 件につき 1 行ずつ、中断されるまで出力します。

14:02:11  command_finished    pane 12  status 0
14:02:11  agent_status        pane 12  claude idle

--pane か --pane-id を付けると、1 つのペインに起きたことだけに絞ります。タブ、ウィンドウ、クライアントの出来事は除かれます。--format json(または --json)は代わりに 1 行 1 オブジェクトで、type とその出来事のフィールドを出力します。これらは安定して保たれます。出来事やフィールドは増えることがあっても、削除や型の変更はありません。出力が追いつかず数千件を超えて溜まると、超えた分は捨てられます。サーバーとの接続が置き換わったときは自動で接続し直し、接続を失ったときはエラーで止まります。

typeいつtype 以外のフィールド
pane_added, pane_removedペインが開く、閉じるpane_id
program_exitedペインが起動したプログラムが終了したpane_id、exit_code(不明なら null)、signal
command_finishedペインのシェルがコマンドの終了を報告したpane_id、exit_code(報告がなければ null)
bellペインがベルを鳴らしたpane_id
notificationプログラムがデスクトップ通知を出したpane_id、title、body
title_changedペインのタイトルが変わったpane_id、title
cwd_changedペインの作業ディレクトリが変わったpane_id
progress進捗の報告pane_id、state(none、percentage、error、indeterminate)、percent
user_varプログラムがユーザー変数を設定したpane_id、name、value
clipboard_writtenプログラムがクリップボードに書き込んだ。書き込まれた内容は繰り返さないpane_id
agent_statusペインでコーディングエージェントが見つかった、状態が変わった、いなくなったpane_id、agent、state
foreground_programペインの前面のプログラムが変わったpane_id、executable、runs
pane_focusedペインがフォーカスを得たpane_id
pane_label_changedペインにラベルが付いた、またはラベルが外れたpane_id、label(外れたら null)
tab_addedウィンドウにタブが加わったtab_id、window_id
tab_title_changedタブの名前が変わったtab_id、title
window_title_changedウィンドウの名前が変わったwindow_id、title
workspace_changedウィンドウが別のワークスペースへ移ったwindow_id、workspace
workspace_renamedワークスペースの名前が変わったold_workspace、new_workspace
client_joined, client_leftウィンドウ、ブラウザ、スマートフォンがペインの表示を始めた、やめたhostname、username、pid、epoch、id

終了ステータス ​

失敗した cli コマンドは、次の場合を除いて 1 で終了します。

ステータス意味
2コマンドラインがありえないことを求めている。引数が解釈できない、知らないキー、数字だけのラベルなど
3ペインがない、または --pane の名前がどれにも、あるいは複数に当てはまる
4サーバーに届かない、またはこのバージョンのプログラムと話してくれない

待つコマンドは、上のとおり、待っていたものの結果で終了します。

スクリプトからエージェント状態を読む ​

thinkterm cli agent list は、ThinkTerm がコーディングエージェントを見つけたペインごとに 1 行を出力します。

列内容
PANEIDペイン。ほかの cli コマンドが受け取るのと同じ ID
AGENTエージェントの ID。たとえば claude
STATEworking、blocked、idle、error、unknown
EVIDENCE状態を決めたもの。report はプログラムが自分の状態レポートを送ったもの、contract はプログラムが THINKTERM_AGENT で報告したもの、screen は画面ルールが一致したもの、fallback は何も一致せず、既知のエージェントをアイドルとみなしたもの
AGE状態が最後に変わってからの時間
WORKSPACEペインがあるマルチプレクサのワークスペース。Thread の中のペインでは内部的な名前で、Thread の名前ではありません
TITLEペインのタイトル
LABELペインのラベル。なければ空

--format json は代わりにオブジェクトの配列を出力します。フィールドは pane_id、label(ない場合は null)、agent、state、evidence、session_id(ない場合は null)、since_unix(状態が最後に変わった時刻。検出したマシンの時計による Unix 秒)、workspace、title です。これらはスクリプト向けで、安定して保たれます。状態がどこから来るかは エージェント状態 を参照してください。

コーディングエージェントに ThinkTerm を使わせる ​

ThinkTerm のペインで動くコーディングエージェントは、thinkterm cli で、ほかのペインを見たり、読んだり、入力したり、新しく開いたりできます。thinkterm skill setup は Claude Code と Codex にそのやり方を教え、起動したときに自分がどこにいるかも伝えます。これはエージェントの認識とは別のもので、認識は何もインストールしません。そしてこちらは、実行するまで何も変えません。

thinkterm skill setup --dry-run
thinkterm skill setup
コマンド何をするか
skill setupこのマシンで見つかったエージェントに、スキルとフックを導入または更新します。何度実行しても安全です。--dry-run は何も変えずに、何が変わるかを伝えます
skill statusエージェントごとに、スキルとフックが current、outdated、missing、someone else's、unreadable のどれかを表示します
skill removeスキルとフックを再び取り除きます
skill showsetup が知らないエージェントのために、スキルを出力します。npx skills add RoversX/ThinkTerm --skill thinkterm -g は、Cursor など別のエージェントに、同じスキルをリポジトリから導入します

setup、status、remove は --agent claude か --agent codex で、見つかったかどうかにかかわらずエージェントを 1 つ指名できます。付けなければ、そのエージェント自身のフォルダーがここにあるエージェントを順に処理し、1 つもなければそう伝えます。

setup が書くもの

エージェントスキルフック
Claude Code~/.claude/skills/thinkterm/SKILL.md~/.claude/settings.json の SessionStart の項目
Codex~/.agents/skills/thinkterm/SKILL.md~/.codex/hooks.json の SessionStart の項目

CLAUDE_CONFIG_DIR と CODEX_HOME はエージェント自身のフォルダーを動かし、Claude Code のスキルと両方の設定ファイルもそれに従います。スキルは短いメモで、エージェントが ThinkTerm の中にいること、コマンドは thinkterm cli --help に並んでいること、thinkterm が PATH にないときの場所、そして自分で開いていないペインへの入力、ペインを閉じること、サーバーを止めることは、先にあなたへ確認したほうがよいかもしれないことを書いています。ペインには THINKTERM=1 が設定されており、スキルの説明文はこれを手がかりにしています。

フックはエージェントの起動時に走ります。ThinkTerm のペインでは、ペインの番号、ラベル、タイトルとそのタブのタイトル、続いて同じタブのほかのペイン(12 個まで、超えた分は件数)、ほかのタブにあるペインの数、ペインの読み方を出力します。これは thinkterm cli agent context です。ThinkTerm のペインの外や ThinkTerm が応答しないときは、何も出力せずに成功し、サーバーを起動することもないので、エージェントはフックがないときと同じように起動します。待つのは最大 10 秒です。フックはまだ Windows には導入されません。スキルは導入されます。

setup が編集するのは設定ファイルの hooks の項目だけで、そのほかの部分のテキストはそのままです。JSON オブジェクトでない設定ファイルや、ThinkTerm のものでない thinkterm という名前のスキルファイルには手を付けず、そう伝えます。Claude Code がフックを実行するのは信頼したフォルダーだけで、Codex は新しいフックを /hooks で承認すると実行します。更新のあとに setup を実行し直すと、outdated のスキルやフックが最新になります。

元に戻す。 thinkterm skill remove はスキルファイルを削除し(ほかに何もなければそのフォルダーも)、設定ファイルからフックを取り除いて、そのために空になった SessionStart のリストや hooks オブジェクトも消します。ほかのフックやスキルはそのままです。手作業なら、ファイルを削除し、項目を消してください。

データとしてのカラースキーム ​

thinkterm cli color-schemes は組み込みのカラースキームの名前を 1 行に 1 つずつ出力します。--json を付けると代わりに JSON の配列を出力し、スキームごとに 1 つのオブジェクトで、name、foreground、background、cursor_bg、cursor_fg、cursor_border、selection_bg、selection_fg は #rrggbb の文字列、ansi と brights はそれぞれ 8 色のリストです。カーソルや選択範囲の色を指定していないスキームには、既定の色が補われます。

この一覧はバイナリに組み込まれたものなので、サーバーは不要で、設定も読みません。設定ファイルで定義したスキームや、カラースキームのディレクトリに置いたものは含まれません。

mux サーバー ​

thinkterm-mux-server はマルチプレクサ単体で、ウィンドウを持ちません。デスクトップがターミナルをセッションサーバーに置いている場合、そのサーバーがこれで、デスクトップが起動します。デスクトップのないホストでは自分で起動し、たいてい --daemonize を付けます。

フラグ何をするか
--daemonizeターミナルから切り離してバックグラウンドで動きます
--takeover同じソケットで動いている mux サーバーを引き継ぎます。そのペイン、ウィンドウ、クライアントは新しいバイナリのもとで続き、古いサーバーは終了します。動いている側が対応している必要があります。Windows では使えません
--no-initial-pane既定のプログラムを動かすペインを作らず、ペインなしで起動します。デスクトップのセッションサーバーはこの形で起動します。中のペインはすべてデスクトップが求めたものだからです
--cwd <DIR>最初のペインのプログラムの作業ディレクトリ
-- <PROG>…最初のペインで、シェルの代わりにこのプログラムを動かします
-n、--config-file、--config name=value設定を読まない、設定ファイルを指定する、オプションを 1 つ上書きする — thinkterm と同じグローバルフラグです

2 つのペインのプログラムは互いに話せます ​

send-text と get-text だけで、一方のプログラムがもう一方を動かせます。どちらにも改変は要りません。

プログラム A ──send-text──►  プログラム B のターミナル入力
                             B が作業し、応答を出力する
プログラム A ◄──get-text───  結果を読み取る

対話的なものなら何でも参加できます — コーディング支援ツール、シェルスクリプト、REPL。インターフェースはペインそのものなので、このために作り込む必要はありません。

現状このやり取りはターミナル入力の注入によって行われます。つまりメッセージの同定はできず、応答も構造化されていません。入力は send-text --enter と send-key が行い、画面は get-text --trim で読み戻します。完了をポーリングする必要はありません。B がシェルのコマンドなら、send-key --wait enter が終了時にそのステータスを返し、プログラムなら wait が同じことをします。B がコーディングエージェントなら、events --pane がその agent_status が待機に戻ったことを報告します。より構造化されたプロトコルを設計中です。

関連 ​