Zum Inhalt springen
cd /languages
  • Konventionsgetrieben
  • Programmierung
  • AST- und Symbol-Support

Ruby in Maguyva: Code-Graphen für Rails- und Ruby-Apps

Maguyva unterstützt Ruby mit AST, Symbolen und Graph, damit KI-Agenten Klassen, Module, Singleton-Methoden und Konstruktoraufrufe in Rails- und Ruby-Codebasen verfolgen.

Warum Ruby-Repositories oberflächlichen KI-Tools schwerfallen

Ruby setzt stark auf Konventionen und Metaprogrammierung. Methoden entstehen durch attr_accessor, Klassen werden in anderen Dateien wieder geöffnet, und Namespaces verschachteln mehrere Module tief. Die gut lesbare Oberfläche verbirgt, welche Methode ein Aufruf tatsächlich erreicht, und eine stumpfe Textsuche liefert jedes call und perform der App.

Maguyva gibt einem Agenten Klassen, Module, Methoden und ihre Aufrufer als Struktur, damit er eine Änderung durch die App verfolgen kann, statt zu raten.

Was Maguyva in Ruby extrahiert

Maguyva deckt .rb-, .rbw-, .rake- und .gemspec-Dateien sowie Gemfile und Rakefile ab. Instanzmethoden und Singleton-Methoden (def self.call) werden extrahiert, wobei Singleton-Methoden als statisch markiert werden. attr_reader-, attr_writer- und attr_accessor-Deklarationen zählen als Accessor-Methoden, und Symbole werden mit ihrem Modul- und Klassen-Namespace qualifiziert.

ClassName.new und Namespace::ClassName.new zählen als Instanziierung, und die Receiver-Typisierung folgt lokalen Zuweisungen und @instance_variables, sodass ein Aufruf auf einem zugewiesenen Objekt zu seiner Klasse aufgelöst werden kann. Der Graph erfasst außerdem Vererbung, Modul-Einbindung, Overrides, raise- und rescue-Kanten sowie Lese- und Schreibzugriffe.

Metaprogrammierungs-Aufrufe (define_method, send, method_missing, class_eval und ähnliche), Sorbets T::-Typhelfer und gängige Enumerable-Aufrufe (each, collect, reject und ähnliche) werden aus den Beziehungen gefiltert, damit der Anwendungscode hervortritt.

Beispiel-Prompts für Agenten

  • „Wer ruft Billing::ChargeCustomer.call auf, und aus welchen Jobs und Controllern?“ (find_symbol, dann dependency_search incoming)
  • „Welche Models erben von ApplicationRecord und binden Auditable ein?“ (dependency_search)
  • „Verfolge, was passiert, nachdem eine Bestellung als bezahlt markiert wurde.“ (get_task_context)

Bekannte Grenzen

  • require und load sind in Ruby gewöhnliche Methodenaufrufe, daher wählt das Preset imports in structural_search nichts aus. Verwende text_pattern_search, um sie aufzulisten.
  • Methoden, die zur Laufzeit mit define_method erzeugt oder von method_missing behandelt werden, werden nicht als Symbole extrahiert, und diese Aufrufe werden als Metaprogrammierungs-Rauschen gefiltert.
  • Ruby hat keine Decorator-Syntax, daher sind Decorator-Beziehungen als nicht anwendbar markiert.

Nächste Schritte

Verbinde ein Repository über den Schnellstart und prüfe dann die Unterstützungsmatrix auf der Kompatibilitätsseite. Für andere Repositories in dynamischen Sprachen vergleiche mit dem Python-Leitfaden.

Am besten geeignet

  • > Rails-Monolithen, in denen Models, Service-Objekte, Jobs und Concerns sich über viele Verzeichnisse hinweg aufrufen.
  • > Gems und Ruby-Dienste mit tief verschachtelten Modul-Namespaces und gemeinsamen Basisklassen.
  • > Teams, die mit KI-Agenten eine Änderung eingrenzen wollen, bevor sie ein Model oder einen Dienst anfassen, von dem die halbe App abhängt.

Agentenabläufe

  • > Jeden Aufrufer eines Service-Objekts oder einer Model-Methode finden, bevor sich ihr Verhalten ändert.
  • > Nachverfolgen, wo eine Klasse mit `.new` instanziiert wird und welche Methoden danach laufen.
  • > Vor einem Refactoring erfassen, welche Klassen von einer Basisklasse erben oder ein Modul einbinden.

Engine-Einordnung

  • > Die Ruby-Unterstützung deckt `.rb`, `.rbw`, `.rake`, `.gemspec`, `Gemfile` und `Rakefile` ab. Singleton-Methoden werden als statisch markiert, und `attr_*`-Deklarationen zählen als Accessor-Methoden.
  • > `ClassName.new` zählt als Instanziierung, und die Receiver-Typisierung folgt lokalen Zuweisungen und Instanzvariablen.
  • > Metaprogrammierungs-Aufrufe wie `define_method` und `send`, Sorbets `T::`-Helfer und gängige Enumerable-Aufrufe werden aus den Beziehungen gefiltert.

Nützliche MCP-Einstiegspunkte

  • find_symbol

    Nutz es für eine Klasse, ein Modul oder eine Methode mit Namespace wie `Billing::ChargeCustomer.call`.

  • dependency_search

    Nutz vor einer Änderung die eingehende Traversierung auf einem Model oder Service-Objekt, um Aufrufer und Unterklassen zu sehen.

  • text_pattern_search

    Nutz es für `require`-Pfade, Routen-Strings und dynamisch definierte Methoden, die der Graph nicht sieht.