Перейти до вмісту
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`, рядків маршрутів і динамічно визначених методів, яких граф не бачить.