- ホーム
- Documentation
- TUI
- `/tree` コマンドリファレンス
`/tree` コマンドリファレンス
/tree はインタラクティブなセッションツリーナビゲーターを開きます。現在のセッションファイル内の任意のエントリにジャンプし、そのポイントから続行できます。
これはファイル内のリーフ移動であり、新しいセッションのエクスポートではありません。
/tree の動作
Section titled “/tree の動作”- 現在のセッションエントリからツリーを構築します(
SessionManager.getTree()) - キーボードナビゲーション、フィルター、検索機能を備えた
TreeSelectorComponentを開きます - 選択時に
AgentSession.navigateTree(targetId, { summarize, customInstructions })を呼び出します - 新しいリーフパスから表示チャットを再構築します
- ユーザー/カスタムメッセージを選択した場合、オプションでエディターテキストを事前入力します
主要な実装:
src/modes/controllers/input-controller.ts(/tree、キーバインディングの接続、ダブルエスケープの動作)src/modes/controllers/selector-controller.ts(ツリー UI の起動 + サマリープロンプトフロー)src/modes/components/tree-selector.ts(ナビゲーション、フィルター、検索、ラベル、レンダリング)src/session/agent-session.ts(navigateTreeのリーフ切り替え + オプションのサマリー)src/session/session-manager.ts(getTree、branch、branchWithSummary、resetLeaf、ラベルの永続化)
以下のいずれかで同じセレクターが開きます:
/tree- 設定されたキーバインディングアクション
tree - エディターが空の状態でダブルエスケープ(
doubleEscapeAction = "tree"の場合、デフォルト) /branch(doubleEscapeAction = "tree"の場合、ユーザーのみのブランチピッカーではなくツリーセレクターにルーティングされます)
ツリー UI モデル
Section titled “ツリー UI モデル”ツリーはセッションエントリの親ポインター(id / parentId)からレンダリングされます。
- 子はタイムスタンプの昇順でソートされます(古いものが先、新しいものが下)
- アクティブブランチ(ルートから現在のリーフまでのパス)はバレットでマークされます
- ラベル(存在する場合)はノードテキストの前に
[label]としてレンダリングされます - 複数のルートが存在する場合(孤立した/壊れた親チェーン)、仮想的な分岐ルートの下に表示されます
Example tree view (active path marked with •):
├─ user: "Start task"│ └─ assistant: "Plan"│ ├─ • user: "Try approach A"│ │ └─ • assistant: "A result"│ │ └─ • [milestone] user: "Continue A"│ └─ user: "Try approach B"│ └─ assistant: "B result"セレクターは現在の選択を中心に再配置し、最大で以下の行数を表示します:
max(5, floor(terminalHeight / 2))行
ツリーセレクター内のキーバインディング
Section titled “ツリーセレクター内のキーバインディング”Up/Down:選択を移動(ラップ)Left/Right:ページアップ / ページダウンEnter:ノードを選択Esc:検索がアクティブな場合はクリア、それ以外はセレクターを閉じるCtrl+C:セレクターを閉じるType:検索クエリに追加Backspace:検索文字を削除Shift+L:選択したエントリのラベルを編集/クリアCtrl+O:フィルターを前方にサイクルShift+Ctrl+O:フィルターを後方にサイクルAlt+D/T/U/L/A:特定のフィルターモードに直接ジャンプ
フィルターと検索のセマンティクス
Section titled “フィルターと検索のセマンティクス”フィルターモード(TreeList):
defaultno-toolsuser-onlylabeled-onlyall
default
Section titled “default”ほとんどの会話ノードを表示しますが、ブックキーピングエントリタイプは非表示にします:
labelcustommodel_changethinking_level_change
no-tools
Section titled “no-tools”default と同じですが、さらに toolResult メッセージを非表示にします。
user-only
Section titled “user-only”ロールが user の message エントリのみ表示します。
labeled-only
Section titled “labeled-only”現在ラベルに解決されるエントリのみ表示します。
ブックキーピング/カスタムエントリを含む、セッションツリー内のすべてを表示します。
ツールのみのアシスタントノードの動作
Section titled “ツールのみのアシスタントノードの動作”ツール呼び出しのみ(テキストなし)を含むアシスタントメッセージは、以下の場合を除き、すべてのフィルタービューでデフォルトで非表示になります:
- メッセージがエラー/中断(
stopReasonがstop/toolUseでない)の場合、または - 現在のリーフである場合(常に表示を維持)
- クエリはスペースでトークン化されます
- マッチングは大文字小文字を区別しません
- すべてのトークンが一致する必要があります(AND セマンティクス)
- 検索可能なテキストにはラベル、ロール、タイプ固有のコンテンツ(メッセージテキスト、ブランチサマリーテキスト、カスタムタイプ、ツールコマンドスニペットなど)が含まれます
選択結果(重要)
Section titled “選択結果(重要)”navigateTree は選択されたエントリタイプから新しいリーフの動作を計算します:
user メッセージの選択
Section titled “user メッセージの選択”- 新しいリーフは選択されたエントリの
parentIdになります - 親が
null(ルートのユーザーメッセージ)の場合、リーフはルートにリセットされます(resetLeaf()) - 選択されたメッセージテキストは編集/再送信のためにエディターにコピーされます
custom_message の選択
Section titled “custom_message の選択”- ユーザーメッセージと同じリーフルール(
parentId) - テキストコンテンツが抽出されエディターにコピーされます
ユーザー以外のノードの選択(アシスタント/ツール/サマリー/コンパクション/カスタムブックキーピングなど)
Section titled “ユーザー以外のノードの選択(アシスタント/ツール/サマリー/コンパクション/カスタムブックキーピングなど)”- 新しいリーフは選択されたノードの ID になります
- エディターは事前入力されません
現在のリーフの選択
Section titled “現在のリーフの選択”- 何もしません。セレクターは「Already at this point」と表示して閉じます
Selection decision (simplified):
selected node │ ├─ is current leaf? ── yes ──> close selector (no-op) │ ├─ is user/custom_message? ── yes ──> leaf := parentId (or resetLeaf for root) │ + prefill editor text │ └─ otherwise ──> leaf := selected node id + no editor prefill切り替え時のサマリーフロー
Section titled “切り替え時のサマリーフロー”サマリープロンプトは branchSummary.enabled(デフォルト:false)で制御されます。
有効にすると、ノードを選択した後に UI が以下を尋ねます:
No summarySummarizeSummarize with custom prompt
フローの詳細:
- サマリープロンプトでエスケープするとツリーセレクターが再度開きます
- カスタムプロンプトのキャンセルはサマリー選択ループに戻ります
- サマリー生成中、UI はローダーを表示し
EscをabortBranchSummary()にバインドします - サマリー生成が中断された場合、ツリーセレクターが再度開き、移動は適用されません
navigateTree の内部:
- 古いリーフから共通の祖先までの放棄されたブランチエントリを収集します
session_before_treeを発行します(拡張機能がキャンセルまたはサマリーを注入できます)- リクエストされ必要な場合のみデフォルトのサマライザーを使用します
- 以下で移動を適用します:
- サマリーが存在する場合は
branchWithSummary(...) - サマリーなしの非ルート移動の場合は
branch(newLeafId) - サマリーなしのルート移動の場合は
resetLeaf()
- サマリーが存在する場合は
- エージェントの会話を再構築されたセッションコンテキストに置き換えます
session_treeを発行します
注意:ユーザーがサマリーをリクエストしても、サマリーする内容がない場合、サマリーエントリを作成せずにナビゲーションが進行します。
ツリー UI でのラベル編集は appendLabelChange(targetId, label) を呼び出します。
- 空でないラベルは解決済みラベルを設定/更新します
- 空のラベルはクリアします
- ラベルは追記のみの
labelエントリとして保存されます - ツリーノードは生のラベルエントリ履歴ではなく、解決済みのラベル状態を表示します
/tree と関連操作の比較
Section titled “/tree と関連操作の比較”| 操作 | スコープ | 結果 |
|---|---|---|
/tree | 現在のセッションファイル | 選択したポイントにリーフを移動(同一ファイル内) |
/branch | 通常は現在のセッションファイル -> 新しいセッションファイル | デフォルトでは選択したユーザーメッセージから新しいセッションファイルにブランチします。doubleEscapeAction = "tree" の場合、/branch は代わりにツリーナビゲーション UI を開きます |
/fork | 現在のセッション全体 | セッションを新しい永続化されたセッションファイルに複製します |
/resume | セッションリスト | 別のセッションファイルに切り替えます |
重要な違い:/tree は1つのセッションファイル内のナビゲーション/再配置ツールです。/branch、/fork、/resume はすべてセッションファイルのコンテキストを変更します。
オペレーターのワークフロー
Section titled “オペレーターのワークフロー”現在のブランチを失わずに以前のユーザープロンプトから再実行する
Section titled “現在のブランチを失わずに以前のユーザープロンプトから再実行する”/tree- 以前のユーザーメッセージを検索/選択
No summaryを選択(必要に応じてサマリーを作成)- エディター内の事前入力されたテキストを編集
- 送信
効果:同じセッションファイル内の選択したポイントから新しいブランチが成長します。
コンテキストのパンくずを残して現在のブランチを離れる
Section titled “コンテキストのパンくずを残して現在のブランチを離れる”branchSummary.enabledを有効にする/treeでターゲットノードを選択Summarize(またはカスタムプロンプト)を選択
効果:続行する前にターゲット位置に branch_summary エントリが追加されます。
非表示のブックキーピングエントリを調査する
Section titled “非表示のブックキーピングエントリを調査する”/treeAlt+A(all)を押すmodel、thinking、custom、またはラベルを検索
効果:会話ノードだけでなく、完全な内部タイムラインを検査できます。
後でジャンプするためにピボットポイントをブックマークする
Section titled “後でジャンプするためにピボットポイントをブックマークする”/tree- エントリに移動
Shift+Lでラベルを設定- 後で
Alt+L(labeled-only)を使用して素早くジャンプ
効果:永続的なブランチランドマーク間の高速ナビゲーション。