🧠

コーディングエージェントでコーディングエージェントを作って変わったこと、変わらなかったこと

に公開

はじめに

ShaftというCLI型コーディングエージェントを作りはじめて、かれこれ3ヶ月経とうとしています。

https://gitlab.com/tkithrta/shaft

3ヶ月の間で様々なアップデートを行ってきました。

これまでの変更内容について3行ずつ書こうかと思ったのですが、Shaftに3行ずつ書いてもらいましたので、詳しくはこのスクリーンショットを見てください!

changelog

(何かv2.4.0の出力内容変だな……)
最新のv2.5.0では画像ファイルやZIPファイルについて質問したりコンテキストファイルとして渡せるような機能を追加しています。

> shaft ask "What is this? Explanation must be in Japanese" -f maxresdefault.jpg
Persona: assistant
Model: gemini-2.5-flash
Executing phase 1/1 using assistant.json
Processing files:
- C:\Users\shaft\Desktop\maxresdefault.jpg
Explanation:
この画像は、イギリスの伝説的なロックバンド、ザ・ビートルズの最後のスタジオアルバム「レット・イット・ビー(Let It Be)」の象徴的なアルバムジャケットです。アルバムのタイトル「LET IT BE」が上部に表示されており、その下にバンドのメンバー4人の顔写真が分割して配置されています。上段左がジョン・レノン、上段右がポール・マッカートニー、下段左がリンゴ・スター、下段右がジョージ・ハリスンです。このアルバムは1970年にリリースされ、バンドの歴史における重要な作品として知られています。

コーディングエージェントでコーディングエージェントを作る

さて、私はなぜコーディングエージェントを作っているのでしょうか?

https://cloud.google.com/blog/ja/topics/developers-practitioners/introducing-gemini-cli/

元々私は2025年6月26日からGemini CLIをメインに使っていて、最近はCodexも使っているぐらいなのでShaftだけを使っているわけではないのですが、Gemini CLIがリリースされた4ヶ月前は以下の内容について不満に感じていました。

  • 遅い
  • レイアウトがよく分からない壊れ方をする
  • Enterキーを押すと送信される
  • 無料とはいえやたらトークンを消費してくる
  • どのコンテキストファイルが読み込まれているか把握できない
  • 明らかに何らかの履歴を読み込んでいる処理が行われる
  • TypeScript

最近はGemini CLIのアップデートが行われたり、CodexがRustで完全に書き直されたり、Vibe KanbanのようなWeb UIからシェルを操作できるツールが登場したことによって大分不満は解消されましたが、特に「どのコンテキストファイルが読み込まれているか把握できない」問題は今もなお解消されていません。

この「どのコンテキストファイルが読み込まれているか把握できない」問題はどのぐらい深刻かと言うと、コーディングエージェントを使う時に以下のことを考慮しなければなりません。

  • Gemini CLIではチャット内でファイルパスの先頭にアットマークをつけるとファイルを読み取ってくれるけど、その後の変更については追跡しない? もし自分で修正を行った場合、再度アットマークをつけてファイルを読み込まなければならない?
  • Codexの場合-s, --sandbox-a, --ask-for-approvalオプションを渡せばいいらしいけど、終わるのはいつ? 終わるまで保持されるコンテキストは?
  • /chat resume--resume, --continueを使うと会話履歴を呼び出すことができるけど、その会話履歴の内容は?
  • その他コンテキストを管理するコンフィグがたくさんあるけど、どれをどう設定する?
  • MCPを追加したほうがいい?
  • Claude Codeで解決する? Claude Codeの何の機能で解決する?
  • プロンプトエンジニアリングとコンテキストエンジニアリングわからないよ~。

結果、コーディングエージェントは人類に早すぎた、AIエージェント使わずに自分でやったほうが早いという言論がまかり通るようになってしまう始末です。

私は全くそうは思いません!!!

失礼声がでかくなってしまいました。

Shaftは以下作業をやるだけです。

  • -f, --fileオプションで質問したいファイルまたは変更したいファイルを渡す
  • ターミナル以外の画面を見ながら少し待つ
  • 回答や結果を見る

だいぶオーバーな書き方をしましたが、結果を見て悪かったら以下の作業をするだけです。

  • ペルソナを変える(デフォルトがassistantなので、コードを書くときはprogrammerに変更しましょう)
  • プロンプトの内容を変える
  • -r, --refオプションでコンテキストファイルを渡す
  • -f, -F, -r, -Rオプションでファイルを増やしたり減らしたりする
  • いちいちコンテキストファイル渡すのが面倒になったらSHAFT.mdファイルやAGENT.mdファイルを使って自動的に読み込んでもらう
  • .shaft/shaft, .shaft/agentでコンテキストファイルを自動的にたくさん読み込める
  • それでもだめだったらペルソナに問題があるのでペルソナを自作する

