À propos du projet

jarvis, publié sur PyPI sous le nom de jarvis-mcp, est une couche d'intelligence de code locale pour les agents de codage. Il est livré sous la forme d'un serveur Model Context Protocol (MCP) communiquant via stdio, permettant à Claude Code, Cursor, Claude Desktop ou tout autre client MCP d'interroger un dépôt déjà indexé. Il n'y a pas de service hébergé, pas d'authentification et aucune dépendance réseau : rien ne quitte la machine. Comment les deux parties s'articulent Le projet est délibérément divisé en un écrivain (writer) et un lecteur (reader) qui partagent un seul contrat : un répertoire de données local (par défaut ~/.jarvis). - CLI d'indexation : jarvis index prend un chemin de dépôt, construit une base de syntaxe Tree-sitter pour chaque fichier supporté, exécute optionnellement l'indexeur SCIP du langage et convertit la sortie en SQLite, construit des shards Zoekt ainsi que des embeddings optionnels, puis publie le tout sous la forme d'un instantané immuable sélectionné par un petit pointeur actuel. - Runtime : jarvis-server expose les outils via stdio, s'appuyant sur des singletons paresseux. Un zoekt-webserver est lancé lors de la première recherche et partagé entre les processus via un fichier pid. Les requêtes ouvrent la base de données publiée en lecture seule, donc le chemin de service n'écrit jamais. La publication est atomique ; une requête lisant l'ancien fichier continue de fonctionner pendant qu'une réindexation bascule le pointeur, et un échec dans toute étape optionnelle laisse l'instantané précédent actif. Chaque réindexation reconstruit également les arêtes de packages sortants de ce dépôt au lieu de les accumuler. Les neuf outils MCP goToDefinition résout un symbole vers son fichier de définition et sa plage, servi par SCIP là où le fichier possède une couverture de définition SCIP, sinon par la déclaration de la base de syntaxe, chaque emplacement étant marqué par le fournisseur. findReferences liste les occurrences d'un symbole et est réservé à SCIP. callHierarchy retourne les appels entrants et sortants, également réservé à SCIP. typeHierarchy retourne les supertypes et subtypes, réservé à SCIP. documentSymbols esquisse les symboles définis dans un fichier, routés par fichier entre l'aperçu SCIP et les déclarations Tree-sitter. searchCode effectue une recherche lexicale ou par expression régulière Zoekt avec un filtre de dépôt optionnel. semanticSearch est une recherche en langage naturel qui fusionne les résultats vectoriels avec les résultats Zoekt et les correspondances de définition de symboles SCIP via une fusion de rangs réciproques (reciprocal rank fusion). blastRadius montre quels autres dépôts indexés dépendent d'un package, jusqu'à deux bonds. getIndexStatus rapporte le commit publié, la fraîcheur, l'obsolescence par rapport à un arbre de travail et les capacités des fournisseurs par outil. Les outils réservés à SCIP ne retournent pas silencieusement des résultats vides lorsque les données sont manquantes ; ils signalent la capacité requise, une raison et un indice de récupération. Les échecs d'outils sont retournés sous forme d'objets de charge utile plutôt que d'erreurs de transport, afin qu'une mauvaise requête ne tue pas le serveur stdio. Indexation et surveillance Les commandes incluent jarvis index, list, status, reindex et forget, ainsi que jarvis watch pour la réindexation automatique avec un délai d'attente (cinq secondes par défaut) utilisant l'extension optionnelle watchdog. Le langage est détecté à partir des fichiers suivis par git par pluralité d'extensions et peut être outrepassé avec --language. Les valeurs de statut sont indexing, indexed, partial, degraded et failed ; une exécution dégradée publie tout de même la base de syntaxe et quitte avec un code zéro, la cause étant enregistrée. Exigences et limites Le projet est explicite sur son périmètre restreint. - macOS et Linux uniquement ; Windows n'est pas supporté. - Un seul langage par dépôt ; les monorepos polyglottes sont indexés selon le langage ayant le plus de fichiers suivis. - La base Tree-sitter sans build couvre 17 langages (Python, JavaScript, TypeScript/TSX, Java, Kotlin, Swift, Go, Ruby, Rust, C, C++, C#, PHP, Scala, Bash, SQL) et est installée comme dépendance pip du package lui-même. - La navigation SCIP précise couvre quatre familles de langages : TypeScript/TSX, Python, Java/Kotlin et Swift. - L'enrichissement optionnel SCIP et Zoekt nécessite des binaires externes installés par un script de configuration : scip (minimum v0.9.0), zoekt-git-index et zoekt-webserver, universal-ctags, scip-typescript, scip-python, scip-swift (macOS arm64 uniquement) et scip-java (détection seule, demande avant de tirer une image Docker). - L'indexation est une étape explicite ; rien n'est analysé en direct. - jarvis est en lecture seule et ne modifie jamais le code. Le README le positionne comme complémentaire à Serena, qui gère les renommages sémantiques et les refactorisations. Recherche et configuration semanticSearch nécessite l'extension sémantique optionnelle (lancedb et sentence-transformers) et fusionne la recherche vectorielle sur du code segmenté par Tree-sitter avec des résultats lexicaux. L'indexation sémantique respecte .gitignore, ignore les fichiers de plus de 1 Mo et les heuristiques de fichiers générés, tout cela pouvant être outrepassé par un flag include. Les variables d'environnement couvrent le répertoire de données et les préfixes d'instruction de requête/document d'embedding, avec une auto-détection pour les modèles bge-m3, e5 et nomic-embed. Le README documente également les limitations SCIP connues en amont (données de relation déclarées mais non écrites pour les hiérarchies de types, noms d'affichage et types complétés a posteriori, incapacité de scip-java à indexer les dépôts Android/Gradle, Kotlin nécessitant une correspondance exacte de version du compilateur, et une exigence de version bash pour les builds Java basés sur Maven) et les traite comme des comportements de l'outillage sous-jacent plutôt que comme des bugs de jarvis. Trois compétences d'agent Claude Code sont livrées avec le plugin : jarvis-setup, jarvis-use et jarvis-issues. Le projet est sous licence MIT, et sa suite de tests est exécutée avec pytest, les tests d'intégration appelant des binaires d'indexation réels étant marqués séparément.