Sobre o projeto
jarvis, publicado no PyPI como jarvis-mcp, é uma camada de inteligência de código local-first para agentes de codificação. Ele é fornecido como um servidor Model Context Protocol (MCP) que utiliza stdio, permitindo que o Claude Code, Cursor, Claude Desktop ou qualquer outro cliente MCP consulte um repositório já indexado. Não há serviço hospedado, autenticação ou dependência de rede: nada sai da máquina.
Como as duas metades se encaixam
O projeto é deliberadamente dividido em um escritor e um leitor que compartilham exatamente um contrato: um diretório de dados local (por padrão ~/.jarvis).
- CLI de Indexação: jarvis index recebe um caminho de repositório, constrói uma base de sintaxe Tree-sitter para cada arquivo suportado, opcionalmente executa o indexador SCIP da linguagem e converte a saída para SQLite, constrói shards Zoekt mais embeddings opcionais, e então publica tudo como um snapshot imutável selecionado por um pequeno ponteiro atual.
- Runtime: jarvis-server expõe as ferramentas via stdio, apoiado por singletons preguiçosos. Um zoekt-webserver é iniciado na primeira busca e compartilhado entre processos através de um pidfile.
As consultas abrem o banco de dados publicado apenas para leitura, portanto, o caminho de serviço nunca escreve. A publicação é atômica; uma consulta que lê o arquivo antigo continua a funcionar enquanto uma reindexação altera o ponteiro, e uma falha em qualquer etapa opcional mantém o snapshot anterior ativo. Cada reindexação também reconstrói as arestas de pacotes de saída daquele repositório em vez de acumulá-las.
As nove ferramentas MCP
goToDefinition resolve um símbolo para seu arquivo e intervalo de definição, servido por SCIP onde há cobertura de definição SCIP e, caso contrário, pela declaração da base de sintaxe, com cada local marcado por provedor. findReferences lista ocorrências de um símbolo e é exclusivo de SCIP. callHierarchy retorna chamadas recebidas e enviadas, também exclusivo de SCIP. typeHierarchy retorna supertipos e subtipos, exclusivo de SCIP. documentSymbols esboça os símbolos definidos em um arquivo, roteados por arquivo entre o esboço SCIP e as declarações Tree-sitter. searchCode realiza busca léxica ou por expressão regular do Zoekt com um filtro de repositório opcional. semanticSearch é uma busca em linguagem natural que funde acertos de vetores com acertos Zoekt e correspondências de definição de símbolos SCIP usando reciprocal rank fusion. blastRadius mostra quais outros repositórios indexados dependem de um pacote, em até dois saltos. getIndexStatus relata o commit publicado, frescor, obsolescência em relação a uma árvore de trabalho e capacidades de provedor por ferramenta.
As ferramentas exclusivas de SCIP não retornam resultados vazios silenciosamente quando os dados estão ausentes; elas relatam a capacidade necessária, um motivo e uma dica de recuperação. Falhas de ferramentas são retornadas como objetos de payload em vez de erros de transporte, para que uma consulta ruim não derrube o servidor stdio.
Indexação e monitoramento
Os comandos incluem jarvis index, list, status, reindex e forget, além de jarvis watch para reindexação automática com um debounce (cinco segundos por padrão) usando o extra opcional watchdog. A linguagem é detectada a partir de arquivos rastreados pelo git por pluralidade de extensão e pode ser substituída com --language. Os valores de status são indexing, indexed, partial, degraded e failed; uma execução degradada ainda publica a base de sintaxe e sai com zero, com a causa registrada.
Requisitos e limites
O projeto é explícito sobre ser restrito.
- Apenas macOS e Linux; Windows não é suportado.
- Uma linguagem por repositório; monorepos poliglotas são indexados na linguagem que tiver a maioria dos arquivos rastreados.
- A base Tree-sitter sem build cobre 17 linguagens (Python, JavaScript, TypeScript/TSX, Java, Kotlin, Swift, Go, Ruby, Rust, C, C++, C#, PHP, Scala, Bash, SQL) e é instalada como uma dependência pip do próprio pacote.
- A navegação SCIP precisa cobre quatro famílias de linguagens: TypeScript/TSX, Python, Java/Kotlin e Swift.
- O enriquecimento opcional de SCIP e Zoekt requer binários externos instalados por um script de configuração: scip (mínimo v0.9.0), zoekt-git-index e zoekt-webserver, universal-ctags, scip-typescript, scip-python, scip-swift (apenas macOS arm64) e scip-java (apenas detecção, solicita antes de baixar uma imagem Docker).
- A indexação é uma etapa explícita; nada é analisado ao vivo.
- jarvis é apenas leitura e nunca edita código. O README o posiciona como complementar ao Serena, que lida com renomeações semânticas e refatorações.
Busca e configuração
semanticSearch requer o extra semântico opcional (lancedb e sentence-transformers) e funde a busca vetorial sobre código fragmentado por Tree-sitter com resultados léxicos. A indexação semântica respeita o .gitignore, pula arquivos com mais de 1 MB e heurísticas de arquivos gerados, tudo isso podendo ser substituído por uma flag de inclusão. Variáveis de ambiente cobrem o diretório de dados e os prefixos de instrução de consulta/documento de embedding, com autodetecção para modelos bge-m3, e5 e nomic-embed.
O README também documenta limitações conhecidas do SCIP upstream (dados de relacionamento declarados mas não escritos para hierarquias de tipos, nomes de exibição e tipos preenchidos retroativamente, incapacidade do scip-java de indexar repositórios Android/Gradle, Kotlin exigindo correspondência exata de versão do compilador e um requisito de versão do bash para builds Java baseados em Maven) e as trata como comportamentos da ferramenta subjacente e não como bugs do jarvis. Três habilidades de agente do Claude Code acompanham o plugin: jarvis-setup, jarvis-use e jarvis-issues. O projeto possui licença MIT e sua suíte de testes é executada com pytest, com testes de integração que chamam binários de indexadores reais marcados separadamente.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.