Skip to content

feat: Claude / Codex / Grok の 3 エージェント対応を仕上げる(Phase D の残り) - #128

Merged
takecchi merged 1 commit into
mainfrom
codiva/grok-issue-claude-codex-grok
Aug 20, 2026
Merged

feat: Claude / Codex / Grok の 3 エージェント対応を仕上げる(Phase D の残り)#128
takecchi merged 1 commit into
mainfrom
codiva/grok-issue-claude-codex-grok

Conversation

@takecchi

Copy link
Copy Markdown
Owner

背景

Grok 対応の issue #107 は PR #124(v0.5.0)で実装済み・クローズ済みで、claude / codex / grok の 3 つはすでに /agent から選べる状態でした。残っていたのは docs/TASKS.mdPhase D の未チェック 3 項目(capability 縮退の仕上げ・エージェントの表示・引き継ぎプロンプト)だけだったので、そこを入れて「3 つを混在させても嘘をつかない」ところまで通します。

変更点

1. capability による UI 縮退(core/agent-capabilities.ts 新規)

判定を純粋モジュールへ集約(supportsCapability / capabilityLookup / agentSupports / showsAccountUsage)。原則は 2 つ:

  • capability が分からないときは縮退しない — 未登録の provider・agent を持たない古いセッションで機能を隠すと、動くはずの操作が黙って消える。
  • 「値が 0 だから自然に消える」に頼らない — 今は偶然そう見えているだけで、混在時に嘘をつく余地が残っている。
対象 capability 縮退の形
ヘッダの合計コスト cost 報告しない provider のセッションを合計に数えない(totalCostUsd(states, reportsCost)
使用状況ゲージ usage 使っていなければ出さないし取りにも行かない(表示と usage-pollerenabled が同じ純関数を通るので、出していないゲージのために 5 分ごとの claude probe が立たない)
フッタのモード表示 permissions 確認モード (非対応) に差し替え。Codex では原理的に聞かれないのに 確認モード と言い切っていたので「待っていれば聞かれる」と読めていた
トランスクリプト復元 transcript 持たない provider のセッションでは読みにも行かない(worktree が同じで id が偶然衝突すれば別 provider のログを混ぜる余地があった)

2. どのセッションが何で走っているかの表示

SessionState.agent / LogEntry.agent は状態に載っていたのにどこにも描いていなかったので、4 か所に出す:

  • ヘッダ: エージェント: Claude(新規セッションの既定。プラン・モデル・ブランチと同じ行 = 行を増やさない)
  • 一覧の行: 混在しているときだけエージェント列(usesMultipleAgents + showsAgentColumn)。全部同じならヘッダと重複するだけで title / branch から幅を奪うため。列が奪う幅はブランチ列の判定から差し引く(行が折り返すと rowLineAtPoint の「1 セッション = 1 行」が崩れてクリック位置が全部ズレる)
  • 詳細: 追加指示のプレースホルダ(Claude に追加の指示を入力…)。ステータスヘッダを持たないビューなので 1 行も増やさずに出せる場所
  • 会話ログ: logLines(…, dividerFor)LogEntry.agent の境界に ── ここから Codex ── を 1 本挿む(切替を使っていないセッションには 1 本も出ない)

3. 引き継ぎプロンプト(core/agent-handoff.ts 新規)

切替先は前の会話を持たないので、何も渡さないと「途中まで作業された作業ツリー」を白紙から見ることになり、済んだ作業をやり直したり直前の指示を無視したりする。ブランチ・最初の指示・直前の指示を並べ、続ける前に自分で git status / git diff を読むよう促す文を composeSystemPrompt の最後の節として渡す。

  • 使い捨てSession が次の open() で消費)— 常設にすると引き継ぎ後のターンや通信断からの再起動でも「前任者から引き継いだ」と言い続ける
  • キューへ指示として積まない — 積むと切替直後に「状況を読むだけのターン」が 1 本走り、provider のプロセスを無駄に立てる
  • AI 向けの文字列なので i18n カタログには置かない(英語固定。SHARED_IGNORED_FILES_NOTICE と同じ扱い)。各項目は 1 行に畳んで MAX_HANDOFF_FIELD_CHARS で切る

ドキュメント

docs/TASKS.md(Phase D を ✅ に)/ docs/ARCHITECTURE.md(縮退の表・引き継ぎの設計理由)/ .claude/rules/sdk-integration.md(capability 縮退の原則・systemPrompt の合成順)/ CLAUDE.md(コードの地図)/ README.md(利用者向け)。

テスト

  • 新規 spec: agent-capabilities.spec.ts / agent-display.spec.ts / agent-handoff.spec.ts(いずれもテーブルドリブン)
  • 追加した番人: cost.spec.ts(報告しない provider を数えない)/ layout.spec.tsshowsAgentColumn と列幅の一致)/ scroll.spec.ts(区切り行の挿入・切替なしでは 1 本も出ない)/ session.spec.ts(引き継ぎが最初の run だけに載る)/ status-footer.spec.tsx確認モード (非対応)
  • ローカルで lint / typecheck / test(118 files, 2971 tests)/ build の 4 点を通した

動作確認のお願い

