Über 60 Sprachen, ein Befehlssatz
Was du davon hast
Dein Repository hat ein Python-Backend, einen Go-Dienst, ein TypeScript-Frontend und Java? Dein Agent fragt überall gleich. greppy who-calls NAME findet die Aufrufer, ob in Python, Go, TypeScript oder Java, greppy search findet Code nach Bedeutung über alle Sprachen hinweg. Kein Suchmuster pro Sprache, kein Language Server pro Sprache, ein Befehlssatz für das ganze Repository.
Ein Repository, vier Sprachen
In einem kleinen Projekt parst in jeder Sprache eine Funktion einen Preis, eine zweite ruft sie auf.
$ git ls-files
go/cart.go
go/go.mod
go/pricing.go
java/shop/Cart.java
java/shop/Pricing.java
python/cart.py
python/pricing.py
ts/cart.ts
ts/pricing.ts
Nach greppy index . stellt dein Agent in jeder Sprache dieselbe Frage.
$ greppy who-calls parse_price
python/cart.py:5 cart_total
$ greppy who-calls ParsePrice
go/cart.go:6 CartTotal
$ greppy who-calls parsePrice
ts/cart.ts:4 cartTotal
$ greppy who-calls parseAmount
java/shop/Cart.java:9 Cart::sum
Jede Antwort nennt die Aufrufstelle und die Funktion, in der sie steht. Die Suche nach Bedeutung findet alle vier Preis-Parser mit einer Frage, jeden mit einem Satz, was er tut:
$ greppy search "turn a price string into a number"
ts/pricing.ts:1 parsePrice — parses a string into a number
go/pricing.go:5 ParsePrice — parses a string into a float64
python/pricing.py:1 parse_price — parses a text string into a rounded float value
java/shop/Pricing.java:4 Pricing::parseAmount — parses a string into a double
…
greppy where-am-i nennt die Sprachen in seiner ersten Zeile: für dieses Projekt go, java, python, typescript, 9 files, 10 definitions, für serde rust, toml, markdown, 339 files, 3,908 definitions.
In Rust stellst du serde dieselbe Frage:
$ greppy who-calls visit_content_map
serde/src/private/de.rs:1152 ContentDeserializer::deserialize_any
serde/src/private/de.rs:1399 ContentDeserializer::deserialize_map
serde/src/private/de.rs:1415 ContentDeserializer::deserialize_struct
Genauso fragst du in Elixir, Kotlin und Zig, hier alle drei in einem Projekt:
$ greppy who-calls parse_price
cart.ex:3 total
$ greppy who-calls parsePriceKt
Pricing.kt:5 cartTotalKt
$ greppy who-calls parsePriceZig
pricing.zig:10 cartTotalZig
So funktioniert es
Jede Sprache bekommt einen eigenen tree-sitter-Parser, einkompiliert ins Binary. greppy bindet 66 tree-sitter-Grammatiken ein. Daraus entstehen Definitionen und, je nach Sprache, Kanten für Aufrufe, Verwendungen, Typreferenzen und Imports. Alle Sprachen landen im selben Graph und im selben Index, deshalb funktionieren who-calls, search und read in einem gemischten Repository ohne Einstellungen.
| Stufe | Sprachen | Was du bekommst |
|---|---|---|
| Graph vollständig geprüft | Rust, Python, Java, JavaScript, TypeScript, Go, C++, C#, Kotlin, Swift, Ruby | Symbole, Suche, Lesen, Ändern und ein Graph, dessen Aufrufe, Verwendungen, Typreferenzen und Imports pro Sprache auf Vollständigkeit geprüft sind |
| Graph-Kanten | weitere prozedurale Sprachen, zum Beispiel Elixir, Zig, Solidity, OCaml und Lua | Symbole, Suche, Lesen, Ändern, dazu Aufruf-, Verwendungs- und Import-Kanten |
| Symbole und Text | deklarative Formate wie TOML und Markdown | Schlüssel und Abschnitte als Symbole, dazu Textsuche |
Vollständig geprüft heißt: Für jede dieser elf Sprachen testet greppy dateiübergreifende Aufrufe, Verwendungen, Typreferenzen und Imports, dazu stabiles Neu-Indizieren, an Fixtures und echten Repositorys. Weitere Sprachen folgen in Wellen.
Die Suche nach Bedeutung hängt nicht an Graph-Kanten. EmbeddingGemma bettet die Definitionen jeder indizierten Sprache ein, das lokale Qwen-Modell schreibt den Satz unter jede gefundene Funktion. So findet search auch Code, den kein Aufruf verbindet.
Die Befehle
| Befehl | was er tut |
|---|---|
greppy where-am-i |
das Repository auf einen Blick, mit seinen Sprachen, Verzeichnissen und Einstiegspunkten |
greppy who-calls S |
wer S aufruft oder verwendet, in jeder Sprache mit Aufruf-Kanten |
greppy search "…" |
Definitionen nach Bedeutung, über alle Sprachen des Repositorys |
greppy search-symbol NAME |
Definitionen, deren Name NAME enthält, auch TOML-Schlüssel und Markdown-Abschnitte |
greppy read S |
genau eine Definition lesen, mit Datei und Zeilen |
greppy index . |
Graph und Embeddings für alle Sprachen des Repositorys bauen |
Mehr in der Doku
- Sprachen: die Stufen, die vollständig geprüften Sprachen und wie eine neue Sprache dazukommt
- Den Graph navigieren:
who-calls,callees,impactundpath - Suchen:
search,search-symbolundsearch-pattern