Przejdź do treści
cd /languages
  • Napędzany konwencjami
  • Programowanie
  • Obsługa AST i symboli

Ruby w Maguyva: grafy kodu dla Rails i aplikacji Ruby

Maguyva obsługuje Ruby przez AST, symbole i graf, dzięki czemu agenci AI śledzą klasy, moduły, metody singletonowe i konstruktory w bazach kodu Rails i Ruby.

Dlaczego repozytoria Ruby sprawiają kłopot powierzchownym narzędziom AI

Ruby mocno opiera się na konwencjach i metaprogramowaniu. Metody są generowane przez attr_accessor, klasy są ponownie otwierane w innych plikach, a przestrzenie nazw zagnieżdżają kilka poziomów modułów. Czytelna powierzchnia ukrywa, do której metody naprawdę trafia wywołanie, a toporne wyszukiwanie tekstowe zwraca każde call i każde perform w aplikacji.

Maguyva daje agentowi klasy, moduły, metody i ich wywołujących jako strukturę, aby śledził zmianę w całej aplikacji zamiast zgadywać.

Co Maguyva wyodrębnia w Ruby

Maguyva obejmuje pliki .rb, .rbw, .rake i .gemspec oraz Gemfile i Rakefile. Wyodrębniane są metody instancji i metody singletonowe (def self.call), przy czym metody singletonowe są oznaczane jako statyczne. Deklaracje attr_reader, attr_writer i attr_accessor liczą się jako metody dostępowe, a symbole są kwalifikowane przestrzenią nazw modułu i klasy.

ClassName.new i Namespace::ClassName.new liczą się jako tworzenie instancji, a typowanie odbiorców śledzi lokalne przypisania i @instance_variables, dzięki czemu wywołanie na przypisanym obiekcie można rozwiązać do jego klasy. Graf zapisuje też dziedziczenie, dołączanie modułów, nadpisania, krawędzie raise i rescue oraz odczyty i zapisy.

Wywołania metaprogramowania (define_method, send, method_missing, class_eval i podobne), pomocnicze typy T:: z Sorbeta oraz typowe wywołania enumerable (each, collect, reject i podobne) są filtrowane z relacji, aby wyróżnić kod aplikacji.

Przykładowe prompty dla agentów

  • „Kto wywołuje Billing::ChargeCustomer.call i z których zadań i kontrolerów?” (find_symbol, potem dependency_search incoming)
  • „Które modele dziedziczą po ApplicationRecord i dołączają Auditable?” (dependency_search)
  • „Prześledź, co się dzieje po oznaczeniu zamówienia jako opłacone.” (get_task_context)

Znane ograniczenia

  • W Ruby require i load to zwykłe wywołania metod, więc preset imports w structural_search niczego nie wybiera. Aby je wypisać, użyj text_pattern_search.
  • Metody tworzone w czasie działania przez define_method lub obsługiwane przez method_missing nie są wyodrębniane jako symbole, a te wywołania są filtrowane jako szum metaprogramowania.
  • Ruby nie ma składni dekoratorów, więc relacje dekoratorów są oznaczone jako nie dotyczy.

Kolejne kroki

Podłącz repozytorium za pomocą szybkiego startu, a potem sprawdź macierz obsługi na stronie zgodności. W przypadku innych repozytoriów w językach dynamicznych porównaj z przewodnikiem po języku Python.

Najlepsze dopasowanie

  • > Monolity Rails, w których modele, obiekty usług, zadania i concerny wywołują się nawzajem w wielu katalogach.
  • > Gemy i usługi w Ruby z głęboko zagnieżdżonymi przestrzeniami nazw modułów i współdzielonymi klasami bazowymi.
  • > Zespoły, które chcą określić zakres zmiany z agentem AI, zanim dotkną modelu lub usługi, od której zależy pół aplikacji.

Workflow agentów

  • > Znaleźć wszystkich wywołujących obiekt usługi lub metodę modelu przed zmianą ich zachowania.
  • > Prześledzić, gdzie klasa jest tworzona przez `.new` i które metody wykonują się potem.
  • > Zmapować, które klasy dziedziczą po klasie bazowej lub dołączają moduł, przed refaktoryzacją.

Szczegóły silnika

  • > Obsługa Ruby obejmuje `.rb`, `.rbw`, `.rake`, `.gemspec`, `Gemfile` i `Rakefile`. Metody singletonowe są oznaczane jako statyczne, a deklaracje `attr_*` liczą się jako metody dostępowe.
  • > `ClassName.new` liczy się jako tworzenie instancji, a typowanie odbiorców śledzi lokalne przypisania i zmienne instancji.
  • > Wywołania metaprogramowania, takie jak `define_method` i `send`, pomocnicze `T::` z Sorbeta oraz typowe wywołania enumerable są filtrowane z relacji.

Przydatne punkty wejścia MCP

  • find_symbol

    Używaj go z klasą, modułem lub metodą z przestrzenią nazw, taką jak `Billing::ChargeCustomer.call`.

  • dependency_search

    Przed zmianą użyj przejścia incoming na modelu lub obiekcie usługi, aby zobaczyć wywołujących i podklasy.

  • text_pattern_search

    Używaj go do ścieżek `require`, ciągów tras i metod definiowanych dynamicznie, których graf nie widzi.