ものすごく簡単ですね! コンフィグファイルも(今のところ)必要ありません!

ただ環境変数SHAFT_ARCHIVEのようなアーカイブ機能はオプトイン(デフォルトでは無効で、設定すれば有効)で提供しているので、環境変数を使用するとより便利に使うことができます。

他にもCLI特有の問題をラップするRunスクリプトやTkinterアプリ、Webアプリも提供しています。

https://gitlab.com/tkithrta/shaft/-/tree/main/scripts

このような「ぼくのかんがえたさいきょうのコーディングエージェント」を作れるのが自作コーディングエージェントの醍醐味です!

コーディングエージェントを作って変わったこと

結果、3ヶ月間ほぼ毎日Shaftを作って使って以下のような変化がありました。

  • 毎日コーディングエージェントでコードを書くようになる
  • コード以外の用途でコーディングエージェントを使うようになる(結果デフォルトのペルソナがprogrammerではなくassistantになってしまった)
  • Pythonに詳しくなる(それはそう)
  • モジュール結合度について考えるようになる(データ結合とかスタンプ結合とか)
  • ドキュメントを頑張るようになる(AIのおかげで英語、日本語のペアで出力できるので)
  • Jinja2やClickのようなCLIツールで使えるライブラリに詳しくなる(Flaskは完全に理解していた)
  • CLIツールのデザインばかり考えるようになる(Webアプリばかり作ってきたので、CLIツールをしっかり作るのは初)
  • LLMモデルに詳しくなる(質の良いモデルだけではなく、あえて質の悪いモデルを使ってデバッグするようになる)
  • LiteLLMやOpenAI Python SDKのようなLLMモデルを扱うライブラリに詳しくなる
  • ファイルパスに詳しくなる(コンテキストファイルを簡単に渡せるようにしたくなるので)
  • ファイルシステムに詳しくなる(テキストファイルとバイナリファイルの違い、文字コードとか)
  • 正しいプロンプトエンジニアリングが分かるようになる(有名なプロンプトエンジニアリングをすべてやる必要ないので)
  • 正しいコンテキストエンジニアリングが分かるようになる(有名なコンテキストエンジニアリングをすべてやる必要ないので)
  • ローカルでGitを使わなくなる(Git Worktreeのベストプラクティスがよく分からないので、自作コーディングエージェントのためにバージョン管理システム作った)
  • 他のコーディングエージェントの良いところをリスペクトするようになる(例えば今回のZIPファイルを読み込む機能はClaude Skillsを見て思いつきました)

一部内容はコーディングエージェントを自作しなくても得られることですが、3ヶ月モチベーションが続いたのはShaftのおかげです。

コーディングエージェントを作って変わらなかったこと

ただコーディングエージェントを作って変わらなかったことが一つだけあります。
それは「コーディングエージェントを作ったからといって、Gemini CLIやCodexを使わなくなるわけではない」ということです。

やっぱりGemini CLIやCodex、あとClaude CodeのようなコーディングエージェントはLLMモデルとエージェントがお互いに性能を高める関係にあるので、寛大な無料枠が用意されていたり、高性能なモデルが定額で使い放題だったりするので、どうやってもコストや性能で勝てないんですよね。

そういう意味で言うとShaftはCursorやCline、GitHub Copilot Coding agentのような様々なモデルで使えるコーディングエージェントや、KiroのようなLLMモデル作っているわけではない企業によるコーディングエージェントに近いのかもしれません。

実際私はShaftを作ってからClineやRooCodeを全く使わなくなりました。
これらのコーディングエージェントにも共通して言えることは「どのコンテキストファイルが読み込まれているか把握できない」点にありますからね。
Clineのソースコードを読んで機能を追加したりシステムプロンプト差し替えたものをインストールするだけでは根本的解決にはならないので……。

おわりに

Gemini CLIを初めて触った時、ついに無料でClineやRooCodeとは比べ物にならないほど爆速でAI駆動開発ができる! と感じました。
じゃあ何を作ろうと考えた結果、コーディングエージェントは今後コードを書くうえでなくてはならない存在になるだろうし、Gemini CLIを無料で使えるうちにコーディングエージェントを作ろうと思い立ったのですが、結果私の開発体験を大きく変えるきっかけになりました。

与えられたコーディングエージェントに激詰めする人生なんてつまらなくないですか?

既にあるCLI型コーディングエージェントのOSSをフォークしたり、自分で作ったコーディングエージェントをより良くしたりする、AI駆動開発でコーディングを楽しみましょう!!

https://gitlab.com/tkithrta/shaft/-/blob/main/src/shaft/docs/ja/getting_started.md
https://gitlab.com/tkithrta/shaft/-/blob/main/src/shaft/docs/ja/user_guide.md

Discussion