프로젝트 소개

PyPI에 jarvis-mcp로 게시된 jarvis는 코딩 에이전트를 위한 로컬 우선 코드 인텔리전스 레이어입니다. stdio를 사용하는 Model Context Protocol(MCP) 서버로 제공되므로, Claude Code, Cursor, Claude Desktop 또는 기타 MCP 클라이언트가 이미 인덱싱된 저장소를 쿼리할 수 있습니다. 호스팅 서비스, 인증, 네트워크 의존성이 없으며 모든 데이터는 머신 외부로 유출되지 않습니다. 두 구성 요소의 결합 방식 이 프로젝트는 의도적으로 라이터(writer)와 리더(reader)로 나뉘어 있으며, 로컬 데이터 디렉토리(기본값 ~/.jarvis)라는 단 하나의 계약을 공유합니다. - 인덱싱 CLI: jarvis index는 저장소 경로를 받아 지원되는 모든 파일에 대해 Tree-sitter 구문 베이스라인을 구축합니다. 선택적으로 해당 언어의 SCIP 인덱서를 실행하여 출력을 SQLite로 변환하고, Zoekt 샤드와 선택적 임베딩을 구축한 후, 작은 current 포인터로 선택되는 하나의 불변 스냅샷으로 모든 내용을 게시합니다. - 런타임: jarvis-server는 lazy singleton을 기반으로 stdio를 통해 도구를 노출합니다. 첫 검색 시 zoekt-webserver가 생성되며 pid 파일을 통해 프로세스 간에 공유됩니다. 쿼리는 게시된 데이터베이스를 읽기 전용으로 열기 때문에 서빙 경로에서는 쓰기가 발생하지 않습니다. 게시는 원자적으로 이루어집니다. 재인덱싱 중에 포인터가 바뀌어도 이전 파일을 읽고 있는 쿼리는 계속 작동하며, 선택적 단계에서 실패하더라도 이전 스냅샷이 유지됩니다. 또한 각 재인덱싱은 누적하는 대신 해당 저장소의 외부 패키지 엣지를 다시 구축합니다. 9가지 MCP 도구 goToDefinition은 심볼을 정의 파일 및 범위로 해석합니다. 파일에 SCIP 정의 커버리지가 있는 경우 SCIP가, 그렇지 않은 경우 구문 베이스라인 선언이 제공하며 각 위치에 제공자가 태그됩니다. findReferences는 심볼의 발생 위치를 나열하며 SCIP 전용입니다. callHierarchy는 유입 및 유출 호출을 반환하며 역시 SCIP 전용입니다. typeHierarchy는 상위 및 하위 타입을 반환하는 SCIP 전용 도구입니다. documentSymbols는 한 파일에 정의된 심볼의 개요를 제공하며, 파일별로 SCIP 개요와 Tree-sitter 선언 사이에서 라우팅됩니다. searchCode는 선택적 저장소 필터와 함께 Zoekt 어휘 또는 정규 표현식 검색을 수행합니다. semanticSearch는 자연어 검색으로, reciprocal rank fusion을 사용하여 벡터 히트, Zoekt 히트 및 SCIP 심볼 정의 일치 항목을 융합합니다. blastRadius는 인덱싱된 다른 저장소 중 어떤 저장소가 패키지에 의존하는지 최대 2홉까지 보여줍니다. getIndexStatus는 게시된 커밋, 최신성, 작업 트리 대비 오래된 정도 및 도구별 제공자 기능을 보고합니다. SCIP 전용 도구는 데이터가 없을 때 단순히 빈 결과를 반환하지 않고, 필요한 기능, 이유 및 복구 힌트를 보고합니다. 도구 실패는 전송 오류가 아닌 페이로드 객체로 반환되므로 잘못된 쿼리가 stdio 서버를 종료시키지 않습니다. 인덱싱 및 감시 명령어에는 jarvis index, list, status, reindex, forget 외에도 선택적 watchdog 엑스트라를 사용하여 디바운스(기본 5초)와 함께 자동 재인덱싱을 수행하는 jarvis watch가 포함됩니다. 언어는 git 추적 파일의 확장자 다수결로 감지되며 --language로 오버라이드할 수 있습니다. 상태 값은 indexing, indexed, partial, degraded, failed이며, degraded 실행의 경우에도 구문 베이스라인을 게시하고 원인을 기록한 후 종료 코드 0으로 종료됩니다. 요구 사항 및 제한 사항 이 프로젝트는 범위가 좁음을 명시합니다. - macOS 및 Linux 전용이며 Windows는 지원되지 않습니다. - 저장소당 하나의 언어만 지원합니다. 다국어 모노레포는 추적된 파일이 가장 많은 언어로 인덱싱됩니다. - 빌드가 필요 없는 Tree-sitter 베이스라인은 17개 언어(Python, JavaScript, TypeScript/TSX, Java, Kotlin, Swift, Go, Ruby, Rust, C, C++, C#, PHP, Scala, Bash, SQL)를 커버하며 패키지의 pip 의존성으로 설치됩니다. - 정밀한 SCIP 내비게이션은 TypeScript/TSX, Python, Java/Kotlin, Swift의 네 가지 언어 제품군을 커버합니다. - 선택적 SCIP 및 Zoekt 강화에는 설정 스크립트로 설치하는 외부 바이너리가 필요합니다: scip(최소 v0.9.0), zoekt-git-index, zoekt-webserver, universal-ctags, scip-typescript, scip-python, scip-swift(macOS arm64 전용) 및 scip-java(감지 전용, Docker 이미지 풀링 전 확인). - 인덱싱은 명시적인 단계이며 실시간으로 분석되지 않습니다. - jarvis는 읽기 전용이며 코드를 수정하지 않습니다. README에서는 이를 시맨틱 이름 변경 및 리팩토링을 처리하는 Serena의 보완 도구로 정의합니다. 검색 및 설정 semanticSearch는 선택적 semantic 엑스트라(lancedb 및 sentence-transformers)가 필요하며, Tree-sitter로 청크 처리된 코드에 대한 벡터 검색과 어휘 결과를 융합합니다. 시맨틱 인덱싱은 .gitignore를 준수하고 1MB 초과 파일 및 생성된 파일 휴리스틱을 건너뛰며, 이는 include 플래그로 오버라이드할 수 있습니다. 환경 변수는 데이터 디렉토리와 임베딩 쿼리/문서 지침 접두사를 다루며, bge-m3, e5, nomic-embed 모델을 자동 감지합니다. README에는 알려진 업스트림 SCIP 제한 사항(타입 계층 구조에 대해 선언되었으나 작성되지 않은 관계 데이터, 백필된 표시 이름 및 종류, scip-java의 Android/Gradle 저장소 인덱싱 불가, Kotlin의 정확한 컴파일러 버전 일치 필요, Maven 기반 Java 빌드를 위한 bash 버전 요구 사항)이 문서화되어 있으며, 이를 jarvis의 버그가 아닌 기본 도구의 동작으로 취급합니다. 플러그인과 함께 jarvis-setup, jarvis-use, jarvis-issues라는 세 가지 Claude Code 에이전트 스킬이 제공됩니다. 프로젝트는 MIT 라이선스이며 테스트 스위트는 pytest로 실행되고, 실제 인덱서 바이너리를 호출하는 통합 테스트는 별도로 표시됩니다.