session-crosslink について
session-crosslinkは、Entireを使ってエージェントのセッションを対象リポジトリに紐付けるスキルです。セッションと対象を特定し、リポジトリのHEADを変更する操作の前にプレビューと確認を求めます。
主な機能
- 01Entireまたはランタイム記録からセッションIDを解決
- 02候補リポジトリの検出と選別
- 03リポジトリごとの紐付け操作をプレビュー
- 04確認後にセッションを紐付け
活用シーン
- 01セッションを兄弟リポジトリに紐付け
- 02セッション紐付け前にリポジトリ変更を確認
- 03セッション紐付け済みのリポジトリを特定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ entireio/ skills --skill session-crosslinkインストール後、Claude Code で/session-crosslinkを入力して読み込まれたか確認します。
詳細
セッションのクロスリンク
応答形式
このスキル呼び出しに対する最初の応答は、次の行から始めてください。
Entire Session Crosslink:
続けて空行を1行入れ、その後に本文を記載します。このヘッダーは、呼び出しに対する最初の応答のみに付けてください。後続のターンや、エラー時/早期終了時の応答(セッションを解決できない場合、対象リポジトリが見つからない場合)には付けません。
停止 — 何かをする前に、これらのルールを読んでください
- リゾルバー/検出の手順を実行するまで、明確化の質問をしてはいけません。 通常、セッション ID と候補リポジトリの一覧は、
entire session current --jsonとユーザーの発言から特定できます。両方とも空の場合に限り、質問してください。 - プレビュー表を先に表示せずに、
entire session attachを実行してはいけません。 このスキルの目的は、プレビューしてから確認することです。attachは対象リポジトリの HEAD を変更します。プレビューを誤ると、誤ったコミットを変更してしまいます。 entire session attachの実行前に、必ず対象リポジトリにcdしてください。 CLI は現在の作業ディレクトリからリポジトリを特定します。呼び出しごとにcd … && entire session attach …を1回実行し、各呼び出しが正しいリポジトリを対象にするようにしてください。
必要な CLI:entire 0.6.2 以降。特別なフラグは不要です。このスキルは、現在の作業ディレクトリを基準にする entire session attach を通じて、提供済みの CLI で動作します。
手順
ステップ 1:セッション ID を特定する
いずれかでセッション ID が得られるまで、以下の方法を順番に試します。
方法 A:Entire が有効な現在の作業ディレクトリ。
entire session current --json
出力が有効な JSON であり、空でない session_id を含む場合は、session_id と agent を読み取り、その値を使って続行します。JSON の解析に成功しても、session_id がないか空の場合は、方法 A は失敗とみなし、方法 B に進みます。セッション ID がないまま attach に進んではいけません。
方法 B:Entire が有効な兄弟リポジトリ。 ユーザーが Entire の有効なリポジトリ(例:the foo repo)を指定した場合は、その場所に cd して、entire session current --json を再試行します。セッション状態は、セッションが追跡された場所に保存されています。
方法 C:ランタイム固有のトランスクリプトディレクトリ。 方法 A と B のどちらも成功しない場合、このセッションは Entire によって記録されていないため、エージェントのランタイムから読み取る必要があります。
- Claude Code: トランスクリプトは
~/.claude/projects/<encoded-cwd>/<session-id>.jsonlに保存されています。エンコードされた作業ディレクトリは、起動ディレクトリ内の/を-に置き換えたものです。エージェントの起動時の作業ディレクトリと一致するプロジェクトディレクトリ内で、最も新しい.jsonlファイルがこのセッションのものです。.jsonlを除いたファイル名をsession_idとして読み取ります。agentはclaude-codeに設定します。 - Codex:
$CODEX_HOME/sessions/または~/.codex/sessions/を確認します。agentはcodexに設定します。 - その他のランタイム: セッション ID をユーザーに尋ねます。
agent を記録しておき、ステップ 4 で --agent <name> を attach に渡せるようにします。
すべての方法が失敗した場合: 「セッション ID を特定できませんでした。明示的に指定するか、Entire が有効なディレクトリから実行してください」と出力し、停止します。
ステップ 2:対象リポジトリを検出する
以下の情報源から候補の集合を作り、パスで重複を除去します。
-
ユーザーのメッセージから: ユーザーが明示的に指定したリポジトリのパスや別名(例:「the foo repo and the bar api」)をすべて含めます。別名はユーザーの
CLAUDE.mdを参照して解決するか、ファイルシステムのパスとして扱います。 -
起動ディレクトリ配下の兄弟リポジトリから(起動ディレクトリで Entire が有効でない場合のみ):独自の
.gitと.entire/settings.jsonを持つ、直下のサブディレクトリを一覧にします。 -
このセッションにおけるエージェントの編集履歴から: セッション中にファイルが編集されたリポジトリを、エージェント自身のコンテキストから特定します。不明な場合は、ユーザーに尋ねます。
各候補について、そのリポジトリ内を現在の作業ディレクトリとして entire status --json を実行し、次のように判定します。
"enabled": true→ 残します。"enabled": falseで、設定の解析エラー(unknown field "...")がある → 残します。ローカル設定に問題がある場合、attachが成功する場合でもstatusはエラーを大量に出して失敗します。"enabled": falseで、エラーがない → 除外します。リポジトリが Entire を使用しない設定になっています。
候補が空の場合は、クロスリンクするリポジトリをユーザーに尋ねます。
ステップ 3:プレビューをローカルで計算する
各候補について、git とセッションストアを調べてアクションを計算します。内部で entire session attach が使うものと同じロジックですが、何も変更しません。
# Get HEAD hash and message
HEAD_HASH=$(git -C <repo> rev-parse HEAD)
HEAD_MSG=$(git -C <repo> log -1 --format=%B HEAD)
# Existing Entire-Checkpoint trailer on HEAD, if any
EXISTING_TRAILER=$(printf '%s\n' "$HEAD_MSG" | grep -E '^Entire-Checkpoint:' | tail -1 | awk '{print $2}')
# Is the session already tracked in this repo's store?
STATE_FILE=<repo>/.git/entire-sessions/<session-id>.json
リポジトリごとにアクションを決定します。
STATE_FILEが存在し、かつそのlast_checkpoint_idフィールドが空でない場合 →would_skip_existing_in_state。Attach は何も行わないため、その旨を報告します。- HEAD に
EXISTING_TRAILERがある場合 →would_link_existing_in_head。Attach はそのチェックポイント ID を再利用し、このセッションを追加します。 - どちらでもない場合 →
would_add_trailer。Attach は新しいチェックポイント ID を生成し、それを付けて HEAD を amend します。
would_link_existing_in_head の行では、チェックポイント ID は EXISTING_TRAILER です。would_add_trailer の行では、Attach は書き込み時に ID を生成するため、事前にはチェックポイント ID がわかりません。テーブルには「new」と表示します。
リポジトリに HEAD のコミットがない場合(git rev-parse が失敗する場合)は、エラー行として error: no commits yet を記録します。
ステップ 4:プレビューテーブルを表示する
ユーザーに簡潔なテーブルを表示します。
repo HEAD commit action checkpoint
foo a1b2c3d would_add_trailer (new)
bar e4f5g6h would_link_existing_in_head ckpt-7d6c
baz — error: no commits yet —
続けて、次のように尋ねます。「セッション <id> を would_* の行に attach しますか? エラー行と would_skip_existing_in_state の行はスキップされます。」
ステップ 5:確認後に実行する
ユーザーが確認した行のうち、action が would_add_trailer または would_link_existing_in_head の各行について、次を実行します。
cd <repo> && entire session attach <session-id> --agent <agent> --force
would_skip_existing_in_state の行(再度 attach しても何も行われません)と error: の行はスキップします。
リポジトリごとに終了ステータスを取得します。最終的な概要を報告します。
attached:
foo ckpt-9f8e (new trailer on a1b2c3d)
bar ckpt-7d6c (added to existing checkpoint on e4f5g6h)
skipped:
baz (no commits yet)
qux (already linked: ckpt-c97b)
attach によって HEAD が amend されるため、変更した各リポジトリのローカルブランチはリモートと異なる状態になっていることをユーザーに伝えます。ブランチにオープンな PR がある場合は、更新するために force-push(git push --force-with-lease)してください。
失敗モード
- セッション ID を解決できない:1 行のメッセージを表示して停止します。ステップ 1 を参照してください。
- 候補リポジトリがない:クロスリンクするリポジトリをユーザーに尋ねます。
- すべての候補で
would_skip_existing_in_stateが報告される:セッションはすでにすべてのリポジトリにリンクされているため、作業は不要であることをユーザーに伝えます。 - ほかのリポジトリで成功した後、あるリポジトリの
attachが途中で失敗する:自動で再試行しないでください。成功したリポジトリと失敗したリポジトリを報告し、失敗したリポジトリの stderr を提示します。成功した amend は冪等であるため、スキルを再実行しても安全です。 - 候補リポジトリに HEAD のコミットがない:その行を
error: no commits yetとしてスキップします。先にそのリポジトリで少なくとも 1 つコミットするようユーザーに伝えます。 entire session attachがEntire is disabledで失敗する:対象リポジトリで Entire が無効になっています。その旨をユーザーに伝え、再試行しないでください。
このスキルがある理由
Entire は、各リポジトリの git 共通ディレクトリに保存された状態を通じて、リポジトリごとにエージェントのセッションを追跡します。エージェントが上位フォルダー、兄弟リポジトリ、または Entire が有効でない親ディレクトリから実行されると、子リポジトリはどれもそのセッションを認識しません。このスキルは、常にセッション ID を持つエージェントのランタイムからセッション ID を解決し、影響を受けるリポジトリを検出して、それぞれをプレビューした後、確認を得てリポジトリごとに entire session attach を実行します。誤ったコミットを amend したり、リポジトリごとに cd するようユーザーに求めたりすることはありません。