본문으로 건너뛰기
cd /languages
  • 동시성 BEAM
  • 프로그래밍
  • AST 및 심볼 지원

Maguyva의 Elixir 지원: Phoenix와 OTP 앱을 위한 코드 그래프

Maguyva는 AST, 심볼, 그래프로 Elixir를 지원하여, AI 에이전트가 Phoenix와 OTP 코드 전반에서 모듈, 비헤이비어, 프로토콜, 구조체를 따라갈 수 있게 합니다.

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

Elixir에서는 거의 모든 것이 매크로 호출입니다. defmodule, def, use, alias, @impl는 모두 호출로 파싱되고, use GenServer는 파일에 한 번도 나타나지 않는 동작을 끌어옵니다. 호출 구문만 보는 도구는 정의와 의존성을 구분하지 못하고, GenServer 콜백과 헬퍼도 구분하지 못합니다.

Maguyva는 이런 매크로를 관계로 매핑하므로, 에이전트가 어떤 모듈이 비헤이비어를 구현하고 누가 컨텍스트 함수를 호출하는지 볼 수 있습니다.

Maguyva가 Elixir에서 추출하는 것

Maguyva는 .ex와 .exs 파일을 지원합니다. Elixir의 매크로는 다음과 같이 관계로 매핑됩니다.

  • alias, import, require는 임포트를 기록합니다.
  • use는 임포트를 기록합니다. GenServer, Supervisor, Agent, Task, Phoenix.Controller, Phoenix.LiveView, Ecto.Schema 같은 OTP 및 프레임워크 비헤이비어의 경우, 해당 모듈이 그 비헤이비어를 구현한다는 사실도 기록합니다.
  • @behaviour 속성과 defimpl 블록은 비헤이비어나 프로토콜의 구현을 기록합니다.
  • @doc, @spec, @impl, @callback 같은 예약된 모듈 속성은 뒤따르는 함수의 애너테이션으로 기록됩니다. @timeout 5_000 같은 값 속성은 기록되지 않습니다.
  • %User{} 구조체 리터럴은 인스턴스화로 계산되고, raise는 예외 발생을, rescue와 catch는 예외 처리를 기록합니다.

def, defp, defmodule, case, with 같은 언어 매크로는 호출에서 걸러지므로, 호출 그래프에는 여러분의 함수가 나타납니다.

에이전트 프롬프트 예시

  • “Accounts.register_user를 누가 호출하고, 어떤 컨트롤러에서 호출하나요?” (find_symbol, 그다음 dependency_search incoming)
  • “GenServer를 구현하는 모듈은 무엇인가요?” (dependency_search)
  • “결제 요청을 컨트롤러에서 데이터베이스까지 추적해 줘.” (get_task_context)

알려진 한계

  • 이름이 있는 def, defmodule, alias, import 형식은 문법상 호출 노드이므로, structural_search에서 결과를 반환하는 것은 functions 프리셋뿐이며 그것도 익명 fn 함수에 한정됩니다. 이름이 있는 함수와 모듈에는 find_symbol를 사용하세요.
  • IO.puts, String.*, Enum.take, Process.* 같은 약 55개의 표준 라이브러리 호출은 관계에서 걸러집니다. 이런 호출에는 text_pattern_search를 사용하세요.
  • Elixir에는 클래스 상속이 없으므로, 상속 관계는 적용 대상 아님으로 표시됩니다.

다음 단계

빠른 시작으로 저장소를 연결한 다음, 호환성 페이지에서 지원 매트릭스를 확인하세요. 다른 함수형 코드베이스라면 Haskell 가이드를 읽어 보세요.

가장 적합한 경우

  • > 컨트롤러, LiveView, 컨텍스트, Ecto 스키마가 많은 모듈에 걸쳐 서로 호출하는 Phoenix 애플리케이션.
  • > GenServer, 슈퍼바이저, 태스크로 구성된 OTP 시스템.
  • > 여러 타입에 대해 프로토콜이 구현된 라이브러리와 엄브렐라 프로젝트.

에이전트 워크플로

  • > 컨텍스트 함수의 반환 형태를 바꾸기 전에 모든 호출자를 찾습니다.
  • > 콜백을 추가하기 전에 비헤이비어나 프로토콜을 구현하는 모듈을 나열합니다.
  • > Phoenix 컨트롤러에서 Ecto 계층까지 요청을 추적합니다.

엔진 세부 정보

  • > Elixir 지원은 `.ex`와 `.exs`를 다룹니다. `alias`, `import`, `require`, `use`는 임포트를 기록합니다.
  • > `use GenServer`와 그 밖의 등록된 OTP 및 프레임워크 비헤이비어, `@behaviour`, `defimpl`은 구현 관계를 기록합니다.
  • > `@spec`, `@impl` 같은 예약 속성은 다음 함수에 애너테이션을 붙이고, `%Struct{}` 리터럴은 인스턴스화로 계산됩니다.

유용한 MCP 진입점

  • find_symbol

    컨텍스트 함수나 모듈의 정의와 호출자가 필요할 때 사용하세요. 구조 프리셋은 이름이 있는 `def` 형식을 선택하지 않습니다.

  • dependency_search

    비헤이비어나 프로토콜에 incoming 탐색을 사용해 그것을 구현하는 모듈을 확인하세요.

  • get_task_context

    "결제 요청을 컨트롤러에서 데이터베이스까지 추적해 줘" 같은 프롬프트에 사용하세요.