Dokumentation

Grenzen

Was der Graph nicht sieht

greppy baut seinen Symbolgraphen aus dem Quelltext. Kanten, die ein Programm erst zur Laufzeit verdrahtet, sieht kein statisches Werkzeug, greppy eingeschlossen:

  • Reflection;
  • Dependency Injection zur Laufzeit;
  • Monkeypatching;
  • dynamisch dispatchte Aufrufe;
  • Makro-Expansion;
  • Code, der erst beim Build entsteht.

greppy ist so gebaut, dass aus diesen blinden Flecken keine falschen Antworten werden:

  • search findet Code über seine Bedeutung, nicht über Graphkanten. Ein Reflection-Ziel oder ein generierter Handler bleibt auffindbar, wenn du beschreibst, was er tut.
  • who-calls liefert eingehende CALLS- und USAGE-Kanten. search-pattern gibt dir Gewissheit auf Ebene des Quelltexts.
  • Der grep-Passthrough gibt dir Gewissheit auf Ebene der Zeichenketten.

Ein Beispiel aus serde: missing_field in serde/src/private/de.rs wird nur aus Code aufgerufen, den serde_derive beim Build erzeugt. Die Aufrufstellen stehen als Tokens in quote_spanned!. Der Graph sieht dort keinen Aufruf. search-pattern findet die Aufrufstellen, search findet die Definition über ihre Bedeutung.

$ greppy who-calls missing_field
no callers
$ greppy search-pattern 'de::missing_field'
serde_derive/src/de.rs:795  serde_derive/src/de.rs::Function::expr_is_missing
serde_derive/src/de/enum_adjacently.rs:80  serde_derive/src/de/enum_adjacently.rs::Function::deserialize
$ greppy search "treat a missing Option field as None"
serde/src/private/de.rs:45  MissingFieldDeserializer::deserialize_option — visits the None variant of an Option
…
serde/src/private/de.rs:24  missing_field — deserializes a value from a named field, returning an error if absent
…

Ein leeres Graph-Ergebnis beweist also nicht, dass keine Beziehung existiert. Wechsle die Navigationsmethode, bevor du daraus etwas schließt. Dasselbe gilt für rename: Es meldet die Referenzen, die es nicht auflösen konnte. Referenzen, die der Graph nicht sieht, benennt es nicht um.

Sprachstufen

Mehr als 60 Sprachen haben Parser-Unterstützung. Der Graph ist pro Sprache vollständig geprüft, aktuell für Rust, Python, Java, JavaScript, TypeScript, Go, C++, C#, Kotlin, Swift und Ruby. Die übrigen prozeduralen Sprachen extrahieren dieselben Beziehungen ohne diese formale Garantie. Deklarative Formate wie JSON, YAML, TOML und Markdown haben Symbole und Textsuche, aber keinen Call-Graph. Siehe Sprachen.

Belege und Hinweise

Quelltext und Graph sind die maßgeblichen Belege. Die Ein-Satz-Hinweise schreibt ein lokales Modell: Sie sind Navigationshilfen, kein Quelltext, und sie fehlen, wenn Inferenz oder Validierung scheitern. Lies den zurückgegebenen Code, bevor du dich darauf verlässt, was eine Funktion tut.

Aktualität

greppy gibt nie wissentlich veralteten Quelltext als Beleg aus. Passt der Index nicht mehr zum Working Tree, aktualisiert ihn die Abfrage. Läuft gerade eine größere Aktualisierung, liefert sie einen vorübergehenden Fehler mit Hinweis, wann du es erneut versuchst.

Semantische Suche

  • search gibt höchstens acht gerankte Treffer aus. Weder --all noch --limit erweitern das.
  • Solange die Embeddings noch entstehen, liefert search eine Fortschrittszeile und keine Treffer. Halbe semantische Ergebnisse gibt greppy nie aus.
