コンテンツにスキップ

Space と worktree

Space は専用の Emacs タブを持つプロジェクトです。タブはフレームの名前付きウィンドウ配置です。フレーム上端の帯を出すかどうかは tab-bar-show 次第です。git worktree はそれ自体が 1 つの Space となり、元のリポジトリの下に表示されます。

ecc-use-spaces は既定でオンです。オフにすると以前の配置に戻ります。トランスクリプトはサイドウィンドウに表示され、タブやサイドバー、worktree コマンドは使えなくなります。

(setq ecc-use-spaces nil)

すべての Space とセッションを並べたサイドバー、プロジェクトごとのタブ、ソースと 2 つのトランスクリプトが横に並んだ 1 つの Space

┌ *ecc-sidebar* ─────┬ タブバー: [ecc] [herdr] [feat-x] ───────────────────┐
│ Spaces │ ┌ ソース ─────────┬ session-A ────┬ session-B ────┐ │
│ ⚠ [1] ecc ▾ │ │ │ (タブライン) │ (タブライン) │ │
│ main ↑2 ↓0 │ │ │ │ │ │
│ └─ ▶ [2] feat-x │ │ │ │ │ │
│ · [3] herdr │ └─────────────────┴───────────────┴───────────────┘ │
│ master │ │
│ │ 1 つの Space = 1 つのタブ = 1 つのウィンドウ配置 │
│ │ │
│ Sessions │ │
│ ⚠ ecc waiting │ │
│ ▶ ecc-2 running │ │
│ · herdr idle │ │
└────────────────────┴─────────────────────────────────────────────────────┘

トランスクリプトは横に並びます。最初はソースの右隣に開き、以降は一番右のウィンドウを分割していきます。上下に積まれることはありません。開いた後は通常のウィンドウと同じなので、分割・移動・拡大・クローズは自由です。タブはウィンドウ構成そのものなので、Space を離れて戻ってきても配置が復元されます。トランスクリプト内のタブラインでも、引き続きそのプロジェクトのセッションを切り替えられます。

トランスクリプトの幅が ecc-space-session-min-width より狭くなることはありません。横に空きがなくなると、最も長く操作していないセッションがウィンドウを明け渡し、ウィンドウのないまま実行を続けます。そのセッションはサイドバーまたは C-c c V で戻せます。

何も動いていない Space に移動すると、そこでセッションが起動します。 これは既定でオンの ecc-space-always-session による動作です。最後のセッションを kill すると Space も閉じます。以前の会話を続けるには、開いたセッションで /resume と入力します。オフにすると、Space はソースのみで開き、そのプロジェクトの最後のバッファを kill するまで残ります。

キー コマンド 動作
C-c c j ecc-space-goto Space を名前で指定して移動。記録しか残っていないプロジェクトも対象
C-c c z ecc-space-zoom このウィンドウでタブ全体を埋める。同じキーを押すと元の配置に戻る
C-c c V ecc-space-reset-windows この Space を新規タブの初期配置(左にソース、その隣にトランスクリプト)に戻す
C-c c ?X ecc-space-close この Space を閉じ、内部で実行中のプロセスをすべて停止する(リポジトリなら配下の worktree も含む)。その後、閉じた worktree を削除するか確認する
ecc-space-jump サイドバーの番号で N 番目の Space に移動

タブバーを出すかどうかはあなたが決める

Section titled “タブバーを出すかどうかはあなたが決める”

tab-bar-mode はタブの帯を表示するだけで、ecc がこのモードを有効にすることはありません。tab-bar-show が既定の t なら tab-bar-new-tab が有効にし、nil に設定されていれば無効のままにします。

(setq tab-bar-show nil) ; フレーム上端に帯を出さずに Space を使う

帯を隠しても、タブの作成・名前変更・切り替え・閉じる操作はこれまでどおり行え、サイドバーがその一覧になります。

サイドバー: 2 つのプロジェクトと、その一方のリポジトリの下に並ぶ 2 つの worktree、下半分に各セッションの状態

C-c c becc-sidebar-focus)でサイドバーを開いてカーソルを移動します。同じキーを押すと元のウィンドウに戻ります。

上半分は Space の一覧です。各行には Space の状態を示す印、19 キーに対応する番号、Space 名が表示されます。リポジトリの下にはブランチと upstream との差が表示され、その worktree がツリー形式で下に連なって各ブランチ名で表示されます。TAB でこれらを折りたためます。