TTY と各 CLI の認証が要るので、体感確認はお願いできると助かります(過去 Phase と同じ運用):

  • 一覧のヘッダに エージェント: <名前> が出る//agent で既定を変えると追従する
  • Claude と Codex(or Grok)のセッションを 1 件ずつ作ると一覧にエージェント列が現れ、片方だけにすると消える
  • Codex セッションの詳細でフッタが 確認モード (非対応) になる(shift+tab の切替自体は効く)
  • Codex / Grok だけで使っているときヘッダに使用状況ゲージが出ない
  • /agent で切り替えたあと最初の指示で、切替先が git status などで状況を確かめてから続ける/ログに ── ここから <名前> ── が入る

Closes #107

Phase D の未着手 3 項目(docs/TASKS.md)を入れて、エージェント抽象の
「混在させても嘘をつかない」ところまで通す。

## capability による UI 縮退

判定を純粋な `core/agent-capabilities.ts` に集約(`supportsCapability` =
**不明なら縮退しない** / `capabilityLookup` / `agentSupports` /
`showsAccountUsage`)。「値が 0 だから自然に消える」偶然に頼るのをやめた:

- `cost`: `totalCostUsd(states, reportsCost)` が報告しない provider を合計から外す
  (混在時に「Claude ぶんの合計」を全体として出さない)
- `usage`: 一覧のゲージを `showsAccountUsage` で出し分け、**同じ純関数**を
  `usage-poller` の `enabled` にも渡す = 出さないゲージのために 5 分ごとの
  `claude` probe を立てない
- `permissions`: フッタの確認モード表示を `確認モード (非対応)` に差し替える
  (Codex では原理的に聞かれないのに「確認モード」と言い切っていた)
- `transcript`: 持たない provider のセッションでは復元時に読みにも行かない

## どのセッションが何で走っているかの表示

- ヘッダに新規セッションの既定エージェント(プラン・モデルと同じ行)
- 一覧の行は**混在時だけ**エージェント列を出す(`usesMultipleAgents` +
  `showsAgentColumn`。列が奪う幅はブランチ列の判定から差し引く)
- 詳細は追加指示のプレースホルダに相手の名前(1 行も増やさない)
- ログは `logLines(…, dividerFor)` が `LogEntry.agent` の境界に区切りを 1 本挿む

## 引き継ぎプロンプト

`core/agent-handoff.ts`(英語固定 = AI 向け文字列)。ブランチ・最初の指示・
直前の指示を並べ、続ける前に自分で `git status` / `git diff` を読むよう促す。
`composeSystemPrompt` の最後の節として **切替直後の 1 回だけ**渡す(キューへ
指示として積まないので、切替直後に余分なターンは走らない)。

refs #107
@takecchi
takecchi merged commit 731d56d into main Aug 20, 2026
1 check passed
@takecchi
takecchi deleted the codiva/grok-issue-claude-codex-grok branch August 20, 2026 16:09
takecchi added a commit that referenced this pull request Aug 21, 2026
## 概要

README などの説明が「Claude Code 専用アプリ」に読める状態だったので、**Claude Code 以外(Codex /
Grok)でも使える**ことを明示しました。実装は既に 3 エージェント対応済み(#128 / #130)で、本 PR
はドキュメント・パッケージメタのみの変更です。

## 変更内容

### README.md

- **タグライン / 紹介文** — 「Claude Code セッションを並列実行」→「コーディングエージェント(Claude Code /
Codex / Grok)のセッションを並列実行」。
- **冒頭に対応エージェントの表を追加** — 「Claude Code 専用ではありません」と明言し、それぞれが起動する
CLI(`claude` / `codex` / `grok`)を並べた。
- **特徴の 2 番目に「エージェントを選べる」を繰り上げ**(従来は下の方に埋もれていた)。Claude 固有の項目(プラン /
使用状況・学習データ利用の警告)には「Claude のとき」と注記。
- **機能差の比較表を追加** — 許可ダイアログ・コスト表示・使用状況ゲージ・ログ復元の 4 点だけが違い、worktree 分離 /
並列実行 / 中断 / マージ / PR 自動化 / 通知 / `/model` はどのエージェントでも同じ、と先に書いた(表の値は
`CLAUDE_CAPABILITIES` / `CODEX_CAPABILITIES` / `GROK_CAPABILITIES` と一致)。
- **見出しを改題** — 「Codex / Grok で動かす」→「エージェントを選ぶ・切り替える」(Claude
も含めた選択の話なので)。参照している 2 箇所のリンク / 文言も追従。
- ログイン手順に `claude auth login` を追記、Claude 前提の言い回し(`gh`
レート制限・トランスクリプトの説明)を中立化。

### その他

- `package.json` — `description` を "parallel coding-agent sessions
(Claude Code / Codex / Grok)" に変更(npm ページの 1 行説明)。`keywords` に `codex` /
`grok` / `coding-agent` を追加。
- `CLAUDE.md` / `docs/PRD.md` — 概要 1 行を同じ方針に更新。

## テスト計画

- [x] 変更はドキュメントと `package.json` のメタ情報のみ(コード・テストへの影響なし)
- [ ] CI(lint / typecheck / test / build)がグリーン
- [ ] README を GitHub でプレビューし、追加した 2
つの表と見出しアンカー(`#エージェントを選ぶ切り替えるagent`)が正しく解決されることを確認
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

エージェントとして Grok (xAI) への対応を追加

1 participant