跳转到内容
cd /languages
  • 约定优先
  • 编程语言
  • AST 和符号支持

Maguyva 的 Ruby 支持:面向 Rails 与 Ruby 应用的代码图谱

Maguyva 以 AST、符号和图谱支持 Ruby,让 AI 智能体在 Rails 和 Ruby 代码库中追踪类、模块、单例方法和构造调用。

为什么 Ruby 仓库让浅层 AI 工具犯难

Ruby 高度依赖约定和元编程。方法由 attr_accessor 生成,类会在其他文件中被重新打开,命名空间嵌套好几层模块。可读的表面掩盖了一次调用实际到达的是哪个方法,而粗糙的文本搜索会返回应用里所有的 call 和 perform。

Maguyva 把类、模块、方法及其调用方作为结构交给智能体,让它沿着应用追踪一次修改,而不是靠猜。

Maguyva 在 Ruby 中提取什么

Maguyva 覆盖 .rb、.rbw、.rake 和 .gemspec 文件,以及 Gemfile 和 Rakefile。实例方法和单例方法(def self.call)都会被提取,单例方法会标记为 static。attr_reader、attr_writer 和 attr_accessor 声明计为访问器方法,符号会以其模块和类命名空间限定。

ClassName.new 和 Namespace::ClassName.new 计为实例化,接收者类型推断会跟踪局部赋值和 @instance_variables,因此对已赋值对象的调用可以解析到它的类。图谱还记录继承、模块包含、重写、raise 和 rescue 边以及读写。

元编程调用(define_method、send、method_missing、class_eval 等)、Sorbet 的 T:: 类型辅助工具,以及常见的可枚举调用(each、collect、reject 等)会从关系中过滤掉,让应用代码更加突出。

智能体提示词示例

  • “谁调用了 Billing::ChargeCustomer.call,来自哪些作业和控制器?”(先用 find_symbol,再用 dependency_search 的 incoming 方向)
  • “哪些模型继承自 ApplicationRecord 并包含了 Auditable?”(dependency_search)
  • “追踪订单被标记为已支付之后会发生什么。”(get_task_context)

已知限制

  • 在 Ruby 中,require 和 load 是普通的方法调用,因此 structural_search 中的 imports 预设不会选中任何内容。要列出它们,请使用 text_pattern_search。
  • 通过 define_method 在运行时创建、或由 method_missing 处理的方法不会被提取为符号,这些调用也会作为元编程噪声被过滤。
  • Ruby 没有装饰器语法,因此装饰器关系被标记为不适用。

后续步骤

通过快速入门连接仓库,然后在兼容性页面查看支持矩阵。其他动态语言仓库请对照阅读 Python 指南。

最适合场景

  • > Rails 单体应用,模型、服务对象、作业和 concern 在许多目录之间相互调用。
  • > 拥有深层模块命名空间和共享基类的 gem 与 Ruby 服务。
  • > 在动到半个应用都依赖的模型或服务之前,想先用 AI 智能体划定修改范围的团队。

智能体工作流

  • > 在修改服务对象或模型方法的行为之前,找出它的所有调用方。
  • > 追踪某个类在哪里通过 `.new` 实例化,以及接下来运行了哪些方法。
  • > 在重构之前,梳理哪些类继承自某个基类或混入了某个模块。

引擎细节

  • > Ruby 支持覆盖 `.rb`、`.rbw`、`.rake`、`.gemspec`、`Gemfile` 和 `Rakefile`。单例方法标记为 static,`attr_*` 声明计为访问器方法。
  • > `ClassName.new` 计为实例化,接收者类型推断会跟踪局部赋值和实例变量。
  • > `define_method`、`send` 等元编程调用、Sorbet 的 `T::` 辅助工具以及常见的可枚举调用会从关系中过滤掉。

常用 MCP 入口工具

  • find_symbol

    用于查找带命名空间的类、模块或方法,例如 `Billing::ChargeCustomer.call`。

  • dependency_search

    修改之前,对模型或服务对象使用 incoming 遍历,查看调用方和子类。

  • text_pattern_search

    用于查找 `require` 路径、路由字符串以及图谱看不到的动态定义方法。