Перейти до вмісту
cd /languages
  • Вбудовувані скрипти
  • Програмування
  • Підтримка AST і символів

Lua у Maguyva: графи коду для ігор, плагінів і OpenResty

Maguyva підтримує Lua з AST, символами та графом, щоб ШІ-агенти могли простежувати модулі, методи з двокрапкою, класи на метатаблицях і ланцюжки require в коді на Lua.

Де Lua збиває з пантелику поверхові ШІ-інструменти

У Lua немає ключового слова для класів. Об’єкти є таблицями, методи є функціями, що зберігаються в них, а успадкування є викликом setmetatable. Модуль є тим, що повертає require. Структура справжня, але живе в домовленостях, яких текстовий пошук не розуміє.

Maguyva читає ці домовленості як структуру, і агент може запитати, хто викликає метод або які таблиці розширюють базову, і отримати пряму відповідь.

Що Maguyva витягує з Lua

Maguyva охоплює файли .lua. Витягуються оголошення функцій, визначення local function і функціональні вирази, а методи з двокрапкою, як-от function Account:deposit(), приписуються таблиці-власниці Account. Ланцюжки методів простежуються виклик за викликом, а виклики через self лишаються прив’язаними до охопного об’єкта.

Домовленості Lua стають зв’язками так:

  • require, dofile і loadfile фіксують імпорти.
  • Виклик setmetatable на рівні модуля фіксує успадкування.
  • ClassName:new(), ClassName.new() і setmetatable({...}, ClassName) вважаються створенням екземпляра.
  • error() фіксує викидання помилки, а pcall і xpcall фіксують її перехоплення.

Граф також фіксує читання й запис і потік керування.

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

  • «Хто викликає Inventory:addItem і з яких скриптів?» (find_symbol, потім dependency_search за вхідними зв’язками)
  • «Які модулі завантажують util.http через require?» (dependency_search)
  • «Простеж, що відбувається, коли гравець отримує шкоду.» (get_task_context)

Відомі обмеження

  • Близько 150 імен відфільтровано зі зв’язків: стандартна бібліотека Lua (string, table, math, io, os, coroutine, debug і utf8), а також API vim.* з Neovim і ngx.* з OpenResty. Виклики цих API не є ребрами графа; щоб знайти їх, використовуйте text_pattern_search.
  • Оскільки модулі й класи будуються зі звичайних викликів і таблиць, пресети classes і imports у structural_search для Lua нічого не вибирають. Використовуйте натомість find_symbol або text_pattern_search.
  • У Lua немає інтерфейсів та анотацій типів, тому зв’язки реалізації інтерфейсів і посилань на типи позначено як незастосовні.

Наступні кроки

Під’єднайте репозиторій за швидким стартом, потім перегляньте матрицю підтримки на сторінці сумісності. Для рушіїв, що вбудовують Lua в нативний код, прочитайте також посібник із C.

Найкраще підходить

  • > Ігровий код і скрипти рушіїв, де модулі, класи на таблицях та обробники подій викликають одне одного.
  • > Плагіни Neovim і конфігурації редактора, розбиті на багато модулів, що завантажуються через require.
  • > OpenResty та інші сценарії вбудовування Lua, де обробники запитів сусідять зі спільними службовими модулями.

Робочі процеси агента

  • > Знайти всі виклики функції модуля, перш ніж змінювати її аргументи.
  • > Простежити, які модулі завантажують спільний службовий модуль через require, перш ніж його переносити.
  • > Скласти карту таблиць, що успадковують від базового класу через `setmetatable`.

Деталі рушія

  • > Підтримка Lua охоплює файли `.lua`. Методи з двокрапкою, як-от `function Account:deposit()`, приписуються таблиці-власниці.
  • > `require`, `dofile` і `loadfile` фіксують імпорти, `setmetatable` на рівні модуля фіксує успадкування, а `ClassName:new()` вважається створенням екземпляра.
  • > `error()` фіксує викидання помилки, а `pcall` її перехоплення; близько 150 імен стандартної бібліотеки, `vim.*` і `ngx.*` відфільтровано.

Корисні точки входу MCP

  • find_symbol

    Використовуйте для функції модуля чи методу з двокрапкою, коли потрібні визначення й виклики.

  • dependency_search

    Використовуйте обхід вхідних зв'язків, щоб побачити, які файли завантажують спільний модуль через require, перш ніж його переносити.

  • text_pattern_search

    Використовуйте для викликів `vim.*`, `ngx.*` чи стандартної бібліотеки, відфільтрованих із графа.