Spring til indhold
cd /languages
  • Indlejret scripting
  • Programmering
  • AST- og symbolunderstøttelse

Lua i Maguyva: kodegrafer til spil, plugins og OpenResty

Maguyva understøtter Lua med AST, symboler og graf, så AI-agenter kan følge moduler, kolonmetoder, metatabelklasser og require-kæder i Lua-kode.

Hvor Lua får overfladiske AI-værktøjer til at snuble

Lua har intet nøgleord til klasser. Objekter er tabeller, metoder er funktioner, der gemmes i dem, og nedarvning er et kald til setmetatable. Et modul er hvad som helst, require returnerer. Strukturen er ægte, men den bor i konventioner, som tekstsøgning ikke forstår.

Maguyva læser disse konventioner som struktur, så en agent kan spørge, hvem der kalder en metode, eller hvilke tabeller der udvider en base, og få et direkte svar.

Hvad Maguyva udtrækker i Lua

Maguyva dækker .lua-filer. Funktionsdeklarationer, local function-definitioner og funktionsudtryk udtrækkes, og kolonmetoder som function Account:deposit() knyttes til deres ejertabel, Account. Metodekæder følges kald for kald, og kald på self forbliver knyttet til det omgivende objekt.

Konventionerne i Lua bliver til relationer sådan her:

  • require, dofile og loadfile registrerer imports.
  • Et setmetatable-kald på modulniveau registrerer nedarvning.
  • ClassName:new(), ClassName.new() og setmetatable({...}, ClassName) tæller som instansiering.
  • error() registrerer et throw, og pcall og xpcall registrerer en catch.

Grafen registrerer også læsninger og skrivninger samt kontrolflow.

Eksempler på prompts til agenter

  • “Hvem kalder Inventory:addItem, og fra hvilke scripts?” (find_symbol, derefter dependency_search incoming)
  • “Hvilke moduler indlæser util.http med require?” (dependency_search)
  • “Spor hvad der sker, når spilleren tager skade.” (get_task_context)

Kendte begrænsninger

  • Omkring 150 navne filtreres fra relationerne: Luas standardbibliotek (string, table, math, io, os, coroutine, debug og utf8) plus Neovims API vim.* og OpenRestys API ngx.*. Kald til disse API’er er ikke kanter i grafen, så brug text_pattern_search til at finde dem.
  • Fordi moduler og klasser bygges af almindelige kald og tabeller, vælger presettene classes og imports i structural_search intet for Lua. Brug i stedet find_symbol eller text_pattern_search.
  • Lua har hverken interfaces eller typeannotationer, så relationer for interface-implementering og typereferencer er markeret som ikke relevante.

Næste skridt

Tilslut et repository med hurtigstarten, og se derefter understøttelsesmatricen på kompatibilitetssiden. For motorer, der indlejrer Lua i native kode, kan du også læse guiden til C.

Bedst egnet til

  • > Spilkode og motorscripts, hvor moduler, tabelbaserede klasser og hændelseshandlere kalder hinanden.
  • > Neovim-plugins og editorkonfiguration fordelt på mange moduler, der indlæses med require.
  • > OpenResty og anden indlejret Lua, hvor request-handlere ligger ved siden af delte hjælpemoduler.

Agent-arbejdsgange

  • > Finde alle kaldere af en modulfunktion, før dens argumenter ændres.
  • > Spore hvilke moduler der indlæser et delt hjælpemodul med require, før det flyttes.
  • > Kortlægge hvilke tabeller der arver fra en basisklasse via `setmetatable`.

Motordetaljer

  • > Lua-understøttelsen dækker `.lua`. Kolonmetoder som `function Account:deposit()` knyttes til deres ejertabel.
  • > `require`, `dofile` og `loadfile` registrerer imports, `setmetatable` på modulniveau registrerer nedarvning, og `ClassName:new()` tæller som instansiering.
  • > `error()` registrerer et throw og `pcall` en catch, mens omkring 150 navne fra standardbiblioteket, `vim.*` og `ngx.*` filtreres fra.

Nyttige MCP-indgange

  • find_symbol

    Brug det til en modulfunktion eller kolonmetode, når du har brug for definitionen og kalderne.

  • dependency_search

    Brug incoming-traversering på et delt modul for at se, hvilke filer der indlæser det med require, før det flyttes.

  • text_pattern_search

    Brug det til kald til `vim.*`, `ngx.*` eller standardbiblioteket, som filtreres fra grafen.