---
title: "コマンドライン"
description: "thinkterm バイナリとそのサブコマンド、および動作中のマルチプレクサと対話する cli サブコマンド。"
url: "https://docs.closex.org/ja/thinkterm/cli.html"
markdown_url: "https://docs.closex.org/ja/thinkterm/cli.md"
site: "CloseX Docs"
product: "ThinkTerm"
language: "ja"
last_updated: "2026-11-08T12:04:16.000Z"
alternates:
  en: "https://docs.closex.org/thinkterm/cli.md"
  zh-Hans: "https://docs.closex.org/zh/thinkterm/cli.md"
  ja: "https://docs.closex.org/ja/thinkterm/cli.md"
---

# コマンドライン

> **ドキュメント作成中**
> 一部の内容はまだ不完全な場合があります。

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

```
thinkterm --help
```

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

## サブコマンド

| コマンド | 何をするか |
|---|---|
| `start` | GUI を起動します。別のプログラムを実行することもできます。別名 `-e` |
| `tui [DOMAIN…]` | 現在のターミナルで ThinkTerm のインターフェースを開きます |
| `connect <name>` | ThinkTerm マルチプレクサへ接続します |
| `ssh` | SSH セッションを確立します |
| `serial` | シリアルポートを開きます |
| `cli <subcommand>` | 動作中のマルチプレクササーバーを通じて、ペイン、タブ、ウィンドウを見たり操作したりし、コーディングエージェントの様子を確認します |
| `update` | 新しいリリースを確認してインストールします。[アップデート](https://docs.closex.org/ja/thinkterm/updates.md) を参照 |
| `plugin` | プラグインの一覧、オン／オフ、再読み込み、呼び出しの送信を行います。[プラグイン](https://docs.closex.org/ja/thinkterm/plugins.md) を参照 |
| `skill setup\|status\|remove\|show` | ThinkTerm のスキルとセッション開始フックをコーディングエージェントに導入します。[コーディングエージェントに ThinkTerm を使わせる](#skill) を参照 |
| `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 のファイル一覧を書き出すもので、デスクトップがリモートホストのファイルを検索するときにそのホストで実行します — [ファイルとノート](https://docs.closex.org/ja/thinkterm/files-and-notes.md) を参照してください。手で実行するためのものではありませんが、なくてはなりません。これより古い ThinkTerm のホストは検索できません。

サーバー版のインストールには、起動できる GUI がありません。`thinkterm start`、引数なしの `thinkterm`、そのほかウィンドウを開くコマンドは `this ThinkTerm has no GUI to start` と答え、`thinkterm tui` を案内します。GUI を加えるのはデスクトップ版のインストールです。

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

`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` は代わりに、付けたラベルでペインを指名します — [ペインに名前を付ける](#naming-panes) を参照してください。

**調べる**

| コマンド | 何をするか |
|---|---|
| `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` を付けると、そのキーが始めたコマンドの終了を待ちます。[キーを押す](#send-key) を参照 |
| `get-text` | ペインの画面にあるテキストを読み取ります。`--pane-id` か `--pane` でペインを選び、省略時はコマンドを実行しているペインです。`--start-line` と `--end-line` で行を選びます。0 は画面の先頭で、負の数はスクロールバックにさかのぼります。`--format` は `text`（既定）、`--escapes` と同じく色や装飾のシーケンスを残す `vt`、色付きの `html` のいずれかです。`--trim` は行末の空白と末尾の空行を省き、`--unwrap` はターミナルが折り返した行を元の 1 行につなぎ直します |

**待つ・見張る**

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

**名前と基盤**

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

**ウェブアクセス**

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

どちらも GUI 内蔵のマルチプレクサではなく mux サーバーを相手にします。発行したリンクは、そのマシンにあなたの資格でログインするのと同じ意味を持ちます。[ほかのマシンに接続する](https://docs.closex.org/ja/thinkterm/web.md#reaching-other-machines)機能がオンなら、そのアカウントが SSH で入れるすべてのマシンへの入口にもなります。[ウェブアクセス](https://docs.closex.org/ja/thinkterm/web.md) がその意味を説明します。

**共有**

| コマンド | 何をするか |
|---|---|
| `share list\|stop\|kick\|revoke\|deny` | このマシンのほかのアカウントと共有している自分のペインを確認し、取り戻します。[共有されたペイン](#shared-panes) を参照 |
| `share incoming\|watch` | このマシンのほかのアカウントがあなたに共有しているペインを一覧し、そのひとつをこの端末で見ます |

`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` コマンドが新しいサーバーを立ち上げます。ほかの止め方は [リモート](https://docs.closex.org/ja/thinkterm/remote.md) にあります。

## ペインに名前を付ける {#naming-panes}

ペインの番号は実行のたびに変わります。ラベルは変わりません。`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 が使っているラベルのために。
- **`MACHINE/ID`** または **`MACHINE/LABEL`。** ウィンドウが接続しているサーバー上のペインを指します。[そのための設定](#servers-terminals) がここのプログラムに許している場合に限ります。
- **`desktop-0123abcd/21`。** サーバー上で、接続元のコンピュータの端末を指します。そちらで許可した場合に限ります。[接続先のサーバーにローカル端末へのアクセスを許す](https://docs.closex.org/ja/thinkterm/remote.md#connect-reverse-access) を参照。

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

## キーを押す {#send-key}

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

`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 のシェル統合です。[インストール](https://docs.closex.org/ja/thinkterm/install.md) を参照してください。ないときは、そう伝えるエラーで止まります。`spawn --wait` はそれがなくても動きます。

## 起きていることを見る {#events}

`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` |

## 接続先サーバーのペイン {#servers-terminals}

サーバーに接続しているウィンドウは、そのサーバーの端末を持っていて、このコンピュータのプログラムは `thinkterm cli` でそれらにアクセスできます。ただし `設定 › エージェント › サーバーのターミナル › このマシンのプログラム` が許す範囲に限られます。既定は `オフ` です。`読むだけ` は端末の一覧と読み取りを許し、`読む・入力` は入力も許します。この設定があるのは、このコンピュータの端末で動くプログラム（コーディングエージェントやプラグインなど）はウィンドウの前にいる人ではなく、アクセスする先があなたとしてログインした別のマシンのシェルだからです。ウィンドウがサインインした接続を通ります。

この設定がオンで、ThinkTerm のウィンドウが開いて接続されていると、`list` はこのマシンのペインのあとにサーバーのペインを加えます。それぞれの名前は `MACHINE/ID` で、ウィンドウがそのマシンを呼ぶ名前、スラッシュ、そのサーバーでのペイン番号です。JSON では数値ではなく文字列です。`--pane` は同じ名前を受け付け、ペインにそちらでのラベルがあれば `MACHINE/LABEL` も使えます。大文字小文字は区別せず、マシン名自体にスラッシュが含まれていてもかまいません。`get-text`、`send-text`、`send-key`、`wait`、`events` はこの形の名前を受け付けます。`--pane-id` やほかのコマンドは、これらのペインに届きません。`events` では、それらのペインに関するイベントが `pane` フィールドに名前を持ち、テーブルではペイン番号の代わりに表示されます。そちらに一致するペインがなければ、ステータス 3 で止まります。設定がオフのときやウィンドウが開いていないときは、サーバー上のペインは `list` が示す `MACHINE/NAME` という名前で、ThinkTerm が開いていて、設定がここのプログラムに許している必要がある、というエラーが出ます。

逆向きもあります。サーバー上のプログラムは、こちらで許可すれば、接続元のコンピュータの端末にアクセスできます。そちらの `list` はそれらを `desktop-0123abcd/21` として表示し、同じコマンドが `--pane` でその名前を受け付けます。[接続先のサーバーにローカル端末へのアクセスを許す](https://docs.closex.org/ja/thinkterm/remote.md#connect-reverse-access) を参照してください。

## 共有されたペイン {#shared-panes}

`設定 › 共有と同期 › ターミナルを共有` をオンにすると、ThinkTerm の端末の共有ボタンから、このマシンのほかのアカウントとその端末を共有できます。ボタンとパネルについては [ターミナルの共有](https://docs.closex.org/ja/thinkterm/window.md#sharing-a-terminal) を参照してください。既定はオフで、試験中の機能と表示されます。共有は人が決めることなので、コマンドラインから共有を始めることはできません。できるのは、共有を確認すること、取り戻すこと、そしてあなたに共有されているものを見ることです。共有された相手はペインをライブで見られますが、入力はできません。入力するには頼み、所有者が決めます。共有は最長 30 分、または始めたデスクトップがいなくなった時点で終わります。入力は 30 分ずつ許され、所有者はいつでも取り戻せます。

| コマンド | 何をするか |
|---|---|
| `share list` | 自分の共有を一覧します。ペイン、共有相手、見ている人、入力できる人、入力を頼んだ人、終了時刻です。`--format json` で JSON を出力します |
| `share stop SHARE` | 共有を終えます。見ている全員が切り離されます |
| `share kick SHARE VIEWER` | 共有から視聴者を 1 人外します。視聴者は `list` に出る id かアカウント名で指定します |
| `share revoke SHARE` | 入力の許可を取り戻します |
| `share deny SHARE VIEWER` | 視聴者の入力の依頼を断ります。視聴は続けられます |
| `share incoming` | このマシンのほかのアカウントがあなたに共有しているペインを、`OWNER/SHARE` の形で、タイトル、開始からの時間、入力している人とともに一覧します。`--format json` で JSON を出力します |
| `share watch [OWNER/SHARE]` | そのひとつをこの端末で見ます |

最初の 5 つは、`web-token` と同じく、ウィンドウではなくバックグラウンドの mux サーバーと話します。`incoming` と `watch` は代わりにほかのアカウントのサーバーに、それぞれが共有に使うソケットで問い合わせるので、自分のサーバーは要りません。

`watch` は共有を、`incoming` が示す `OWNER/SHARE` で指定します。そのアカウントが共有しているペインが 1 つだけなら `OWNER` だけでよく、自分に共有されているペインが 1 つだけなら何も渡さなくてかまいません。複数が当てはまるときはステータス 2 で止まって一覧を出し、1 つもなければステータス 3 で止まります。別のバージョンの ThinkTerm を使っているアカウントの共有は、両者のバージョンが揃うと見えるようになり、コマンドがそう伝えます。ペインは所有者のサイズで描かれ、端末がそれより小さければカーソルの周りの部分が、大きければ残りが空白で表示されます。所有者が入力を許すまで、キーは見回すためだけに使われます。矢印キーか `j` と `k`、Page Up と Page Down で履歴をスクロールし、`g` か Home で先頭へ、`G` か End でライブの画面へ戻り、`h` と `l` か左右の矢印で横にずらします。`Ctrl-]` はビューア自身のコマンドの開始です。`q` で終了し、`r` で所有者に入力を頼むか、入力が許されているときは返します。入力できるあいだはキーがペインに届き、`Ctrl-]` を 2 回押すと `Ctrl-]` そのものが送られます。`--once` は共有された画面をテキストで 1 回出力して終了します。

## ペインの出力を保存する {#restore-output}

`thinkterm cli restore-output` は `設定 › 一般 › 開き直したときにペインの内容を戻す` のコマンドライン版で、実行したマシンに対して働きます。`status` はこのマシンがターミナルの停止時にペインの表示内容を保存するかどうかを示し、`on` でオンに、`off` でオフにして保存済みのものを削除します。このマシンのスイッチを読み書きするだけなので、サーバーは関与せず、起動もされません。デスクトップが動いているマシンでは、オフにしない限りスイッチはオンです。それ以外のマシン、たとえばリモートホストでは、そこで `restore-output on` を実行するまでオフです。何が保存されるか（パスワードとトークンは保存前にマスクされます）と、どう戻るかは [ペインの内容の復元](https://docs.closex.org/ja/thinkterm/configuration.md#restoring-pane-contents) で説明しています。

## 終了ステータス

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

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

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

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

`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` | ペインの[ラベル](#naming-panes)。なければ空 |

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

## コーディングエージェントに ThinkTerm を使わせる {#skill}

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

```
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 サーバー {#the-mux-server}

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

| フラグ | 何をするか |
|---|---|
| `--daemonize` | ターミナルから切り離してバックグラウンドで動きます |
| `--takeover` | 同じソケットで動いている mux サーバーを引き継ぎます。そのペイン、ウィンドウ、クライアントは新しいバイナリのもとで続き、古いサーバーは終了します。動いている側が対応している必要があります。また、自分より古いビルドは拒否します |
| `--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` が待機に戻ったことを報告します。より構造化されたプロトコルを設計中です。

## 関連

- [エージェント状態](https://docs.closex.org/ja/thinkterm/agents.md) — `cli agent` と `cli events` が報告する対象
- [ウェブアクセス](https://docs.closex.org/ja/thinkterm/web.md) — `web-server` と `web-token` が開くもの
- [TUI](https://docs.closex.org/ja/thinkterm/tui.md) — 素のターミナル内のワークスペース
- [プラグイン](https://docs.closex.org/ja/thinkterm/plugins.md) — `thinkterm plugin` が扱うもの
- [キーボードとコマンド](https://docs.closex.org/ja/thinkterm/keyboard.md) — `show-keys` が表示するキーマップ
