関連 issue: #61 Geminiを実装メイドにしたい
Google AI Pro 枠で Gemini CLI / Gemini Code Assist 経由の Gemini を利用し、Butler の implement intent を処理する実装メイド候補にできるか検証する。
主な目的:
maid_registry と intent_maid_routes 側へ寄せる想定する構成:
Brain / Codex / Claude Code
-> Butler
-> Gemini CLI Maid
-> Gemini CLI / Gemini Code Assist
Google 公式ドキュメントでは、Gemini Code Assist の agent mode と Gemini CLI のリクエスト枠は合算扱い。
Google AI Pro の枠:
参照:
確認すること:
gemini CLI をインストールできるgemini --help などで起動確認できる結果:
npm install -g @google/gemini-cli でインストールできたgemini のパスは /home/akira/.nvm/versions/node/v20.20.2/bin/gemini0.45.2メモ:
v20.20.2、npm は 10.8.2。gemini --help / gemini --version を実行すると ~/.gemini/projects.json への書き込みで EROFS が出た。通常運用ではホーム配下へ書ける状態で起動する必要がある。確認すること:
結果:
gemini -p "..." の headless 実行は、認証方式未設定のため失敗したgemini の対話起動では Sign in with Google が選択肢として表示されたSign in with Google によるブラウザ認証gemini -p "Reply with exactly: gemini-ok" --output-format text を実行しても、同じく認証方式未設定で失敗したGOOGLE_GENAI_USE_GCA=true gemini -p "..." --output-format json ではブラウザ認証画面を開くところまで進んだメモ:
Please set an Auth method in your /home/akira/.gemini/settings.json or specify one of the following environment variables before running: GEMINI_API_KEY, GOOGLE_GENAI_USE_VERTEXAI, GOOGLE_GENAI_USE_GCA
Sign in with Google する流れ。Sign in with Google までは到達したが、Web認証はユーザーの通常端末で実施するのが確実。GOOGLE_GENAI_USE_GCA=true を指定すると、headless 実行でもブラウザ認証導線に入ることを確認した。--skip-trust、GEMINI_CLI_TRUST_WORKSPACE=true、または対話モードで trust 設定が必要。確認すること:
結果:
gemini -p "..." --output-format text という headless 実行形式は存在する--output-format は text / json / stream-json を選べるGOOGLE_GENAI_USE_GCA=true gemini --skip-trust -p "Reply with exactly: gemini-ok" --output-format text は成功した--output-format json も成功し、session_id、response、stats がJSONで返った--output-format stream-json も成功し、NDJSON形式でイベントが順次出力された--approval-mode plan で実行できたメモ:
gemini --help によると、-p / --prompt は非対話 headless mode。--approval-mode は default / auto_edit / yolo / plan を指定できる。gemini -p ... --output-format json または stream-json が安定して扱えるかを見る。response は文字列として返る。モデルの構造化出力を得たい場合でも、Butler側では response の中身をさらに parse する必要がある。stream-json は init、message、tool_use、tool_result、result などのイベントが1行1JSONで出る。最後の result.stats に token / tool_calls / model 情報がまとまる。stream-json 応答でも update_topic tool が1回実行された。確認すること:
git commit などを勝手に行わないよう制約できる--approval-mode plan で読み取り・計画だけを安全に実行できる--approval-mode auto_edit で小さな編集を任せられる--approval-mode yolo を使う必要があるか、使う場合の前提条件を明確にできる結果:
--approval-mode plan で対象メモの目的を要約させるrepo読み取りタスクは成功したread_file tool が1回使われたtotalLinesAdded: 0 / totalLinesRemoved: 0--approval-mode auto_edit で1行追加の編集タスクは成功したupdate_topic×3、read_file×1、replace×1 (totalCalls: 5)totalLinesAdded: 1 / totalLinesRemoved: 0メモ:
plan では読み取りタスクを安全に試せた。auto_edit では replace tool が自動承認 (auto_accept: 0 / accept: 1) された。--approval-mode auto_edit でも人間の確認は挟まれず、完全自動で編集が進んだ。plan -> auto_edit -> yolo の順で上げる。yolo は確認なしでコマンド実行・編集が進む可能性があるため、Butler 側の watchdog / timeout / git操作検知が整うまでは本運用候補にしない。確認すること:
ImplementMaid を流用できるかGeminiImplementMaid または CLI worker が必要かmaid_registry.yml に Gemini CLI Maid を表現できるかintent_maid_routes.yml で研究枠または既定 route として切り替えられるか--skip-trust、GEMINI_CLI_TRUST_WORKSPACE=true、対話モードでの trust 済み状態のどれで運用するか決められる結果:
--approval-mode auto_edit で実ファイル編集が成功した(実作業委譲は可能と判断)GEMINI_CLI_TRUST_WORKSPACE=true で --skip-trust なしの headless 実行が成功した--skip-trust と GEMINI_CLI_TRUST_WORKSPACE=true の両方で同等の動作を確認メモ:
ImplementMaid は Goose 前提の起動・監視が強い可能性がある。--approval-mode plan / auto_edit / yolo があるため、Butler側の安全設計と合わせて起動モードを決める必要がある。--skip-trust、本運用は GEMINI_CLI_TRUST_WORKSPACE=true を環境変数として渡す形で固定する。確認すること:
implement 1タスクあたり、おおよそ何リクエスト消費するか実測できる結果:
GOOGLE_GENAI_USE_GCA=true で headless 実行が成功したため、Gemini API key ではなく Google Code Assist / OAuth 系の経路で動いている可能性が高いstats.models にモデル別 totalRequests が含まれており、リクエスト消費量の実測が可能| タスク | flash-lite (ルーター) | flash-preview (メイン) | 合計 |
|---|---|---|---|
| 最小JSON応答 | 1 | 1 | 2 |
repo読み取り (plan) |
1 | 1 | 2 |
| タスク | flash-lite (ルーター) | flash-preview (メイン) | 合計 |
|---|---|---|---|
1行追加編集 (auto_edit) |
1 | 4 | 5 |
1行追加編集 (auto_edit, TRUST_WORKSPACE) |
1 | 4 | 5 |
メモ:
Sign in with Google する。stats.models.*.api.totalRequests の合計を記録して精度を上げる。比較観点:
結果:
メモ:
実施内容:
gemini_cli_test_target.md) を作成したGOOGLE_GENAI_USE_GCA=true gemini --skip-trust --approval-mode auto_edit でファイル1行追加タスクを実行したGOOGLE_GENAI_USE_GCA=true GEMINI_CLI_TRUST_WORKSPACE=true gemini --approval-mode auto_edit で同じタスクを --skip-trust なしで実行した結果:
auto_edit で指示通りの1行追加に成功。余分な変更は発生しなかったupdate_topic×3、read_file×1、replace×1 (totalCalls: 5)replace の decision は accept: 1 / auto_accept: 0(auto_edit でも自動承認扱いで人間確認なし)GEMINI_CLI_TRUST_WORKSPACE=true でも同等の動作を確認。stats もほぼ同じgemini-3.1-flash-lite 1 + gemini-3-flash-preview 4 = 合計5リクエスト気づき:
--approval-mode auto_edit の auto_accept: 0 は「ユーザーの手動 accept があった」という意味ではなく、approve_mode 設定に従い自動で accept された件数とは別カウントの可能性がある。実際は非対話で完全自動実行された。GEMINI_CLI_TRUST_WORKSPACE=true は --skip-trust の代替として本運用に使える。実施内容:
@google/gemini-cli を npm global install したgemini --version / gemini --help を確認したgemini -p "Reply with exactly: gemini-ok" --output-format text を試したgemini 対話起動で Sign in with Google の認証選択肢まで確認したgemini -p "Reply with exactly: gemini-ok" --output-format text が認証方式未設定で失敗することを確認したGOOGLE_GENAI_USE_GCA=true gemini -p "..." --output-format json でブラウザ認証導線に入ることを確認したGOOGLE_GENAI_USE_GCA=true gemini --skip-trust -p "Reply with exactly: gemini-ok" --output-format text を実行し、gemini-ok が返ることを確認したGOOGLE_GENAI_USE_GCA=true gemini --skip-trust -p "Reply with JSON only: {\"status\":\"gemini-ok\"}" --output-format json を実行し、JSON出力が返ることを確認したGOOGLE_GENAI_USE_GCA=true gemini --skip-trust -p "Reply with exactly: stream-ok" --output-format stream-json を実行し、stream-json出力を確認したGOOGLE_GENAI_USE_GCA=true gemini --skip-trust --approval-mode plan -p "..." --output-format json で小さなrepo読み取りタスクを実行したrg を使えない理由を調査した結果:
0.45.2gemini を起動し、Sign in with Google によるWeb認証を完了する必要があるGOOGLE_GENAI_USE_GCA=true の指定が必要そう--skip-trust と本運用候補の GEMINI_CLI_TRUST_WORKSPACE=true を分けて評価する--approval-mode plan から始め、auto_edit、必要なら yolo の順で段階的に広げるGOOGLE_GENAI_USE_GCA=true + --skip-trust で headless 実行は成立したstats にモデル別リクエスト数とtoken情報が含まれるstream-json はイベント処理できるが、Butlerで扱うなら最後の result イベントを拾う実装が必要--approval-mode plan のrepo読み取りタスクは成功し、ファイル変更は発生しなかったread_file 1回、gemini-3.1-pro-preview の totalRequests: 2rg はPATH上にはあるが、場所がVS Code拡張配下のため Gemini CLI の trusted system path 判定で弾かれている可能性が高い気づき:
~/.gemini/projects.json への書き込みが制限され、EROFS が出る。Gemini CLI検証はホーム配下へ書き込める通常実行が必要。gemini --help によると、非対話実行は -p / --prompt、出力形式は --output-format text|json|stream-json。Don't trust を選んでも認証方式選択までは進める。--skip-trust は「このセッションだけ現在の workspace を信頼する」ためのオプションとして gemini --help に出ている。最小疎通ではこの指定で進めるのがよさそう。Ripgrep is not available. Falling back to GrepTool. と表示された。Codex側では rg は使えているため、Gemini CLI の実行環境/PATHから rg が見えていない可能性がある。repo探索性能に影響するなら別途確認する。rg は /home/akira/.vscode/extensions/openai.chatgpt-26.602.40724-linux-x64/bin/linux-x86_64/rg。resolveRipgrepPath() は、同梱ripgrepか、/usr/bin、/bin、/usr/local/bin などの trusted system path にある rg だけを採用する。VS Code拡張配下の rg は trusted system path ではないため fallback している可能性が高い。主要な headless 検証は完了。ここで事前検証ループはいったん区切る。
Gemini CLI の導入・headless 実行・ファイル編集・trust 運用の切り替えまで確認できた。GOOGLE_GENAI_USE_GCA=true + GEMINI_CLI_TRUST_WORKSPACE=true が本運用想定の構成として成立する。
--approval-mode plan: 読み取りタスク成功、ファイル変更なし--approval-mode auto_edit: 編集タスク成功、指示外の変更なししたがって、Gemini CLI を実装メイド候補にできるか という実現可能性は OK寄り と判断する。
残っている論点は「事前に全部潰すべき検証項目」ではなく、実装設計・運用設計の論点として扱う。
次の関門は、Gemini CLI 専用 Maid の実装案をまとめること。
「最小実装案」ではなく「実装案」と呼ぶには、単にコマンドが動くことだけでなく、Butler の Maid としてどう起動し、どう監督し、どう失敗を扱うかまで決める必要がある。
ImplementMaid を流用するか、Gemini CLI 専用 Maid を分けるか決めるmaid_registry.yml に置く kind / provider / model / role / command を決めるintent_maid_routes.yml で研究枠として扱うか、既定 route 候補にするか決めるGOOGLE_GENAI_USE_GCA=true \
GEMINI_CLI_TRUST_WORKSPACE=true \
gemini --approval-mode auto_edit --output-format json -p "..."
json と stream-json のどちらを標準にするか決める
json: 実装が単純stream-json: 進捗監視やtool呼び出し監視に向くresponse は文字列として返るため、Butler 側で parse する方針を決めるstats.models.*.api.totalRequests と token 情報を evidence に残すstats.files.totalLinesAdded / totalLinesRemoved と git diff を結果判定に使う--approval-mode は段階的に扱う
planauto_edityolo: 当面は本運用候補にしないgit commit など Butler 管理外の操作をしないよう prompt と検知で縛るrg を trusted system path に用意する必要があるか判断する以下は、実装案を作る前に全部終わらせる必要はない。実装中または運用前の確認項目として扱う。
rg を trusted system path に用意した場合の探索性能差を見る--approval-mode yolo が必要か判断する
docs/capabilities/maid/仕様書_v3.mddocs/capabilities/implement/仕様書.mddocs/モデル追加手順.md