Sobre el proyecto

jarvis, publicado en PyPI como jarvis-mcp, es una capa de inteligencia de código local-first para agentes de programación. Se distribuye como un servidor Model Context Protocol (MCP) que utiliza stdio, permitiendo que Claude Code, Cursor, Claude Desktop o cualquier otro cliente MCP consulte un repositorio ya indexado. No existe un servicio alojado, ni autenticación ni dependencia de red: nada sale de la máquina. Cómo encajan las dos mitades El proyecto está deliberadamente dividido en un escritor y un lector que comparten exactamente un contrato: un directorio de datos local (por defecto ~/.jarvis). - Indexing CLI: jarvis index toma una ruta de repositorio, construye una base de sintaxis de Tree-sitter para cada archivo compatible, opcionalmente ejecuta el indexador SCIP del lenguaje y convierte la salida a SQLite, construye shards de Zoekt más embeddings opcionales, y luego publica todo como una instantánea inmutable seleccionada por un pequeño puntero actual. - Runtime: jarvis-server expone las herramientas a través de stdio, respaldadas por singletons perezosos. Se inicia un zoekt-webserver en la primera búsqueda y se comparte entre procesos mediante un pidfile. Las consultas abren la base de datos publicada en modo de solo lectura, por lo que la ruta de servicio nunca escribe. La publicación es atómica; una consulta que lee el archivo antiguo sigue funcionando mientras una reindexación cambia el puntero, y un fallo en cualquier etapa opcional mantiene activa la instantánea anterior. Cada reindexación también reconstruye los bordes de paquetes salientes de ese repositorio en lugar de acumularlos. Las nueve herramientas MCP goToDefinition resuelve un símbolo a su archivo y rango de definición, servido por SCIP donde el archivo tiene cobertura de definición SCIP y, de lo contrario, por la declaración de la base de sintaxis, con cada ubicación etiquetada por proveedor. findReferences enumera las ocurrencias de un símbolo y es exclusivo de SCIP. callHierarchy devuelve llamadas entrantes y salientes, también exclusivo de SCIP. typeHierarchy devuelve supertipos y subtipos, exclusivo de SCIP. documentSymbols esquematiza los símbolos definidos en un archivo, enrutados por archivo entre el esquema de SCIP y las declaraciones de Tree-sitter. searchCode realiza búsquedas léxicas o de expresiones regulares de Zoekt con un filtro de repositorio opcional. semanticSearch es una búsqueda en lenguaje natural que fusiona aciertos vectoriales con aciertos de Zoekt y coincidencias de definición de símbolos de SCIP utilizando reciprocal rank fusion. blastRadius muestra qué otros repositorios indexados dependen de un paquete, hasta dos saltos. getIndexStatus informa sobre el commit publicado, la frescura, la obsolescencia frente a un árbol de trabajo y las capacidades del proveedor por herramienta. Las herramientas exclusivas de SCIP no devuelven resultados vacíos silenciosamente cuando faltan datos; informan la capacidad requerida, un motivo y una sugerencia de recuperación. Los fallos de las herramientas se devuelven como objetos de carga útil en lugar de errores de transporte, por lo que una consulta incorrecta no mata el servidor stdio. Indexación y monitoreo Los comandos incluyen jarvis index, list, status, reindex y forget, además de jarvis watch para la reindexación automática con un debounce (cinco segundos por defecto) utilizando el extra opcional watchdog. El lenguaje se detecta a partir de los archivos rastreados por git mediante la pluralidad de extensiones y puede anularse con --language. Los valores de estado son indexing, indexed, partial, degraded y failed; una ejecución degradada aún publica la base de sintaxis y sale con código cero registrando la causa. Requisitos y límites El proyecto es explícito sobre su alcance limitado. - Solo macOS y Linux; Windows no es compatible. - Un lenguaje por repositorio; los monorepos políglotas se indexan según el lenguaje que tenga más archivos rastreados. - La base de Tree-sitter sin compilación cubre 17 lenguajes (Python, JavaScript, TypeScript/TSX, Java, Kotlin, Swift, Go, Ruby, Rust, C, C++, C#, PHP, Scala, Bash, SQL) y se instala como una dependencia de pip del propio paquete. - La navegación precisa de SCIP cubre cuatro familias de lenguajes: TypeScript/TSX, Python, Java/Kotlin y Swift. - El enriquecimiento opcional de SCIP y Zoekt requiere binarios externos instalados por un script de configuración: scip (mínimo v0.9.0), zoekt-git-index y zoekt-webserver, universal-ctags, scip-typescript, scip-python, scip-swift (solo macOS arm64) y scip-java (solo detección, pregunta antes de descargar una imagen de Docker). - La indexación es un paso explícito; nada se analiza en vivo. - jarvis es de solo lectura y nunca edita código. El README lo posiciona como complementario a Serena, que maneja renombramientos semánticos y refactorizaciones. Búsqueda y configuración semanticSearch requiere el extra semántico opcional (lancedb y sentence-transformers) y fusiona la búsqueda vectorial sobre código fragmentado por Tree-sitter con resultados léxicos. La indexación semántica respeta .gitignore, omite archivos de más de 1 MB y heurísticas de archivos generados, todo lo cual puede anularse con un flag de inclusión. Las variables de entorno cubren el directorio de datos y los prefijos de instrucción de consulta/documento de embedding, con autodetección para los modelos bge-m3, e5 y nomic-embed. El README también documenta limitaciones conocidas de SCIP upstream (datos de relación declarados pero no escritos para jerarquías de tipos, nombres y tipos de visualización rellenados a posteriori, la incapacidad de scip-java para indexar repositorios Android/Gradle, la necesidad de Kotlin de coincidir exactamente con la versión del compilador y un requisito de versión de bash para compilaciones de Java basadas en Maven) y los trata como comportamientos de las herramientas subyacentes en lugar de errores de jarvis. El plugin incluye tres habilidades de agente de Claude Code: jarvis-setup, jarvis-use y jarvis-issues. El proyecto tiene licencia MIT y su suite de pruebas se ejecuta con pytest, con pruebas de integración que llaman a binarios de indexadores reales marcadas por separado.