Code Intelligence
REAP はコードインデックスを内蔵しています。インストールするものも、起動するものも、バックグラウンドで動くプロセスもありません。Tree-sitter パーサーが追跡中のすべてのファイルを走査し、定義されたシンボルとその間の呼び出し・import を記録して、結果を .reap/.index/ に gzip された JSON として保存します。15 言語が同梱され、ネイティブビルドはありません — グラマーは WebAssembly です。
コマンド
どのサブコマンドも REAP の他のコマンドと同様に stdout へ JSON を出力します。エージェントはそれをパースし、人間は message フィールドを読めば済みます。
reap index # update — デフォルト動作
reap index update [--full] # インデックスを HEAD に合わせる
reap index status # 統計、import 解決率、インデックス済みコミット
reap index impact <file>... # このファイルを変更すると何が影響を受けるか
reap index search <query> # 定義を探す(file:line を返す)
reap index callers <symbolId> # 誰がこれを呼ぶか
reap index callees <symbolId> # これが何を呼ぶかsymbolId は <file>::<name> の形式です — 例: src/core/lifecycle.ts::nextStage。reap index search がこの値を出力します。
変更の単位はコミットです
インデックスは自分が記述する SHA を記録します。何を再解析するかは git diff 一回、そもそも再解析が必要かは文字列比較一回で決まります。HEAD が動けば — コミット・ブランチ切り替え・rebase・pull の後 — クエリ自身がインデックスを更新します。REAP が先んじて更新するのは自分がコミットした直後だけ — completion の末尾と early-close です。
reap index update # Indexed 412 file(s) — full, 1530 symbols at 1a2b3c4 (612ms)
reap index update # Index is current at 1a2b3c4 (1530 symbols, 3688 edges)その代償として、コミットされていない作業はインデックスに入りません。今しがた書いてまだコミットしていないシンボルは search で見つからず、新規ファイルは impact に現れません。それらは Grep で探してください。また git リポジトリが必要です — なければインデックスを紐づけるコミットが存在しません。
impact を信じる前に status を見てください
impact が知っていることはすべて解決済みの import エッジ由来です。imports の比率が低ければグラフは不完全であり、そのときの空の blast radius は「なし」ではなく「不明」を意味します。status はグラマーの読み込み失敗も警告します — ある言語が静かにインデックスされなくなるもう一つの経路です。
files: 412
symbols: 1530 (function 902, method 341, class 187, type 100)
edges: 3688 (CALLS 3145, IMPORTS 543)
imports: 543/543 resolved (100%)
commit: 1a2b3c4(例示の数値です。)重要なのは imports の行です。impact が知っていることはすべて解決済みの import edge から来るため、解決率が低ければグラフは不完全であり、そのとき空の blast radius は「なし」ではなく「不明」を意味します。./x.js という specifier を、それを生成する x.ts に対応づけられない解決器はここでゼロを報告します — だからこそ「インデックスは走ったか」から推し量るのではなく、解決率を画面に出しています。
インデックスの置き場所
.reap/.index/ の中に manifest.json と gzip されたグラフ一つとして置かれ、reap init と reap update が .gitignore に追加します。プロジェクトを削除すればインデックスも一緒に消え、ホームディレクトリには何も溜まりません。gitignore する理由はサイズではありません — インデックスをコミットすると、それを含むコミットを再びインデックスする必要が生じ、この過程は終わりません。.reap/.index/ はいつ削除しても安全です。次のコマンドが作り直します。
使いどころ
両者は補完関係です — インデックスは file:line で答え、それを読めば済みます。
| 使うもの | 問いがこういうとき |
|---|---|
| reap index | これはどこで定義されているか、誰が呼ぶか、このファイルに何が依存しているか、この変更の blast radius はどこまでか |
| Grep / Glob | リテラル文字列、コメント、設定ファイル、グラマーのない言語、そしてまだコミットしていないすべて |
