Reading gemini-cli #1
職場で使われがちなので、いちおうコード読んどくかという試み。
-
gemini-cli/GEMINI.md at main · google-gemini/gemini-cli コードを読む上でヒントがあるかなとおもったが、あまりなかった。書くヒントだからな・・・。
-
gemini-cli/docs at main · google-gemini/gemini-cli こっちに色々説明がありそうである。
-
gemini-cli/docs/architecture.md at main · google-gemini/gemini-cli
- クライアントサーバらしい。はあ。
-
gemini-cli/docs/checkpointing.md at main · google-gemini/gemini-cli
- Git を使って project file の状態を保存するらしいが、プロジェクト自体の git ではなくどこかでこっそりやるらしい。それは non-git monorepo 住人には朗報である。
- snapshot は tool call の手前でとられるらしい。
- しかしデフォルトでは off らしい。なんでよ・・・。
-
gemini-cli/docs/extension.md at main · google-gemini/gemini-cli
- “Extension” と呼んでいるが、基本的には MCP の模様。ただそのほかに GEMINI.md を提供したりもできる。チーム固有の GEMINI.md はこういうの経由で渡すのがいいのだろうか。
- ただ auto-update はなさそうなので、どうすんだろうね?
-
gemini-cli/docs/telemetry.md at main · google-gemini/gemini-cli
- stats とってます。はいどうぞ。
-
gemini-cli/docs/core/index.md at main · google-gemini/gemini-cli
- バックエンド側・・・に状態があるのだね。複数の状態(セッション)は持てるのかな?などという疑問には答えていない。ただ基本的に入り組んだ話はバックエンド(core)を読むのが良さそうである。
- メモリ =
GEMINI.md
か。/memory add で追加できるらしいので、プロジェクト固有の GEMINI.md は repo に置いておき自分で読ませてくれや、というのがよさそうだな。 - “File Discovery Service” とか monorepo では機能仕様がなさそうですが、なんとかできるのだろうか・・・という疑問を念頭に読みたい。
-
gemini-cli/docs/core/memport.md at main · google-gemini/gemini-cli
- GEMINI.md から他の .md をインポートできます。いいじゃん!
-
gemini-cli/docs/core/tools-api.md at main · google-gemini/gemini-cli
- built-in のツール一覧。
google-web-search
というツールがあるんかい。- gemini-cli/packages/core/src/tools/web-search.ts at main · google-gemini/gemini-cli
- Gemini API 経由で聞くらしい。いわゆる伝統的な “ウェブサーチ API” は百年前くらいに無くなったけど、こんな形で復権するとはねえ。
- ていうか ”Gemini 経由でウェブを検索する" という単機能のアプリがあったら普通に便利そうだな。ただコードをみるとプロンプトは何も装飾してないけど、ちゃんと検索してくれるのかな?まあいい。
- Edit.
- gemini-cli/packages/core/src/tools/edit.ts at main · google-gemini/gemini-cli
str_replace
相当ですね。- ちなみに undo はできなさそうである。
- ツールのエラーに 人間が読む “display” と LLM が読む “raw” の二種類の自然言語を返すのが趣深いですねえ・・・。
- third party tool は MCP の他に “こんな CLI のコマンドがあるよ” と settings.json に書くことでも実現できるらしい。settings だと他人と共有できないので extension としても CLI 渡せるようにして欲しいな。ラクじゃん?
- gemini-cli/docs/tools/mcp-server.md at main · google-gemini/gemini-cli
- MCP は “extension” にしなくても settings.json で直に設定できるらしい。
- gemini-cli/docs/tools/shell.md at main · google-gemini/gemini-cli
- 特定コマンドを禁止する設定など。
- gemini-cli/docs/tools/memory.md at main · google-geminiに/gemini-cli
- “memory” は
~/.gemini/GEMINI.md
にしまわれているらしい。たまに勝手に保存しにいくよねこのひと。
- “memory” は
- gemini-cli/docs/sandbox.md at main · google-gemini/gemini-cli
- Sandbox がある、というのはわかったが、sandbox のなかになにがあるのかとか全然わからないな・・・
- どのみち仕事では使えなそう。スルー。
- 追記:
--sandbox-image
というフラグがあった。
- gemini-cli/docs/npm.md at main · google-gemini/gemini-cli
gemini-cli-core
というバックエンド部分は独立したパッケージなので CLI なしでも使えるらしい。API とか全然文書化されてなさそうだが・・・。
- gemini-cli/docs/quota-and-pricing.md at main · google-gemini/gemini-cli
- Ultra に数百ドル払っても関係ないよ、でも “Supporting these plans is under active consideration for future support.” だそうです。Claude Code 見習って早いとこなんとかしてあげて!
- 仕事ではキーをもらってるので問題なし。
- gemini-cli/docs/cli/commands.md at main · google-gemini/gemini-cli
- コマンド解説
/extension
と/mcp
と/tools
が独立して存在するとか剥き出しにもほどがあるよなあ。MCP 配布メタデータを標準化しなかった Anthropic が悪い (言いがかり)- gemini-cli/docs/cli/configuration.md at main · google-gemini/gemini-cli
- 設定一覧
- 設定ファイルはプロジェクト単位で作れるのか。これは必要だな。ただ、やはり monorepo だと困るのでなんとかしてほしい・・・割と深刻・・・
- プロジェクトファイルを override する環境変数を突っ込むのが良さそうだが・・・。
- gemini-cli/docs/cli/tutorials.md at main · google-gemini/gemini-cli
- MCP server の設定例。
といったところでドキュメントは終了。
- Quarterly Roadmap · Gemini CLI Public Roadmap
- Roadmap が公開されている!といっても直近四半期分のみ。
- Feature: Deploy to Cloud Run with /deploy · Issue #4167 · google-gemini/gemini-cli さすがクラウド部門が作ってるだけあって GCP の扱いが手厚いですネエ
- Claude Code みたいに非同期クエリとか sub-agent とか頑張ってほしいが、そういう話は書いてないか・・・。
- まあがんばって働いてください。
- Roadmap が公開されている!といっても直近四半期分のみ。
寄り道したが今度こそコード読まないとな。CLI からみていくべし。
- gemini-cli/packages/cli/src/acp/acp.ts at fe00686c58421ae7d9a60bddf38deda35591709b · google-gemini/gemini-cli
> ACP defines a schema for a simple (experimental) JSON-RPC protocol that allows GUI applications to interact with agents.
--experimental-acp
というフラグがあり、これを使うとバックエンドと ACP というプロトコルで話し始める- Welcome - Agent Communication Protocol
- なぜこんな身元のしれないプロトコルをサポートしてるんだろうね?
- Zed integration by ConradIrwin · Pull Request #4266 · google-gemini/gemini-cli とおもったら zed editor からの contribution らしい。へー盛り上がってんじゃん。
- 脇道にそれたので本題に戻ると・・・
- gemini-cli/packages/cli/src/ui/App.tsx at main · google-gemini/gemini-cli
- これがアプリのメイン UI.
- この Ink ってやつはヤバイ代物だよなよく作ったよね・・・
- gemini-cli/packages/cli/src/ui/commands/chatCommand.ts at main · google-gemini/gemini-cli
- やはり chat の history は client にあるっぽいよなあ。サーバにはなんの状態があるんだい?
- gemini-cli/packages/cli/src/ui/commands/ideCommand.ts at main · google-gemini/gemini-cli
/ide
! なにかとおもったら vscode のプラグインをつくってるらしい。競合もやってるからな。
- コマンド類は
SlashCommand
サブクラスになっていて実装は必要な時にすぐ見つけられることがわかったのでこのへんまでにして、チャットの往復はどうなってんだろうね。 - gemini-cli/packages/cli/src/ui/hooks/useGeminiStream.ts at main · google-gemini/gemini-cli
- で、それはこのファイルに凝縮されているっぽいが、React Hooks がわからない私にはさっぱりな雰囲気。
- まあハイレベルには agentic loop を回してる、という感じ。
- そして結局重要な仕事は core / backend にまとまっているのであった。なので UI はこれにて終了。
Core.
- gemini-cli/packages/core/src/index.ts at main · google-gemini/gemini-cli
- ではどんな API があるのか見てみるか・・・とおもったらめっちゃ wildcard で import しまくり。おまえら github だからって好き勝手しやがって dependency 見えないじゃんか・・・。
疲れたので今日はこのへんまで。
個人的に面白かったところ:
- GEMINI.md が他の md をインポートできる。
- MCP を書かなくてもCLIのバイナリがあれば使い方を教えられる。つまりMCPは stateful にしたい時だけ作れば良い。
なぜか client-server である。(追記: クライアントサーバじゃなかった。UIを切りわけてあるだけ。)- ウェブ検索は Gemini API を呼ぶという tool である.
- これだけ agentic なツールでも、わりかし沢山コードを書かないといけない。