Перейти к содержимому
cd /languages
  • На соглашениях
  • Программирование
  • Поддержка AST и символов

Ruby в Maguyva: графы кода для Rails и приложений на Ruby

Maguyva поддерживает Ruby с AST, символами и графом, чтобы ИИ-агенты отслеживали классы, модули, синглтон-методы и конструкторы в кодовых базах Rails и Ruby.

Почему репозитории на Ruby трудны для поверхностных ИИ-инструментов

Ruby во многом опирается на соглашения и метапрограммирование. Методы генерируются через attr_accessor, классы переоткрываются в других файлах, а пространства имён вкладывают модули на несколько уровней. Читаемая поверхность скрывает, до какого метода на самом деле доходит вызов, а грубый текстовый поиск возвращает каждый call и perform в приложении.

Maguyva даёт агенту классы, модули, методы и их вызывающих в виде структуры, чтобы он прослеживал изменение по всему приложению, а не гадал.

Что Maguyva извлекает из Ruby

Maguyva охватывает файлы .rb, .rbw, .rake и .gemspec, а также Gemfile и Rakefile. Извлекаются методы экземпляра и синглтон-методы (def self.call), причём синглтон-методы помечаются как статические. Объявления attr_reader, attr_writer и attr_accessor считаются методами доступа, а символы квалифицируются пространством имён модуля и класса.

ClassName.new и Namespace::ClassName.new считаются созданием экземпляров, а типизация получателей отслеживает локальные присваивания и @instance_variables, так что вызов на присвоенном объекте можно разрешить в его класс. Граф также фиксирует наследование, подключение модулей, переопределения, рёбра raise и rescue, а также чтения и записи.

Вызовы метапрограммирования (define_method, send, method_missing, class_eval и подобные), типовые помощники T:: из Sorbet и распространённые вызовы Enumerable (each, collect, reject и подобные) отфильтровываются из связей, чтобы код приложения был на виду.

Примеры промптов для агентов

  • «Кто вызывает Billing::ChargeCustomer.call и из каких заданий и контроллеров?» (find_symbol, затем dependency_search incoming)
  • «Какие модели наследуют от ApplicationRecord и подключают Auditable?» (dependency_search)
  • «Проследи, что происходит после того, как заказ помечен как оплаченный.» (get_task_context)

Известные ограничения

  • В Ruby require и load — обычные вызовы методов, поэтому пресет imports в structural_search ничего не выбирает. Чтобы перечислить их, используйте text_pattern_search.
  • Методы, созданные во время выполнения через define_method или обрабатываемые method_missing, не извлекаются как символы, а такие вызовы отфильтровываются как шум метапрограммирования.
  • В Ruby нет синтаксиса декораторов, поэтому связи декораторов помечены как неприменимые.

Следующие шаги

Подключите репозиторий по быстрому старту, затем изучите матрицу поддержки на странице совместимости. Для других репозиториев на динамических языках сравните с руководством по языку Python.

Лучше всего подходит

  • > Монолиты на Rails, где модели, сервис-объекты, задания и concerns вызывают друг друга из множества каталогов.
  • > Гемы и сервисы на Ruby с глубокими пространствами имён модулей и общими базовыми классами.
  • > Команды, которые хотят очертить изменение с помощью ИИ-агента, прежде чем трогать модель или сервис, от которых зависит половина приложения.

Сценарии работы агента

  • > Найти всех, кто вызывает сервис-объект или метод модели, прежде чем менять их поведение.
  • > Проследить, где класс создаётся через `.new` и какие методы выполняются дальше.
  • > Перед рефакторингом составить карту классов, наследующих от базового класса или подключающих модуль.

Детали движка

  • > Поддержка Ruby охватывает `.rb`, `.rbw`, `.rake`, `.gemspec`, `Gemfile` и `Rakefile`. Синглтон-методы помечаются как статические, а объявления `attr_*` считаются методами доступа.
  • > `ClassName.new` считается созданием экземпляра, а типизация получателей отслеживает локальные присваивания и переменные экземпляра.
  • > Вызовы метапрограммирования, такие как `define_method` и `send`, помощники `T::` из Sorbet и распространённые вызовы Enumerable отфильтровываются из связей.

Полезные точки входа MCP

  • find_symbol

    Используйте для класса, модуля или метода с пространством имён, например `Billing::ChargeCustomer.call`.

  • dependency_search

    Перед изменением используйте обход incoming для модели или сервис-объекта, чтобы увидеть вызывающих и подклассы.

  • text_pattern_search

    Используйте для путей `require`, строк маршрутов и динамически определённых методов, которых граф не видит.