별첨 E

graft로 저장소 컨텍스트 탐색하기

graft는 저장소를 미리 인덱싱해 둔 컨텍스트 그래프입니다. 코드를 이해하거나, 어디서 무엇을 고쳐야 할지 찾거나, 변경의 영향 범위를 파악할 때 grep이나 파일을 직접 여는 대신 graft에 먼저 물어보면 훨씬 적은 토큰으로 정확한 file:line 위치를 얻을 수 있습니다.

이 별첨에서 다루는 것
  • graft란 무엇이고 왜 필요한가
  • grep/파일 읽기 대신 graft를 먼저 써야 하는 이유
  • 핵심 명령어 5가지 (ask, grep, skeleton, callers, map)
  • MCP 도구로 graft 사용하기 (지원 환경)
  • 실전 워크플로우 예시
  • 코드 변경 후 그래프 갱신하기

1. graft란 무엇인가

graft는 저장소를 스캔하여 파일마다 "이 파일이 뭘 하는지, 어떤 심볼을 정의하는지, 누가 호출하는지"를 정리한 작은 마크다운 노드들의 그래프를 만들어 두는 도구입니다. 이 그래프는 graft/ 디렉토리에 저장되며, 코드가 바뀔 때마다 git과 함께 갱신됩니다.

grep은 "이 글자가 어디 있는지"만 찾아줍니다. graft는 "이 개념이 어디서 정의되고, 어떻게 동작하고, 누가 쓰는지"까지 미리 정리해 둔 지도입니다. 처음 가 보는 도시에서 골목마다 직접 걸어 다니는 것과, 미리 만들어진 지도를 보는 것의 차이와 같습니다.

graft는 두 가지 방식으로 쓸 수 있습니다:

  • CLI — 터미널에서 graft <subcommand> 형태로 직접 실행
  • MCP 도구 — 호스트(Claude Code 등)가 graft_find_code, graft_find_all, graft_trace_calls, graft_file_api, graft_repo_map 같은 도구를 노출하는 경우, 같은 그래프를 도구 호출로 조회
이 워크스페이스에서는 세션이 시작될 때 SessionStart 훅이 graft 사용을 안내합니다. 즉, 코드를 이해하거나 수정하는 작업이라면 가장 먼저 graft부터 확인하는 것이 이 워크스페이스의 기본 규칙입니다.

2. 왜 grep 대신 graft인가

상황 grep / 파일 직접 읽기 graft
"이 기능이 어떻게 동작하지?" 관련 파일을 추측해 여러 개 열어봐야 함 graft ask가 코드 스니펫이 포함된 순위 결과를 즉시 반환
"이 심볼을 누가 호출하지?" 문자열 검색 + 수동 대조 (오탐 많음) graft callers가 정확한 호출 관계를 그래프에서 바로 조회
"이 패턴이 나오는 곳을 전부 찾아줘" grep -rn으로 가능하지만 결과가 정리되지 않음 graft grep이 감싸는 심볼별로 그룹화해서 보여줌
"이 파일의 API 전체를 훑어보고 싶다" 파일 전체를 읽어야 함 (토큰 소모 큼) graft skeleton이 시그니처만 ~10배 저렴하게 제공
"처음 보는 저장소, 어디서 시작하지?" README를 읽고 폴더를 하나씩 열어봄 graft map이 디렉토리 클러스터·허브·핫스팟을 토큰 예산 안에서 요약
핵심 원칙은 "작업 형태에 맞는 도구 하나만 고르고, 그 답으로 행동한다"입니다. 같은 도구를 반복 호출하거나, 질문을 살짝 바꿔 다시 묻는 것은 비효율적입니다. 한 번으로 부족하면 다음 필요에 맞는 다른 도구로 전환하세요.

3. 핵심 명령어

3.1 graft map — 낯선 저장소 오리엔테이션

처음 보는 저장소에서 가장 먼저 실행합니다. LLM 호출 없이(비용 $0) 디렉토리 구조, 허브 파일, 핫스팟을 토큰 예산 안에서 보여줍니다.

graft map

주의: map은 그 자체로 오리엔테이션 답입니다. map이 언급한 모든 하위 시스템을 이어서 skeleton으로 훑는 것은 과도한 사용입니다.

3.2 graft ask — 이해하거나 수정할 위치 찾기

"이게 어떻게 동작하지?", "이 코드는 어디에 있지?" 같은 질문에 코드 스니펫이 포함된 순위 결과를 반환합니다.

