コンテンツにスキップ

`/tree` コマンドリファレンス

/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.tsnavigateTree のリーフ切り替え + オプションのサマリー)
  • src/session/session-manager.tsgetTreebranchbranchWithSummaryresetLeaf、ラベルの永続化)

以下のいずれかで同じセレクターが開きます:

  • /tree
  • 設定されたキーバインディングアクション tree
  • エディターが空の状態でダブルエスケープ(doubleEscapeAction = "tree" の場合、デフォルト)
  • /branchdoubleEscapeAction = "tree" の場合、ユーザーのみのブランチピッカーではなくツリーセレクターにルーティングされます)

ツリーはセッションエントリの親ポインター(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):

  1. default
  2. no-tools
  3. user-only
  4. labeled-only
  5. all

ほとんどの会話ノードを表示しますが、ブックキーピングエントリタイプは非表示にします:

  • label
  • custom
  • model_change
  • thinking_level_change

default と同じですが、さらに toolResult メッセージを非表示にします。

ロールが usermessage エントリのみ表示します。

現在ラベルに解決されるエントリのみ表示します。

ブックキーピング/カスタムエントリを含む、セッションツリー内のすべてを表示します。

ツールのみのアシスタントノードの動作

Section titled “ツールのみのアシスタントノードの動作”

ツール呼び出しのみ(テキストなし)を含むアシスタントメッセージは、以下の場合を除き、すべてのフィルタービューでデフォルトで非表示になります:

  • メッセージがエラー/中断(stopReasonstop/toolUse でない)の場合、または
  • 現在のリーフである場合(常に表示を維持)
  • クエリはスペースでトークン化されます
  • マッチングは大文字小文字を区別しません
  • すべてのトークンが一致する必要があります(AND セマンティクス)
  • 検索可能なテキストにはラベル、ロール、タイプ固有のコンテンツ(メッセージテキスト、ブランチサマリーテキスト、カスタムタイプ、ツールコマンドスニペットなど)が含まれます

navigateTree は選択されたエントリタイプから新しいリーフの動作を計算します:

  • 新しいリーフは選択されたエントリの parentId になります
  • 親が null(ルートのユーザーメッセージ)の場合、リーフはルートにリセットされます(resetLeaf()
  • 選択されたメッセージテキストは編集/再送信のためにエディターにコピーされます
  • ユーザーメッセージと同じリーフルール(parentId
  • テキストコンテンツが抽出されエディターにコピーされます

ユーザー以外のノードの選択(アシスタント/ツール/サマリー/コンパクション/カスタムブックキーピングなど)

Section titled “ユーザー以外のノードの選択(アシスタント/ツール/サマリー/コンパクション/カスタムブックキーピングなど)”
  • 新しいリーフは選択されたノードの ID になります
  • エディターは事前入力されません
  • 何もしません。セレクターは「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

サマリープロンプトは branchSummary.enabled(デフォルト:false)で制御されます。

有効にすると、ノードを選択した後に UI が以下を尋ねます:

  • No summary
  • Summarize
  • Summarize with custom prompt

フローの詳細:

  • サマリープロンプトでエスケープするとツリーセレクターが再度開きます
  • カスタムプロンプトのキャンセルはサマリー選択ループに戻ります
  • サマリー生成中、UI はローダーを表示し EscabortBranchSummary() にバインドします
  • サマリー生成が中断された場合、ツリーセレクターが再度開き、移動は適用されません

navigateTree の内部:

  • 古いリーフから共通の祖先までの放棄されたブランチエントリを収集します
  • session_before_tree を発行します(拡張機能がキャンセルまたはサマリーを注入できます)
  • リクエストされ必要な場合のみデフォルトのサマライザーを使用します
  • 以下で移動を適用します:
    • サマリーが存在する場合は branchWithSummary(...)
    • サマリーなしの非ルート移動の場合は branch(newLeafId)
    • サマリーなしのルート移動の場合は resetLeaf()
  • エージェントの会話を再構築されたセッションコンテキストに置き換えます
  • session_tree を発行します

注意:ユーザーがサマリーをリクエストしても、サマリーする内容がない場合、サマリーエントリを作成せずにナビゲーションが進行します。

ツリー UI でのラベル編集は appendLabelChange(targetId, label) を呼び出します。

  • 空でないラベルは解決済みラベルを設定/更新します
  • 空のラベルはクリアします
  • ラベルは追記のみの label エントリとして保存されます
  • ツリーノードは生のラベルエントリ履歴ではなく、解決済みのラベル状態を表示します
操作スコープ結果
/tree現在のセッションファイル選択したポイントにリーフを移動(同一ファイル内)
/branch通常は現在のセッションファイル -> 新しいセッションファイルデフォルトでは選択したユーザーメッセージから新しいセッションファイルにブランチします。doubleEscapeAction = "tree" の場合、/branch は代わりにツリーナビゲーション UI を開きます
/fork現在のセッション全体セッションを新しい永続化されたセッションファイルに複製します
/resumeセッションリスト別のセッションファイルに切り替えます

重要な違い:/tree は1つのセッションファイル内のナビゲーション/再配置ツールです。/branch/fork/resume はすべてセッションファイルのコンテキストを変更します。

現在のブランチを失わずに以前のユーザープロンプトから再実行する

Section titled “現在のブランチを失わずに以前のユーザープロンプトから再実行する”
  1. /tree
  2. 以前のユーザーメッセージを検索/選択
  3. No summary を選択(必要に応じてサマリーを作成)
  4. エディター内の事前入力されたテキストを編集
  5. 送信

効果:同じセッションファイル内の選択したポイントから新しいブランチが成長します。

コンテキストのパンくずを残して現在のブランチを離れる

Section titled “コンテキストのパンくずを残して現在のブランチを離れる”
  1. branchSummary.enabled を有効にする
  2. /tree でターゲットノードを選択
  3. Summarize(またはカスタムプロンプト)を選択

効果:続行する前にターゲット位置に branch_summary エントリが追加されます。

非表示のブックキーピングエントリを調査する

Section titled “非表示のブックキーピングエントリを調査する”
  1. /tree
  2. Alt+A(all)を押す
  3. modelthinkingcustom、またはラベルを検索

効果:会話ノードだけでなく、完全な内部タイムラインを検査できます。

後でジャンプするためにピボットポイントをブックマークする

Section titled “後でジャンプするためにピボットポイントをブックマークする”
  1. /tree
  2. エントリに移動
  3. Shift+L でラベルを設定
  4. 後で Alt+Llabeled-only)を使用して素早くジャンプ

効果:永続的なブランチランドマーク間の高速ナビゲーション。