greppy
greppy ist ein Werkzeug zum Navigieren und Ändern von Code für Coding-Agents. Es nimmt auch ganz normale grep-Aufrufe an: Die laufen über das echte System-grep und geben stdout, stderr und Exit-Code Byte für Byte weiter. Alles andere ist ein strukturierter Befehl über einen vorberechneten Symbolgraphen und einen semantischen Index, der auf deinem Rechner läuft.
Die Befehle beantworten die Fragen, für die ein Agent sonst mehrere Such- und Leserunden braucht: Wer ruft diese Funktion auf? Was bricht, wenn ich sie ändere? Wo steckt der Code, der X tut? Maßgeblich sind deterministische Belege aus Quelltext und Graph. Die lokal erzeugten Kurzbeschreibungen stehen als Navigationshinweis neben der exakten Signatur; entschieden wird am zurückgegebenen Code.
In dieser Demo beantwortet derselbe Coding-Agent (MiniMax-M3, gesteuert von Pi) eine who-calls-Frage an einem echten Repository: links mit grep, rechts mit greppy.

Die Fragen, die greppy beantwortet
Alle Beispiele dieser Doku laufen gegen serde in Version 1.0.229.
| Du willst wissen | Befehl |
|---|---|
| Wer ruft diese Funktion auf? | greppy who-calls visit_content_map |
| Was bricht, wenn ich das ändere? | greppy impact get_renames |
| Wo ist der Code, der X tut? | greppy search "check whether a field should be skipped when serializing" |
| Was tut diese Funktion? | greppy brief visit_content_map |
| Wie ändere ich genau diesen Code? | greppy read visit_content_map --handle, dann ein Edit-Befehl |
| Lief der Build durch, und wenn nicht, warum? | greppy bash-smart -- cargo test |
Jede Antwort ist eine kompakte Liste: Fundstelle als datei:zeile, der aufgelöste Name und, nach einem Gedankenstrich, ein generierter Hinweis. who-calls nennt die Zeile des Aufrufs.
$ 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
impact liefert in einem Aufruf den ganzen Baum der transitiven Aufrufer. Eine eingerückte Zeile ruft die Zeile darüber auf, (above) verweist auf einen Eintrag, der schon im Baum steht. Hier führt der Weg von einer Hilfsfunktion bis zu den Einstiegspunkten von #[derive(Serialize)] und #[derive(Deserialize)].
$ greppy impact get_renames
serde_derive/src/internals/attr.rs:237 Container::from_ast — builds rename rules from a DeriveInput's attributes
serde_derive/src/internals/ast.rs:62 Container::from_ast — converts a syn::DeriveInput into a Container, handling enums and structs
serde_derive/src/de.rs:25 expand_derive_deserialize — expands a syn::DeriveInput into a TokenStream
serde_derive/src/lib.rs:122 derive_deserialize — derives deserialize code from a TokenStream
serde_derive/src/ser.rs:13 expand_derive_serialize — expands a syn::DeriveInput into a TokenStream of serialize methods
serde_derive/src/lib.rs:114 derive_serialize — derives serialization from a TokenStream
serde_derive/src/internals/attr.rs:748 Variant::from_ast — parses rename and alias attributes from a syn::Variant
serde_derive/src/internals/ast.rs:133 enum_from_ast — converts a list of syn::Variant entries into a flat list
serde_derive/src/internals/ast.rs:62 Container::from_ast (above)
search findet Code über seine Bedeutung, auch wenn du den Namen nicht kennst.
$ greppy search "check whether a field should be skipped when serializing"
serde_derive/src/internals/attr.rs:1286 skip_serializing — returns the skip_serializing field value as a boolean
serde_derive/src/ser.rs:160 needs_serialize_bound — decides whether a field should be serialized
serde_derive/src/internals/check.rs:455 allow_transparent — decides whether a field is allowed to be transparent
serde_core/src/ser/mod.rs:1923 SerializeStruct::skip_field — acts as a no-op skip that returns Ok without doing anything
serde_derive/src/internals/check.rs:226 check_variant_skip_attrs — reports errors when variants lack required serialization attributes
serde_derive/src/internals/attr.rs:1290 skip_deserializing — returns the skip_deserializing flag
serde_core/src/ser/mod.rs:1993 SerializeStructVariant::skip_field — acts as a no-op skip that returns Ok without doing anything
serde_derive/src/internals/attr.rs:956 Variant::skip_serializing — returns the skip_serializing field value as a boolean
Normales grep läuft weiter über dasselbe Binary, mit grep-Ausgabe und grep-Exit-Codes.
$ greppy -c deny_unknown_fields serde_derive/src/internals/attr.rs
7
$ cmp <(greppy -rn deny_unknown_fields serde_derive/src) <(grep -rn deny_unknown_fields serde_derive/src) && echo identisch
identisch
$ greppy -rn TODO serde/src; echo "exit $?"
exit 1
Erste Schritte
Neu bei greppy? Der Schnellstart führt dich durch Installation, erste Abfrage und die Anbindung deines Agents.
- So funktioniert greppy: der Graph, die eingebetteten Modelle, der Lebenszyklus des Index und die Frischeprüfung.
- Agent einrichten: eine Prompt-Datei, kein MCP-Server.
greppy nutzen
- Im Graphen navigieren:
who-calls,callees,brief,impact,path. - Suchen: nach Bedeutung, nach Name, nach literalem Text.
- Quelltext lesen: exakte Definitionen, gefaltete Definitionen, Dateiseiten und Edit-Handles.
- Transaktional editieren: Handles mit Hash, atomare Patches, Verifikation und Undo.
- grep- und ripgrep-Passthrough: was Byte für Byte gleich bleibt und wie ripgrep-Syntax weitergeleitet wird.
- Builds und Tests ausführen:
bash-smartliefert ein Urteil und die Diagnosen statt des ganzen Logs. - Worktrees und geteilte Indexe: verknüpfte Git-Worktrees nutzen einen gemeinsamen, unveränderlichen Index (0.4.1).
- Eingebauter Agent und Browser-Werkzeug, beide in Beta.
Referenz
- CLI-Referenz: jeder Befehl, jedes Flag, jeder Exit-Code und jede Umgebungsvariable.
- Sprachen und Plattformen: was geparst, vollständig geprüft und veröffentlicht ist.
- Performance und Ressourcenbedarf und Benchmarks und Paper: gemessene Zahlen und wie sie gemessen wurden.
- Grenzen: was ein statischer Graph nicht sieht.
- Lokale Daten, Datenschutz und Deinstallation und Sicherheit und Verifikation.