graft ask "로그인 실패 시 재시도 로직이 어떻게 동작하나" --source
  • --source — 각 결과에 핵심 코드(기본 8줄)를 함께 표시
  • --full — 8줄로 부족할 때 전체 정의를 표시
  • 이해·수정 작업이면 1위 결과가 곧 답입니다. covers:에 명시된 file:line을 인용하고 --source 결과에서 바로 수정하세요.
"이 패턴이 나오는 모든 곳"처럼 전수 조사가 필요한 작업에는 ask를 쓰지 마세요. ask는 순위 기반 상위 N개일 뿐, 전체를 보장하지 않습니다. 전수 조사는 graft grep을 쓰세요.

3.3 graft grep — 전수 검색

리터럴 문자열이나 심볼의 모든 출현 위치를, 이를 감싸는 심볼 단위로 그룹화하여 보여줍니다.

graft grep "processPayment"

인덱싱되지 않은 파일까지 봐야 한다면 그때만 원시 grep -rn으로 보완합니다.

3.4 graft skeleton — 파일 API 한눈에 보기

파일 전체를 읽지 않고도 모든 정의의 시그니처와 위치를 ~10배 저렴하게 확인합니다. API 표면을 훑어볼 때 유용합니다.

graft skeleton src/services/payment.ts

3.5 graft callers — 정확한 호출 관계 추적

어떤 심볼을 바꾸기 전에 그것을 누가 호출하는지(또는 그것이 무엇을 호출하는지) 정확하게 파악합니다. 리팩터링이나 이름 변경 전에는 반드시 실행하세요.

# 이 심볼을 호출하는 곳 (기본)
graft callers formatCurrency

# 이 심볼이 호출하는 것들
graft callers formatCurrency --direction out

# 전체 영향 범위 (연결된 모든 파일)
graft callers formatCurrency --depth all
리팩터링·이름 변경·다중 파일 변경 작업에서 가장 흔한 실수는 주 파일만 고치고 멈추는 것입니다. graft callers <symbol> --depth all로 연결된 모든 파일을 먼저 지도화한 뒤 수정하세요.

4. MCP 도구로 사용하기

Claude Code 같은 호스트 환경에서는 같은 그래프를 CLI 대신 MCP 도구 호출로 조회할 수 있습니다. 대응 관계는 다음과 같습니다:

CLI 명령어 MCP 도구
graft askgraft_find_code
graft grepgraft_find_all
graft callersgraft_trace_calls
graft skeletongraft_file_api
graft mapgraft_repo_map
호출 관계(누가 무엇을 부르는지) 같은 엣지 정보는 그래프에만 존재합니다 — 노드 마크다운 파일을 직접 읽어서는 알 수 없습니다. graft callers / graft_trace_calls가 이런 엣지를 읽는 유일한 방법입니다.

5. 실전 워크플로우

1단계: 낯선 저장소라면 map부터

처음 접하는 프로젝트라면 graft map으로 전체 구조를 먼저 파악합니다.

2단계: 작업 형태에 맞는 도구 선택

이해·수정이면 ask --source, 전수 조사면 grep, API 훑기면 skeleton, 영향 범위 파악이면 callers를 씁니다.

3단계: 결과에서 바로 수정

ask --source가 반환한 file:line과 코드 스니펫을 그대로 인용하며 수정합니다. 결과가 잘려 있으면(+N more lines) 그 정확한 범위만 파일에서 열어 확인합니다.

4단계: 큰 변경 후 그래프 갱신

코드를 크게 바꾼 뒤에는 graft build로 그래프를 최신 상태로 맞춥니다.

6. 그래프 갱신 (graft build)

graft 그래프는 결정론적으로 생성되며, LLM API 키 없이 무료로 갱신할 수 있습니다. 대규모 코드 변경(새 파일 추가, 대규모 리팩터링 등) 이후에는 그래프를 다시 빌드하여 최신 상태를 유지합니다.

graft build
작은 수정 하나마다 build를 실행할 필요는 없습니다. 그래프는 git과 함께 버전 관리되며, 의미 있는 단위의 변경이 끝난 뒤 한 번 갱신하는 것으로 충분합니다.
2026-09-20부터: 새 프로젝트를 만들 때(new-project.ts)는 스캐폴딩 과정에서 graft 그래프가 자동으로 빌드됩니다. 전역 설치된 graft 명령을 먼저 사용하고, 없으면 bunx로 대체 실행합니다. 즉 새로 만든 프로젝트는 처음부터 graft ask로 질문할 수 있습니다.
요약하면: 이해하거나 수정할 때 → graft ask, 전부 찾을 때 → graft grep, API를 훑을 때 → graft skeleton, 영향 범위를 볼 때 → graft callers, 낯선 저장소를 처음 볼 때 → graft map. 이 다섯 가지만 기억하면 충분합니다.