下半分はセッションの一覧で、それぞれ印、名前、待機中の内容が表示されます。印、色、点滅表示はタブラインと共通のため、セッションはどこに表示されていても同じ状態を示します。

キー 動作
RET その行の Space またはセッションへ移動
n, p 次の行/前の行
TAB リポジトリの worktree を折りたたむ/展開する
19 その番号の Space へ移動
c この Space でセッションを開始
W この Space から worktree を作成してセッションを開始
k このセッションを停止
K この worktree のディレクトリを削除
X この Space を閉じる
a, d このセッションの待機要求を許可/拒否(確認あり。Bash は対象外)
g git の状態を更新して再描画
q サイドバーを隠す

ad の動作はダッシュボードと同じです(セッション管理 を参照)。ecc-sidebar-width はサイドバーの幅で、既定値は 28 桁です。ecc-sidebar-sessions-sort は下半分の並び順を指定します。spaces(既定値)は各 Space の下にセッションをまとめ、priority は応答待ちのものを先頭に配置します。

git の worktree は、リポジトリに別のブランチを割り当てたもうひとつの作業ツリーです。2 つのセッションが互いの変更を見ずに同じプロジェクトで作業できます。以下のコマンドは ecc-use-spaces のオン・オフを問わず使えます。

キー コマンド 動作
C-c c ?W c ecc-start-worktree リポジトリの隣にブランチをチェックアウトしてセッションを開始
C-c c ?W o ecc-start-in-worktree 既存の worktree でセッションを開始
C-c c ?W k ecc-remove-worktree worktree 内のセッションを停止して worktree を削除

ecc-start-worktree はブランチの入力を求め、既存のブランチを候補として提示します。既存のブランチはそのままチェックアウトし、存在しないブランチは HEAD から作成します。すでに別の worktree でチェックアウトされているブランチを指定しても拒否はされず、ecc が確認したうえで、その worktree でセッションを開始します。worktree はブランチ名で特定するため、ディレクトリ名は何でも構いません。

worktree は ecc-worktree-directory(既定値は .claude/worktrees)に配置されます。相対パスの場合はリポジトリ配下となり、feat/x の worktree は <repo>/.claude/worktrees/feat-x に置かれます。絶対パスの場合は全リポジトリで共有され、<directory>/<repository>/<branch-slug> に置かれます。

worktree で動く最後のセッションが終了すると、終了理由を問わず、ecc はその worktree を削除するか確認します。ブランチが削除されることはありません: ecc-remove-worktree が削除するのはディレクトリだけなので、コミット済みの変更が失われることはありません。未コミットの変更や未追跡ファイルがあって git が削除を拒否した場合は、ecc がディレクトリ名を示して再確認し、承認された場合のみ強制的に削除します。

作業を worktree のセッションに引き渡す

Section titled “作業を worktree のセッションに引き渡す”

セッション内で worktree での作業を依頼すると、CLI は単体では git worktree add を実行し、同じ会話のまま作業を続けます。1 つのセッションで 2 つの worktree を扱うことになります。

Emacs の MCP サーバーが有効な場合(ecc-mcp-enabled)、モデルには代わりに start_worktree_session が提示されます。モデルがブランチ名を決めて依頼文を書くと、Emacs が worktree を作成して Space として開き、そこでセッションを開始してその依頼文を送ります。Emacs は会話から追跡した情報(変更したファイル、作成した plan、記録ファイルのパス、未コミットの変更)も添えます。worktree は HEAD から作成されるため、作業内容は事前にコミットするか、依頼文に明記してください。モデルがツールを使わずに自前で worktree を作成しようとすると、Emacs はその要求を拒否し、ツールを使うよう伝えます。このときユーザーへの確認プロンプトは表示されません。

下書きに worktree への言及があると、モデルにツールの存在を促す 1 行を添えて送信します。この行はユーザーが書いたものではないため、トランスクリプトではプロンプト本体から除外され、下に “1 line Emacs added” として折りたたんで表示されます。

モデルが指定したブランチが別の worktree でチェックアウト済みの場合は、ツールが要求を拒否し、別のブランチを求めます。1 つの worktree で 2 つのセッションを動かすのは、作業の引き渡しにならないためです。Lisp から呼び出すコマンドは ecc-worktree-delegate で、M-x コマンドはありません。

worktree で開始したセッションは、元のリポジトリ配下に専用の Space を開きます。