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

Elixir en Maguyva: grafos de código para apps Phoenix y OTP

Maguyva admite Elixir con AST, símbolos y grafo, para que los agentes de IA sigan módulos, behaviours, protocolos y structs en código Phoenix y OTP.

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

Casi todo en Elixir es una llamada a macro. defmodule, def, use, alias y @impl se analizan como llamadas, y use GenServer trae comportamiento que nunca aparece en el archivo. Una herramienta que solo ve la sintaxis de llamada no distingue una definición de una dependencia, ni un callback de GenServer de un helper.

Maguyva convierte esas macros en relaciones, para que un agente vea qué módulos implementan un behaviour y quién llama a una función de contexto.

Qué extrae Maguyva en Elixir

Maguyva cubre archivos .ex y .exs. Las macros de Elixir se convierten en relaciones:

  • alias, import y require registran importaciones.
  • use registra una importación. Para behaviours de OTP y de frameworks como GenServer, Supervisor, Agent, Task, Phoenix.Controller, Phoenix.LiveView y Ecto.Schema, también registra que el módulo implementa ese behaviour.
  • Los atributos @behaviour y los bloques defimpl registran la implementación de un behaviour o protocolo.
  • Los atributos de módulo reservados como @doc, @spec, @impl y @callback se registran como anotaciones de la función que sigue. Los atributos de valor como @timeout 5_000 no.
  • Los literales de struct %User{} cuentan como instanciación, raise registra un throw, y rescue y catch registran un catch.

Las macros del lenguaje como def, defp, defmodule, case y with se filtran de las llamadas, así que el grafo de llamadas muestra tus funciones.

Ejemplos de prompts para agentes

  • “¿Quién llama a Accounts.register_user y desde qué controladores?” (find_symbol, luego dependency_search incoming)
  • “¿Qué módulos implementan GenServer?” (dependency_search)
  • “Rastrea una petición de pago desde el controlador hasta la base de datos.” (get_task_context)

Limitaciones conocidas

  • Las formas con nombre def, defmodule, alias y import son nodos de llamada en la gramática, así que en structural_search solo el preset functions devuelve resultados, y solo para funciones fn anónimas. Usa find_symbol para funciones y módulos con nombre.
  • Unas 55 llamadas de la biblioteca estándar, como IO.puts, String.*, Enum.take y Process.*, se filtran de las relaciones. Usa text_pattern_search para encontrarlas.
  • Elixir no tiene herencia de clases, así que las relaciones de herencia 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 otras bases de código funcionales, lee la guía de Haskell.

Mejor uso

  • > Aplicaciones Phoenix donde controladores, LiveViews, contextos y esquemas de Ecto se llaman entre sí a través de muchos módulos.
  • > Sistemas OTP construidos con GenServers, supervisores y tareas.
  • > Bibliotecas y proyectos umbrella con protocolos implementados para muchos tipos.

Flujos de trabajo del agente

  • > Encontrar todos los llamadores de una función de contexto antes de cambiar la forma de su retorno.
  • > Listar qué módulos implementan un behaviour o protocolo antes de añadir un callback.
  • > Rastrear una petición desde un controlador Phoenix hasta la capa de Ecto.

Detalles del motor

  • > El soporte de Elixir cubre `.ex` y `.exs`. `alias`, `import`, `require` y `use` registran importaciones.
  • > `use GenServer` y otros behaviours de OTP y de frameworks de la lista, `@behaviour` y `defimpl` registran relaciones de implementación.
  • > Los atributos reservados como `@spec` y `@impl` anotan la función siguiente, y los literales `%Struct{}` cuentan como instanciación.

Puntos de entrada MCP útiles

  • find_symbol

    Úsalo para una función de contexto o un módulo cuando necesites la definición y los llamadores; los presets estructurales no seleccionan las formas `def` con nombre.

  • dependency_search

    Usa el recorrido incoming sobre un behaviour o protocolo para ver qué módulos lo implementan.

  • get_task_context

    Úsalo para prompts como "rastrea una petición de pago desde el controlador hasta la base de datos".