Skip to content

Instantly share code, notes, and snippets.

@silenvx
Last active February 1, 2026 18:05
Show Gist options
  • Select an option

  • Save silenvx/af46a1c5da5e0c989c33008dbec59a19 to your computer and use it in GitHub Desktop.

Select an option

Save silenvx/af46a1c5da5e0c989c33008dbec59a19 to your computer and use it in GitHub Desktop.

Claude Code Skills: Codex CLI / Gemini CLI 連携

概要

Claude CodeからOpenAI Codex CLI(@openai/codex)とGoogle Gemini CLI(@google/gemini-cli)を呼び出し、複数AIの意見を収集・比較するためのskillsを作成します。

注意: OpenAI Codex CLIは2025年リリースの新しいツールであり、2023年に廃止された旧Codex APIとは別物です。

主な用途

  • コードレビュー: コードの品質、バグ、改善点の指摘
  • 相談・質問: 技術的な質問や設計相談
  • コード生成: 新しいコードの生成・提案
  • デバッグ: エラーの原因特定と修正提案

CLI情報(バージョン固定)

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

実装タスク

1. /codex skill

  • ユーザー呼び出し可能なskill
  • Codex CLI単体呼び出し
  • 事前チェック(インストール、認証)
  • JSON Lines出力のパース

2. /gemini skill

  • ユーザー呼び出し可能なskill
  • Gemini CLI単体呼び出し
  • 事前チェック(インストール、認証)
  • JSON出力のパース

3. /multi-ai skill

  • 3つのAI(Claude + Codex + Gemini)から意見収集
  • 利用可能なCLIのみ呼び出し
  • 結果の統合・比較・推奨の提示

4. external-ai-cli skill(背景知識)

  • user-invocable: false で自動ロード専用(正常動作確認済み)
  • Claudeが文脈に応じて参照する詳細ガイド
  • リファレンスとスクリプトを格納
  • references/の内容は実装時にCLIドキュメント参照して作成

Skill Frontmatter仕様

---
name: skill-name
description: トリガー条件の説明(最重要)
allowed-tools:
  - Bash(codex *)
  - Bash(gemini *)
  - Read
---

