Oikonです。外資企業でITエンジニアをしています。
ふざけたタイトルですみません(元々はこんなはずじゃなかった)。
2025年6月25日にGoogleからGemini CLIがリリースされました。
Gemini CLIがせっかくOSSとして公開されているので、勉強がてらソースコードをウォークスルーしようと考えました。
当初の目的は以下の3つです。
- 今時のCLIツールの作りを理解する
- コンテキストをどうやってコントロールしているのか知る
- Googleの十八番であるWeb Searchがどう組み込まれているか調べる
しかしソースコードを調べている間に/corgi
という隠しコマンドを見つけてしまい、こんな記事のタイトルになってしまいました。
この記事では、ちゃんと当初の目的を中心に紹介します。
調査方法
Gemini CLIのウォークスルーにはClaude CodeとGemini CLIの力を借りました。
- コードベース全体把握
- 仕様のドキュメント化
- ドキュメントの相互査読
これらのタスクを、Claude CodeとGemini CLIを交互に使って調べています。
個人的に「ドキュメントの相互査読」が結構いい感触でした。Claude Codeが書いた仕様説明をGemini CLIが正しいかレビューをして、そのレビュー結果をClaude Codeが妥当か再度検証するような流れです。
Gemini CLIはコンテキストサイズが大きいおかげか、コードの全体把握が得意だと感じました。「コードを読ませてまとめさせる」というタスクは適任かもしれないです。他のプロジェクトをウォークスルーする時は、先にGemini CLIにドキュメントの初稿を書かせてみようかなと思っています。
Claude Codeはやはり実装の理解が強い印象です。これは実際にコードを書かせても感じることが多いです。実装ロジックの詳細解説などはClaude Codeの方が得意だと感じました。
調査レポートのgistも(役に立つかは分かりませんが)貼っておきます:
https://gist.github.com/s4yuba/4165b064290b33af70c9ae9d27a9ce4b
アーキテクチャ
gemini-cli/
├── packages/
│ ├── cli/ # ユーザーインターフェース層
│ │ ├── src/
│ │ │ ├── gemini.tsx # メインエントリーポイント
│ │ │ ├── ui/
│ │ │ │ ├── App.tsx # ルートUIコンポーネント
│ │ │ │ ├── components/ # React/Inkコンポーネント
│ │ │ │ ├── hooks/ # カスタムReactフック
│ │ │ │ └── themes/ # テーマ定義
│ │ │ ├── config/ # 設定管理
│ │ │ └── utils/ # ユーティリティ関数
│ │ └── package.json
│ │
│ └── core/ # ビジネスロジック層
│ ├── src/
│ │ ├── config/ # 設定管理
│ │ │ ├── config.ts # 中央設定クラス
│ │ ├── core/ # コアクライアント実装
│ │ │ ├── client.ts # GeminiClient
│ │ │ ├── geminiChat.ts
│ │ │ └── turn.ts
│ │ ├── tools/ # ツール実装
│ │ │ ├── tools.ts # 基底クラス
│ │ │ ├── edit.ts
│ │ │ ├── shell.ts
│ │ │ └── mcp-*.ts # MCP統合
│ │ ├── services/ # 各種サービス
│ │ ├── telemetry/ # 監視機能
│ │ └── utils/ # 共通ユーティリティ
│ └── package.json
フォルダツリーは見ての通り、分かりやすいモノリポ構造です。cli
コンポーネント、core
コンポーネントについて簡単に見ていきます。
cli
コンポーネント
cli
コンポーネントはGemini CLIのユーザーインターフェース層です。
Claude CodeやGemini CLIのリッチなCLIのインターフェースは、InkというReactのカスタムレンダラーのライブラリによるものです。
React Inkの詳細は、以下の記事で詳しく書かれているので気になる方は参照してください。
個人的に特筆して紹介するcli
コンポーネントは以下です。
cli
コンポーネント:
-
gemini.tsx
: CLIアプリケーションのメインエントリーポイント。設定の読み込み、サンドボックスの起動、メモリ管理など、アプリケーション全体の初期化と設定を担当。 -
ui/App.tsx
: inkライブラリを使用した、インタラクティブなCLIのメインコンポーネント。ユーザー入力の処理、コマンド履歴の管理、Geminiからのストリーミングレスポンスの表示など、UIに関連する主要な機能が実装されている。 -
utils/sandbox.ts
: セキュリティと分離を目的としたサンドボックス環境を管理する機能を提供。DockerやmacOSのSeatbelt(sandbox-exec)を利用して、コマンドを安全な環境で実行するためのロジックが含まれている。 -
ui/hooks/slashCommandProcessors
: Slashコマンドを統括しているコンポーネント。ここを見ればどのようなSlashコマンドが存在しているか分かる。
core
コンポーネント
core
コンポーネントはいわゆるビジネスロジックを担当しています。
Gemini Client、Google検索、MCPサーバーのハンドリングなどの機能が挙げられます。ツール自体はtools/
に綺麗にまとまっていました。
個人的に特筆して紹介するcore
コンポーネントは以下です。
core
コンポーネント:
-
services/gemini.ts
: GoogleのGemini APIとの通信担当。ユーザーの入力やツールの実行結果をAPIに送信し、モデルからの応答(テキストやツール呼び出しのリクエスト)を受け取る。認証(OAuthやAPIキー)の複雑な処理を抽象化。 -
config/config.ts
: アプリケーション全体の設定管理役。APIキー、使用するモデル、サンドボックスの有無、有効にするツールなど、CLIの動作を決定するあらゆる設定をConfigクラスとして一元管理。 -
tools/*
: バックエンドのツール群。Read, WebSearch, MCP-toolなどの個別機能の実装はここに含まれている。
機能
ここでは元々調査するつもりだった2つの機能に加えて、偶然見つけた/corgi
モードについて紹介します。
- Google Web Search
- コンテキスト
/corgi
モード
1. Google Web Search
Google Web Search(WebSearchツール)は、Gemini APIのグラウンディング機能(googleSearch
)を活用して、ウェブ検索結果に基づいた信頼性の高い応答を生成するツールです。
このツールは、Google検索の生の結果を直接処理するのではなく、Gemini APIの内部機能を通じて検索・要約・引用付けを行います。
要は「検索をしてきてそのまま結果を使うよ」という感じです。Gemini CLIを使っていて、必要な情報の検索という観点ではまだまだ足りないと感じることがあるのはこういう理由です。
これについては実際に𝕏でも言及されていました。
検索処理のフロー
1. ユーザークエリ受信
↓
2. Gemini APIにgoogleSearchツールを指定してリクエスト
const response = await geminiClient.generateContent(
[{ role: 'user', parts: [{ text: params.query }] }],
{ tools: [{ googleSearch: {} }] },
signal,
);
↓
3. Gemini APIが内部で:
- Google検索を実行
- 検索結果を分析・要約
- グラウンディング情報(引用元)を生成
↓
4. WebSearchツールがレスポンスを処理:
- groundingSupportsから引用位置情報を抽出
- テキスト内の正確な位置に引用番号[1], [2]を挿入
- groundingChunksからソースリストを生成
↓
5. フォーマットされた結果をユーザーに返却
2. コンテキスト
Gemini CLIで処理されるコンテキストは、以下の表のようなものに大別されます。
要素 | 内容 | 処理プログラム(ツール) | トークンへの影響 |
---|---|---|---|
基本情報 | ユーザーのOS、現在日時、カレントディレクトリなどの環境情報。 | (CLI内部で初期化) | 小 |
ファイルシステム情報 | lsやglobで取得したファイル・ディレクトリのリスト。 | list_directory, glob | 中 |
ファイルの内容 | read_fileやsearch_file_contentで能動的に読み込んだファイルの中身。 | read_file, read_many_files, search_file_content | 大 |
コマンド実行結果 | run_shell_commandで実行したコマンドの標準出力・エラー出力。 | run_shell_command | 中〜大 |
Web検索結果 | google_web_searchがWebを検索し、要約・生成した回答。 | google_web_search | 中 |
会話履歴 | ユーザーとGeminiの直近のやり取り。 | (チャットエンジン) | 中 |
システムプロンプト | GEMINI.mdに記述されているような、Gemini自身の役割や行動規範を定義した指示。 | (CLI内部で読み込み) | 中 |
表をみるとツールを使ったアクションにトークンを消費する傾向があることが分かります。一般的に具体的な処理の指示を与えるのは、無駄なトークン消費を抑えコンテキストをクリーンにするためです。Gemini CLIでもその必要性を確認できました。
Token Limit
デフォルトのトークン上限は100万トークン(1M)であり、Claude Codeと比べても大きいです。これがGeminiを使用する大きなメリットだと思います。
一応モデルによってトークン上限にも差があることが、ソースコードから分かりました。
tokenLimits.ts
export const DEFAULT_TOKEN_LIMIT = 1_048_576;
export function tokenLimit(model: Model): TokenCount {
switch (model) {
case 'gemini-1.5-pro':
return 2_097_152;
case 'gemini-1.5-flash':
case 'gemini-2.5-pro-preview-05-06':
case 'gemini-2.5-pro-preview-06-05':
case 'gemini-2.5-pro':
case 'gemini-2.5-flash-preview-05-20':
case 'gemini-2.5-flash':
case 'gemini-2.0-flash':
return 1_048_576;
case 'gemini-2.0-flash-preview-image-generation':
return 32_000;
default:
return DEFAULT_TOKEN_LIMIT;
}
}
3. /corgi
モード
Gemini CLIのコードをウォークスルーしているときに見つけました。
/corgi
のスラッシュコマンドを打つと、フッターの右下にコーギーが現れます。
Claude Codeがスラッシュコマンドの表を作ってくれた時に、一番最後に謎の/corgi
コマンドがあり「ん??なんだこれ??」と思いました。
Claude Codeが生成したスラッシュコマンド表:
コマンド | 説明 |
---|---|
/help または /?
|
ヘルプを表示 |
/docs |
完全なGemini CLIドキュメントをブラウザで開く |
/clear |
会話履歴をクリア(Ctrl+Lでも可) |
/theme |
テーマ選択ダイアログ |
/auth |
認証方法の変更 |
/stats |
使用統計を表示 |
/memory |
メモリ管理(add/show/refresh) |
/tools |
利用可能なツール一覧 |
/mcp |
MCPサーバー一覧と状態 |
/compress |
会話を手動圧縮 |
/bug |
バグレポートの提出 |
/about |
バージョン情報とシステム詳細を表示 |
/chat |
会話履歴管理(list/save/load/resume/delete) |
/restore [tool_call_id] |
チェックポイントから復元(要–checkpointing) |
/quit |
Gemini CLIを終了(exitやCtrl+Dでも可) |
/editor |
エディタ設定ダイアログを開く |
/corgi |
イースターエッグ(🐕) |
いわゆるイースターエッグ的な隠し要素です。
実際にスラッシュコマンド部分のコードを見てみると以下のようになっています。
slashCommandProcessor.ts
{
name: 'corgi',
action: (_mainCommand, _subCommand, _args) => {
toggleCorgiMode();
},
},
このcorgiMode
をさらに深掘りすると、以下のようにReact Ink Textで表現されています。
Footer.tsx
{corgiMode && (
Text>
Text color={Colors.Gray}>| /Text>
Text color={Colors.AccentRed}>▼/Text>
Text color={Colors.Foreground}>(´/Text>
Text color={Colors.AccentRed}>ᴥ/Text>
Text color={Colors.Foreground}>`)/Text>
Text color={Colors.AccentRed}>▼ /Text>
/Text>
)}
非常にシンプルな実装です。たとえば「何かに失敗したフリーレン」に差し替えることも可能です。
Footer.tsx
{corgiMode && (
Text>
Text color={Colors.Gray}>| /Text>
Text color={Colors.AccentBlue}>▼/Text>
Text color={Colors.Foreground}>(´/Text>
Text color={Colors.AccentBlue}>⌯/Text>
Text color={Colors.Foreground}> ̫ /Text>
Text color={Colors.AccentBlue}>⌯/Text>
Text color={Colors.Foreground}>`)/Text>
Text color={Colors.AccentBlue}>▼ /Text>
/Text>
)}
何かに失敗したフリーレン:
こういう遊び要素があるのは、個人的に結構好きで面白いですね。
まとめ
Gemini CLIをウォークスルーしてみました。イースターエッグ要素の/corgi
モードを発見できたのはラッキーでした。
最近はAIエージェントとOSSコードを見ることができるため、全体把握が以前よりやりやすくなったのはいいなと感じました。詳しい実装はGemini CLIのリポジトリで確認できるので、気になる方はぜひ確認してみてください。
個人的にGemini CLIは無料で使えるかなり良いCLIツールだと思います。ぜひ使い倒しましょう!
𝕏フォローしてくれると嬉しいです!
𝕏でも情報発信しているので、フォローしていただけると励みになります。!!
最近のAI関係のポストは、ハイライトを見ていただければと思います。
参考文献
Gemini CLI:
React Ink によるリッチ CLI (ClaudeCodeの裏側のアレ):
Gemini CLI の簡単チュートリアル:
Views: 0