Dokumentation

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.

Geteilter Bildschirm: derselbe Coding-Agent beantwortet eine who-calls-Frage, 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.

greppy nutzen

Referenz