# relay-baton **コーディングエージェントのための可搬な継続インフラ** Codex CLI、Claude Code、そして次に登場するツールへ ― チャットログ、diff、リポジトリを貼り直すことなく ― 圧縮されたコーディング状態を渡す。 [English](../../README.md) · [한국어](./README.ko.md) · **日本語** · [简体中文](./README.zh-CN.md) · [繁體中文](./README.zh-TW.md) · [Español](./README.es.md) · [Français](./README.fr.md) · [Deutsch](./README.de.md) · [Português](./README.pt-BR.md) · [Русский](./README.ru.md)
```bash # Codex が作業途中で quota の壁に当たる。relay-baton が検知し、リポジトリの # 実際の状態から compact handoff を生成し、Claude が作業を引き継ぐ。 $ relay-baton run "upload pipeline をリファクタ" --diet caveman ● relay chain: codex → claude ▲ codex hit a limit — fallback pattern detected: "rate limit exceeded" → building a compact handoff for claude… ✓ claude resumed from .ai-session/handoff.md ``` --- ## なぜ存在するか AI コーディング作業は複数のツールに分散しつつある。実際のセッションはこうだ: - ある一連の編集は Codex CLI で、別のものは Claude Code で。 - 朝はノートパソコン、夜は別のマシン。 - context window は埋まり、崩れ、あるいは静かに切り捨てられる。 現在エージェント間で作業を移す既定の方法は **チャットログのコピペ** ― ひどい場合はリポジトリ全体を prompt に放り込むこと。3 つの問題がある: 1. **トークン。** チャットログは大半がノイズ。毎ターン、そのノイズに課金される。 2. **継続性。** 次のエージェントに *意図* ではなく transcript が渡る。 3. **脆さ。** ファイル 1 つ抜け、diff 1 つが stale、エージェントは誤った前提から再起動する。 relay-baton はエージェントの下に敷くための **ローカルハーネス** だ。引き継ぎ越しに *最小十分な状態* だけを運ぶ ― compact 要約、repo map、ファイル参照。transcript ではない。 > **トークンを最小限に抑えつつ、Codex CLI と Claude Code CLI を一つの作業フローに統合する。** ## アイデア ``` ┌─────────┐ ┌──────────────┐ ┌──────────────┐ ┌────────┐ │ Codex │ → │ Fallback │ → │ Token Diet │ → │ Claude │ │ exec │ │ Detector │ │ Handoff │ │ Code │ └─────────┘ └──────────────┘ └──────────────┘ └────────┘ ↓ ↓ .ai-session/handoff.md, compact-state.md, repo-map.md, full-diff.patch, commands.log ``` コーディングエージェントのための baton-pass ― 4 段階の primitive: - **Detect** 現エージェントが限界に達したかを検知 (quota、context、rate、errors)。 - **Capture** 重要なものだけ収集 (repo 状態、変更ファイル、決定、次の一手)。 - **Compact** 次のエージェントが実際に処理できる予算内に圧縮。 - **Hand off** quality gate を通った後にのみ渡す。 handoff は小さなファイル (`.ai-session/handoff.md`) と参照で構成される。大きな資料 (全 diff、全ログ、全 repo map) はディスクに置かれ、必要な時だけ読まれる。 ## Quick Start **インストール(ビルド不要)** ```bash # npm (全 OS) npm i -g @relay-baton/cli # -> relay-baton # macOS / Linux — Homebrew brew tap dgl1231/relay-baton && brew install relay-baton # Windows — Scoop / Winget scoop bucket add relay-baton https://github.com/dgl1231/scoop-relay-baton && scoop install relay-baton winget install dgl1231.relay-baton ``` ```bash relay-baton doctor relay-baton login relay-baton run "..." --diet balanced ``` **ソースから(開発用)** ```bash pnpm install pnpm build pnpm relay-baton login # Codex + Claude にログイン pnpm relay-baton doctor # 環境チェック pnpm relay-baton run "mail attachment upload flow を直して" --diet balanced ``` ## ワークフロー ```bash $ relay-baton init # .ai-session/ を作成 $ relay-baton run "flaky upload test を修正" --diet balanced ... codex の出力がストリームされる ... ▲ codex hit a limit — fallback pattern detected: "maximum context length" → building a compact handoff for claude… ✓ Handoff Quality Gate: ok · Token Diet Quality Gate: ok ... claude が引き継いでファイルを編集し終了 ... $ relay-baton status # セッション状態 $ relay-baton budget # diet 予算の使用量 ``` 自動 fallback なし、手動 handoff のみ: ```bash $ relay-baton handoff --to claude --no-run --diet caveman ``` 複数リポジトリの切り替え: ```bash $ relay-baton project add /path/to/repo-a --diet caveman $ relay-baton project switch repo-a $ relay-baton run "metrics endpoint を配線" ``` ## 機能 - **自動 fallback** ― Codex 出力から `quota exceeded`、`rate limit exceeded`、`maximum context length` などを検知。grep 結果や、それらのパターンを説明する文章はスキップ (false positive 防止)。 - **Token diet** ― 5 つの決定的圧縮 profile (`off · lite · balanced · caveman · ultra`)。lock/build/min ファイルを除外、ログは tail、repo map で代替。 - **Quality gates** ― fallback 実行 *前* に handoff の完全性と予算を検証。 - **Auth-safe by default** ― `OPENAI_API_KEY` / `ANTHROPIC_API_KEY` は子プロセスから除去。`--allow-api-key-env` で opt-in のみ。key を保存・出力・記録しない。 - **Project registry** ― 複数リポジトリを一度登録し、`--project` / `--path` でどこからでも実行。 - **Ink TUI** ― project/session dashboard。エージェントを起動しない。 - **API 呼び出しなし** ― OpenAI / Anthropic API を直接呼ばない。ローカル `codex` / `claude` CLI subprocess のみ。 ## コマンド | コマンド | 説明 | |---|---| | `relay-baton init` | `.ai-session/` 作成 | | `relay-baton doctor` | 環境チェック(`--deep` で拡張診断) | | `relay-baton verify` | シミュレートされたE2Eチェック — 実モデル呼び出しなし | | `relay-baton login [agent]` | Codex / Claude ログインフロー | | `relay-baton run ""` | primary agent 実行 + fallback 検知 + handoff | | `relay-baton route ""` | advisory ルーティングヒントのプレビュー(読み取り専用, `--json`) | | `relay-baton handoff --to claude` | 手動 handoff (`--diet`, `--no-run`, `--force`) | | `relay-baton handoff history` | 現在 + バックアップの handoff 文書を一覧 (metadata のみ) | | `relay-baton plan ""` | Plan-execute: planner が `plan.md` を書く (`--with`, `--no-run`, `--then-execute`) | | `relay-baton execute` | Plan-execute: executor が `plan.md` を実装 (`--with`, `--from`) | | `relay-baton compress-context` | 進行中の context (state.md / commands.log) を圧縮 (`--dry-run`, `--threshold`) | | `relay-baton compact` / `squeeze` | compact-state / repo-map / full-diff 再生成 | | `relay-baton budget` | context budget 使用量 | | `relay-baton compress ` | markdown の決定的圧縮 | | `relay-baton status` | セッション状態 | | `relay-baton project add/list/switch/current/doctor/remove` | project registry 管理 | | `relay-baton tui` | Ink dashboard | Project 対応コマンドは `--project ` と `--path ` を受け付ける。優先順位:`--path` > `--project` > active project > cwd。 ## Project registry ```bash relay-baton project add /path/to/relay-baton --name relay-baton --diet caveman --primary codex --fallback claude relay-baton project switch relay-baton relay-baton status --project relay-baton ``` デフォルトの保存先は `~/.relay-baton/projects.json`。`RELAY_BATON_PROJECTS_FILE` でパスを上書き可能 (CI、sandbox、テスト)。破損したファイルは `projects.json.corrupt-.bak` にバックアップされ、空の registry にリセットされる ― コマンドはそのまま動き続ける。 ## Token diet profiles | Profile | 意図 | |---|---| | `off` | truncation 最小 | | `lite` | 軽い整理 | | `balanced` *(既定)* | 通常運用 | | `caveman` | aggressive minimal-context | | `ultra` | 極端な圧縮 | > `caveman` はふざけた口調ではなく **aggressive minimal-context** を意味する。技術的正確性は保たれる。 ## 他の方式との比較 | 方式 | 渡る情報 | トークンコスト | 継続性 | 失敗モード | |---|---|---|---|---| | 生のチャット export | transcript 全部 | 高い (大半がノイズ) | 脆い ― エージェントが自分の思考を読み直す | context window 溢れ | | コピペ prompting | 人が覚えていた分 | 可変 | 壊れやすい | 実状態との silent drift | | repo 全体 dump | 全部 | 非常に高い | 強いが高コスト | モデルが途中で切る | | **relay-baton** | compact 要約 + repo map + ファイル参照 | **低く、profile で上限** | 強い ― *実際の* repo 状態が駆動 | quality gate で *明示的に* 失敗 | ## 哲学 relay-baton は **AI ネイティブ開発ワークフロー向けの小さく鋭いツール** だ。 - **Local-first.** 全てディスク上。クラウド、デーモン、テレメトリ、アカウント不要。 - **Composability.** `.ai-session/` ディレクトリは単なるファイル群。読んで、grep して、diff して、PR に添付できる。 - **軽量な状態転送。** handoff は markdown ファイル。データベースではない。 - **賢さより決定性。** ハーネス内で LLM 要約をしない ― モデルが要約を間違えれば handoff が嘘になる。文字予算、構造ルール、明示参照のみ。 - **Repo 状態が真実の源。** 会話は解釈、repo は事実。 - **トークン効率は機能そのもの** ― メニューに隠れたオプションではない。 ### 設計原則 1. chat relay ではなく **work handoff**。 2. 会話履歴より **現在のリポジトリ状態** を優先。 3. handoff は **人間が読める** こと。 4. 全 UI は core を呼ぶ薄い殻。 5. **Token diet は副機能ではなく中心機能**。 ## 今後の方向 relay-baton は 2-agent fallback ハーネスとして出発する。同じ primitive はさらに広がる: - **多エージェント relay chain** ― Codex → Claude → OpenCode → 再び Codex。 - **分岐するセッションツリー** ― 同じタスクを並列エージェントで試し、diff で和解。 - **リモート relay state** ― `.ai-session/` を共有 remote に push し、次のマシンが引き継ぐ。 - **オーケストレーションされたワークフロー** ― `review`、`diagnose`、`continue` モード (明示的チェックポイントを持つ bounded autopilot)。 - **追加 adapter** ― OpenCode、Gemini CLI、Aider など、まともなローカル subprocess インターフェイスを持つ全て。 ハーネスの形は変わらない:detect、capture、compact、hand off。 ## 必要環境 | 項目 | バージョン / 備考 | |---|---| | Node.js | ≥ 20 | | pnpm | ≥ 9 | | git | 必須 | | `codex` | **ChatGPT Plus 以上のサブスクリプションが必要** | | `claude` | **Claude Pro 以上のサブスクリプションが必要** | > relay-baton は OpenAI / Anthropic API を直接呼ばない。ローカル `codex` / `claude` CLI の **サブスクリプション認証** を使う。API key 認証は可能だが **デフォルトでブロック** (`--allow-api-key-env` で opt-in)。 ## ログイン ```bash pnpm relay-baton login # 両方 pnpm relay-baton login codex pnpm relay-baton login claude ``` `claude --version` が通ってもログイン済みではない。"Not logged in" が出たら上のコマンドを再実行。 ## リリースノート **最新: v1.6.1** — [English](../../release-notes/v1.6.1.md) · [한국어](../../release-notes/ko/v1.6.1.md) · [日本語](../../release-notes/ja/v1.6.1.md) relay-baton は **v1.0.0 で正式リリース(GA)** され、現在の最新は **v1.6.1** です。 - 全バージョン履歴: [`CHANGELOG.md`](../../CHANGELOG.md) - 各バージョンの詳細な変更点: [release-notes index](../../release-notes/README.md) ### インストール ```bash npm i -g @relay-baton/cli # -> relay-baton brew tap dgl1231/relay-baton && brew install relay-baton # macOS / Linux scoop bucket add relay-baton https://github.com/dgl1231/scoop-relay-baton && scoop install relay-baton # Windows winget install dgl1231.relay-baton # Windows ``` ## License MIT。詳細は [`LICENSE`](../../LICENSE)。 > 完全なドキュメント (quality gate の詳細、`.ai-session/` ファイルの意味、config schema、TUI キーバインド、トラブルシューティング等) は [English README](../../README.md) と [`install/install.md`](../../install/install.md) にある。