⚠️ 注意: allowed-toolsには既知のバグ(Issue #14956)があります。 動作しない場合はsettings.jsonでの回避策を案内します(後述)。

権限設定(settings.json)- バックアップ

allowed-toolsが機能しない場合の回避策として、~/.claude/settings.jsonに以下を追加:

{
  "permissions": {
    "allow": [
      "Bash(codex *)",
      "Bash(gemini *)",
      "Bash(LANG=* codex *)",
      "Bash(LANG=* gemini *)"
    ]
  }
}

AI間レビューによる改善点

1. エラーハンドリング強化(Codex/Gemini合意)

以下のエラー分類を実装:

not_installed  - CLIが見つからない
auth_failed    - 認証エラー
rate_limited   - APIレート制限(429)→ リトライロジック
invalid_output - JSON/JSONLinesパース失敗
timeout        - 応答タイムアウト
unknown        - その他のエラー

2. セキュリティ対策(Codex/Gemini合意 - Round 17更新)

  • シェル履歴対策: ファイルリダイレクトで標準入力経由(< <(echo "$PROMPT")
  • 機密データ: V1は警告表示のみ、将来マスキング実装
  • 外部送信の明示: Skill実行時に「外部AIに送信する」旨を表示

3. Multi-AI統合仕様(Codex/Gemini合意)

  • 並列実行: CodexとGeminiを同時に呼び出し待ち時間短縮
  • 出力の正規化: 各AIのJSON形式を共通フォーマットに変換
  • コンフリクト解消ルール:
    • セキュリティ指摘 → 保守的に全て採用
    • パフォーマンス指摘 → 多数決または根拠の強い方
    • スタイル指摘 → 参考として列挙

4. Skill説明文の明記(Gemini提案)

各Skillのdescriptionに「このSkillは@openai/codex CLIを呼び出します」等を明記

5. コンテキストサイズ戦略(3者合意)

ハイブリッドアプローチを採用:

ユースケース 戦略 理由
単一ファイルレビュー 丸ごと送信 全体像把握、依存関係を見落とさない
複数ファイル/リポジトリ分析 要約+関連箇所 トークン効率、誤読防止

6. Skill引数処理(Claude提案)

Claude Code Skillsの機能を活用:

  • $ARGUMENTS - ユーザー入力をそのまま受け取る
  • @ファイルパス - ファイル内容の自動展開
  • !コマンド - シェルコマンドの実行結果を埋め込み

例: /codex @src/app.ts をレビューして → @src/app.tsが自動展開されてSkillに渡される

ベストプラクティス準拠

原則 適用
簡潔さ SKILL.mdは500行以下、必要時のみリファレンス参照
適切な自由度 CLIコマンドは固定、プロンプト内容は柔軟
プログレッシブディスクロージャー 詳細はreferences/に分離
エラーハンドリング 6種類のエラー分類 + リトライロジック
セキュリティ 履歴対策 + 機密データマスキング

検証方法

  1. bash ~/.claude/skills/external-ai-cli/scripts/check-cli-status.sh でCLI状態確認
  2. /codex このコードをレビューして でCodex呼び出しテスト
  3. /gemini このコードをレビューして でGemini呼び出しテスト
  4. /multi-ai この関数を分析して で複数AI統合テスト

AI間レビュー議論サマリー

参加AI(3者)

  • 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)

主な議論

  1. Codex CLI非推奨問題: Geminiが旧Codex API(2023年廃止)と混同 → Codexが事実確認 → Gemini訂正
  2. Skill名 /codex の維持: 3者合意で維持決定
  3. エラーハンドリング: 3者一致で6種類の分類を推奨
  4. セキュリティ: シェル履歴対策と機密データマスキングで3者合意
  5. コンテキストサイズ:
    • Codex(保守的)vs Gemini(楽観的)の対立
    • Claude提案のハイブリッドアプローチで3者合意
  6. Skill引数処理: Claude提案の@ファイルパス活用を3者で確認

議論の流れ

Round 1: 初期レビュー(Codex/Gemini並行)
Round 2: 相互レビュー(お互いの指摘にコメント)
Round 3: 事実確認(Codex CLI非推奨問題の解決)
Round 4: Claude参加、追加質問(プロンプト前処理、コンテキストサイズ)
Round 5: ハイブリッドアプローチ提案 → 3者合意

実装仕様(3者合意)

1. 具体的な数値

項目 備考
タイムアウト(単体) 120秒 /codex, /gemini
タイムアウト(multi-ai) 180秒 並列実行のため余裕を持たせる
リトライ 最大3回、指数バックオフ(1秒→2秒→4秒) ネットワーク/API一時エラー対策
ファイルサイズ警告 50MB超 制限はなし、警告のみ

2. 出力フォーマット

## Codex (OpenAI)
[Codexの回答]

## Gemini (Google)
[Geminiの回答]

## Claude (Anthropic)
[Claudeの統合・要約]

3. エラー処理

  • 部分的失敗: エラーのAIのみスキップして続行
  • 詳細度: 短い要約 + 原因候補1行(詳細はオプション)
  • 未設定時: インストール/認証手順を表示

4. /multi-ai統合の表示形式

## 各AIの回答
### Codex (OpenAI)
...
### Gemini (Google)
...

## 統合分析 (by Claude)
### 合意点
- ...

### 相違点
- ...

### 不足情報・不明点
- ...

### 推奨アクション
- ...

5. その他

  • コスト警告: なし(ユーザー責任)
  • キャンセル: Ctrl+Cで即時中断
  • ストリーミング: なし(バッファリング後に一括表示)

追加仕様(3者合意 - Round 9)

1. 言語対応

  • ユーザーのプロンプト言語に従う(日本語で質問→日本語で回答)
  • CLI実行時は LANG=C で英語強制(パース安定性のため)

2. ログ/デバッグ

  • V1では詳細ログなし(シンプルに)
  • エラー時のみ詳細を表示

3. 設定

  • V1はハードコード
  • 環境変数で上書き可能:
    • CLAUDE_SKILL_TIMEOUT - タイムアウト秒数
    • CLAUDE_SKILL_RETRY - リトライ回数

4. CLIバージョン

  • 最低バージョンを references/ に明記
  • 実行時のバージョンチェックは実装しない
  • エラー時に「バージョンを確認してください」と案内

5. SKILL.md description(具体的な文言)

# /codex
description: OpenAI Codex CLIを使ってコードレビュー、質問、相談を行う。"codex"、"OpenAI"、"GPT"、"o1"などのキーワードで呼び出す。

# /gemini
description: Google Gemini CLIを使ってコードレビュー、質問、相談を行う。"gemini"、"Google"などのキーワードで呼び出す。

# /multi-ai
description: 複数のAI(Claude、Codex、Gemini)から意見を集めて比較する。"複数AI"、"比較"、"意見を聞く"、"セカンドオピニオン"などで呼び出す。

6. テスト方法

  • V1は手動テストのみ
  • check-cli-status.sh で基本動作確認
  • 自動テストは将来検討

7. エッジケース対応

ケース 対応
インタラクティブモード Codex: --skip-git-repo-check、Gemini: 非対話オプション
出力途切れ タイムアウト(120秒)でエラー扱い + 再実行ガイド表示
文字化け UTF-8固定、デコードエラーは無視
未インストール インストール手順を表示 + 非ゼロ終了(リトライ抑止)
非ゼロ終了 エラー扱い、リトライ対象(未インストール以外)

実装詳細(3者合意 - Round 10)

CLI呼び出しコマンド

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'

成功/失敗判定

  1. 終了コード0かつエラー出力なし → 成功
  2. 終了コード非0 → 失敗(リトライ対象)
  3. タイムアウト → 失敗(再実行ガイド表示)
  4. JSON Linesに type:"error" → 失敗

プロンプト処理

  • ユーザー入力をそのまま渡す(加工なし)
  • Claude Codeが@ファイルを展開済みの前提
  • 例: /codex @src/app.ts をレビューして@src/app.ts の内容 + "をレビューして"がCodexに渡される

セキュリティチェック(V1)

  • 警告表示のみ(マスキングなし)
  • 表示: 「⚠️ 外部AI(Codex/Gemini)にデータを送信します」
  • 将来対応予定: API_KEY, SECRET, PASSWORD, sk-xxx, ghp_xxx, AKIA... の検出

実行環境(3者合意 - Round 11)

項目 決定内容
実行ディレクトリ 呼び出し元のcwd(Claude Codeの作業ディレクトリ)
stdin 使わない(引数で渡す)
改行・末尾空行 保持
異常系 type:errorが来ても最後まで読む、最終判定は終了コード + type:complete
終了コード 0=成功、124=タイムアウト、1-255=一般エラー
timeoutコマンド 使わない(CLIの内部タイムアウトに任せる、依存を減らす)
実装言語 SKILL.md(マークダウン)+ シェルスクリプト(TypeScript不要)

SKILL.mdサンプル(3者合意 - Round 12)

/codex/SKILL.md

---
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 *)"]
  }
}

