# Maguyva의 Ruby 지원: Rails와 Ruby 앱을 위한 코드 그래프

Canonical source: https://maguyva.ai/ko/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에는 데코레이터 문법이 없으므로, 데코레이터 관계는 적용 불가로 표시됩니다.

## 다음 단계

[빠른 시작](/ko/docs/quickstart)으로 저장소를 연결한 다음, [호환성 페이지](/ko/docs/compatibility)에서 지원 매트릭스를 확인하세요. 다른 동적 언어 저장소라면 [Python 가이드](/ko/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` 경로, 라우트 문자열, 그래프가 볼 수 없는 동적으로 정의된 메서드에 쓰세요.
