Funktionen

Ü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, impact und path
  • Suchen: search, search-symbol und search-pattern