# MaguyvaのRuby対応: RailsとRubyアプリのコードグラフ

Canonical source: https://maguyva.ai/ja/languages/ruby

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

MaguyvaはAST、シンボル、グラフでRubyに対応しています。AIエージェントはRailsとRubyのコードベースで、クラス、モジュール、特異メソッド、コンストラクターをたどれます。

## 対応状況スナップショット

- 対応レベル: AST・シンボル対応
- プログラミング
- 拡張子: .gemfile, .gemspec, .rake, .rakefile, .rb, .rbw
- 構文を考慮した検索と構造コンテキストのための実際のAST解析。
- 名前付きシンボルはセマンティック検索と相互参照に利用されます。関係抽出が有効な場合は、グラフナビゲーションも利用できます。
- この言語は、グラフを考慮した検索にシンボルと関係情報を提供します。対応するエッジの種類は、その言語固有の構文要素によって異なります。
- AST解析とシンボル抽出の両方に対応しています。

## 最適な用途

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

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

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

## 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にはデコレーター構文がないため、デコレーターの関係は適用対象外としてマークされています。

## 次のステップ

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

## エンジンの詳細

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