本文へスキップ
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:: 型ヘルパー、よく使われるEnumerableの呼び出し(each、collect、reject など)は関係性から除外されるため、アプリケーションのコードが際立ちます。

エージェントへのプロンプト例

  • 「Billing::ChargeCustomer.call を呼び出しているのは誰で、どのジョブやコントローラーからか?」(find_symbol、次に dependency_search の incoming)
  • 「ApplicationRecord を継承し、Auditable をincludeしているモデルはどれか?」(dependency_search)
  • 「注文が支払い済みになった後に何が起きるかを追跡して。」(get_task_context)

既知の制限

  • Rubyでは require と load は通常のメソッド呼び出しなので、structural_search の imports プリセットは何も選択しません。それらを一覧にするには text_pattern_search を使ってください。
  • define_method で実行時に作られたメソッドや method_missing で処理されるメソッドはシンボルとして抽出されず、それらの呼び出しはメタプログラミングのノイズとして除外されます。
  • Rubyにはデコレーター構文がないため、デコレーターの関係は適用対象外としてマークされています。

次のステップ

クイックスタートでリポジトリを接続し、互換性ページで対応マトリクスを確認してください。ほかの動的言語のリポジトリについては、Pythonガイドと比較してください。

最適な用途

  • > モデル、サービスオブジェクト、ジョブ、concernが多くのディレクトリをまたいで呼び合うRailsのモノリス。
  • > 深いモジュール名前空間と共有の基底クラスを持つgemやRubyのサービス。
  • > アプリの半分が依存するモデルやサービスに触れる前に、AIエージェントで変更範囲を見定めたいチーム。

エージェントワークフロー

  • > サービスオブジェクトやモデルのメソッドの振る舞いを変える前に、その呼び出し元をすべて見つける。
  • > クラスが `.new` でインスタンス化される場所と、その次に実行されるメソッドを追跡する。
  • > リファクタリングの前に、基底クラスを継承するクラスやモジュールをミックスインするクラスをマッピングする。

エンジンの詳細

  • > Rubyの対応は `.rb`、`.rbw`、`.rake`、`.gemspec`、`Gemfile`、`Rakefile` を含みます。特異メソッドはstaticとしてマークされ、`attr_*` の宣言はアクセサーメソッドとして扱われます。
  • > `ClassName.new` はインスタンス化として扱われ、レシーバーの型付けはローカルの代入とインスタンス変数をたどります。
  • > `define_method` や `send` などのメタプログラミングの呼び出し、Sorbetの `T::` ヘルパー、よく使われるEnumerableの呼び出しは関係性から除外されます。

役立つMCPエントリーポイント

  • find_symbol

    `Billing::ChargeCustomer.call` のような、名前空間付きのクラス、モジュール、メソッドに使ってください。

  • dependency_search

    変更前に、モデルやサービスオブジェクトに対してincomingのトラバーサルを使い、呼び出し元とサブクラスを確認してください。

  • text_pattern_search

    `require` のパス、ルートの文字列、グラフからは見えない動的に定義されたメソッドに使ってください。