Runner in the High

技術のことをかくこころみ

AI時代のtech bonsai - piでオレオレextensionsを育てる

もともとdotfilesを育てるのは割と好きなタイプだったのだが、TSスタックがメインになってきてVSCodeのout-of-the-boxな便利さには敵わんなーと思いbonsai a.k.a dotfilesを放置している今日この頃。しかし、どうやら最近はpiという新たなbonsaiが流行っているらしい。

仕事ではGithub Copilot in VSCodeで全く困ってなかったのだが、ちょっとなんか弄って遊びたいとなー思っていたところ、piでextensionを作り始めたらdotfilesを育てていたあの頃の記憶が蘇ってきた。

extensionsづくりの機運

いろいろすっ飛ばして説明すると、piはベアボーンのAIエージェントハーネスであり、そのうちコーディングに特化したI/Fを持つCLIがpi-coding-agentとして提供されている。ここにextensionsという機能があり、ざっくりこれはClaude Code Plugin相当のもの... なのだが、それ以上になんでもでき、かつ後述するようにTypeScriptのAPIで機能を拡張することができるという嬉しいものである。

サードパーティのextensionsはカタログで検索できるくらいにはたくさんあるのだが、vibe codingによる玉石混合具合が凄すぎるのと、自分が欲しいものが割となかったりする。

というわけで、自分が欲しかったものをふたつ作ってみた。

pi-ts-code-search: TypeScript向けセマンティックコードサーチ

VSCodeにはいい感じのセマンティックサーチのtoolがあり、それをCopilot Agentから利用できる。

これによりgrepとかfindを使って低レベルにファイル内容の走査をすることなく雑な指示でもAIがコードベースの実装を突き止められて割と便利だったので、まずは似たようなものが欲しいなーということで作ってみた。

github.com

やっていることは単純で、コードベースをts-morphでシンボルなどの情報と共にトークナイズ、インデクス化し、それをminisearchという全文検索ライブラリに与えて効率的にコードベースの検索をできるようにするだけのもの。

これは単なる文字列検索の代用品というより、TypeScript/TSXのコードベースを事前に索引化して定義、参照、import/exportの関係をコードの構造としてたどれるようにする、軽量なコードインテリジェンスに近い。

認証関連のコードを検索し、ランキングしている様子

インデクスの構築サイクルはかなりサボっているので、ユーザーからの入力があるたびに作り直している。しかし、それでもある程度の規模のOSSですら初回のインデクス作成に1-2秒しかかからないので、特に困らない。自分のユースケースはAPI実装の一貫性レビューや横断的なリファクタリングなどに向けた調査をAIにさせる上での情報収集なので、頻繁な変更に追従させる必要がないという背景もある。暇があればもう少し賢くしてもいい。

piのextensionは素直なTypeScriptのAPIで実装できるので、今回のインデクスデータのようなものは凝らなければ単にextensionのインスタンス変数みたいなノリで保持できる上にpiのイベント・ライフサイクルと合わせて簡単に操作できて良い。少なくとも、MCPプロトコルで実装するよりは圧倒的に楽。*1

pi-file-tree-browser: ツリー型ファイルブラウザ

piの面白さはcustom toolでTUIまで作れることにある。やろうと思えばDoomも動かせるらしい。

というわけで、Vimmerならお馴染みのNERDTreeインスパイアなファイルブラウザも作ってみた。個人的な好みとしてAIとの会話に付随するファイルの閲覧をできる限りシームレスにしたく、そこであまり画面の切り替えとかもできればしたくない。それが叶ういい感じのやつが欲しかった。

github.com

https://raw.githubusercontent.com/IzumiSy/pi-file-tree-browser/refs/heads/main/assets/demo.gif

ツリービューでのファイルのブラウジング、ディレクトリ横断のファイルインクリメンタルサーチ、プレビューとファイル内検索、AI用のショートリストツールを備えており、上で自分が作ったpi-ts-code-searchを組み合わせると検索で絞り込まれたファイル群をまとめて閲覧するみたいなこともでき、コードベースの調査も捗る。

あと地味に便利なのが、ファイル単位ないし行指定で次のターンの会話コンテキストに任意のファイルを与える機能で、VSCodeのCopilotにあったファイルのピン(?)に相当する機能。AIに作業をお願いする際にピンポイントでみて欲しい箇所があったりする時に便利である。

結論: 楽しい

やはり自由度のあるツールはイイ。TypeScriptで書けるのも素晴らしい。

みなさんのオススメPi packagesや、こんな風にカスタマイズしているぜ! があればぜひ知りたい。

*1:ちなみに、そもそもpiにはMCPという概念がない