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

Canonical source: https://maguyva.ai/ko/languages/lua

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

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

## 지원 현황 요약

- 등급: AST 및 심볼 지원
- 프로그래밍
- 확장자: .lua
- 구문 인식 검색과 구조적 컨텍스트를 위한 실제 AST 파싱을 제공합니다.
- 이름이 지정된 심볼은 시맨틱 조회와 상호 참조에 활용됩니다. 관계 추출이 활성화된 경우 그래프 내비게이션을 사용할 수 있습니다.
- 이 언어는 그래프 인식 검색에 심볼과 관계를 제공합니다. 지원되는 에지 유형은 언어 고유의 구문 구조에 따라 다릅니다.
- AST 파싱과 심볼 추출을 모두 지원합니다.

## 가장 적합한 경우

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

## 에이전트 워크플로

- 모듈 함수의 인수를 바꾸기 전에 모든 호출자를 찾습니다.
- 공유 헬퍼를 옮기기 전에 어떤 모듈이 그것을 require하는지 추적합니다.
- `setmetatable`를 통해 기반 클래스를 상속하는 테이블을 매핑합니다.

## 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에는 인터페이스도 타입 애너테이션도 없으므로, 인터페이스 구현과 타입 참조 관계는 적용 대상 아님으로 표시됩니다.

## 다음 단계

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

## 엔진 세부 정보

- 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.*`, 표준 라이브러리 호출을 찾을 때 사용하세요.
