Claude CodeからOpenAI Codex CLI(@openai/codex)とGoogle Gemini CLI(@google/gemini-cli)を呼び出し、複数AIの意見を収集・比較するためのskillsを作成します。
注意: OpenAI Codex CLIは2025年リリースの新しいツールであり、2023年に廃止された旧Codex APIとは別物です。
- コードレビュー: コードの品質、バグ、改善点の指摘
- 相談・質問: 技術的な質問や設計相談
- コード生成: 新しいコードの生成・提案
- デバッグ: エラーの原因特定と修正提案
| CLI | パッケージ | バージョン | コマンド | 出力形式 |
|---|---|---|---|---|
| Codex | @openai/codex | 0.93.0+ | codex exec --json "task" |
JSON Lines |
| Gemini | @google/gemini-cli | 0.26.0+ | gemini -p "prompt" --output-format json |
JSON |
- Codex: ChatGPTログイン(
codex login)またはOPENAI_API_KEY - Gemini: Googleログイン または
GEMINI_API_KEY
~/.claude/skills/
├── codex/
│ └── SKILL.md # /codex コマンド
├── gemini/
│ └── SKILL.md # /gemini コマンド
├── multi-ai/
│ └── SKILL.md # /multi-ai コマンド
└── external-ai-cli/
├── SKILL.md # 背景知識skill(自動ロード用)
├── references/
│ ├── codex-cli-guide.md
│ └── gemini-cli-guide.md
└── scripts/
└── check-cli-status.sh
- ユーザー呼び出し可能なskill
- Codex CLI単体呼び出し
- 事前チェック(インストール、認証)
- JSON Lines出力のパース
- ユーザー呼び出し可能なskill
- Gemini CLI単体呼び出し
- 事前チェック(インストール、認証)
- JSON出力のパース
- 3つのAI(Claude + Codex + Gemini)から意見収集
- 利用可能なCLIのみ呼び出し
- 結果の統合・比較・推奨の提示
user-invocable: falseで自動ロード専用(正常動作確認済み)- Claudeが文脈に応じて参照する詳細ガイド
- リファレンスとスクリプトを格納
- references/の内容は実装時にCLIドキュメント参照して作成
---
name: skill-name
description: トリガー条件の説明(最重要)
allowed-tools:
- Bash(codex *)
- Bash(gemini *)
- Read
---
⚠️ 注意:allowed-toolsには既知のバグ(Issue #14956)があります。 動作しない場合はsettings.jsonでの回避策を案内します(後述)。
allowed-toolsが機能しない場合の回避策として、~/.claude/settings.jsonに以下を追加:
{
"permissions": {
"allow": [
"Bash(codex *)",
"Bash(gemini *)",
"Bash(LANG=* codex *)",
"Bash(LANG=* gemini *)"
]
}
}以下のエラー分類を実装:
not_installed - CLIが見つからない
auth_failed - 認証エラー
rate_limited - APIレート制限(429)→ リトライロジック
invalid_output - JSON/JSONLinesパース失敗
timeout - 応答タイムアウト
unknown - その他のエラー
- シェル履歴対策: ファイルリダイレクトで標準入力経由(
< <(echo "$PROMPT")) - 機密データ: V1は警告表示のみ、将来マスキング実装
- 外部送信の明示: Skill実行時に「外部AIに送信する」旨を表示
- 並列実行: CodexとGeminiを同時に呼び出し待ち時間短縮
- 出力の正規化: 各AIのJSON形式を共通フォーマットに変換
- コンフリクト解消ルール:
- セキュリティ指摘 → 保守的に全て採用
- パフォーマンス指摘 → 多数決または根拠の強い方
- スタイル指摘 → 参考として列挙
各Skillのdescriptionに「このSkillは@openai/codex CLIを呼び出します」等を明記
ハイブリッドアプローチを採用:
| ユースケース | 戦略 | 理由 |
|---|---|---|
| 単一ファイルレビュー | 丸ごと送信 | 全体像把握、依存関係を見落とさない |
| 複数ファイル/リポジトリ分析 | 要約+関連箇所 | トークン効率、誤読防止 |
Claude Code Skillsの機能を活用:
$ARGUMENTS- ユーザー入力をそのまま受け取る@ファイルパス- ファイル内容の自動展開!コマンド- シェルコマンドの実行結果を埋め込み
例: /codex @src/app.ts をレビューして → @src/app.tsが自動展開されてSkillに渡される
| 原則 | 適用 |
|---|---|
| 簡潔さ | SKILL.mdは500行以下、必要時のみリファレンス参照 |
| 適切な自由度 | CLIコマンドは固定、プロンプト内容は柔軟 |
| プログレッシブディスクロージャー | 詳細はreferences/に分離 |
| エラーハンドリング | 6種類のエラー分類 + リトライロジック |
| セキュリティ | 履歴対策 + 機密データマスキング |
bash ~/.claude/skills/external-ai-cli/scripts/check-cli-status.shでCLI状態確認/codex このコードをレビューしてでCodex呼び出しテスト/gemini このコードをレビューしてでGemini呼び出しテスト/multi-ai この関数を分析してで複数AI統合テスト
- Claude (Anthropic claude-opus-4-5 - 本セッション)
- Codex (OpenAI gpt-5.2-codex via @openai/codex 0.93.0)
- Gemini (Google Gemini via @google/gemini-cli 0.26.0)
- Codex CLI非推奨問題: Geminiが旧Codex API(2023年廃止)と混同 → Codexが事実確認 → Gemini訂正
- Skill名
/codexの維持: 3者合意で維持決定 - エラーハンドリング: 3者一致で6種類の分類を推奨
- セキュリティ: シェル履歴対策と機密データマスキングで3者合意
- コンテキストサイズ:
- Codex(保守的)vs Gemini(楽観的)の対立
- Claude提案のハイブリッドアプローチで3者合意
- Skill引数処理: Claude提案の@ファイルパス活用を3者で確認
Round 1: 初期レビュー(Codex/Gemini並行)
Round 2: 相互レビュー(お互いの指摘にコメント)
Round 3: 事実確認(Codex CLI非推奨問題の解決)
Round 4: Claude参加、追加質問(プロンプト前処理、コンテキストサイズ)
Round 5: ハイブリッドアプローチ提案 → 3者合意
| 項目 | 値 | 備考 |
|---|---|---|
| タイムアウト(単体) | 120秒 | /codex, /gemini |
| タイムアウト(multi-ai) | 180秒 | 並列実行のため余裕を持たせる |
| リトライ | 最大3回、指数バックオフ(1秒→2秒→4秒) | ネットワーク/API一時エラー対策 |
| ファイルサイズ警告 | 50MB超 | 制限はなし、警告のみ |
## Codex (OpenAI)
[Codexの回答]
## Gemini (Google)
[Geminiの回答]
## Claude (Anthropic)
[Claudeの統合・要約]- 部分的失敗: エラーのAIのみスキップして続行
- 詳細度: 短い要約 + 原因候補1行(詳細はオプション)
- 未設定時: インストール/認証手順を表示
## 各AIの回答
### Codex (OpenAI)
...
### Gemini (Google)
...
## 統合分析 (by Claude)
### 合意点
- ...
### 相違点
- ...
### 不足情報・不明点
- ...
### 推奨アクション
- ...- コスト警告: なし(ユーザー責任)
- キャンセル: Ctrl+Cで即時中断
- ストリーミング: なし(バッファリング後に一括表示)
- ユーザーのプロンプト言語に従う(日本語で質問→日本語で回答)
- CLI実行時は
LANG=Cで英語強制(パース安定性のため)
- V1では詳細ログなし(シンプルに)
- エラー時のみ詳細を表示
- V1はハードコード
- 環境変数で上書き可能:
CLAUDE_SKILL_TIMEOUT- タイムアウト秒数CLAUDE_SKILL_RETRY- リトライ回数
- 最低バージョンを
references/に明記 - 実行時のバージョンチェックは実装しない
- エラー時に「バージョンを確認してください」と案内
# /codex
description: OpenAI Codex CLIを使ってコードレビュー、質問、相談を行う。"codex"、"OpenAI"、"GPT"、"o1"などのキーワードで呼び出す。
# /gemini
description: Google Gemini CLIを使ってコードレビュー、質問、相談を行う。"gemini"、"Google"などのキーワードで呼び出す。
# /multi-ai
description: 複数のAI(Claude、Codex、Gemini)から意見を集めて比較する。"複数AI"、"比較"、"意見を聞く"、"セカンドオピニオン"などで呼び出す。- V1は手動テストのみ
check-cli-status.shで基本動作確認- 自動テストは将来検討
| ケース | 対応 |
|---|---|
| インタラクティブモード | Codex: --skip-git-repo-check、Gemini: 非対話オプション |
| 出力途切れ | タイムアウト(120秒)でエラー扱い + 再実行ガイド表示 |
| 文字化け | UTF-8固定、デコードエラーは無視 |
| 未インストール | インストール手順を表示 + 非ゼロ終了(リトライ抑止) |
| 非ゼロ終了 | エラー扱い、リトライ対象(未インストール以外) |
Codex:
# 履歴対策: パイプで標準入力経由(PROMPTを省略するとstdinから読み取り)
echo "$PROMPT" | LANG=C.UTF-8 codex exec --skip-git-repo-check --jsonリトライロジック:
retry_with_backoff() {
local cmd="$1" max_attempts=3
for ((i=1; i<=max_attempts; i++)); do
if result=$($cmd 2>&1); then echo "$result"; return 0; fi
[ $i -lt $max_attempts ] && sleep $((2 ** (i-1)))
done
echo "$result"; return 1
}Gemini:
# 履歴対策: パイプで標準入力経由(-p ""でstdinを使用)
echo "$PROMPT" | LANG=C.UTF-8 gemini -p "" 2>"$TEMP_DIR/gemini.err"
rc=$?
if [ $rc -ne 0 ]; then
echo "Error:" && cat "$TEMP_DIR/gemini.err"
fi※ stderrを一時ファイルにキャプチャ、エラー時のみ表示
Codex (JSON Lines):
type: "thread.started" → スレッド開始(無視)
type: "turn.started" → ターン開始(無視)
type: "item.completed" + item.type: "agent_message" → item.text を抽出
type: "item.completed" + item.type: "reasoning" → 推論過程(オプション表示)
type: "item.completed" + item.type: "command_execution" → コマンド実行結果
type: "turn.completed" → 終了、usage情報を含む
パース失敗行 → 無視して継続
Gemini:
- stderr: ログ出力 → 一時ファイルにキャプチャ、エラー時のみ表示
- stdout: レスポンス本文(プレーンテキスト)→ そのまま表示
- 終了コード0で成功、非0でstderrを表示
JSONパース:
- jqを使用(依存チェック追加)
jq -r 'select(.type=="item.completed" and .item.type=="agent_message") | .item.text'
- 終了コード0かつエラー出力なし → 成功
- 終了コード非0 → 失敗(リトライ対象)
- タイムアウト → 失敗(再実行ガイド表示)
- JSON Linesに type:"error" → 失敗
- ユーザー入力をそのまま渡す(加工なし)
- Claude Codeが@ファイルを展開済みの前提
- 例:
/codex @src/app.ts をレビューして→@src/app.ts の内容 + "をレビューして"がCodexに渡される
- 警告表示のみ(マスキングなし)
- 表示: 「
⚠️ 外部AI(Codex/Gemini)にデータを送信します」 - 将来対応予定: API_KEY, SECRET, PASSWORD, sk-xxx, ghp_xxx, AKIA... の検出
| 項目 | 決定内容 |
|---|---|
| 実行ディレクトリ | 呼び出し元のcwd(Claude Codeの作業ディレクトリ) |
| stdin | 使わない(引数で渡す) |
| 改行・末尾空行 | 保持 |
| 異常系 | type:errorが来ても最後まで読む、最終判定は終了コード + type:complete |
| 終了コード | 0=成功、124=タイムアウト、1-255=一般エラー |
| timeoutコマンド | 使わない(CLIの内部タイムアウトに任せる、依存を減らす) |
| 実装言語 | SKILL.md(マークダウン)+ シェルスクリプト(TypeScript不要) |
---
name: codex
description: OpenAI Codex CLIを使ったコードレビュー・質問・相談のためのSkill。ユーザーが「codex」「OpenAI」「GPT」「o1」などのキーワードを含めた依頼をした場合に使用する。外部AI(OpenAI Codex)にデータを送信する。
allowed-tools:
- Bash(codex *)
- Bash(LANG=* codex *)
- Read
---
# Codex CLI Integration
OpenAI Codex CLIを呼び出してコードレビューや技術相談を行う。
## 権限エラー時の対処
allowed-toolsが機能しない場合は、`~/.claude/settings.json`に以下を追加:
```json
{
"permissions": {
"allow": ["Bash(codex *)", "Bash(LANG=* codex *)"]
}
}- 警告を表示: 「
⚠️ 外部AI(OpenAI Codex)にデータを送信します」 - 次のコマンドを実行(履歴対策+リトライ付き):
※ 失敗時は指数バックオフでリトライ(最大3回)
echo "$ARGUMENTS" | LANG=C.UTF-8 codex exec --skip-git-repo-check --json
- JSON Lines出力を解析:
- type: "item.completed" + item.type: "agent_message" → item.textを抽出
- type: "turn.completed" → 終了確認
- 結果を「## Codex (OpenAI)」見出しで表示
- CLI未インストール:
npm i -g @openai/codexを案内 - 認証エラー:
codex loginを案内 - タイムアウト: 再試行を提案
### /gemini/SKILL.md
```markdown
---
name: gemini
description: Google Gemini CLIを使ったコードレビュー・質問・相談のためのSkill。ユーザーが「gemini」「Google」などのキーワードを含めた依頼をした場合に使用する。外部AI(Google Gemini)にデータを送信する。
allowed-tools:
- Bash(gemini *)
- Bash(LANG=* gemini *)
- Read
---
# Gemini CLI Integration
Google Gemini CLIを呼び出してコードレビューや技術相談を行う。
## 権限エラー時の対処
allowed-toolsが機能しない場合は、`~/.claude/settings.json`に以下を追加:
```json
{
"permissions": {
"allow": ["Bash(gemini *)", "Bash(LANG=* gemini *)"]
}
}
- 警告を表示: 「
⚠️ 外部AI(Google Gemini)にデータを送信します」 - 次のコマンドを実行(履歴対策+リトライ付き):
※ 失敗時は指数バックオフでリトライ(最大3回)
echo "$ARGUMENTS" | LANG=C.UTF-8 gemini -p "" 2>"$TEMP/err"
- 標準出力をそのまま取得
- 終了コード非0の場合、stderrを表示
- 結果を「## Gemini (Google)」見出しで表示
- CLI未インストール:
npm i -g @google/gemini-cliを案内 - 認証エラー:
gemini auth loginを案内 - タイムアウト: 再試行を提案
### /multi-ai/SKILL.md
```markdown
---
name: multi-ai
description: 複数のAI(Claude、Codex、Gemini)から意見を集めて比較するSkill。「複数AI」「比較」「意見を聞く」「セカンドオピニオン」などのキーワードで呼び出す。外部AI(Codex、Gemini)にデータを送信する。
allowed-tools:
- Bash(codex *)
- Bash(gemini *)
- Bash(LANG=* codex *)
- Bash(LANG=* gemini *)
- Read
---
# Multi-AI Integration
複数のAIから意見を収集し、比較・統合する。
## 権限エラー時の対処
allowed-toolsが機能しない場合は、`~/.claude/settings.json`に以下を追加:
```json
{
"permissions": {
"allow": [
"Bash(codex *)", "Bash(gemini *)",
"Bash(LANG=* codex *)", "Bash(LANG=* gemini *)"
]
}
}
- 警告を表示: 「
⚠️ 外部AI(Codex、Gemini)にデータを送信します」 - 並列でCodexとGeminiを呼び出す
- 各AIの回答を収集
- 以下の形式で統合結果を表示:
## 各AIの回答
### Codex (OpenAI)
[Codexの回答]
### Gemini (Google)
[Geminiの回答]
## 統合分析 (by Claude)
### 合意点
- ...
### 相違点
- ...
### 不足情報・不明点
- ...
### 推奨アクション
- ...
- 一部のCLIが失敗: 利用可能なCLIのみで続行
- 全てのCLIが失敗: エラーを報告し、Claudeのみで回答
## 追加実装詳細(3者合意 - Round 13-14)
### external-ai-cli/SKILL.md(背景知識skill)
```markdown
---
name: external-ai-cli
description: 外部AI CLI(Codex、Gemini)の詳細情報と使用ガイド。ユーザーが直接呼び出すものではなく、他のskillが参照する背景知識として使用する。
user-invocable: false
---
# External AI CLI Context
外部AI CLIツールの詳細情報と使用パターンを提供する内部skill。
## 詳細リファレンス
- Codex CLIの詳細: [references/codex-cli-guide.md](references/codex-cli-guide.md)
- Gemini CLIの詳細: [references/gemini-cli-guide.md](references/gemini-cli-guide.md)
## ステータスチェック
CLI状態確認: `scripts/check-cli-status.sh`
#!/usr/bin/env bash
set -euo pipefail
# Usage: check-cli-status.sh [codex|gemini|all|deps]
CLI="${1:-all}"
check_deps() {
local missing=()
command -v jq >/dev/null 2>&1 || missing+=("jq")
if [ ${#missing[@]} -gt 0 ]; then
echo "{\"status\":\"missing_deps\",\"missing\":[\"${missing[*]}\"]}"
echo "Install with: brew install jq" >&2
return 1
fi
echo '{"status":"ok","deps":["jq"]}'
}
check_codex() {
if ! command -v codex >/dev/null 2>&1; then
echo '{"name":"Codex","status":"not_installed","version":null}'
return 1
fi
local version=$(codex --version 2>/dev/null | head -n1)
# 認証確認: 簡単なコマンドを実行してエラーを確認
if ! codex exec --skip-git-repo-check --json "echo test" 2>&1 | grep -q '"type":"turn.completed"'; then
echo "{\"name\":\"Codex\",\"status\":\"auth_required\",\"version\":\"$version\"}"
return 2
fi
echo "{\"name\":\"Codex\",\"status\":\"ok\",\"version\":\"$version\"}"
}
check_gemini() {
if ! command -v gemini >/dev/null 2>&1; then
echo '{"name":"Gemini","status":"not_installed","version":null}'
return 1
fi
local version=$(gemini --version 2>/dev/null | head -n1)
# 認証確認: 簡単なコマンドを実行してエラーを確認
if ! gemini -p "test" 2>/dev/null | grep -q .; then
echo "{\"name\":\"Gemini\",\"status\":\"auth_required\",\"version\":\"$version\"}"
return 2
fi
echo "{\"name\":\"Gemini\",\"status\":\"ok\",\"version\":\"$version\"}"
}
case "$CLI" in
deps) check_deps ;;
codex) check_codex ;;
gemini) check_gemini ;;
all)
echo "{"
echo "\"deps\":"
check_deps || true
echo ","
echo "\"codex\":"
check_codex || true
echo ","
echo "\"gemini\":"
check_gemini || true
echo "}"
;;
esac# 一時ファイルで出力を分離
TEMP_DIR=$(mktemp -d)
trap 'rm -rf "$TEMP_DIR"' EXIT
# 並列実行(履歴対策: パイプで標準入力経由)
(echo "$PROMPT" | LANG=C.UTF-8 codex exec --skip-git-repo-check --json 2>&1) > "$TEMP_DIR/codex.out" &
pid_codex=$!
(echo "$PROMPT" | LANG=C.UTF-8 gemini -p "" 2>"$TEMP_DIR/gemini.err") > "$TEMP_DIR/gemini.out" &
pid_gemini=$!
# 待機
wait $pid_codex; rc_codex=$?
wait $pid_gemini; rc_gemini=$?
# 結果を読み込み
cat "$TEMP_DIR/codex.out"
cat "$TEMP_DIR/gemini.out"| Issue | 内容 | 対応 |
|---|---|---|
| #14956 | Bash権限が付与されない場合がある | まず試す → ダメならsettings.jsonで回避 |
| #8581 | 環境変数付きパターン不安定 | 両パターン登録(LANG=*付き/なし) |
方針: allowed-toolsをまず試し、動作しない場合はsettings.jsonで回避 LANG=C.UTF-8は維持(日本語環境でのパース安定性のため必須)