본문으로 건너뛰기
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` 경로, 라우트 문자열, 그래프가 볼 수 없는 동적으로 정의된 메서드에 쓰세요.