本文へスキップ
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

    「チェックアウトのリクエストをコントローラーからデータベースまで追跡して」のようなプロンプトに使ってください。