コマンドライン
ドキュメント作成中
一部の内容はまだ不完全な場合があります。
thinkterm は、シェルから日常的に使うコマンドです。
thinkterm --helpインストールされるバイナリはこれだけではありません。デスクトップ構成にもサーバー構成にも thinkterm-mux-server が入り、リモートクライアントとブラウザに実際に応じるのはこちらです — リモート、ウェブアクセス、そして後述の mux サーバー を参照してください。互換のための wezterm という名前も併せて導入され、補完スクリプトは両方の名前を登録します。デスクトップ構成とサーバー構成には thinkterm-plugin-server も入ります。プラグインはこのもとで動き、組み込みのスニペットプラグインもそのひとつです。必要になったときに起動されるもので、手で実行することはありません — プラグイン を参照してください。
サブコマンド
| コマンド | 何をするか |
|---|---|
start | GUI を起動します。別のプログラムを実行することもできます。別名 -e |
tui [DOMAIN…] | 現在のターミナルで ThinkTerm のインターフェースを開きます |
connect <name> | ThinkTerm マルチプレクサへ接続します |
ssh | SSH セッションを確立します |
serial | シリアルポートを開きます |
cli <subcommand> | 動作中のマルチプレクササーバーを通じて、ペイン、タブ、ウィンドウを見たり操作したりし、コーディングエージェントの様子を確認します |
update | 新しいリリースを確認してインストールします。アップデート を参照 |
plugin | プラグインの一覧、オン/オフ、再読み込み、呼び出しの送信を行います。プラグイン を参照 |
skill setup|status|remove|show | ThinkTerm のスキルとセッション開始フックをコーディングエージェントに導入します。コーディングエージェントに ThinkTerm を使わせる を参照 |
config check [FILE] | 設定ファイルをアプリと同じように読み込み、エラーと警告を報告します。適用はせず、動作中のアプリには触れません。ファイルを省くと、アプリが読み込むファイルを調べます。ファイルが読み込めなければステータス 1 で終了します |
imgcat <file> | 画像をターミナルへ出力します |
ls-fonts | 使用中のフォント情報を表示します |
show-keys | 現在のキー割り当てを表示します |
set-working-directory | シェル統合のため、現在の作業ディレクトリをターミナルへ伝えます |
record | ターミナルセッションを asciicast として記録します |
replay | asciicast を再生します |
shell-completion | bash、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 を使わせる を参照 |
tlscreds | TLS 資格情報を取得します |
proxy | RPC プロキシパイプを開始します |
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 enterwaitはペインが起動したプログラムの終了を待ち、そのステータスで終了します。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 |
STATE | working、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 show | setup が知らないエージェントのために、スキルを出力します。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 が待機に戻ったことを報告します。より構造化されたプロトコルを設計中です。
関連
- エージェント状態 —
cli agentとcli eventsが報告する対象 - ウェブアクセス —
web-serverとweb-tokenが開くもの - TUI — 素のターミナル内のワークスペース
- プラグイン —
thinkterm pluginが扱うもの - キーボードとコマンド —
show-keysが表示するキーマップ
