본문으로 건너뛰기

Windsurf 사용자를 위해

Windsurf는 파일을 편집합니다.
Maguyva는 리포지토리를 봅니다.

Windsurf는 에디터이고 Cascade는 에이전트입니다. 모노레포에서는 에이전트에게 여전히 어떤 파일이 중요한지 알려주는 지도가 필요합니다. Maguyva는 코드베이스를 인덱싱해 MCP(시맨틱, AST, 그래프, 텍스트)로 되돌려주므로, "인증이 어디서 일어나는가"라는 질문에 테스트 스텁 일곱 개가 아니라 실제 인증 흐름이 돌아옵니다.

Free 등급: 리포지토리 3개, 인덱싱된 리포지토리 라인 최대 5만 줄, 카드 등록 불필요.

Windsurf는 여러분이 가리킨 것을 편집합니다. Maguyva는 Cascade에게 무엇을 가리켜야 할지 알려줍니다.

각 레이어가 하는 일

네 가지 조각. 각각 맡은 역할이 있습니다.

// 에디터

Windsurf

여러분과 Cascade가 실제로 작업하는 곳입니다.

// 수동 컨텍스트

@ 멘션 + .windsurfrules

리포지토리가 커지기 전까지는 수동 컨텍스트가 통합니다.

// 코드베이스

Maguyva

MCP를 통한 자동 코드베이스 사실 제공.

// 누가 비용을 내는가

좌석이 아니라 워크스페이스

에이전트는 좌석 비용을 내지 않습니다. 요금제 보기

Windsurf는 에디터입니다. 그대로 사용하세요.

IDE 자체가 문제는 아닙니다. Cascade, 탭 완성, 다중 파일 편집, .windsurfrules는 훌륭하며, 여러분은 이미 다음과 같은 용도로 사용하고 있을 것입니다:

  • 열려 있는 파일에서의 인라인 제안과 Cascade 편집.
  • 변경 사항이 로컬에 국한될 때의 다중 파일 편집.
  • 리포지토리 관례와 스타일 가드레일을 위한 .windsurfrules.
  • 특정 파일을 컨텍스트로 끌어오기 위한 @ 멘션.

계속 그렇게 하세요. 그 어느 것도 사라지지 않습니다.

하지만 실제 모노레포(워크스페이스 의존성이 있는 TypeScript, Python 서비스, 혼합 패키지)에서는 관련 파일이 아직 Cascade의 레이더에 없는 순간 에이전트 컨텍스트가 깨집니다.

이미 시도해본 수동 해결책, 그리고 그것이 깨지는 지점

네 가지 수동 해결책과 각각의 실패 양상. 왼쪽 = 오늘 하고 있는 일. 오른쪽 = 깨지는 지점.

// the fix

// 파일 멘션하기

중요하다고 생각하는 파일 세 개를 @로 멘션합니다. Cascade는 그 안에서 깔끔하게 편집합니다.

// where it breaks

// 멘션은 추측입니다

어떤 파일이 관련되어 있는지 이미 알고 있을 때만 통합니다. 컨텍스트 도구의 핵심은 멘션할 줄 몰랐던 파일까지 드러내는 데 있습니다.

// the fix

// 코드 조각 붙여넣기

Cascade에게 충분한 컨텍스트를 주려고 다른 패키지에서 200줄을 붙여넣습니다.

// where it breaks

// 붙여넣은 코드는 낡아버립니다

오전 9시에 붙여넣은 코드 조각은 팀원이 오전 11시에 반영한 리베이스를 반영하지 않습니다. Cascade는 패키지의 유령 버전을 대상으로 편집하고 있는 셈입니다.

// the fix

// 컨텍스트 문서 작성하기

.windsurfrules 파일이나 아키텍처 마크다운을 작성합니다. 오늘은 맞습니다.

// where it breaks

// 문서는 코드보다 빠르게 낡습니다

손으로 작성한 것은 무엇이든 낡습니다. 코드가 진실의 원천입니다. 큐 레이어를 설명하는 문서는 일주일간은 맞다가, 그 뒤로는 영원히 틀리게 됩니다.

// the fix

// 규칙 파일 유지하기

네이밍, 린트, 빌드 명령어를 위해 .windsurfrules를 추가합니다. 행동 방식에는 훌륭합니다.

// where it breaks

// 규칙 ≠ 인덱스

.windsurfrules는 “커밋 전에 항상 pnpm tsc -b를 실행하라” 같은 규칙에 적합한 곳입니다. 모노레포의 모든 심볼, 파일, 호출 지점을 담은 조회 가능한 인덱스는 아닙니다.

