가이드

Code Intelligence

REAP 는 코드 인덱스를 내장합니다. 설치할 것도, 띄울 것도, 백그라운드에서 도는 프로세스도 없습니다. Tree-sitter 파서가 추적 중인 모든 파일을 훑어 정의된 심볼과 그 사이의 호출·import 를 기록하고, 결과를 .reap/.index/ 에 gzip 된 JSON 으로 저장합니다. 15개 언어가 함께 배포되며 네이티브 빌드가 없습니다 — grammar 가 WebAssembly 입니다.

명령

모든 서브커맨드는 REAP 의 다른 명령과 마찬가지로 stdout 에 JSON 을 냅니다. 에이전트는 파싱하고, 사람은 message 필드를 읽으면 됩니다.

bash
reap index                     # update — 기본 동작
reap index update [--full]     # 인덱스를 HEAD 에 맞춤
reap index status              # 통계, import 해석률, 인덱싱된 커밋
reap index impact <file>...    # 이 파일을 바꾸면 무엇이 영향받는가
reap index search <query>      # 정의 찾기 (file:line 반환)
reap index callers <symbolId>  # 누가 이것을 부르는가
reap index callees <symbolId>  # 이것이 무엇을 부르는가

symbolId 는 <file>::<name> 형태입니다 — 예: src/core/lifecycle.ts::nextStage. reap index search 가 이 값을 출력합니다.

변경의 단위는 커밋입니다

인덱스는 자기가 서술하는 SHA 를 기록합니다. 무엇을 다시 읽을지는 git diff 한 번이고, 다시 읽을 필요가 있는지는 문자열 비교 한 번입니다. HEAD 가 움직이면 — 커밋·브랜치 전환·rebase·pull 후 — 질의가 스스로 인덱스를 갱신합니다. REAP 이 먼저 갱신하는 것은 자기가 방금 커밋한 자리뿐입니다 — completion 끝, 그리고 early-close.

bash
reap index update    # Indexed 412 file(s) — full, 1530 symbols at 1a2b3c4 (612ms)
reap index update    # Index is current at 1a2b3c4 (1530 symbols, 3688 edges)

대가는 이것입니다 — 커밋되지 않은 작업은 인덱스에 없습니다. 방금 쓰고 아직 커밋하지 않은 심볼은 search 로 찾을 수 없고, 새로 만든 파일은 impact 에 나타나지 않습니다. 그건 Grep 으로 찾으세요. 그리고 git 저장소가 필요합니다 — 없으면 인덱스를 키잉할 커밋 자체가 없습니다.

impact 를 믿기 전에 status 를 보세요

impact 가 아는 것은 전부 해석된 import edge 에서 나옵니다. imports 비율이 낮으면 그래프가 불완전하고, 그때 빈 blast radius 는 '없음'이 아니라 '모름'입니다. status 는 grammar 로드 실패도 경고합니다 — 어떤 언어가 조용히 인덱싱되지 않는 다른 한 경로입니다.

text
files:   412
symbols: 1530  (function 902, method 341, class 187, type 100)
edges:   3688  (CALLS 3145, IMPORTS 543)
imports: 543/543 resolved (100%)
commit:  1a2b3c4

(예시 수치입니다.) 중요한 것은 imports 줄입니다. impact 가 아는 것은 전부 해석된 import edge 에서 나오므로, 해석률이 낮으면 그래프가 불완전하다는 뜻이고 그때 빈 blast radius 는 '없음'이 아니라 '알 수 없음'입니다. ./x.js specifier 를 그것을 만들어내는 x.ts 에 대응시키지 못하는 해석기는 여기서 0을 보고합니다 — 그래서 '인덱싱이 돌았는가'로 추론하지 않고 해석률을 화면에 띄웁니다.

인덱스가 있는 곳

.reap/.index/ 안에 manifest.json 과 gzip 된 그래프 하나로 있고, reap init 과 reap update 가 .gitignore 에 추가합니다. 프로젝트를 지우면 인덱스도 함께 사라지고 홈 디렉토리에는 아무것도 쌓이지 않습니다. gitignore 하는 이유는 크기가 아닙니다 — 인덱스를 커밋하면 그것을 담은 커밋을 다시 인덱싱해야 하고, 이 과정은 끝나지 않습니다. .reap/.index/ 는 언제 지워도 안전합니다. 다음 명령이 다시 만듭니다.

언제 쓰는가

둘은 상호보완적입니다 — 인덱스는 file:line 으로 답하고, 그것을 읽으면 됩니다.

도구질문이 이럴 때
reap index이건 어디에 정의됐나, 누가 부르나, 이 파일에 무엇이 의존하나, 이 변경의 blast radius 는 어디까지인가
Grep / Glob리터럴 문자열, 주석, 설정 파일, grammar 가 없는 언어, 그리고 아직 커밋하지 않은 모든 것