跳至主要內容
cd /languages
  • 並行 BEAM
  • 程式語言
  • AST 與符號支援

Maguyva 的 Elixir 支援:面向 Phoenix 與 OTP 應用的程式碼圖譜

Maguyva 以 AST、符號和圖譜支援 Elixir,讓 AI 代理跨越 Phoenix 和 OTP 程式碼追蹤模組、behaviour、協定和結構體。

Elixir 讓淺層 AI 工具栽跟頭的地方

在 Elixir 裡,幾乎一切都是巨集呼叫。defmodule、def、use、alias 和 @impl 都會被解析為呼叫,而 use GenServer 引入的行為從未出現在檔案裡。只看得到呼叫語法的工具,分不清定義和依賴,也分不清 GenServer 回呼和輔助函式。

Maguyva 把這些巨集對應為關係,讓代理能看到哪些模組實作了某個 behaviour,以及誰在呼叫某個上下文函式。

Maguyva 在 Elixir 中擷取什麼

Maguyva 支援 .ex 和 .exs 檔案。Elixir 的巨集會這樣對應為關係:

  • alias、import 和 require 記錄匯入。
  • use 記錄匯入。對於 GenServer、Supervisor、Agent、Task、Phoenix.Controller、Phoenix.LiveView 和 Ecto.Schema 等 OTP 與框架 behaviour,它還會記錄該模組實作了這個 behaviour。
  • @behaviour 屬性和 defimpl 塊會記錄對 behaviour 或協定的實作。
  • @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。
  • 約 55 個標準函式庫呼叫(如 IO.puts、String.*、Enum.take 和 Process.*)會從關係中過濾掉。查詢它們請使用 text_pattern_search。
  • Elixir 沒有類別繼承,因此繼承關係被標記為不適用。

下一步

透過快速入門連接儲存庫,然後在相容性頁面檢視支援矩陣。其他函式式程式碼庫請閱讀 Haskell 指南。

最適合的情境

  • > 控制器、LiveView、上下文和 Ecto schema 跨越大量模組相互呼叫的 Phoenix 應用。
  • > 由 GenServer、監督者和任務建構的 OTP 系統。
  • > 為大量型別實作了協定的函式庫和 umbrella 專案。

代理工作流程

  • > 在修改上下文函式的回傳結構之前,找到它的所有呼叫端。
  • > 在新增回呼之前,列出實作了某個 behaviour 或協定的模組。
  • > 追蹤一次請求從 Phoenix 控制器進入 Ecto 層的過程。

引擎細節

  • > Elixir 支援涵蓋 `.ex` 和 `.exs`。`alias`、`import`、`require` 和 `use` 記錄匯入。
  • > `use GenServer` 及其他已列出的 OTP 與框架 behaviour、`@behaviour` 和 `defimpl` 會記錄實作關係。
  • > `@spec`、`@impl` 等保留屬性會註解其後的函式,`%Struct{}` 字面值計為實例化。

實用的 MCP 進入點

  • find_symbol

    需要上下文函式或模組的定義和呼叫端時使用它;結構化預設集不會選中具名的 `def` 形式。

  • dependency_search

    對某個 behaviour 或協定使用 incoming 方向走訪,檢視哪些模組實作了它。

  • get_task_context

    用於「追蹤一次結帳請求從控制器到資料庫的過程」這類提示。