Maguyva는 그 아래에 있는 레이어입니다

Windsurf를 대체하지 않습니다. Cascade의 MCP 지원에 연결되는 리포지토리 컨텍스트 레이어입니다.

  • 시맨틱 + AST + 그래프 + 텍스트 의미, 구조, 의존성, 또는 리터럴로 검색합니다. 모든 결과는 파일 경로와 줄 번호를 반환합니다.
  • 기본적으로 패키지 전반을 아우름 Cascade가 열어둔 패키지뿐 아니라 모노레포 내 모든 패키지의 호출 지점과 임포터를 아우릅니다.
  • 브랜치 인식 Maguyva는 Cascade가 편집 중인 코드 버전을 인식합니다.
  • 경쟁이 아니라 보완 .windsurfrules는 계속 제 역할을 합니다. @ 멘션도 계속 제 역할을 합니다. Maguyva는 그것들이 채우지 못하는 빈틈을 채웁니다.

Cascade는 여러분이 가리킨 파일을 편집합니다.

Maguyva는 에이전트에게 무엇을 가리켜야 할지 알려줍니다.

세 가지 모노레포 워크플로

패키지와 언어를 넘나듭니다. Cascade의 grep이 아니라 실제 호출 그래프에 근거합니다.

// workflow 01

아무것도 멘션하지 않고 패키지 전반의 인증 흐름 찾기

cascade> 이 모노레포에서 인증은 어디서 일어나나요?

graph::query("authentication flow")
  packages/web/src/auth/session.ts:42       미들웨어
  packages/api/src/auth/jwt.ts:88           토큰 검증
  packages/shared/src/auth/types.ts:12      AuthContext
  packages/admin/src/auth/admin-only.ts:31  RBAC 게이트

 4개 패키지에 걸친 4개의 진입점, 호출 지점 밀도 순으로 랭킹됨.
[exit 0]

파일을 멘션하지도, 코드 조각을 붙여넣지도 않았습니다. Cascade는 중요한 네 개의 파일을 올바른 순위로 확보했고, 근거 있는 편집을 할 수 있습니다.

// workflow 02

테스트 스텁이 아니라 실제 구현 찾기

cascade> normalizePhoneNumber는 E.164를 어떻게 처리하나요?

semantic::query("normalize phone E.164")
  packages/shared/util/phone.ts:88     normalizePhoneNumber()  ← 실제 구현
  packages/api/test/phone.spec.ts:14   jest.mock(...)          ← 스텁
[exit 0]

이름은 거짓말을 합니다. 목(mock)은 실제 코드를 가립니다. Maguyva는 모든 패키지에서 테스트 목보다 실제 구현을 위에 올려 랭킹합니다.

// workflow 03

리팩터링 전에 영향 범위 확인하기

cascade> 모노레포 전체에서 QueueDispatcher.publish를 호출하는 곳은 어디인가요?

graph::callers(QueueDispatcher.publish)
  3 in packages/billing/*
  1 in packages/audit/*
  1 in packages/notifications/*
  1 in services/python-worker/*  ← gRPC 스텁을 통한 교차 언어 호출
[exit 0]

패키지를 넘나들고, 여러 언어를 쓰는 리포지토리라면 언어까지 넘나들며, 호출 지점이 인라인으로 드러납니다. 변경 사항은 Cascade의 grep이 아니라 실제 임포터에 근거합니다.

Windsurf에서 설정하기

세 단계로 끝. Free 등급: 리포지토리 3개, 인덱싱된 리포지토리 라인 최대 5만 줄, 카드 등록 불필요.

  1. // step 01

    maguyva.ai에서 리포지토리 인덱싱하기

    컨텍스트 문제를 가장 많이 겪은 모노레포를 선택하세요.

  2. // step 02

    Windsurf에서 Maguyva를 MCP 서버로 추가하기

    // ~/.codeium/windsurf/mcp_config.json
    {
      "mcpServers": {
        "maguyva": {
          "serverUrl": "https://maguyva.tools/mcp",
          "headers": {
            "Authorization": "Bearer <your-key>"
          }
        }
      }
    }
  3. // step 03

    이미 답을 알고 있는 질문 하나 해보기

    회사 전체로 시작하지 마세요. 리포지토리 하나와 검증 가능한 질문 하나로 시작하세요. 예를 들어 "패키지 전반에서 formatInvoice를 호출하는 곳은 어디인가요?" 같은 질문입니다.