$ greppy search "deserialize a map" --all
serde_core/src/de/value.rs:1617  MapAccessDeserializer::new — constructs a MapAccessDeserializer from the given map
serde/src/private/de.rs:1608  MapDeserializer::new — constructs a MapDeserializer from a vector of Content values
serde/src/private/de.rs:2554  MapRefDeserializer::new — constructs a MapRefDeserializer from a slice of Content values
serde_core/src/de/value.rs:1245  MapDeserializer::new — constructs a MapDeserializer from an iterator
serde_core/src/de/value.rs:1227  MapDeserializer
serde_core/src/de/value.rs:1611  MapAccessDeserializer
serde/src/private/de.rs:1656  MapDeserializer::deserialize_any — deserializes a value by visiting its map contents
serde/src/private/de.rs:1600  MapDeserializer

Reichweite eines Index

Der Graph-Namensraum gilt pro Repository. Mehrere Pakete eines Workspaces unter einer Root bilden einen gemeinsamen Beziehungsraum. Mehrere Repositories fragst du nacheinander mit --root ab; eine gemeinsame Abfrage über mehrere Roots gibt es nicht. greppy bleibt lokal: Es gibt keinen zentralen Team-Server.

Bearbeiten

  • patch ändert bestehende Dateien. Dateien anlegen oder löschen kann es nicht. Eine neue Datei legst du mit greppy write PATH an, als eigene Transaktion.
  • undo verweigert, wenn eine spätere Änderung denselben Bereich berührt hat (Exit 12).
  • --verify lädt nie einen Checker herunter. Es nutzt, was lokal installiert ist, und endet nach einem begrenzten Timeout. Es prüft Syntax und Build; Tests laufen mit, wenn du GREPPY_VERIFY_TEST_COMMAND setzt. Ein fehlgeschlagener Test endet mit Exit 17.
$ greppy replace-text util.py "max(lo, min(x, hi))" "min(max(x, lo), hi)"
applied util.py:2  362417
│
│     1  def clamp(x, lo, hi):
│>    2      return min(max(x, lo), hi)
$ greppy replace-text util.py "min(max(x, lo), hi)" "min(max(x, lo), hi)  # clamp"
applied util.py:2  c49237
│
│     1  def clamp(x, lo, hi):
│>    2      return min(max(x, lo), hi)  # clamp
$ greppy undo 362417
util.py no longer looks the way that edit left it

Eingebauter Agent (Beta)

  • Er braucht ein lokales, Anthropic-kompatibles Gateway, erreichbar über reines HTTP (GREPPY_ENDPOINT, Standard http://127.0.0.1:8317). greppy liefert kein Chat-Modell mit.
  • Repositories mit Submodulen unterstützt er noch nicht. Ein Repository mitten in Merge, Rebase oder Cherry-pick, mit Git LFS oder mit Checkout-Filtern bricht vor dem Modellstart ab (Exit 2).
  • Die Sandbox begrenzt Schreibzugriffe, nicht Lesen oder Netzwerk.
  • Fernsteuerung und agent serve laufen über Unix-Sockets. Jeder Prozess unter deinem Benutzer kann eine laufende Session steuern.

Siehe Eingebauter Agent.

Browser-Tool (Beta)

  • Die Verben können sich noch ändern.
  • Es erscheint für macOS und Linux.
  • Ein Ziel, das auf mehr als einen Knoten passt, scheitert mit Exit 34, außer du gibst --first, --last oder --nth N an.
  • SubtleCrypto ist in Seiten vorübergehend abgeschaltet. crypto.getRandomValues und crypto.randomUUID bleiben verfügbar.
  • greppy web endpoint, ein nativer Playwright-Connect-Endpunkt, läuft auf einer eigenen Release-Spur.

Siehe Browser-Tool.

Plattformen

Release-Ziele sind macOS auf Apple Silicon mit Metal und Linux x86_64 mit NVIDIA CUDA. Windows ist für 0.4.1 kein Release-Ziel. macOS auf Intel und Linux auf ARM64 sind nicht freigegeben, der Installer lehnt sie ab. Release-Builds rechnen nicht auf der CPU: --device cpu endet mit Exit 73. Siehe Plattformen.