Code Intelligence
REAP bringt einen Code-Index mit. Nichts zu installieren, nichts zu starten, kein Hintergrundprozess. Ein Tree-sitter-Parser durchläuft jede versionierte Datei, erfasst die dort definierten Symbole sowie die Aufrufe und Importe zwischen ihnen und legt das Ergebnis als gzip-komprimiertes JSON in .reap/.index/ ab. Fünfzehn Sprachen sind enthalten, und es gibt keinen nativen Build — die Grammatiken sind WebAssembly.
Befehle
Jeder Unterbefehl gibt wie der Rest von REAP JSON auf stdout aus, sodass ein Agent es parsen und ein Mensch das Feld message lesen kann.
reap index # update — die Voreinstellung
reap index update [--full] # den Index auf HEAD bringen
reap index status # Zahlen, Import-Auflösungsrate, indizierter Commit
reap index impact <file>... # was bricht, wenn Sie diese Datei ändern
reap index search <query> # eine Definition finden, mit file:line
reap index callers <symbolId> # wer ruft das auf
reap index callees <symbolId> # was ruft das aufEine symbolId hat die Form <file>::<name> — zum Beispiel src/core/lifecycle.ts::nextStage. reap index search gibt sie aus.
Die Einheit der Änderung ist ein Commit
Der Index hält die SHA fest, die er beschreibt. Zu entscheiden, was neu geparst werden muss, ist ein git diff; zu entscheiden, ob überhaupt, ein Stringvergleich. Sobald HEAD sich bewegt hat — nach einem Commit, einem Branch-Wechsel, einem Rebase oder einem Pull — aktualisieren die Abfragen den Index selbst. REAP aktualisiert nur dort von sich aus, wo es gerade selbst committet hat: am Ende von completion und in 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)Der Preis dafür: nicht committete Arbeit steht nicht im Index. Ein eben geschriebenes, noch nicht committetes Symbol findet search nicht, und eine neue Datei taucht in impact nicht auf — dafür nehmen Sie Grep. Außerdem wird ein git-Repository benötigt, denn ohne eines gibt es keinen Commit, an den der Index gebunden werden könnte.
Lesen Sie status, bevor Sie impact glauben
Alles, was impact weiß, stammt aus aufgelösten Import-Kanten. Eine niedrige imports-Rate bedeutet einen unvollständigen Graphen, und ein leerer Blast Radius heißt dann unbekannt statt keiner. status warnt außerdem, wenn eine Grammatik nicht geladen werden konnte — der andere Weg, auf dem eine Sprache stillschweigend unindiziert bleibt.
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(Beispielwerte.) Entscheidend ist die Zeile imports. Alles, was impact weiß, stammt aus aufgelösten Import-Kanten: Ist die Rate niedrig, ist der Graph unvollständig, und ein leerer Blast Radius bedeutet dann unbekannt statt keine. Ein Resolver, der einen ./x.js-Specifier nicht der x.ts zuordnen kann, aus der er entsteht, meldet hier null — deshalb steht die Rate auf dem Bildschirm, statt aus einem gelaufenen Indexlauf erschlossen zu werden.
Wo der Index liegt
In .reap/.index/ — eine manifest.json plus ein gzip-komprimierter Graph — und sowohl reap init als auch reap update tragen ihn in .gitignore ein. Wer das Projekt löscht, löscht den Index mit; im Home-Verzeichnis sammelt sich nichts an. Der Ignore-Eintrag hat nichts mit Größe zu tun: den Index zu committen hieße, den Commit zu indizieren, der ihn enthält, und das terminiert nicht. .reap/.index/ zu löschen ist immer unbedenklich — der nächste Befehl baut ihn neu.
Wann Sie ihn verwenden
Beide ergänzen einander — der Index antwortet mit file:line, das Sie anschließend lesen.
| Werkzeug | Wenn die Frage lautet |
|---|---|
| reap index | Wo ist das definiert, wer ruft es auf, was hängt von dieser Datei ab, wie weit reicht der Blast Radius dieser Änderung |
| Grep / Glob | Literale Strings, Kommentare, Konfigurationsdateien, Sprachen ohne Grammatik und alles noch nicht Committete |