実行手順

  1. 警告を表示: 「⚠️ 外部AI(OpenAI Codex)にデータを送信します」
  2. 次のコマンドを実行(履歴対策+リトライ付き):
    echo "$ARGUMENTS" | LANG=C.UTF-8 codex exec --skip-git-repo-check --json
    ※ 失敗時は指数バックオフでリトライ(最大3回)
  3. JSON Lines出力を解析:
    • type: "item.completed" + item.type: "agent_message" → item.textを抽出
    • type: "turn.completed" → 終了確認
  4. 結果を「## 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 *)"]
  }
}

実行手順

  1. 警告を表示: 「⚠️ 外部AI(Google Gemini)にデータを送信します」
  2. 次のコマンドを実行(履歴対策+リトライ付き):
    echo "$ARGUMENTS" | LANG=C.UTF-8 gemini -p "" 2>"$TEMP/err"
    ※ 失敗時は指数バックオフでリトライ(最大3回)
  3. 標準出力をそのまま取得
  4. 終了コード非0の場合、stderrを表示
  5. 結果を「## 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 *)"
    ]
  }
}

実行手順

  1. 警告を表示: 「⚠️ 外部AI(Codex、Gemini)にデータを送信します」
  2. 並列でCodexとGeminiを呼び出す
  3. 各AIの回答を収集
  4. 以下の形式で統合結果を表示:

出力形式

## 各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`

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

並列実行(multi-ai用)

# 一時ファイルで出力を分離
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"

allowed-toolsバグへの対応(Round 14-15決定)

Issue 内容 対応
#14956 Bash権限が付与されない場合がある まず試す → ダメならsettings.jsonで回避
#8581 環境変数付きパターン不安定 両パターン登録(LANG=*付き/なし)

方針: allowed-toolsをまず試し、動作しない場合はsettings.jsonで回避 LANG=C.UTF-8は維持(日本語環境でのパース安定性のため必須)

参考資料

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment