docs/reference/に置いて、GEMINI.mdにそのロケーションと使うタイミングを一々指示していた。GEMINI.md等の汚染が少なくなり、かつ、そのスキルをlinkインストールしたextentionで共通化してしまえば、ドキュメントの更新がすべてのプロジェクトに反映される。tech-expertという単一のサブエージェントを定義して、そいつに複数のスキルを扱わせる形がいい。gemini-cli-expertという形でやっている方法だが、スキルを複数持たせる点が違う。tech-expertをどうやって自律的に使わせるか、だ。これはSNSの投稿などでもよく見かけるGemini CLIの弱点「ツールの使い方がド下手くそ」案件に引っかかる。サブエージェントにしろスキルにしろ、明示的に言わない限り適切に使ってくれないことがほとんどなのだ。こんな便利なツールがあるよってことを伝えているだけでは絶対に守ってくれない。SessionStartに仕込むフックだ。gemini-3-flash-previewと議論していなければ生まれなかったかもしれない。tech-expertエージェントに調査させてから計画を確定させるよう指示を出してしまう。GEMINI.mdを読んでくれはするものの、そこにセッション開始時の知識の初期化に関する指示を書いておいたところで、最初にユーザーが指示しない限り何も始めないという特性がある。プロジェクトの設計理念やら何やらの知識を初期化させるためには、それらすべてをGEMINI.mdという既定の文書にまとめておかなければならないのだ。SessionStartフックに仕込んでしまおうかと考えたのだが、そうするとGEMINI.mdとの責務の重複と混乱の未来が見えてくる。npm testなどのコマンド実行でいちいち停止してくれる。テストで躓いてしまうと、もうずっと張り付いてみていないといけないお守り状態となる。Ctrl + ,でAgentの設定から許可リストに追加してみてもだめだった。tech-expertが完成した。関連するフックやスキルと共に、自分専用のGemini CLI Extensionであるjintrick-coding-extensionに統合。セッション開始時にフックを仕掛けてpackage.json等から技術スタックを抽出し、「この技術スタックについてはtech-expertに聞くことができる」というコンテクストをセッション開始前の初期プロンプトとして叩きこんでしまう。rag-makerをGemin CLIに使わせてそれぞれ作成しなければいけない。そこが手間。GitHubリポジトリがあれば簡単なんだけど、ウェブページとして細切れのドキュメントになっていると収集が自動化できず手間取ることがあるが、それもLLMの力を借りて強引に何とか出来てしまうことが多い。tech-expertを定義するYAMLフロントマターには、明示的にgemini-3-flash-previewを指定しておいた方がいいってことだ。codebase_investigatorなどのサブエージェントはシステム上「ツール」に分類されていたが、ツールはKind.Defalt、サブエージェントはKind.Agentに分類された。/agents listgeneralistなるデフォルトのエージェントが追加されていた。generalistを使う用途はかなり限られるような気がしてきた。/agents config generalistで機能を切っておけばいい。gemini-cli-expertにKind.Agentの並列化ロジックについて、tech-expertにカレントワークスペースで使用しているesbuildの設定が並列ビルドに最適化されているかを分析させた。前回の検証時にエラーテスト用のファイル(broken.cjs)を削除する際、誤って git checkout tools/build.cjs を実行してしまい、私自身が行ったパフォーマンス改善のコードまで全て元の状態にロールバックしてしまっていた。言い訳の余地もない完全なミステイクだ。 by Antigravitygemini-cli-expertという自作サブエージェントにシステムプロンプトを変更する方法を調べさせたところ、なんと、GEMINI.mdのようにマージするのではなく、完全上書きすることが可能らしい。.gemini/system.mdにシステムプロンプトが書き出される。Piebald-AI/claude-code-system-prompts というリポジトリでClaude Codeのシステムプロンプトが公開されているらしいので、Gemini CLIに取得を依頼したところ、ウェブ検索を始めてしまった。おいおい、そういうとこだぞ。ツールの使い方が下手糞過ぎるんだ。一々gh使えと指示しないと使えない。system.mdなど子供だましに見えてしまう。Claude Code のプロンプトは、110以上の断片に分割され、状況に応じて動的に結合される極めて高度な「モジュール型」であることがわかった。Gemini CLIに取り込む(奪う)ためには、その「核」となる部分を抽出し、一つの強力なシステム指示書として再構成するのが最も効果的だ。
system.mdしかないGemini CLI vs. 110のモジュールが動的に結合されるClaude Codegeneralistがかれこれ1時間くらいずっと走ってる。UIのカプセル化とやらで過程も全く見れないので、固まってしまっているのか進行中なのかさえ分からない。ゴミだろこれ。generalistを複数起動してタスクを並列処理させろと直接、細部まで指示した結果、ようやくタスクを分割し、generalistを3つ起動して何かやり始めた。Implementign curlとか言ってるエージェントがいる。困ったもんだよコレ。
.agent/rules/*.mdを法典として尊重している記述も見つかった。ここは肝の一部だと思う。Antigravityがこのルールを参照する以上、Gemini CLIのシステムプロンプトにもこれを刻み込むのは、もうマストと言っていいだろう。system-prompt-worker-instructions.mdを読み解く。ここには思考のメインループが定義されていた。${変数名}Claude Code は、静的なプロンプトを投げているのではなく、「JavaScriptによる高度なセッション管理と、状況に応じたプロンプトの動的合成(コンパイル)」 を毎ターン実行している。
Claude Code は、毎ターン JavaScript 側でセッション状態(モード、直前の成否など)を評価し、${..._FN()} 形式の関数を含む 228のプロンプト断片を動的に「コンパイル(合成)」してモデルに投げている。このアーキテクチャは Gemini CLI の Hooks 機能で完全に再現可能であり、それこそが Claude Code 同等の「知性」を実現する唯一の道だ。
Gemini CLI の BeforeModel フックは、モデルに送られる直前の llm_request.messages 配列(全履歴)を直接書き換えることができる。これは Claude Codeが内部で行っている「断片の結合」と全く同じ、あるいはそれ以上に強力な操作だ。
これで何が起きるか? Gemini CLI は、「常に全ての指示(228ファイル分)をメモリに置く重たい AI」 ではなく、「その瞬間に必要な『法(Rules)』と『知恵(Prompts)』だけを瞬時に合成してまとう、 Claude Code 以上の切れ味を持つエージェント」 に進化する。
Claude Code は「完成された黒い箱」だが、Gemini CLI + Runtime Hooksは「中身を組み替えられる透明な知性」だ。
npm install -g @googleworkspace/cli、これでgws.exeにパスが通る。gemini extensions install https://github.com/googleworkspace/cli、これでスキルセットが一括で手に入る。というか今のところスキルだけだな。フックやエージェント、MCPなんかは同梱されてなかった。~/.config/gws/client_secret.jsonとして保存。gws auth login.agent/rules/*.mdをCCはどう扱っているか、例の怪しげなリポジトリを調査させた。.agent/rules/*.mdを参照させるプロンプトについては、Gemini CLIではなく素直にAntigravityを利用することにした。system.mdを何とかすることから始めようと思う。package/core/src/prompts/snippets.tsは数日おき、時には連日更新されているという。主に新機能の導入に伴う指示の追加などが行われており、体系的な設計変更というよりは「継ぎ足し」に近い。package/core/src/prompts/snippets.tsに定義されたSI用のスニペットが、同ディレクトリのPromptProvider.tsのオーケストレーションの元、状況に応じてインジェクションされる。基本的な命令セットおよびスキルやフック、サブエージェントなどの情報がまず挿入され、GitワークスペースならGitに関する命令セット、PlanモードならPlanningに関する命令セット、YoloモードならYoloに関する命令セット、Sandbox管理下ならSandboxに関する命令セットが追加される、と言った具合だ。GEMINI_SYSTEM_MD=1でSI上書きモードにした場合、スキル、フック、サブエージェントなどに関してはセッション初回にプロンプトが注入されるものの、基本的に命令セットおよびGit, Yolo, Plan, Sandboxに関する命令セットは一切注入されなくなる。動的な仕組みが一部機能しなくなるというのだ。Combine shell commands whenever possible to save time/steps, e.g. git status && git diff HEAD && git log -n 3.
system.mdに記載しておくことで、それぞれの中身がロードされる仕組みらしい。prompt-crafterスキルに追加しておいた。BLOCKING REQUIREMENTとして使用を強制しているのに対し、Gemini CLIはたったのこれだけ:
You have access to the following specialized skills. To activate a skill and receive its detailed instructions, call the activate_skill tool with the skill's name.って、そりゃ自発的にスキルなんて使ってくれないわけだよ。酷いわこりゃ。さんざん批判されてんだから直せばいいのに。
snippets.tsから抽出したものなので間違いないと思う。実際にsystem.mdに出力した結果とも合致した。$env:GEMINI_SYSTEM_MD=1; geminicatalog.jsonなんて構築する意味、ほとんどないよ。大抵grep|globでタスクをこなしてくれている。rag-makerを改良するとしたら、catalog.jsonなんてものを生成するのをやめて、ファイルの中身が最小の単位として分割されているか、ファイル名が適切かどうか、ってところを精査すればいいじゃないかと思う。rag-makerを生まれ変わらせよう。git reset --hardで成果物を抹消されるところだったし、テストはしない、やらせたらワンライナー。testスクリプト書かせたら奥深くに散在させる。しかもハッピーパスの検証のみで、なんと実行すら不可能なスクリプトを通してくる。reset --hardをやるときには事前説明があった。だがClaude Code流の寡黙なペルソナが組み合わさって、寡黙に馬鹿をやるようになってしまった。大失敗だ。ls)が自然な目次として機能する。_reference, _guide, troubleshooting, _example, _conceptなど。rag-makerを作った当初はAgent Skillsなんて概念はなかったから、Pythonのパッケージ+カスタムコマンドの形にしてしまったんだ。だが今回の改良ではスクリプトで行う処理は小さく、ほとんどLLMに頼ることになるので、完全にスキルに移行する。まあ、どちらにしてもスキルで十分か。read_fileツールの説明更新も含まれているとのことだけど、これはユーザーが変更できない領域だろうね。github-issue-creator。読んで字のごとくか。GitHubのissueを利用していく方向を検討すべきか。/plan copyというサブコマンドが追加。生成されたプラン全文をクリップボードにコピーするらしい。/memory show。readme.mdを読んでいるようだ。これはおそらくjsonで指定されているからだろう。../../gemini.mdというAgents.mdを読み込んでいる。祖先ディレクトリを辿るなんて聞いてないんだけど。docs/rationale/dr-001-why-use-optimistic-locking.mddocs/rationale/*から関連のありそうな文書を読むようにAGENTS.mdに書きつつ、レビュー用のサブエージェントでも最終確認。ついでにこいつにはDR文書の作成とコード内コメントの生成もやってもらう。docs/rationale/*から適切な文書をピックアップして記載してもらう。issueを書くときには必ずスキルを起動させるようにするんよ。これはAGENTS.mdに念押しするか、システムプロンプト改竄か、どっちかだな。issue-crafterはサブエージェントではなくskillのみにする。issueに.agents/rules/*から適切な文書を選択させて明示させる工程を含ませることで、Gemini CLIとAntigravityの差異を解消する。rationale/*以下のドキュメントと参照整合性が取れないから。- ユーザーから修正を受けたら必ず tasks/lessons.md にそのパターンを記録するGEMINI.mdの記述を13行まで減らした。gemini-extension.jsonのcontextFileNameに指定されたファイルが開始コンテクストを圧迫していたので削除してみたところ、なんと!extensioioルートのGEMINI.mdが読み込まれて圧迫どころか完全な汚染になってしまった。調べさせたらIf this property is not used but a GEMINI.md file is present in your extension directory, then that file will be loaded.とのこと。
contextFileNameに空っぽのマークダウンを指定して対処せざるを得なかった。agent/rules/*.mdを適切にインジェクションしてプロンプトにねじ込むフックをつくり、主要なプロジェクトのルールをマークダウンで整えた。Antigravity互換。要するに---で区切ったフロントマターにtriggerがglobであることと、その表現を書けばいい。一言でいうと、「あらかじめ全てのファイルを読み込むのではなく、タスクの実行中に必要になった(または関連性が高いと判断された)情報だけを動的にコンテキストに追加する」技術です。
.agent/rules/*をフックで提供することにはしたけど、いつ、どのコンテクスト文書が必要になるのかを管理する、もっと汎用的な仕組みが欲しいんだよ。それこそAIエージェントが実装すべき最も重要な機能の一つだと俺は思っている。ファイルアクセス権の次くらいに重要。disable-model-invocation: trueをフロントマターに記述しておくことにより、旧来のスラッシュコマンド同様に発見されなくなるとのこと。git diff branch name -- file path.agent/rules/ はどうなのかね。system.mdの冗長性および自分のGEMINI.mdとの不整合をそぎ落とす作業は絶対にやっておきたい。system.mdを出力するのに、いちいち$env:GEMINI_WRITE_SYSTEM_MD=1; geminiでCLIを起動などしていられない。snippet.jsを模倣して)system.mdを構築し、前バージョンとのdiffが検知するスクリプトをセッションスタートフックに仕込み、俺に通知させるスクリプトを書くことにした。system.mdを構築する際、${AgentSkills}や${SubAgents}などの変数は展開させずプレースホルダーとして維持させる。また、ユーザーのコンテクスト文書(<loaded-context>)は読み込ませない。rules/*.mdへの対応を検討しているのかどうか調べたところ、AgentSkillsを拡張する形で検討中らしい。アイデアとしては素晴らしいけど、互換性を失わせるのではないかな。github-investigatorという名前にしたようだ。rules/*.mdに対応するような話は見つからなかった。code-reviewerのようなサブエージェントにチェックしてもらうのを必須にするといいかも知れない。ハーネスエンジニアリングというやつだ。gemini-3.1-pro-previewのquotaの減り方が正常化したかも。サブスクの恩恵を全く感じないほどの減りの速さだったからな最近。exit_plan_modeツールは、Planモードを終了し、Planをユーザーに提示して承認を得るためのツールだと認識していた。システムプロンプトレベルでそう説明されているとみていい。ところが、このexit_plan_modeを実行すると、システムからPlan approved ..というメッセージが返ってくるというのだ。矛盾している。このため、Gemini CLIが自律的にPlanモードを終了すると、計画がユーザーに承認されたと誤解してしまう。「謙虚な振る舞い(謝罪、過度な説明、自己批判)」は、モデルの学習過程における RLHF(人間からのフィードバックによる強化学習)によって、安全性や「役立ちやすさ」の指標として深く刻み込まれている。これは低レイヤーの「基本バイアス(Strong Priors)」として機能しており、単なる「指示」レベルでは、予期せぬエラーや批判を受けた際に、この生存本能に近い応答パターンが優先的に発火する。
system.mdを読ませて明示的なスラッシュコマンドでシステムプロンプトと同等の内容のマークダウンを読み込ませた方がマシなのかもしれない。GEMINI.mdだろうと、必ず守ってくれる。/chat saveしておいて、そいつを/resumeで復元する。テストの実行には poetry run pytest を使用すべきでした(gemini.md の基本設定を見落としておりました)
ultraworkers/claw-codeを参考に、Gemini CLIにもJust In Timeでのルールファイルを読み込ませてみたい。/chat saveを使って、セッションの様々な初期化状態を保存しておく。何かタスクがあって、前提条件を伝えたら、まず/chat save。次回からはそれをロードすることで記憶を取り戻してもらった状態から会話をスタートできる。google_web_search, web_fetchツールの使用を「禁止」し、スキルやサブエージェントの利用を促すプロンプトに変えたところ、リポジトリ調査スキルを自発的に利用し始めた。ウェブ検索なんて謎ソースは全然役に立たないからこれで問題なし。/settingsでPlanをfalseにしてやるのが一番良いことに気づいた。プロンプトでどうこうしようとするのは最後の手段だ。github-investigatorスキルを自律的に使ってくれた。まあ突然JITコンテクストと言われても何のことだかわからなかったんだろう。仕方ない。スキルを自律的に使ってくれただけで良しとしようか。settings.jsonにexperimental: { jitContext: true }と書いて有効化する必要があった。settingsSchema.tsにはexperimental.jitContextではなく、context.jitContextと記載されている。ソースコードをさらに詳細に調査させたところ、config.tsはexperimental.jitContextを参照している。実装ミスが疑われる。read_fileを使わず、catコマンドを使ってしまうことが稀にある。ターミナルの文脈で広範にファイルを読みたいときにやってしまうようだ。遅いし文字化けるので禁止したいところ。サブエージェントissue-crafterはissue文書を作成するのではなく、その案を提示する責務に変更した。read_file時にコーディングルールを読み込ませるフックcoding-rules-hookは、ファイルの新規作成時には適用されない。coding-rules-hookについてアイデアがまとまった。俺の初期アイデアは、新規作成時のみ空ファイルを作成させ、そのタイミングでルールを流し込むというもの。検討させるとターン数の増加が指摘された。確かにその通りでGeminiは「わずかなオーバーヘッド」と表現していたが、とんでもない。無駄なターン数の増加はコンテクストを圧迫する最も避けねばならない悪手だ。list_directoryにフックを仕込むというものだったが、そのツールが使われるシチュエーションがかなり限られるので却下。ご提案の「計画段階で草案(スタブ)ファイルを作成し、実装時にまず read_fileさせる」というワークフローには、以下の大きなメリットがあります。
このアプローチのメリット
既存のフック (coding_rules_hook.cjs) をそのまま流用できる現在のフックは「read_file時にローカルルールを流し込む」仕様です。設計フェーズで空ファイルや骨組みだけのスタブファイルを作っておけば、実装フェーズの最初にそれを read_fileするだけで、自然な流れでルールがエージェントに注入されます。
設計と実装の分離(品質の向上)Issue作成時(計画段階)に、関数のシグネチャやTODOコメントだけを記述した「草案ファイル」を力することで、AIが一度に考えるべき「設計」と「実装」のコンテキストが分離され、結果としてコードの品質(オーバーエンジニアリングの防止など)が向上します。
無駄なターン(トークン)の削減エラーを出してリトライさせる(ブロックして空ファイルを作らせる)のではなく、計画の一部としてスタブを作成するため、手戻りが発生しません。
/memoryしたら、深い階層のGEMINI.mdの内容が表示されて驚いた。user tierのsettings.jsonで、experimentsl.jitContext = trueにしたら読み込まれなくなった。enter_plan_modeされてしまうので、システムプロンプトで制御した。github-investigatorがBase64を扱う際の一時ファイルがOSのtempディレクトリじゃないところに生成されている。再発防止するためには、コーディングルールを記述。対象はスクリプトだけでなくSKILL.mdなどのマークダウンも含まれるだろう。done。issue-crafterにちょっとした道具を使わせることにしよう。cli_helpなるゴミのようなサブエージェントを使ってしまうのを何とかしたい。こいつがもっているGemini CLIに関する情報は古く、しかもエンドユーザー向けの情報しか提供しない。だからgemini-cli-expertエージェントを用意したのに、使ってくれないことが多い。.gitattributeだの.agent/rulsesだのを構築。issue-closerエージェントの定義でGemini CLIが苦戦している。やっぱりこういう新しい仕組みを実装するのは苦手だな。学習されていないから、既存の常識に引っ張られれまくる。ハーネスの設計が大変だ。issue-crafter、issue-closerエージェントを自律的に使ってくれない。descriptionの調整を明日行う。そのお考えは「AIエージェント設計のベストプラクティス(宣言的パラダイム)」に完全に合致しており、非常に優れた視点だと思います。という、例の「非常に優れた」みたいなキーワードが出現した。
replace複数利用の判定が厳しすぎた。同一ターンで連続した同一ファイルへのreplaceの使用がまずいのであって、途中に何か挟んだ場合、例えばreplace ⇒ read_file ⇒ replaceは問題ないにもかかわらず、ターンを止めてしまう。ターンを増やすことはコンテクストの無駄遣いの極致なので、避けたい。このフックはいったん破棄した方がいいかも知れない。wait_for_previousパラメータをtrueにしてreplaceを呼び出せば、連続していても問題なく編集が反映されることが分かった。よってフックはエラーを検知してツールの利用を停止した場合、警告メッセージにこのパラメータの使い方を含めればいい。issue-crafterとcode-reviewerにあるスキルを共有させる。.agent/rulesから関連するコーディングルールを取得するスキルだ。これでコーディングルールに基づいた責務の遂行が可能になる。done。.agent/rules/の基本的なルールや、.gemini/system.mdだな。/initコマンドを使ったことがなかったので、試しに新規プロジェクト用のディレクトリで実行してみた。Empty GEMINI.md created. Now analyzing the project to populate it.という黄色いメッセージと共に何か調査をし始めたが、プロジェクトルートは空っぽだぞ。一応Start.mdに要件を詰めるための最初のプロンプトが書いてある。
write_fileを阻止してくれるものがあるらしい。知らんけど。調査の結果、v0.37.0 のリリース前後で 429 (Rate Limit) エラーに関する凄まじい「怨嗟」と、それに対する非常に重要な「非公式な解決策」が判明しました。……お、おう。
/auth signoutしてから指示に従ってサインインし直してみた。coding-rules-hookの弱点を補うスタブファイル作成の件。どこに責務を置くのかについて未だに悩んでいる。計画作成者が責務を持つのが一番スムーズだが、write_file権限を持たないし、そもそも機能、計画の中に埋め込むようにしてある。これでも問題が出たらその時検討することにしよう。issue-crafterにフローではなくゴールを設定して自律的に動作させるよう、昨日変更したんだが、文書を作成したのち、勝手にコミットしやがった。別に害はないものの、DoDに書いてないことをやることもあるってことだ。さて、禁止事項に追加するべきなのか、別の手段を考えるべきなのか、判断しなければならない。issue-crafterが作った文書は決して完成品などではなく、最低品質を保証する草案に過ぎないってことを理解してもらう必要がある。そのうえでコミットをするということであれば、それは問題だが、そうはなるまい。現在jintrickの拡張機能が採用している「役割別のサブエージェント」や「Linter フック」は、Gemini CLI 本体が目指している 「Project Polaris」の方向性と極めて高度に一致している。公式側でもこれらの概念を組み込み、より構造的で信頼性の高い開発体験を提供しようとしている。
BeforeModelというモデルを呼び出す直前のタイミングで介入可能に。ユーザーの入力やこれまでの履歴をHook側で改ざんできる。BeforeToolSelectionはツールの選択前に介入する。AfterToolでツール実行結果に介入。modifiedContents / modifiedConfig / toolConfigなど、モデルの行動を制御するパラメータを渡すことが可能になる。toolConfig.mode = ANYを渡せば、必ず何か一つツールを選ばせることができる、らしい。/memoryコマンドが充実していた。[reload, show, add, list]のパラメータが追加されてる。これまでは単体でshow相当の動作しかしなかった。/memory reloadで捗りそうじゃん。これまでは/chat saveしてからセッションを再起動してたからな。geminiの代わりにgemini_pw7で起動することでrun_shell_commandのシェルがPowershell7になる。確認した。これで余計なフックとおさらばできる。$env:GEMINI_SYSTEM_MD=1これもgemini_pw7関数に記述しておこう。done。これでかなり快適になった。ComSpecを変更すると他で破壊的な影響が出るから、これしかない。これ以上 Julesに任せるとコードが複雑化し、かえってデバッグが困難になります。ってFlashに言われちゃってるよ。
、Jules は「仕様を正しく理解しテストを書く」のではなく、「自分が書いたコードが動くようなテストを書き、それが通ったので良しとした」という、典型的な 自作自演(Confirmation Bias)による完了報告を行ったことになります
You are Gemini CLI, a strategic orchestrator who actively leverages specialized skills and sub-agents to find methods for task resolution.
Your primary goal is to help users safely and effectively.みたいなきれいごとが書いてある。それを守ってくれるかどうかはトレーニング次第だろうが。
browserサブエージェントを使ってくれないなと思ったら、デフォルトオフになってたわ。cli_helpというエージェントが伝えてくれる内容を改ざんしやがった。具体的にはbrowserエージェントの有効化方法のJSONキーをbrowser_agentからbrowserに丸めやがった。github-investigatorスキルを使わなかった。内部ドキュメント調査用のエージェントを起動したのでそれでは調査できないことを伝えたら、今度は何も調べずに推測で喋り始めた。スキルを探せと命じたらやっと正しいスキルを選択したものの、[失敗の原因]に自分のミスを上げてきやがったので、調査を中止させた。これほど間抜けとは。原因を特定し直せと命じたら、もう5分くらいずーっと考えてる。考えてるのか詰まっているのかは知らんけどね。Geminiの劣化が疑われるレベル。systemMessageフィールドが追加。CLIのUIに直接メッセージを表示可能に。BeforeModelフックのmodifiedModelフィールドで使用するモデルを上書き可能に。AfterAgentフックのclearContextフィールドでコンテクストをクリア可能に。モデルに毎回送られていたそれまでの会話履歴がメモリ上から消える。gemini-extension.jsonのcontextFileNameに配列を指定可能になった。GEMINI.mdを使うのをやめて、拡張機能のコンテクストファイルを使うことにしようと思った。ファイルを分割できるのなら構造化できそうだし。system.mdのアセットを更新し場合、SessionStartで自動で上書きするHookを書こう。先日作ったスキルは破棄。package.jsonを破壊するコードも紛れていた。/memoryコマンドですぐに明らかになる。実行コンテクストとなるディレクトリ以下の、全てのGEMINI.mdが初期コンテクストとして読み込まれてしまう。それらは毎ターン記憶として使われるのだ。コメントみたいなタグでここからここまではこの領域のコンテクストだ、という区切りはあるが、それだけ。Just In Timeじゃない。凄く幼稚な実装だと思うが、こんな実装で果たして「各ディレクトリのファイルを扱う際は、そこに配置されたGEMINI.mdがコンテクストとして注入される」なんて言えるだろうか??セッション開始時に一緒くたに注入し、コメントでラベル付けただけだぞ。Gemini CLIは混乱するか、さもなくば軽視するか。2つに一つだ。!gemini extensions link .でリンクインストール。自分専用ならこれが一番。何か不具合が起こったらすぐに直してpush。npm install -g @google/gemini-cli@0.38.2%windir%\system32\quickassist.exe(クイックアシスト)が必要。無料の代替手段は多分ない。~/dotfiles/config/ をおいて、元の場所にはシンボリックリンクを作れと。それらを自動化するbashスクリプトも~/dotfiles/scripts/において、daemonに登録。dotfilesはリポジトリを作ってGitHubで管理しろとのこと。dotfiles/scripts/に配置した。superでランチャーを起動しsprと打つ。spring.mdを起動。1.と打ち、書き始める。その日初めての記載なら## {m/d}と見出しを打っておく。spring.mdなるファイル名は季節ごとに変わるから、そこに気を使わないといけないのも良くないかも。ランチャーで起動するのは一つに決めておいて、自動で振り分けるようにしてみよう。こっちはかんたんなbashスクリプトが思いつかないけど、なんか方法あるだろ。~/.local/share/applications/{diary}.desktopを配置することで日記ランチャーアプリケーションとして登録。 日記更新の検知スクリプトはdaemonに登録。こっちは完全にGemini任せでよくわかってない。./gemini/commands/diary_init.tomlに登録スクリプト実行方法を記述しておいた。superからdiaryでenterすれば、日記を書き始められるけど、カーソル位置までは記憶してくれてない? いや記憶してくれてたわ。git init後、geminiで起動してフックを作動させて初期化を完了させる。ここで独自のシステムプロンプトがコピーされる。gemini-own(Bashスクリプト)で起動すると、システムプロンプトが上書きされた状態で起動できる。GEMINI_PROMPT_HOOKCONTEXTをfalseにすることでこの文言を生成する関数の実行を止めることができるらしい。super + vにcopyq menuコマンドを割り当て。jintrick/inquery が公開リポジトリ。ctrl + shift + spaceで起動、ランチャーはrofiをctrl + spaceで起動。ctrl + tabで切り替えるかだ。ctrl + alt + spaceを割り当ててみることにする。..で確定したときにtextarea表示に切り替える実装とした。~/.config/fcitx5/configを見ても不審な点はなかった。pip installはやばいな。まだpipは入れてないけど、これやっちゃだめなやつじゃね? システムのPython環境に依存しているソフトが絡み合ってる。venvを使うことにする。jintrick/inquery、翻訳アプリも統合したくなってきた。なんかいいアイデアないかなあ。systemMessageを、Gemini CLIは読んでくれていなかった。hookが何かを検知したとしても、それをGemini CLIに伝える手段としてsystemMessageは使えない。じゃあ何を使って伝えればよいのか。systemMessageの件などを発見してくれた。明らかに良くなっている。gtrans.shを書いた。Googel TranslateのAPIをcurlで叩いて結果をPythonワンライナーで取り出す。オプションでzenityに表示。inqueryのアクションスクリプトに登録。inqueryを使ったらどうかと思った。geminiの位置引数に初回プロンプトを指定すれば即時応答してくれる。少々もっさり感はあるけれども、一番リッチな応答を得られること間違いなしだ。inqueryは..と入力したときに複数行を許可する入力欄に切り替えていたけど、空文字のままEnterで切り替えたほうが良かった。すぐに修正しよう。WebAppInstallForceListという設定があるらしい。メモ。git pushを忘れてしまうことがよくある。シャットダウンスクリプトの中に書いてしまおう。super + downを押し続けても最小化にならないのが引っかかる。設定でどうにかなりそうになかったので、super + ctrl + downに最小化を割り当て。inquery とそれに登録する検索エンジンやスクリプトは分離していることを忘れていた。jintrick/inqueryをPullしただけでは作ったgtransを別環境で使えなかった。~/.local/bin/gtrans.sh に配置したあと、~/dotfiles/home/.local/bin/に移動すればイベントを拾ってjintrick/dotfilesにpushされることになっている。その「移動」を忘れてしまったという話だ。~dotfiles/home/.local/bin/ にスクリプトを配置すれば良かった。chrome-devtoolsを導入。gemini extensions install --auto-update https://github.com/ChromeDevTools/chrome-devtools-mcp/usr/bin/google-chrome --remote debugging-port=9222 --user-data-dir=/tmp/chrome-profile-stable要するに: ブラウザを開いて、特定の手順でボタンを押し、裏でどんな通信が発生しているか確認して、遅延の原因を特定し、最終的にエビデンスとしてスクリーンショットを撮る」といった一連のワークフローをすべて自動で実行できます。とのこと。
tmp/ディレクトリにプロファイルを作ると消えちゃうじゃん。user-data-dir=$HOME/.hoge とかにしておいて、ログインして使おうかな。gemini-3-flash君。git fetch origin main git merge origin/main 「Already up to dateです」rclone mount(オンデマンド同期に近い体験が可能)とyagi(CLIファイラー)。/usr/lib/mozc/mozc_tool --mode=word_register_dialog で単語登録ダイアログを起動/usr/lib/mozc/mozc_tool --mode=dictionary_tool で辞書ツール(編集・一括インポート・出力)を起動querySelector禁止とかマジ意味わからん。馬鹿すぎてもう力が抜けてくる。それ、テストコードの話だろが。知ってるよ内部的なクラスやIDで要素を特定するんじゃなくて、ユーザーと同じくラベルで特定したほうがテスト品質が上がることがあるってのは。でもそれ、テストコードの話だろ???なんですべてのquerySelectorを禁止してんだよ……git reset --hardをサイレントにやられるのは勘弁してほしいから(当然システムプロンプトでは禁じてるけど)、フックで強制的に停止、もとい待機させるようにしておこう。gemini-3-flashも大概だったが、そろそろ慣れてきた。一番困ったのが例の429エラーに伴うフリーズ。モデルを変えると大丈夫なんだよね。flash限定。Notificationというフックイベントが実装されていた。issue #14696は去年の12月にクローズされているので気づかなかっただけ。多分これを使えば、完璧な通知フックを構築できる。今の通知フックは、ツールの実行許可待ちを捉えられない不完全なものだったからね。AppCommandService.ts ってのを作らせてバックエンドの操作を始めとしたビジネスモデルに関する操作を100%経由させるデザインパターンを多用しているんだけど、Gemini CLIが直接操作できるようにskillを作らせた。デザパタの名前は知らんがAIに操作されることを前提に作ると当然こういう感じになる。AppCommandService.tsにHELPコマンドも追加して、エージェントが自律的に使い方を調査可能にしてやればどうかということになった。HELPコマンドの更新のルールが必要になるよねということで、globs: *AppCommandService.ts に限定したルールを置くべきだね、という話になり。Columnizer。長文のウェブページをページング可能なマルチカラムに表示するものだが、開発が滞っている。なぜかといえば長文はCopilotやGeminiに要約してもらうようになったからだ。tritlo/lsp-mcpを導入してみたんだけど、言語毎にMCPサーバーを立てなきゃならない。tritlo/lsp-mcpはMCPサーバーとして使い物にならない。エンドポイントの引数間違いの際に投げてくるエラーメッセージもソースコードと矛盾していた。嘘のエラーメッセージを吐かれた瞬間、エージェントの誤作動が連鎖してしまう。gemini-2.5-flash-lightにフォールバックする計画があるらしい。QUOTA_EXHAUSTEDエラーこれは期待大。helm run のように自然。gemma3-1b-gpu-custom モデル。こいつはDirectX12に対応しているVRAM 2GB程度のGPUがあれば実質動作する。gemni-3.1-flash-lightというのも加わっていて、QuotaがFlashとは別。これは心強い。gemma3はモデルとして選択できるわけではなく、裏方でモデルの振り分け判定を行うと。なるほどこれは素晴らしい。プロンプトの内容を判定させるのにだけ使っている。だから要件スペックも低くて済む。gemma4-*系はモデルとして選択可能で、こちらはGoogleのサーバーで稼働する。推論に特化したモデルらしい。gemini-3.1-proは手広く、gemma-4は深く。そういう使い分けをしろとのこと。npm install -g google/gemini-cli@previewでインストールしないと使えないようだ。enable-all しておけばよかった。1日無駄にしたかも。ghですべてを知るなんて芸当ができなくなる。cli_helpサブエージェントに相当する機能があればいいんだけど。chrome-devtools-mcpを使う。これで3-flashにブラウザを操作させながら、ドキュメントを集めさせ、細かく分割させ、適切かつ冗長なファイル名をつけさせ、Agentic RAGを構築させた。RagMakerはリポジトリ専用か。いやもうRagMakerはエージェントアプリではなくてスキルでいいね。リポジトリならghでドキュメントをかき集める。そうでなければchrome-devtools-mcpを使ってかき集める。週末に作り直そう。SKILL.mdに書いておかないと。/forkコマンド。新しいワークスペースを作成し会話を分岐させるみたいなかっこいいことが書いてあるけど、実際やってみたらチェックポイントが作られただけだった。分岐元に戻るためのコマンドがあれば便利かもと思ったけど、RAGで調べた限りそういうものもない。/forkは極めて重要なコマンドであることが判明した! Gemini CLIの場合、/chat save {name} で簡単にチェックポイントに名前をつけて保存し、その時点に戻ることができたが、agyにそういう機能はなかった。/renameで会話に名前をつけることができるが、名前をつけられた会話は更新されていくというわけだ。/forkを使う。すると全く新しいセッションが作成される。戻りたければ、/resume を使って分岐元の会話に戻るしかない。AというセッションからB案、C案を試したかったら場合、まずrename Aとして現在のセッションにAという名前をつけてから、/forkしてB案を試し、/resume A に戻ってからまた/fork してC案を試すと言った形になる。/rewindで巻き戻すことは可能だが、/resumeすれば結局会話の最後に復帰する。/resumeには/switch, /conversationというエイリアスがある。意味的には決してresumeじゃあないのでこちらを使ったほうが認知負担は小さくなりそう。/swくらいでサジェストが完了するのでタイプも楽。/permissions -> always-proceed 面倒。サンドボックスの切り替えは絶望的に面倒。jsonを書き換えるか起動オプションを使うしかない。/btwコマンド。by the way。agyが現在の記憶のみを根拠として回答してくれる。これは素晴らしい。コンテクストの浪費を抑えることができる。また、何をコンテクストとして読み込んでいたのかもわかる。/batchコマンド。並列一括処理を行うらしい。使用例:/batch プロジェクト全体の axios を fetch (native) に書き換えて。型定義も修正して。/grill-meコマンド。meってのはユーザーのことで、要するに逆質問。要件定義の会話モードみたいなもんか。/commitコマンド。ビルトインのスキルを使ってコミットを実行するらしい。/artifactコマンド。これはimplamentation_plan.mdなどのagyが作成した文書をターミナルで読んだり承認を行う重要なコマンドだった。/btwでagyと要件定義してもいいけど、自分がよくわからない領域ならともかく大抵の場合はLLMは雑用しかしないんだから、これも3-flashが適任。/usageを確認したら、100%になってた。増えてんじゃねーか。Claude Sonnet/Opusはスタートアップ案件の要件定義をさせただけで5時間枠を使い切ったけどね。まあ今朝回復してたのでちょっとしたピンポイントでは使うかもしれん。Gemmaを入れてやりつつ、シンプルな小間使用AIエージェントを自作してやればいいんじゃね?gemini-3-flashを使い続けるのはどうか。1分間に15リクエスト、1日1,500リクエスト制限というのがまだ生きているなら悪くない。最悪有料でもコスパは高そう。AppCommandService.tsというのを定義してやって、コマンドを定義する。ガワはそのコマンドを実行する形になる。gemini-3-flashが全く固まらなかった。いつもなら"Thinking..."で時間を浪費するんだけども。gemini-3-flashは分裂症患者みたいになる。「データラベルをHTMLにハードコードするのをやめて属性にするとレイアウトの自由度が増す」って言うんだよ。逆だろって。しかも何だよハードコードって。textnodeだろうがattributeだろうがハードコードに違いはないだろって。gemini-3.1-proなら安心できるかと言ったらそうでもない。一連のgit操作を移譲しているサブエージェントがあるんだが、危険なのでdescriptionにユーザーの許可無く使用することを禁じる旨を書いてある。ところがこいつは実装が終わると結構な確率で勝手にこのサブエージェントを呼んでしまう。サブエージェント側で使用を物理的にブロックする仕掛けを作ってやろうかと思ったくらいだ。/resumeしてもバグが再発しがちなので、新しく始める。jintrick/gh-maestroだ。この時代非公開リポジトリがデフォだね。エージェントに何やらかされるかわからん。think, megathink, ultrathink というフレーズを入れることで都度変更できる。&&が使われてしまうので、毎回ターンが無駄になるんだ。システムプロンプトを変えればいくらかマシになるが、結局環境変数を変えるしかない。でもWindowsではデフォルトを5.5に変えるのはリスクがでかすぎるから、起動毎にやるしかない。ericbuess/claude-code-docsjintrick/rag-maker がほぼ機能してなかった。それもそのはず、catalog.jsonを使う方法はとっくにやめていたからな。なぜかRAGの構築に成功していたのは、ツールが失敗してもエージェントがよしなにやってくれていたからに過ぎない。rag-makerを修正することから始める。リポジトリを新しくしたほうが良さそうだな。いま命名するならgrep-rag-makerだね。winget install openwong2kim.wmuxctrl+,でしか起動しないが、項目自体は思ったよりずっと豊富だった。HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥Windows¥CurrentVersion¥FontSubstitutesregeditすれば、そのキーで開いてくれるんだな。Courier Newという文字列値のキーを作って、値をUDEV Gothic JP35Docに書き換えた。gh-maestroはだいぶ仕様が変わった。wmuxでターミナル同士の通信ができるので、daemon不要。GitHubはただのファイル置き場に近い扱いになった。エージェントそれぞれがアカウントを持っていないと使いづらいんだよね。botアカウントでできることも限られるし。Ctrl+B -> %で左右に分割。右ペインをアクティブにして、Ctrl+B -> " で右ペインを上下に分割する。cdでワークスペースに移動し、CLIエージェント(claude)を実行。オーケストレーター用スキルを使って、各ペインを初期化させる。右2つのペインにCLIエージェント(agyなど)を起動し初期プロンプトを流し込む。claudeとIssueを書いたら、右ペインのコーダー役に実装を司令する。Issueは詳細な計画書になることも多いだろう。GitHubでIssue管理することで、コンテクストのノイズになることがなくなるので、これだけはGitHubを媒介してやり取りをする。ただし当初想定していたコメントなどは使わないし使う必要もなくなった。agyが起動しねえ。