ガイド

Code Intelligence

REAP はコードインデックスを内蔵しています。インストールするものも、起動するものも、バックグラウンドで動くプロセスもありません。Tree-sitter パーサーが追跡中のすべてのファイルを走査し、定義されたシンボルとその間の呼び出し・import を記録して、結果を .reap/.index/ に gzip された JSON として保存します。15 言語が同梱され、ネイティブビルドはありません — グラマーは WebAssembly です。

コマンド

どのサブコマンドも REAP の他のコマンドと同様に stdout へ JSON を出力します。エージェントはそれをパースし、人間は message フィールドを読めば済みます。

bash
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 です。

bash
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 はグラマーの読み込み失敗も警告します — ある言語が静かにインデックスされなくなるもう一つの経路です。

text
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リテラル文字列、コメント、設定ファイル、グラマーのない言語、そしてまだコミットしていないすべて