Saltar al contenido
cd /languages
  • Scripting embebido
  • Programación
  • Soporte de AST y símbolos

Lua en Maguyva: grafos de código para juegos, plugins y OpenResty

Maguyva admite Lua con AST, símbolos y grafo, para que los agentes de IA sigan módulos, métodos con dos puntos, clases con metatablas y cadenas de require en código Lua.

Dónde Lua hace tropezar a las herramientas de IA superficiales

Lua no tiene una palabra clave para clases. Los objetos son tablas, los métodos son funciones guardadas en ellas y la herencia es una llamada a setmetatable. Un módulo es lo que devuelva require. La estructura es real, pero vive en convenciones que una búsqueda de texto no entiende.

Maguyva lee esas convenciones como estructura, para que un agente pueda preguntar quién llama a un método o qué tablas extienden una base y obtener una respuesta directa.

Qué extrae Maguyva en Lua

Maguyva cubre archivos .lua. Se extraen declaraciones de funciones, definiciones local function y expresiones de función, y los métodos con dos puntos como function Account:deposit() se atribuyen a su tabla propietaria, Account. Las cadenas de métodos se siguen llamada a llamada, y las llamadas sobre self quedan ligadas al objeto que las contiene.

Las convenciones de Lua se convierten en relaciones:

  • require, dofile y loadfile registran importaciones.
  • Una llamada a setmetatable a nivel de módulo registra herencia.
  • ClassName:new(), ClassName.new() y setmetatable({...}, ClassName) cuentan como instanciación.
  • error() registra un throw, y pcall y xpcall registran un catch.

El grafo también registra lecturas y escrituras y flujo de control.

Ejemplos de prompts para agentes

  • “¿Quién llama a Inventory:addItem y desde qué scripts?” (find_symbol, luego dependency_search incoming)
  • “¿Qué módulos cargan util.http con require?” (dependency_search)
  • “Rastrea qué pasa cuando el jugador recibe daño.” (get_task_context)

Limitaciones conocidas

  • Unos 150 nombres se filtran de las relaciones: la biblioteca estándar de Lua (string, table, math, io, os, coroutine, debug y utf8) más las API vim.* de Neovim y ngx.* de OpenResty. Las llamadas a esas API no son aristas del grafo, así que usa text_pattern_search para encontrarlas.
  • Como los módulos y las clases se construyen con llamadas y tablas normales, los presets classes y imports de structural_search no seleccionan nada para Lua. Usa en su lugar find_symbol o text_pattern_search.
  • Lua no tiene interfaces ni anotaciones de tipo, así que las relaciones de implementación de interfaces y de referencia de tipos están marcadas como no aplicables.

Próximos pasos

Conecta un repositorio con el inicio rápido y luego revisa la matriz de compatibilidad en la página de compatibilidad. Para motores que embeben Lua en código nativo, lee también la guía de C.

Mejor uso

  • > Código de juegos y scripts de motor donde módulos, clases basadas en tablas y manejadores de eventos se llaman entre sí.
  • > Plugins de Neovim y configuración del editor repartidos en muchos módulos cargados con require.
  • > OpenResty y otros usos de Lua embebido, donde los manejadores de peticiones conviven con módulos auxiliares compartidos.

Flujos de trabajo del agente

  • > Encontrar todos los llamadores de una función de módulo antes de cambiar sus argumentos.
  • > Rastrear qué módulos cargan con require un helper compartido antes de moverlo.
  • > Mapear qué tablas heredan de una clase base mediante `setmetatable`.

Detalles del motor

  • > El soporte de Lua cubre `.lua`. Los métodos con dos puntos como `function Account:deposit()` se atribuyen a su tabla propietaria.
  • > `require`, `dofile` y `loadfile` registran importaciones, `setmetatable` a nivel de módulo registra herencia y `ClassName:new()` cuenta como instanciación.
  • > `error()` registra un throw y `pcall` un catch, mientras que unos 150 nombres de la biblioteca estándar, `vim.*` y `ngx.*` se filtran.

Puntos de entrada MCP útiles

  • find_symbol

    Úsalo para una función de módulo o un método con dos puntos cuando necesites la definición y los llamadores.

  • dependency_search

    Usa el recorrido incoming sobre un módulo compartido para ver qué archivos lo cargan con require antes de moverlo.

  • text_pattern_search

    Úsalo para llamadas a `vim.*`, `ngx.*` o la biblioteca estándar, que se filtran del grafo.