본문으로 건너뛰기
cd /languages
  • 임베디드 스크립팅
  • 프로그래밍
  • AST 및 심볼 지원

Maguyva의 Lua 지원: 게임, 플러그인, OpenResty를 위한 코드 그래프

Maguyva는 AST, 심볼, 그래프로 Lua를 지원하여, AI 에이전트가 Lua 코드에서 모듈, 콜론 메서드, 메타테이블 클래스, require 체인을 따라갈 수 있게 합니다.

Lua가 얕은 AI 도구를 넘어뜨리는 지점

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 incoming)
  • “util.http를 require하는 모듈은 무엇인가요?” (dependency_search)
  • “플레이어가 피해를 입으면 무슨 일이 일어나는지 추적해 줘.” (get_task_context)

알려진 한계

  • 약 150개의 이름이 관계에서 걸러집니다. Lua 표준 라이브러리(string, table, math, io, os, coroutine, debug, utf8)와 Neovim의 vim.*, OpenResty의 ngx.* API입니다. 이런 API 호출은 그래프 엣지가 아니므로, 찾으려면 text_pattern_search를 사용하세요.
  • 모듈과 클래스는 일반 호출과 테이블로 만들어지므로, structural_search의 classes와 imports 프리셋은 Lua에서 아무것도 선택하지 않습니다. 대신 find_symbol나 text_pattern_search를 사용하세요.
  • Lua에는 인터페이스도 타입 애너테이션도 없으므로, 인터페이스 구현과 타입 참조 관계는 적용 대상 아님으로 표시됩니다.

다음 단계

빠른 시작으로 저장소를 연결한 다음, 호환성 페이지에서 지원 매트릭스를 확인하세요. 네이티브 코드에 Lua를 내장하는 엔진이라면 C 가이드도 읽어 보세요.

가장 적합한 경우

  • > 모듈, 테이블 기반 클래스, 이벤트 핸들러가 서로 호출하는 게임 코드와 엔진 스크립트.
  • > require되는 여러 모듈로 나뉜 Neovim 플러그인과 에디터 설정.
  • > 요청 핸들러가 공유 헬퍼 모듈과 나란히 있는 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

    공유 모듈을 옮기기 전에 incoming 탐색을 사용해 그것을 require하는 파일을 확인하세요.

  • text_pattern_search

    그래프에서 걸러지는 `vim.*`, `ngx.*`, 표준 라이브러리 호출을 찾을 때 사용하세요.