Об этом проекте
jarvis, опубликованный в PyPI как jarvis-mcp, представляет собой локальный слой интеллектуального анализа кода для агентов программирования. Он поставляется в виде сервера Model Context Protocol (MCP), работающего через stdio, поэтому Claude Code, Cursor, Claude Desktop или любой другой MCP-клиент может запрашивать данные из уже индексированного репозитория. Хостинг-сервисов, аутентификации и сетевых зависимостей нет: данные не покидают машину.
Как взаимодействуют две части
Проект намеренно разделен на «писателя» (writer) и «читателя» (reader), которые разделяют один общий контракт — локальный каталог данных (по умолчанию ~/.jarvis).
- Indexing CLI: команда jarvis index принимает путь к репозиторию, создает базовый синтаксический анализ Tree-sitter для каждого поддерживаемого файла, опционально запускает индексатор SCIP соответствующего языка и конвертирует вывод в SQLite, создает шарды Zoekt и опциональные эмбеддинги, затем публикует все это как один неизменяемый снимок (snapshot), выбираемый небольшим указателем текущей версии.
- Runtime: jarvis-server предоставляет инструменты через stdio, опираясь на ленивые синглтоны. При первом поиске запускается zoekt-webserver, который используется между процессами через pid-файл.
Запросы открывают опубликованную базу данных только для чтения, поэтому путь обслуживания никогда не выполняет запись. Публикация атомарна: запрос, читающий старый файл, продолжает работать, пока переиндексация переключает указатель, а сбой на любом опциональном этапе оставляет предыдущий снимок активным. Каждая переиндексация также перестраивает исходящие ребра пакетов этого репозитория вместо их накопления.
Девять инструментов MCP
goToDefinition разрешает символ до файла и диапазона его определения; данные предоставляются SCIP (если есть покрытие определениями SCIP) или базовым синтаксическим анализом, при этом каждая локация помечается провайдером. findReferences перечисляет вхождения символа (только SCIP). callHierarchy возвращает входящие и исходящие вызовы (только SCIP). typeHierarchy возвращает супертипы и подтипы (только SCIP). documentSymbols описывает символы, определенные в одном файле, маршрутизируя запрос между структурой SCIP и декларациями Tree-sitter. searchCode выполняет лексический поиск Zoekt или поиск по регулярным выражениям с опциональным фильтром репозитория. semanticSearch — это поиск на естественном языке, который объединяет векторные результаты с результатами Zoekt и совпадениями определений символов SCIP с помощью взаимного ранжирования (reciprocal rank fusion). blastRadius показывает, какие другие индексированные репозитории зависят от пакета (до двух переходов). getIndexStatus сообщает о опубликованном коммите, актуальности, устаревании относительно рабочего дерева и возможностях провайдеров для каждого инструмента.
Инструменты, работающие только с SCIP, не возвращают пустые результаты молча при отсутствии данных; они сообщают о требуемой возможности, причине и подсказке по восстановлению. Ошибки инструментов возвращаются как объекты полезной нагрузки, а не как ошибки транспорта, поэтому некорректный запрос не приводит к остановке stdio-сервера.
Индексация и отслеживание
Команды включают jarvis index, list, status, reindex и forget, а также jarvis watch для автоматической переиндексации с задержкой (по умолчанию пять секунд) с использованием опционального дополнения watchdog. Язык определяется по расширениям файлов, отслеживаемых git, и может быть переопределен с помощью --language. Значения статуса: indexing, indexed, partial, degraded и failed; при статусе degraded все равно публикуется синтаксическая база, и команда завершается с кодом ноль с записью причины.
Требования и ограничения
Проект четко определяет свои узкие рамки.
- Только 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, пропускает файлы более 1 МБ и эвристики сгенерированных файлов, что можно переопределить флагом include. Переменные окружения определяют каталог данных и префиксы инструкций для запросов/документов эмбеддингов с автоопределением моделей bge-m3, e5 и nomic-embed.
В README также задокументированы известные ограничения upstream SCIP (заявленные, но не записанные данные о связях для иерархий типов, заполненные задним числом отображаемые имена и типы, невозможность scip-java индексировать Android/Gradle репозитории, требование точного соответствия версии компилятора для Kotlin и требование к версии bash для Java-сборок на базе Maven) и рассматриваются как особенности базовых инструментов, а не баги jarvis. С плагином поставляются три навыка агента Claude Code: jarvis-setup, jarvis-use и jarvis-issues. Проект распространяется под лицензией MIT, его тестовый набор запускается с помощью pytest, при этом интеграционные тесты, вызывающие реальные бинарные файлы индексатора, отмечены отдельно.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.