tokensave
officielBoostez votre Agent avec l'Intelligence Sémantique du Code et économisez 💰 en cours de route !
Que pouvez-vous faire avec Tokensave MCP ?
- Trouver des symboles par nom ou signification — Utilisez
tokensave_searchpour localiser des fonctions, classes ou types dans la base de code indexée. - Obtenir le contexte de code pertinent pour une tâche en un seul appel — Demandez à
tokensave_contextles points d’entrée, les symboles associés et les extraits de code pour une tâche donnée. - Tracer les appelants et les appelés d’une fonction — Utilisez
tokensave_callersettokensave_calleespour naviguer dans le graphe d’appels. - Analyser l’impact de la modification d’un symbole — Utilisez
tokensave_impactpour voir tout le code affecté par une modification. - Identifier les problèmes de qualité du code — Utilisez
tokensave_dead_code,tokensave_complexityoutokensave_circularpour trouver les symboles inaccessibles, les fonctions complexes ou les dépendances circulaires. - Conserver les décisions entre les sessions — Utilisez
tokensave_record_decisionettokensave_session_recallpour sauvegarder et récupérer les choix de conception.
Documentation
Intelligence de Code Sémantique pour Agents de Codage IA
Moins de tokens • Moins d'appels d'outils • 100% local
Pourquoi tokensave ?
Les agents de codage IA gaspillent des tokens à explorer les bases de code. Chaque grep, glob et lecture de fichier coûte de l'argent. Sur des tâches complexes, les agents génèrent de multiples sous-agents d'exploration qui scannent des centaines de fichiers juste pour construire le contexte.
tokensave donne aux agents un graphe de connaissances sémantiques pré-indexé. Au lieu de scanner des fichiers, l'agent interroge le graphe et obtient des réponses instantanées et structurées -- les bons symboles, leurs relations et le code source, en un seul appel.
Comment ça marche
┌──────────────────────────────────────────────────────────────┐
│ AI Coding Agent (Claude Code, Codex, Gemini, Cursor, ...) │
│ │
│ "Implement user authentication" │
│ │ │
│ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Sub-agent │ ───── │ Sub-agent │ │
│ └────────┬────────┘ └─────────┬───────┘ │
└───────────┼──────────────────────────┼───────────────────────┘
│ │
▼ ▼
┌──────────────────────────────────────────────────────────────┐
│ tokensave MCP Server │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Search │ │ Callers │ │ Context │ │
│ │ "auth" │ │ "login()" │ │ for task │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ └────────────────┼────────────────┘ │
│ ▼ │
│ ┌───────────────────────┐ │
│ │ libSQL Graph DB │ │
│ │ • Instant lookups │ │
│ │ • FTS5 search │ │
│ └───────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
Sans tokensave : Les agents utilisent grep, glob et Read pour scanner les fichiers -- nombreux appels API, utilisation élevée de tokens.
Avec tokensave : Les agents interrogent le graphe via les outils MCP -- résultats instantanés, traitement local, moins de tokens.
Fonctionnalités clés
| Construction intelligente du contexte | Recherche sémantique | Analyse d'impact |
| Un seul appel d'outil retourne tout ce dont l'agent a besoin -- points d'entrée, symboles liés et extraits de code. | Trouvez du code par le sens, pas seulement par le texte. Cherchez "authentification" et trouvez login, validateToken, AuthService. | Sachez exactement ce qui casse avant de le changer. Tracez les appelants, les appelés et le rayon d'impact complet de n'importe quel symbole. |
| Plus de 80 outils MCP | Plus de 50 langages | Plus de 12 intégrations d'agents |
| De la traversée du graphe d'appel à la détection de code mort, en passant par les primitives d'édition atomique, les métriques de santé du code, la cartographie des tests et l'analyse de complexité. | Rust, Go, Java, Python, TypeScript, C, C++, Swift, Svelte, Astro et 42 autres, y compris les shaders WGSL/HLSL/Metal et Markdown. Trois niveaux (lite/medium/full) contrôlent la taille du binaire. | Claude Code, Codex CLI, Gemini CLI, Qwen Code, Kiro, Cursor, OpenCode, Copilot, Cline, Roo Code, Zed, Antigravity, Kilo CLI, Kimi CLI, Mistral Vibe, Grok Build, Factory Droid. |
| Indexation multi-branche (optionnelle) | 100% local | Toujours à jour |
| Bases de données optionnelles par branche. Diff et recherche inter-branches sans changer votre checkout. | Aucune donnée ne quitte votre machine. Pas de clés API. Pas de services externes. Tout fonctionne sur une base de données libSQL locale. | Vérification de fraîcheur à la demande à chaque appel MCP (cooldown de 30 s) plus synchronisation de rattrapage lorsque le serveur se connecte. Le travail multi-agent est censé utiliser les worktrees git — chaque agent obtient son propre checkout et les divergences d'index sont fusionnées par git, pas par un observateur de fichiers. |
| Extraction isolée en sous-processus | Analytique de santé du code | Primitives d'édition atomique |
| Un crash natif dans n'importe quelle grammaire tree-sitter (abort, segfault, etc.) ne tue que le worker ; le pool le régénère et la synchronisation continue. La synchronisation ne meurt jamais à cause d'un fichier malformé. | Score de santé composite (0-10000), inégalité de Gini, profondeur du DAG de fichiers, matrice de structure de conception, lacunes de test pondérées par le risque et deltas de session. | Éditez des fichiers sans les risques liés aux regex ou au shell quoting : str_replace d'ancrage unique, remplacement multiple atomique, réécriture AST, insertion ancrée. Ré-indexation automatique après les écritures. |
Démarrage rapide
1. Installer
Homebrew (macOS) :
brew install aovestdipaperino/tap/tokensave
Scoop (Windows) :
scoop bucket add tokensave https://github.com/aovestdipaperino/scoop-bucket
scoop install tokensave
Cargo (toute plateforme) :
cargo install tokensave # full (50+ languages, default)
cargo install tokensave --features medium # medium tier
cargo install tokensave --no-default-features # lite (smallest binary)
Binaires précompilés (Linux, Windows, macOS) :
Téléchargez depuis la dernière version et placez le binaire dans votre PATH.
| Plateforme | Archive |
|---|---|
| macOS (Apple Silicon) | tokensave-vX.Y.Z-aarch64-macos.tar.gz |
| Linux (x86_64) | tokensave-vX.Y.Z-x86_64-linux.tar.gz |
| Linux (ARM64) | tokensave-vX.Y.Z-aarch64-linux.tar.gz |
| Windows (x86_64) | tokensave-vX.Y.Z-x86_64-windows.zip |
2. Configurer votre agent
tokensave install # auto-detects installed agents
tokensave install --agent antigravity # Google Antigravity (formerly Windsurf)
tokensave install --agent auggie # AugmentCode
tokensave install --agent claude # Claude Code
tokensave install --agent cline # Cline
tokensave install --agent codex # OpenAI Codex CLI
tokensave install --agent copilot # GitHub Copilot
tokensave install --agent cursor # Cursor
tokensave install --agent droid # Factory Droid
tokensave install --agent gemini # Gemini CLI
tokensave install --agent kilo # Kilo CLI
tokensave install --agent kiro # AWS Kiro
tokensave install --agent kimi # Moonshot Kimi CLI
tokensave install --agent opencode # OpenCode
tokensave install --agent pi # Pi (pi.dev)
tokensave install --agent qwen # Qwen Code
tokensave install --agent roo-code # Roo Code
tokensave install --agent vibe # Mistral Vibe
tokensave install --agent zed # Zed
tokensave install --agent grok # Grok Build (xAI)
tokensave install --git-hook yes # auto-install the global post-commit and post-checkout hooks (no prompt)
tokensave install --git-hook no # skip the post-commit and post-checkout hooks (no prompt)
Chaque agent voit son serveur MCP enregistré dans le format de configuration natif. Claude Code reçoit en plus un hook PreToolUse (bloque les agents Explore inutiles), un hook UserPromptSubmit, un hook Stop, des règles d'invite dans CLAUDE.md et des permissions d'outils auto-autorisées. Kiro reçoit la configuration MCP globale, le pilotage tokensave.md chargé comme ressource, et un agent par défaut géré par tokensave avec approbation permissive des outils intégrés/tokensave, hooks de garde-fou de délégation et synchronisation post-écriture ; les agents Kiro gérés par l'utilisateur sont préservés.
Toutes les modifications sont idempotentes -- exécutable à nouveau sans risque après une mise à niveau. Après la configuration de l'agent, des hooks git globaux post-commit et post-checkout vous seront proposés.
Installation locale au projet
Par défaut, tokensave install enregistre le serveur MCP dans votre configuration d'agent globale (par ex. ~/.claude.json). Pour enregistrer tokensave uniquement pour le projet actuel, ajoutez --local :
tokensave install --local --agent claude
Ceci écrit une configuration limitée au projet que vous pouvez commiter et partager avec votre équipe. Pour Claude, il s'agit de ./.mcp.json, ./.claude/settings.json et ./CLAUDE.md. Agents supportés : claude, cursor, droid, gemini, zed, opencode, roo-code, kiro, auggie (chacun écrit son propre fichier projet, par ex. .cursor/mcp.json, .factory/mcp.json, .gemini/settings.json, .zed/settings.json, opencode.json, .roo/mcp.json, .kiro/settings/mcp.json, .augment/settings.json). Les autres agents n'ont pas de configuration limitée au projet et signalent une erreur avec --local.
Supprimez une installation locale au projet avec tokensave uninstall --local.
3. Indexer votre projet
cd /path/to/your/project
tokensave init
Ceci crée un répertoire .tokensave/ avec la base de données du graphe de connaissances. L'initialisation et la synchronisation sont des commandes séparées : init est une adhésion unique par projet, tandis que sync ne met à jour que les projets déjà initialisés. Cela empêche les hooks git globaux de créer silencieusement des bases de données dans des dépôts que vous n'aviez jamais l'intention d'indexer. Après init, utilisez tokensave sync pour mettre à jour de manière incrémentielle -- seuls les fichiers modifiés sont ré-indexés.
Ce que l'installation écrit pour Claude Code
Serveur MCP
{
"mcpServers": {
"tokensave": {
"command": "/path/to/tokensave",
"args": ["serve"]
}
}
}
Hook PreToolUse
Le hook exécute tokensave hook-pre-tool-use -- une commande Rust native (pas besoin de bash ou jq). Il intercepte les appels d'outils Agent, Grep et Bash : les agents Explore sont bloqués net, et les invocations grep/rg/ag en forme de symbole (identifiants simples, alternances, noms enveloppés par \b) sont redirigées vers l'outil MCP tokensave correspondant. Les motifs regex, les modes de découverte de fichiers, git grep et les commandes en pipeline passent sans modification ; définissez TOKENSAVE_DISABLE_GREP_HOOK=1 pour vous désengager par shell.
Dispatch headless / sous-agent (claude -p). Les processus enfants dispatchés par une session d'orchestration héritent de son ~/.claude/settings.json, y compris ce hook. Pour permettre à un enfant d'exécuter des recherches brutes, définissez TOKENSAVE_DISABLE_GREP_HOOK=1 dans l'environnement de l'enfant -- le binaire natif l'honore et laisse passer chaque chemin (Grep, Bash, Agent), donc il n'y a pas besoin du --settings '{"hooks": {}}' brutal qui supprime tous les hooks. Le garde-fou est sans état : il ne consulte jamais l'historique des citations, donc il ne redirige que les recherches en forme de symbole décrites ci-dessus et oriente la dispersion de recherche non typée ; les commandes ordinaires ne sont pas affectées, que la session soit interactive ou headless.
Règles CLAUDE.md
Ajoute des instructions à ~/.claude/CLAUDE.md qui disent à Claude d'utiliser les outils tokensave avant de recourir aux agents Explore ou aux lectures de fichiers brutes.
Synchronisation résiliente aux crashs
Les grammaires tree-sitter sont du code C/C++ compilé. Elles rencontrent occasionnellement une assertion interne ou terminent autrement le processus par des chemins que la gestion de panique Rust ne peut pas intercepter. Depuis la v4.3.0, chaque fichier est analysé dans un sous-processus worker de courte durée : si une grammaire provoque une segfault, appelle abort() ou rencontre un dépassement de pile, seul le worker meurt. Le pool le régénère, le fichier incriminé est journalisé et ignoré, et sync continue.
Le worker est une sous-commande extract-worker cachée authentifiée auprès du parent via un jeton de 256 bits par génération, requis à la fois comme variable d'environnement TOKENSAVE_WORKER_TOKEN et comme les 32 premiers octets reçus sur stdin. L'invocation directe par les utilisateurs échoue. Par défaut, available_parallelism() workers ; désengagez avec TOKENSAVE_DISABLE_SUBPROCESS=1.
Les primitives d'édition (tokensave_str_replace, tokensave_insert_at, etc.) s'exécutent toujours dans le processus : elles ciblent un fichier à la fois où la surcharge du sous-processus dominerait, et un crash d'extracteur y est immédiatement visible pour l'agent.
Indexation multi-branche (Optionnelle)
tokensave peut optionnellement maintenir un graphe de code séparé par branche git. Lorsqu'elle est activée, changer de branche ne vous donne jamais de résultats périmés et ne ré-indexe jamais les fichiers que vous avez déjà analysés sur une autre branche. Le suivi multi-branche est optionnel -- sans cela, tokensave utilise une seule base de données pour toutes les branches.
Comment ça marche
Lorsque vous suivez une branche, tokensave copie la base de données de l'ancêtre le plus proche et synchronise uniquement les fichiers qui diffèrent. Cela signifie que suivre une branche de fonctionnalité à partir de main est quasi instantané -- cela n'analyse que les fichiers que vous avez modifiés.
Commandes CLI
tokensave branch add # track the current branch
tokensave branch list # see tracked branches and DB sizes
tokensave branch remove <name> # stop tracking a branch
tokensave branch removeall # remove all tracked branches except default
tokensave branch gc # clean up branches deleted from git
Outils MCP inter-branches
Trois outils MCP permettent des requêtes inter-branches sans changer votre checkout :
tokensave_branch_search-- rechercher des symboles dans le graphe d'une autre branchetokensave_branch_diff-- comparer les graphes de code entre deux branches : symboles ajoutés, supprimés et modifiés (signature différente). Prend en charge les filtres de fichier et de type.tokensave_branch_list-- lister les branches suivies avec les tailles de DB, la branche parente et les heures de synchronisation
Repli de branche
Lorsque le serveur MCP ne trouve pas de base de données pour la branche actuelle, il sert à partir de la DB de la branche ancêtre la plus proche et inclut un avertissement dans chaque réponse d'outil suggérant d'exécuter tokensave branch add.
Suivi automatique des branches (v7.3.0)
Une fois le mode multi-branche amorcé (une première commande manuelle tokensave branch add a créé les métadonnées de branche), les nouvelles branches peuvent être suivies automatiquement au lieu de se replier sur la DB ancêtre. Deux mécanismes indépendants couvrent cela ; les projets en mode DB unique ne sont jamais affectés, et aucun des deux mécanismes ne touche jamais à la base de données de la branche par défaut.
Hook git (au checkout de branche). Le hook post-checkout que tokensave install met en place reconnaît un checkout de branche (par opposition à un checkout de fichier) et exécute tokensave branch add en arrière-plan. Cette commande est sans effet lorsque la branche est déjà suivie ou est la branche par défaut, donc le basculement ordinaire entre branches connues ne coûte rien.
Suivi automatique à l'ouverture (optionnel). Lorsque TokenSave::open s'exécute — commande CLI ou démarrage du serveur MCP — et que la branche active n'est pas suivie, tokensave peut la suivre sur-le-champ en copiant la DB de l'ancêtre suivi le plus proche et en l'enregistrant dans les métadonnées de branche. Ceci est contrôlé par le champ de configuration auto_track (par défaut false) ou la variable d'environnement TOKENSAVE_AUTO_TRACK, qui remplace la configuration par exécution (toute valeur l'active sauf 0, false, no, off ou vide). La copie est la même copie quasi instantanée de la DB ancêtre qu'effectue un branch add manuel ; aucune synchronisation n'est exécutée à ce moment-là — le hook post-commit garde la nouvelle DB de branche à jour au fur et à mesure de vos commits, ou exécutez tokensave sync pour rafraîchir immédiatement. Le suivi automatique est strictement au mieux : tout échec est signalé comme un avertissement et open() procède avec le repli ancêtre habituel, donc il ne peut jamais interrompre un appel d'outil.
En bref : avec le hook installé, le checkout d'une nouvelle branche de fonctionnalité lui donne de manière transparente son propre graphe par branche ; avec auto_track activé, même une branche créée en dehors d'un checkout (par ex. dans un nouveau worktree) est prise en charge la première fois que tokensave ouvre le projet dessus.
Voir docs/BRANCHING-USER-GUIDE.md pour le guide complet.
Mémoire inter-session
Trois outils MCP conservent les décisions et le contexte de zone de code entre les sessions, stockés dans le fichier .tokensave/tokensave.db propre au projet.
| Outil | Rôle |
|---|---|
tokensave_record_decision | Enregistrer une décision de conception/architecture avec raison facultative, fichiers et étiquettes |
tokensave_record_code_area | Marquer un chemin sur lequel l'agent a travaillé (compteur de contact + last_touched_at) |
tokensave_session_recall | Requête FTS5 sur les décisions enregistrées ; à associer aux deux outils d'écriture |
Utilisez-les pour que l'agent n'ait pas à réexpliquer les choix d'architecture d'une session à l'autre.
Registre des économies
Chaque appel MCP écrit une ligne en ajout seulement dans ~/.tokensave/global.db (table savings_ledger). Inspectez avec tokensave gain :
tokensave gain # current project, last 30 days
tokensave gain --all # all projects
tokensave gain --history --range 7d
tokensave gain --json
Les estimations en dollars utilisent le module de tarification existant (tarification des entrées Sonnet, actualisée quotidiennement via LiteLLM).
Benchmark reproductible
tokensave bench exécute un ensemble de requêtes fixe via tokensave_context et rapporte les économies de récupération par rapport à une base de référence fichier complet (reflète la méthodologie CCE) :
tokensave bench # ships with 10 default queries
tokensave bench --queries my-queries.toml --json
tokensave bench --max-nodes 5
Mesuré sur ce dépôt (tokensave lui-même) en utilisant l'ensemble de requêtes génériques fourni :
| # | Requête | Référence | Contexte | Économie | Fichiers | Nœuds |
|---|---|---|---|---|---|---|
| 1 | Comment la configuration est-elle chargée au démarrage ? | 45,3k | 454 | 99% | 4 | 5 |
| 2 | Où les arguments de ligne de commande sont-ils analysés et distribués ? | 948 | 402 | 58% | 3 | 3 |
| 3 | Comment le point d'entrée principal est-il organisé ? | 6,1k | 251 | 96% | 3 | 8 |
| 4 | Comment les erreurs sont-elles définies, encapsulées et propagées ? | 3,5k | 819 | 77% | 2 | 3 |
| 5 | Où la journalisation ou la sortie de diagnostic est-elle émise ? | 8,6k | 514 | 94% | 6 | 14 |
| 6 | Comment les tests sont-ils organisés et quel harnais de test est utilisé ? | 3,5k | 818 | 77% | 2 | 3 |
| 7 | Comment les données sont-elles persistées sur disque ou dans une base de données ? | 11,9k | 330 | 97% | 3 | 6 |
| 8 | Comment les tâches asynchrones ou le travail en arrière-plan sont-ils lancés ? | 29,4k | 364 | 99% | 2 | 3 |
| 9 | Comment la construction assemble-t-elle les dépendances et initialise-t-elle l'état ? | 10,9k | 1,4k | 88% | 4 | 5 |
| 10 | Comment les surfaces d'API publiques sont-elles exposées (points de terminaison HTTP, exports de bibliothèque ou commandes CLI) ? | 22,5k | 235 | 99% | 4 | 5 |
Agrégat : 88 % d'économie moyenne de récupération (142,8k → 5,5k tokens sur 10 requêtes).
L'ensemble de requêtes par défaut cible des motifs présents dans la plupart des bases de code applicatives (CLI, démons, services). Exécutez-le sur votre propre projet avec tokensave bench pour voir vos chiffres, ou écrivez un fichier de requêtes personnalisé (--queries my.toml) pour un rappel plus précis.
Banc d'essai Criterion sur de grands dépôts réels
benches/large_repos.rs est un micro-benchmark criterion qui exerce les outils MCP de bout en bout sur quatre grandes bases de code open source épinglées à des références constantes. Chaque outil est piloté par au moins 5 requêtes avec des arguments (identifiants de nœud, noms qualifiés, globs de fichiers, …) échantillonnés à partir du graphe indexé une fois par dépôt, afin que les temps soient reproductibles d'une exécution à l'autre.
Dépôts et références épinglées (définis dans benches/repos.rs) :
| Dépôt | URL | Réf |
|---|---|---|
| polkadot-sdk | https://github.com/paritytech/polkadot-sdk | polkadot-stable2412 |
| emacs | https://github.com/emacs-mirror/emacs | emacs-30.1 |
| scipy | https://github.com/scipy/scipy | v1.14.1 |
| node | https://github.com/nodejs/node | v22.11.0 |
Chaque dépôt est cloné superficiellement (git init + git fetch --progress --depth 1 origin <ref> + checkout FETCH_HEAD) lors de la première utilisation et mis en cache localement ; les exécutions suivantes réutilisent l'extraction. La sortie Git est diffusée vers le terminal afin que la récupération de plusieurs Go affiche la progression en temps réel.
Outils couverts (5 requêtes chacun). Outils de lecture — search, context, callers, callees, node, by_qualified_name, signature, impact, body, files, complexity, doc_coverage, largest, hotspots, god_class, module_api, derives, dead_code, rank, coupling, circular. Outils d'écriture — str_replace, multi_str_replace, insert_at, et (si ast-grep est sur PATH) ast_grep_rewrite.
Synchronisation forcée à chaque exécution. Avant tout déclenchement de benchmark, le harnais exécute l'équivalent de tokensave sync --force sur chaque dépôt (index_all() quelle que soit la fraîcheur de .tokensave/) afin que les temps reflètent toujours la source épinglée.
Bancs d'essai d'écriture et nettoyage. Les outils d'écriture modifient les fichiers. Pour maintenir la condition préalable « la correspondance doit être unique », le harnais utilise iter_batched de criterion — un petit fichier temporaire sous <repo>/.tokensave-bench-scratch/ est réécrit avec un contenu connu avant chaque itération chronométrée, puis l'outil d'édition s'exécute dessus. Une fois tous les benchmarks terminés, le harnais exécute git stash --include-untracked && git stash drop dans chaque dépôt préparé afin que l'arbre de travail revienne à la référence épinglée.
Configuration de Criterion. Le banc d'essai remplace les valeurs par défaut de criterion par sample_size = 10 et measurement_time = 30s (au lieu des 100 / 5s standard), ce qui donne à chaque mesure de temps par requête environ 30 secondes — suffisamment pour que des outils lents comme tokensave_context sur polkadot-sdk produisent des chiffres stables.
Exécutez-le :
# Required: a writable cache directory for the cloned repos + their indexes.
# Expect several GB of disk and a long first run (shallow clone + full index of each repo).
export TOKENSAVE_BENCH_REPOS_DIR=~/tokensave-bench-cache
cargo bench --bench large_repos
Si TOKENSAVE_BENCH_REPOS_DIR n'est pas défini, le banc d'essai affiche un avis et enregistre zéro benchmark (afin que cargo bench --all reste léger sur les machines des contributeurs).
Configuration (tout optionnel, via l'environnement) :
| Variable | Effet |
|---|---|
TOKENSAVE_BENCH_REPOS_DIR | Requis. Répertoire racine où chaque dépôt est cloné dans $DIR/<repo-name>/. |
TOKENSAVE_BENCH_REPOS | Sous-ensemble de noms de dépôts séparés par des virgules à évaluer, par ex. TOKENSAVE_BENCH_REPOS=emacs,scipy. Par défaut, les quatre. |
TOKENSAVE_BENCH_SKIP_CLONE | Si défini, le banc d'essai échoue rapidement pour tout dépôt qui n'est pas déjà à sa référence épinglée au lieu de le récupérer. Utile en CI / exécutions hors ligne. |
Le filtrage des benchmarks utilise la CLI standard de criterion — par exemple, uniquement l'outil search sur scipy :
cargo bench --bench large_repos -- 'scipy/tokensave_search'
Les rapports (HTML + échantillons bruts) se trouvent sous target/criterion/.
Pour changer les références épinglées (par ex. vers une version plus récente ou un SHA spécifique), modifiez REPOS dans benches/repos.rs et supprimez le marqueur $TOKENSAVE_BENCH_REPOS_DIR/<repo>/.bench-ref correspondant afin que la prochaine exécution refasse la récupération. Si vous sautez le nettoyage post-exécution (par ex. vous faites Ctrl-C en cours de banc d'essai), exécuter git stash --include-untracked && git stash drop dans chaque répertoire de dépôt le restaure manuellement.
Sonde de matrice de test MCP (scripts/mcp_probe)
scripts/mcp_probe/ est un harnais Python qui pilote tokensave serve via stdio sur un ensemble configurable de dépôts réels et exerce chaque outil MCP en lecture seule avec 5 variantes de requête par langage, produisant une table de statut par outil / par dépôt. Le même harnais sert deux objectifs :
- Balayage de régression. Nouveau support de langage, nouvel outil ou refactorisation — réexécutez la matrice et toute cellule qui génère une nouvelle erreur, expire ou retourne des résultats vides ressort comme un 🚩.
- Sonde de performance. Les temps par appel sont journalisés en TSV ; le même corpus fixe de dépôts sert également de comparaison grossière entre versions. Le bogue actuel du cycle
tokensave_inheritance_deptha été trouvé par ce harnais lorsqu'un seul outil sur polkadot-sdk a expiré à >60 s.
Disposition — probe.py est le pilote (JSON-RPC à identifiant apparié pour qu'un outil lent ne puisse pas empoisonner les appels suivants), isolated.py réexécute un seul outil avec un serveur frais par appel (échappe à la file d'attente du serveur), build_matrix.py lit le TSV et émet du markdown, les modules tools/<lang>.py fournissent des ensembles de requêtes par langage (Rust livré ; ajoutez Python/Go/… en déposant un nouveau module), repos.toml liste les dépôts cibles (remplacez via $TOKENSAVE_PROBE_REPOS).
Exécution rapide :
cargo build --release --bin tokensave
python3 scripts/mcp_probe/probe.py
python3 scripts/mcp_probe/build_matrix.py > matrix.md
Les cellules de sortie sont ✓ 5/5 (propre), 🐛 e/N (erreurs), ⏱ N/N (expirations), ∅ E/N (vide), 🐢 ok/slow (appels >10 s). Toute cellule portant une erreur ou une expiration gagne un 🚩 dans la colonne la plus à droite. Le détail par appel avec les 100 premiers caractères de chaque erreur se trouve dans le journal TSV pour suivi.
Différent du banc d'essai criterion ci-dessus : criterion mesure la latence par itération pour un ensemble d'outils ciblé sur des références épinglées et produit des rapports statistiques sous target/criterion/ ; mcp_probe exerce chaque outil avec un ensemble de requêtes plus large sur les dépôts que vous pointez, en optimisant pour l'étendue de la couverture plutôt que la précision de la mesure.
Plus de 80 outils MCP
Le serveur expose plus de 80 outils (un de moins lorsque le binaire optionnel ast-grep n'est pas sur PATH) ; les tableaux ci-dessous regroupent les plus couramment utilisés par catégorie. La plupart sont en lecture seule, peuvent être appelés en parallèle en toute sécurité et sont annotés avec readOnlyHint. Les primitives d'édition sont limitées à des fichiers uniques et réindexent sur place ; les outils de base de session et d'enregistrement en mémoire modifient également l'état local .tokensave et sont annotés comme non lecture seule. Les trois outils principaux (tokensave_context, tokensave_search, tokensave_status) sont marqués anthropic/alwaysLoad afin de contourner l'aller-retour de recherche d'outils du client.
Découverte
| Outil | Rôle |
|---|---|
tokensave_context | Obtenir le contexte de code pertinent pour une tâche -- points d'entrée, symboles associés, extraits de code |
tokensave_search | Trouver des symboles par nom (fonctions, classes, types) |
tokensave_node | Obtenir les détails + le code source d'un symbole spécifique |
tokensave_files | Lister les fichiers de projet indexés avec filtrage |
tokensave_module_api | Surface d'API publique d'un fichier ou répertoire |
tokensave_similar | Trouver des symboles avec des noms similaires |
tokensave_annotations | Introspection d'attribut/annotation/décorateur -- histogramme de toutes les annotations ou listes par site avec filtres de cible |
tokensave_dependencies | Introspection de manifeste de paquet sur 17 écosystèmes -- résumé de l'espace de travail, recherche par paquet, surface de licence, dérive de version |
tokensave_status | Statut de l'index, statistiques, tokens économisés |
Graphe d'appel et impact
| Outil | Rôle |
|---|---|
tokensave_callers | Trouver ce qui appelle une fonction |
tokensave_callees | Trouver ce qu'une fonction appelle |
tokensave_impact | Voir ce qui est affecté par la modification d'un symbole |
tokensave_affected | Trouver les fichiers de test affectés par les modifications de la source |
tokensave_rename_preview | Toutes les références à un symbole (aperçu de l'impact d'un renommage) |
tokensave_hotspots | Symboles les plus connectés (nombre d'appels le plus élevé) |
Qualité du code
| Outil | Rôle |
|---|---|
tokensave_complexity | Classer les fonctions par complexité cyclomatique et cognitive, profondeur d'imbrication, métriques de Halstead, indice de maintenabilité, CRAP et métriques de sécurité |
tokensave_dead_code | Trouver les symboles inaccessibles (pas d'arêtes entrantes) |
tokensave_god_class | Trouver les classes avec trop de membres |
tokensave_coupling | Classer les fichiers par fan-in/fan-out |
tokensave_inheritance_depth | Trouver les hiérarchies d'héritage les plus profondes |
tokensave_circular | Détecter les dépendances circulaires entre fichiers |
tokensave_recursion | Détecter les cycles d'appels récursifs/mutuellement récursifs |
tokensave_unused_imports | Instructions d'importation jamais référencées |
tokensave_doc_coverage | Symboles publics sans documentation |
tokensave_simplify_scan | Analyse de qualité des fichiers modifiés (duplications, code mort, complexité) |
Analyses de santé du code
Cinq outils font émerger des signaux de qualité structurelle à partir du graphe existant. Le score composite utilise une moyenne géométrique sur des dimensions indépendantes afin qu'aucune ne puisse être manipulée isolément.
| Outil | Rôle |
|---|---|
tokensave_health | Signal de qualité composite (0-10000) à partir de l'acyclicité, de la profondeur, de l'égalité, de la redondance et de la modularité |
tokensave_gini | Coefficient d'inégalité de Gini pour toute métrique (complexité, lignes, fan-in/out, membres) -- trouve les fichiers dieux et la distribution inégale |
tokensave_dependency_depth | Chaînes de dépendances au niveau fichier les plus longues (nivellement de Lakos) avec reconstruction complète de la chaîne après rupture de cycle Tarjan SCC |
tokensave_dsm | Matrice de Structure de Conception sous forme stats, clusters ou matrix -- révèle les violations de couches et le couplage caché |
tokensave_test_risk | Analyse des lacunes de test pondérée par le risque combinant complexité, fan-in, couverture et évolution git sur 90 jours en un seul score |
Sessions
Capturez les métriques de santé au début d'une session de codage IA, puis comparez à la fin pour voir ce qui s'est amélioré ou a régressé.
| Outil | Objectif |
|---|---|
tokensave_session_start | Enregistrer les métriques de santé actuelles comme référence JSON pour une comparaison ultérieure |
tokensave_session_end | Recalculer et comparer à la référence -- deltas par dimension, succès/échec, nettoyage automatique |
Primitives d'édition
Quatre outils d'écriture permettant aux agents de modifier des fichiers sans les risques liés aux expressions régulières ou à l'échappement shell. Chacun est mono-fichier, ancré, et déclenche une réindexation sur place après écriture afin que le graphe ne soit jamais obsolète.
| Outil | Objectif |
|---|---|
tokensave_str_replace | Remplacer un old_str unique par new_str ; échoue si 0 ou >1 correspondance (protège contre les bogues de multi-édition) |
tokensave_multi_str_replace | Appliquer N remplacements (old, new) de manière atomique -- transaction tout ou rien |
tokensave_insert_at | Insérer du contenu avant ou après une chaîne d'ancrage unique ou un numéro de ligne |
tokensave_ast_grep_rewrite | Réécriture structurelle de code via la CLI ast-grep en mode --rewrite |
Git & Flux de travail
| Outil | Objectif |
|---|---|
tokensave_diff_context | Contexte sémantique pour les fichiers modifiés -- symboles modifiés, dépendances, tests affectés |
tokensave_commit_context | Résumé sémantique des modifications non commitées pour la rédaction du message de commit |
tokensave_pr_context | Diff sémantique entre les références git pour les descriptions de pull request |
tokensave_changelog | Diff sémantique entre deux références git |
tokensave_test_map | Mappage source-à-test au niveau du symbole, avec détection des symboles non couverts |
tokensave_test_coverage | Récapitulatif de couverture par fichier/symbole/fonction-de-test avec expansion transitive des arêtes d'appel |
Système de types
| Outil | Objectif |
|---|---|
tokensave_type_hierarchy | Arborescence récursive de la hiérarchie des types pour les traits, interfaces et classes |
tokensave_rank | Classer les nœuds par nombre de relations (interface la plus implémentée, classe la plus étendue) |
tokensave_distribution | Répartition des types de nœuds par fichier ou répertoire |
tokensave_largest | Classer les nœuds par taille -- plus grandes classes, plus longues méthodes |
Portage
| Outil | Objectif |
|---|---|
tokensave_port_status | Comparer les symboles entre les répertoires source/cible pour suivre la progression du portage |
tokensave_port_order | Tri topologique des symboles pour le portage -- porter les feuilles d'abord, puis les dépendants |
Multi-branche
| Outil | Objectif |
|---|---|
tokensave_branch_search | Rechercher des symboles dans le graphe d'une autre branche |
tokensave_branch_diff | Comparer les symboles entre les branches (ajoutés/supprimés/modifiés) |
tokensave_branch_list | Lister les branches suivies avec la taille des BDD et les heures de synchronisation |
Ressources MCP
Quatre ressources sont exposées via resources/list et resources/read :
tokensave://status-- statistiques du graphe au format JSONtokensave://files-- arborescence de fichiers indexés groupée par répertoiretokensave://overview-- résumé du projet avec distribution des langages et types de symbolestokensave://branches-- branches suivies avec tailles de BDD et informations sur le parent
Suivi des jetons
tokensave mesure les jetons qu'il économise à chaque appel d'outil MCP. Chaque réponse d'outil inclut une ligne tokensave_metrics: before=N after=M indiquant combien de jetons de fichier brut ont été évités par cet appel spécifique.
Observabilité des coûts
tokensave cost # 7-day cost summary (default)
tokensave cost today # today only
tokensave cost --by-model # breakdown by Claude model
tokensave cost --by-task # breakdown by task category (coding, debugging, exploration, ...)
tokensave cost --export json # JSON export to stdout
tokensave cost --export csv # CSV export to stdout
Analyse les transcriptions de session Claude Code (~/.claude/projects/**/*.jsonl), classe chaque tour d'API dans l'une des 13 catégories de tâches, calcule le coût en dollars en utilisant la tarification du modèle, et stocke les résultats dans ~/.tokensave/global.db pour des requêtes agrégées rapides. La tarification est actualisée depuis LiteLLM toutes les 24 heures et utilise une table intégrée en mode hors ligne.
L'en-tête tokensave status inclut une ligne de coût indiquant les dépenses du jour, le total sur 7 jours et le ratio d'efficacité (jetons économisés / total des jetons). L'ATH tokensave monitor affiche un panneau de coûts en direct à côté du flux d'économies. À la fin de chaque session Claude Code, le gestionnaire hook_stop imprime un reçu d'une ligne dans le terminal.
Catégories de classification des tâches : Codage, Débogage, Développement de fonctionnalités, Refactorisation, Tests, Exploration, Planification, Délégation, Opérations Git, Build/Déploiement, Brainstorming, Conversation, Général. La classification est déterministe (reconnaissance de motifs sur les noms d'outils et les commandes Bash), ne nécessite aucun appel LLM, et est adaptée de AgentSeal/codeburn.
Moniteur en direct
tokensave monitor
Une IHM globale qui montre les appels d'outils MCP de tous les projets en temps réel, via un tampon circulaire partagé mappé en mémoire à ~/.tokensave/monitor.mmap. Chaque entrée montre le nom du projet, le nom de l'outil et le delta de jetons. Un panneau de coûts en haut affiche les dépenses du jour, les économies, l'efficacité et le modèle principal (actualisé toutes les 30 secondes).
Compteurs de session et à vie
tokensave current-counter # show per-project session counter
tokensave reset-counter # reset the session counter
tokensave status # shows project + global lifetime totals + cost
tokensave status affiche les statistiques de l'index du projet, la répartition par langage, la ligne de coût (aujourd'hui / 7j / efficacité), et les totaux à vie du projet et mondiaux :
Compteur mondial
Tous les utilisateurs de tokensave contribuent à un compteur agrégé anonyme. tokensave status montre à la fois le total de votre projet et le total mondial. L'envoi ne transmet qu'un seul nombre (par ex. 4823) sans aucune information d'identification. Désactivez avec tokensave disable-upload-counter.
Fraîcheur de l'index
tokensave maintient le graphe à jour sans démon d'arrière-plan ni observateur de fichiers au niveau du système d'exploitation.
Vérification de l'obsolescence à la demande. Chaque appel d'outil MCP vérifie si des fichiers indexés ont été modifiés depuis la dernière synchronisation. Si des fichiers obsolètes sont trouvés, ils sont ré-extraits avant que la réponse de l'outil ne soit renvoyée. Un délai de 30 secondes empêche les appels consécutifs de ré-explorer l'arborescence à chaque frappe.
Synchronisation de rattrapage à la connexion. Lorsque le serveur MCP démarre, il exécute immédiatement une synchronisation de rattrapage non bloquante qui prend en compte toutes les modifications effectuées lorsqu'aucun agent n'était attaché — un git pull, une édition dans l'IDE, une étape de build — afin que le tout premier appel d'outil d'une session voie un index frais.
Travail multi-agents et arborescences de travail git. Lorsque plusieurs agents travaillent simultanément sur le même projet, l'hypothèse forte est que chaque agent opère dans sa propre arborescence de travail git. Les arborescences de travail sont des extractions indépendantes du même dépôt sur le système de fichiers : l'agent A et l'agent B ont chacun leur propre copie de chaque fichier, de sorte qu'ils n'écrasent jamais les modifications en cours de l'autre. tokensave détecte automatiquement quand une requête provient d'une arborescence de travail imbriquée dans l'extraction principale et sert les résultats à partir du graphe de la branche correcte. Les modifications s'accumulent indépendamment et sont finalement réconciliées via git merge ou rebase — le même processus utilisé pour tout autre développement parallèle. Cette conception évite la complexité et les modes de défaillance du verrouillage inter-agents sur un répertoire mutable partagé.
Flux de travail CLI uniquement. Si vous exécutez des commandes tokensave sans agent attaché (pas de serveur MCP), la vérification d'obsolescence ne s'exécute pas entre les commandes. Installez des hooks git pour maintenir l'index frais automatiquement après chaque commit ou clone :
cp scripts/post-commit scripts/post-checkout .git/hooks/
chmod +x .git/hooks/post-commit .git/hooks/post-checkout
Mise à niveau depuis la 5.x
La commande autonome tokensave daemon et son démarrage automatique launchd/systemd/Windows Service ont été supprimés dans la version 6.0.0. L'observateur de fichiers intégré au niveau du système d'exploitation qui remplaçait le démon a lui-même été supprimé dans la version 6.1.0 (il causait une utilisation excessive du CPU et de la mémoire sur les grands monorepos avec des arborescences node_modules ou target profondes). Le modèle d'obsolescence à la demande ci-dessus est la conception actuelle.
Si vous avez encore un démarrage automatique de démon de la version 5.x, supprimez-le :
- macOS :
launchctl unload ~/Library/LaunchAgents/com.tokensave.daemon.plist && rm ~/Library/LaunchAgents/com.tokensave.daemon.plist - Linux :
systemctl --user disable --now tokensave-daemon && rm ~/.config/systemd/user/tokensave-daemon.service - Windows :
sc.exe delete tokensave-daemon(depuis un terminal élevé)
Si vous ne vous souvenez pas du nom exact : launchctl list | grep tokensave / systemctl --user list-units | grep tokensave / sc.exe query state= all | findstr -i tokensave.
Auto-mise à niveau
tokensave upgrade # upgrade to latest in current channel
tokensave channel # show current channel (stable/beta)
tokensave channel beta # switch to beta channel
tokensave channel stable # switch back to stable
tokensave upgrade télécharge le binaire de plateforme correct depuis les releases GitHub et remplace le binaire en cours d'exécution sur place. Prend en charge les canaux stable et bêta indépendamment.
Versionnage & mises à niveau
Les numéros de version de tokensave ressemblent à SemVer mais ne le suivent pas : le composant qui change encode la maintenance requise par la mise à jour, que tokensave effectue automatiquement au prochain lancement — vous n'exécutez jamais de réinstallation ou de réindexation manuellement.
| Incrément | Exemple | La mise à jour nécessite | Action automatique |
|---|---|---|---|
Correctif (x.y.Z) | 7.2.0 → 7.2.1 | Rien | Aucune — pas de réinstallation, pas de réindexation |
Mineur (x.Y.0) | 7.2.0 → 7.3.0 | Une réinstallation (nouveaux harnais, nouveaux outils, nouvelle configuration) | Réinstallation globale de chaque intégration d'agent installée (rafraîchit les permissions, les hooks et la configuration MCP) |
Majeur (X.0.0) | 7.2.0 → 8.0.0 | Une réinstallation + resynchronisation complète | Réinstallation globale et une réindexation forcée par projet (équivalent à sync -f) |
Réinstallation globale. Lors de la première exécution d'une nouvelle version mineure ou majeure, tokensave ré-exécute silencieusement install pour chaque agent qu'il a enregistré, afin que la configuration de l'agent pointe toujours vers le binaire actuel et expose l'ensemble d'outils actuel. Les incréments de correctif sautent cette étape — le marqueur de version en cours est simplement avancé.
Réindexation forcée par projet (majeur uniquement). Un incrément majeur signifie que les index de projet doivent être reconstruits. tokensave le fait paresseusement et par projet : lors du premier appel d'outil MCP dans un projet après une mise à niveau majeure, il lance une réindexation complète en arrière-plan (équivalent à tokensave sync --force) qui ne bloque jamais la réponse de l'outil.
Solution de repli Brew / cargo. Les mises à niveau externes qui remplacent le binaire en dehors de tokensave upgrade — brew upgrade tokensave ou cargo install tokensave — sont détectées de la même manière : si la version en cours d'exécution est plus récente que la dernière version ayant effectué une installation, la réinstallation s'exécute au prochain lancement comme elle le ferait après une auto-mise à niveau.
Voir TOKENSAVE-VERSIONING.md pour comprendre pourquoi tokensave diverge de SemVer (encoder la maintenance dans la version est ce qui rend les mises à niveau sans intervention possibles), les mécanismes de marqueur, la version indépendante du schéma de base de données, et les règles pour le mainteneur lors de la publication de releases.
Référence CLI
tokensave init [path] # Initialize a new project (full index)
tokensave sync [path] # Incremental sync (must be initialized first)
tokensave sync --force [path] # Force a full re-index
tokensave sync --doctor [path] # Sync and list added/modified/removed files
tokensave status [path] # Show statistics + cost summary
tokensave status [path] --json # Show statistics (JSON output)
tokensave status --details # Include node-kind breakdown
tokensave cost [range] # Token cost summary (default: 7d)
tokensave cost --by-model # Cost grouped by model
tokensave cost --by-task # Cost grouped by task category
tokensave cost --export json|csv # Export cost data
tokensave query <search> [path] # Search symbols
tokensave files [--filter dir] [--pattern glob] [--json] # List indexed files
tokensave affected <files...> [--stdin] [--depth N] # Find affected test files
tokensave install [--agent NAME] # Configure agent integration
tokensave reinstall # Refresh settings for all installed agents
tokensave uninstall [--agent NAME] # Remove agent integration
tokensave serve # Start MCP server
tokensave monitor # Live TUI showing MCP calls across all projects
tokensave upgrade # Self-update to latest version
tokensave channel [stable|beta] # Show or switch update channel
tokensave doctor [--agent NAME] # Check installation health
tokensave branch add|list|remove|removeall|gc # Multi-branch management
tokensave current-counter # Show per-project token counter
tokensave reset-counter # Reset per-project token counter
tokensave disable-upload-counter # Opt out of worldwide counter uploads
tokensave enable-upload-counter # Re-enable worldwide counter uploads
tokensave doctor
Exécutez un bilan de santé complet de votre installation tokensave :
tokensave doctor
Vérifications : emplacement du binaire, index du projet, BDD globale, configuration utilisateur, intégration de l'agent (serveur MCP, hooks, permissions, règles d'invite) et connectivité réseau. Si des permissions d'outils sont manquantes après une mise à niveau, il vous indique d'exécuter tokensave install. Utilisez --agent pour vérifier un agent spécifique uniquement.
Doctor valide également que chaque hook installé utilise la sous-commande tokensave correcte et répare automatiquement les hooks cassés.
Comment cela fonctionne avec Claude Code
Une fois configuré, Claude Code utilise automatiquement tokensave au lieu de lire les fichiers bruts lorsqu'il a besoin de comprendre votre base de code. Trois couches se renforcent mutuellement :
| Couche | Ce qu'elle fait | Pourquoi c'est important |
|---|---|---|
| Serveur MCP | Expose plus de 80 outils tokensave_* à Claude | Claude peut interroger le graphe directement |
| Règles CLAUDE.md | Indique à Claude de préférer tokensave aux agents/lectures de fichiers | Empêche le modèle de retomber sur des schémas coûteux |
| Hook PreToolUse | Hook Rust natif bloque les agents Explore | Intercepte les cas où le modèle ignore les règles CLAUDE.md |
| Hook UserPromptSubmit | S'exécute à la soumission de l'invite | Suivi du cycle de vie pour la comptabilité des jetons |
| Hook Stop | S'exécute à la fin de la session | Vide les compteurs de jetons |
Le résultat : Claude obtient la même compréhension du code avec beaucoup moins de jetons. Un agent Explore typique lit 20 à 50 fichiers ; tokensave renvoie les symboles, relations et extraits de code pertinents depuis son index pré-construit.
Appels réseau & Confidentialité
La fonctionnalité principale de tokensave (indexation, recherche, requêtes de graphe, serveur MCP) est 100 % locale -- votre code ne quitte jamais votre machine.
| Appel | Données envoyées | Quand | Désinscription |
|---|---|---|---|
| Téléversement du compteur mondial | Nombre de tokens (un nombre) + pays (depuis l'IP) | sync, status, sessions MCP | tokensave disable-upload-counter |
| Lecture du compteur mondial | Rien (requête GET) | status | N/A (lecture seule, délai d'attente 1s) |
| Vérification de version | Rien (requête GET) | status (cache 5m), sync (parallèle) | N/A (délai d'attente 1s, sans effet en cas d'échec) |
| Actualisation des prix des modèles | Rien (requête GET) | tokensave cost (cache 24h) | N/A (délai d'attente 5s, repli sur les prix intégrés) |
Le téléversement du compteur mondial envoie une seule requête HTTP POST avec un corps JSON comme {"amount": 4823}. Pas de cookies, pas de pistage, pas d'identifiant utilisateur. Le Worker Cloudflare enregistre le pays de votre adresse IP (déduit des en-têtes de requête) pour des statistiques géographiques agrégées -- votre adresse IP réelle n'est pas stockée.
L'actualisation des prix des modèles récupère un fichier JSON public depuis GitHub (raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json) pour maintenir à jour les prix des modèles Claude pour tokensave cost. Aucune donnée n'est envoyée -- il s'agit d'une simple requête HTTPS GET. La réponse est mise en cache à ~/.tokensave/pricing.json pendant 24 heures. Si la récupération échoue, tokensave utilise sa table de prix compilée.
Plus de 50 langages
tokensave prend en charge plus de 50 langages de programmation organisés en trois niveaux contrôlés par des indicateurs de fonctionnalité Cargo. Chaque niveau inclut tous les langages du niveau inférieur. Les en-têtes Markdown sont extraits en tant que nœuds Module avec des arêtes hiérarchiques Contains afin que la structure du document participe aux requêtes de graphe aux côtés du code source.
Lite -- --no-default-features
Toujours compilé. Le plus petit binaire pour les langages les plus populaires, plus Svelte et Astro (extraction de blocs de script via l'extracteur TypeScript, sans dépendance de grammaire supplémentaire).
| Langage | Extensions |
|---|---|
| Rust | .rs |
| Go | .go |
| Java | .java |
| Scala | .scala, .sc |
| TypeScript | .ts, .tsx |
| JavaScript | .js, .jsx |
| Python | .py |
| C | .c, .h |
| C++ | .cpp, .hpp, .cc, .cxx, .hh |
| Kotlin | .kt, .kts |
| C# | .cs |
| Swift | .swift |
| Svelte | .svelte |
| Astro | .astro |
Medium (Lite + 9 de plus) -- --features medium
| Langage | Extensions | Indicateur de fonctionnalité |
|---|---|---|
| Dart | .dart | lang-dart |
| Pascal | .pas, .pp, .dpr | lang-pascal |
| PHP | .php | lang-php |
| Ruby | .rb | lang-ruby |
| Bash | .sh, .bash | lang-bash |
| Protobuf | .proto | lang-protobuf |
| PowerShell | .ps1, .psm1 | lang-powershell |
| Nix | .nix | lang-nix |
| VB.NET | .vb | lang-vbnet |
Full (Medium + tout le reste) -- par défaut
| Langage | Extensions | Indicateur de fonctionnalité |
|---|---|---|
| ActionScript | .as | lang-actionscript |
| Lua | .lua | lang-lua |
| Zig | .zig | lang-zig |
| Objective-C | .m, .mm | lang-objc |
| Perl | .pl, .pm | lang-perl |
| Batch/CMD | .bat, .cmd | lang-batch |
| Fortran | .f90, .f95, .f03, .f08, .f18, .f, .for | lang-fortran |
| COBOL | .cob, .cbl, .cpy | lang-cobol |
| MS BASIC 2.0 | .bas | lang-msbasic2 |
| GW-BASIC | .gw | lang-gwbasic |
| QBasic | .qb | lang-qbasic |
| QuickBASIC 4.5 | .bi, .bm | lang-qbasic |
| Dockerfile | Dockerfile, .dockerfile | lang-dockerfile |
| GLSL | .glsl, .vert, .frag, .comp | lang-glsl |
| WGSL | .wgsl | lang-wgsl |
| HLSL | .hlsl, .fx | lang-hlsl |
| Metal | .metal | lang-metal |
| Markdown | .md, .markdown | lang-markdown |
| R | .r, .R | lang-r |
| SQL | .sql | lang-sql |
| Julia | .jl | lang-julia |
| Haskell | .hs, .lhs | lang-haskell |
| OCaml | .ml, .mli | lang-ocaml |
| Clojure | .clj, .cljs, .cljc | lang-clojure |
| Erlang | .erl, .hrl | lang-erlang |
| Elixir | .ex, .exs | lang-elixir |
| F# | .fs, .fsi, .fsx | lang-fsharp |
| F* | .fst, .fsti | lang-fstar |
| Quint | .qnt | lang-quint |
| TOML | .toml | lang-toml |
| Lean | .lean | lang-lean |
Les langages individuels peuvent également être sélectionnés sans un niveau complet :
cargo install tokensave --no-default-features --features lang-nix,lang-bash
Tous les extracteurs partagent la même profondeur : fonctions, classes, méthodes, champs, imports, graphes d'appel, chaînes d'héritage, docstrings, métriques de complexité, extraction de décorateurs/annotations et suivi des dépendances inter-fichiers.
tokensave vs CodeGraph
tokensave est une réécriture Rust complète de CodeGraph (Node.js/TypeScript). Les deux construisent des graphes de code sémantiques pour les agents de codage IA, mais ils divergent considérablement en termes de portée et de capacités.
| tokensave | CodeGraph | |
|---|---|---|
| Environnement d'exécution | Binaire natif (Rust) | Node.js 18+ |
| Installation | brew install, cargo install, scoop install | npx @colbymchenry/codegraph |
| Langages | 50+ (3 niveaux : lite/medium/full) | 19+ |
| Outils MCP | 80+ | 9 |
| Intégrations d'agents | 12+ (Claude, Codex, Gemini, Qwen, OpenCode, Cursor, Cline, Copilot, Roo Code, Zed, Antigravity, Kilo, Kiro, Kimi, Vibe, Grok, Factory Droid) | 1 (Claude Code) |
| Fraîcheur de l'index | Vérification de péremption à la demande à chaque appel MCP ; synchronisation de rattrapage à la connexion ; le travail multi-agents est censé utiliser des arborescences de travail git | Observateur de fichiers natif au niveau du système d'exploitation (FSEvents/inotify/ReadDirectoryChangesW, rebond de 2 s) ; synchronisation de rattrapage à la connexion |
| Indexation multi-branches | Oui, avec adhésion (bases de données par branche, diff/recherche inter-branches) | Non |
| Métriques de complexité | Extraites de l'AST (branches, boucles, profondeur d'imbrication, complexité cyclomatique et cognitive, Halstead, indice de maintenabilité, CRAP) | Non |
| Outils de portage | Oui (port_status, port_order) | Non |
| Visualiseur de graphe | Supprimé (v4.0.1) | Oui |
| Recherche sémantique | Expansion de mots-clés pilotée par l'agent (coût nul) | Plongements locaux (nomic-embed-text-v1.5 via ONNX) |
| Ressources MCP | 4 (status, files, overview, branches) | Non |
| Annotations MCP | Oui (readOnlyHint, alwaysLoad) | Non |
| Détection de code mort | Oui | Non |
| Détection de dépendances circulaires | Oui | Non |
| Hiérarchie de types | Oui | Non |
| Analyse de classe Dieu / couplage | Oui | Non |
| Contexte de commit / PR | Oui | Non |
| Mappage de tests | Oui | Non |
| Aperçu de renommage | Oui | Non |
| Suivi des tokens | Métriques par appel, moniteur TUI en direct, compteurs de session et de durée de vie | Non |
| Analyse de santé du code | Score composite, Gini, profondeur de dépendance, DSM, écarts de test pondérés par le risque, deltas de session | Non |
| Primitives d'édition | 4 rédacteurs atomiques (str_replace, multi_str_replace, insert_at, ast_grep_rewrite) avec ré-indexation automatique | Non |
| Résilience aux plantages | Extraction isolée dans un sous-processus ; les abandons de grammaire native sautent le fichier, la synchronisation continue | Non |
| Mise à niveau automatique | tokensave upgrade avec canaux stable/beta | npm update |
| Moteur de base de données | libsql (fork SQLite, WAL, asynchrone) | better-sqlite3 / wa-sqlite (WASM) |
| Vitesse d'indexation | ~1,2s pour 1 782 fichiers | ~4s pour 1 782 fichiers |
| Taille du binaire | ~25 Mo (toutes les grammaires incluses) | ~80 Mo (node_modules + WASM) |
CodeGraph a été le pionnier de l'approche et reste un choix solide si vous préférez l'outillage npm et n'avez besoin que de l'intégration Claude Code. tokensave étend le concept avec une analyse plus approfondie, plus d'agents, la prise en charge multi-branches et un binaire natif sans dépendances d'exécution.
Pour des comparaisons détaillées avec CodeGraph, Dual-Graph (GrapeRoot), code-review-graph et OpenWolf, voir docs/COMPARABLE-TOOLS.md.
Pourquoi tokensave plutôt que les alternatives
Plusieurs outils réduisent l'utilisation de tokens pour les agents de codage IA. Voici pourquoi tokensave se démarque.
Binaire natif unique, zéro dépendance
Chaque alternative nécessite un environnement d'exécution : Python, Node.js, ou les deux. tokensave est livré sous la forme d'un seul binaire Rust d'environ 25 Mo avec toutes les grammaires tree-sitter (plus de 50) incluses. Rien d'autre à installer.
Intelligence de code la plus approfondie
tokensave fonctionne au niveau des symboles : fonctions, structures, champs, arêtes d'appel, hiérarchies de types, métriques de complexité. Les alternatives comme Dual-Graph (GrapeRoot) fonctionnent au niveau du fichier -- elles savent quels fichiers existent mais ne peuvent pas répondre à « qui appelle cette fonction ? » ou « qu'est-ce qui casse si je modifie cette structure ? ». Les plus de 80 outils MCP spécialisés de tokensave couvrent le parcours du graphe d'appel, l'analyse d'impact, la détection de code mort, le mappage de tests, l'aperçu de renommage, les hiérarchies de types, la détection de dépendances circulaires, le classement de complexité, l'analyse de santé du code (Gini, DSM, profondeur de dépendance, écarts de test pondérés par le risque), les primitives d'édition atomique, et plus encore. Le concurrent le plus proche (code-review-graph) a 22 outils ; d'autres en ont 5 à 9.
Prise en charge d'agents la plus large
Plus d'une douzaine d'intégrations d'agents de codage IA avec des formats de configuration natifs par agent. Aucun autre outil ne couvre autant d'agents avec une intégration aussi profonde. Claude Code obtient des hooks, des règles d'invite et des autorisations d'outils auto-autorisées. Kiro obtient une configuration MCP globale, tokensave.md chargé en tant que ressource, un agent géré avec approbation permissive des outils intégrés/tokensave, et des hooks pour les garde-fous de délégation plus la synchronisation post-écriture. Les autres agents obtiennent l'enregistrement du serveur MCP dans leur format de configuration natif.
Indexation multi-branches
Le seul outil dans cet espace avec des bases de données de graphes optionnelles par branche et une comparaison et recherche inter-branches. Lorsqu'elle est activée, le changement de branche est instantané -- aucune ré-indexation requise.
Suivi des tokens par appel
Le seul outil qui rapporte exactement combien de tokens chaque appel d'outil MCP individuel a économisé, plus un moniteur TUI en direct sur tous les projets et des compteurs de durée de vie.
Entièrement open source
Sous licence MIT Rust, auditable de bout en bout. Le moteur principal de Dual-Graph (graperoot sur PyPI) est propriétaire -- vous ne pouvez pas voir ce qu'il fait avec votre graphe de code. OpenWolf est AGPL-3.0, ce qui exige que les travaux dérivés soient open source.
Performance
Benchmark d'indexation complète sur une base de code mixte Rust/Java/Scala de 1 782 fichiers (57K nœuds, 103K arêtes) :
| Outil | Temps | Accélération |
|---|---|---|
| CodeGraph (TypeScript) | 31,2s | 1x |
| tokensave (Rust) | 1,2s | 26x |
Dépannage
« tokensave non initialisé »
Le répertoire .tokensave/ n'existe pas dans votre projet.
tokensave init
Le serveur MCP ne se connecte pas
L'agent IA ne voit pas les outils tokensave.
- Assurez-vous que la configuration de l'agent inclut le serveur MCP tokensave (exécutez
tokensave doctor) - Redémarrez complètement l'agent
- Vérifiez que
tokensaveest dans votre PATH :which tokensave
Symboles manquants dans la recherche
- Exécutez
tokensave syncpour mettre à jour l'index - Vérifiez que le langage est pris en charge (voir le tableau ci-dessus)
- Vérifiez que le fichier n'est pas exclu par
.gitignore
L'indexation est lente
Les grands projets prennent plus de temps lors de la première indexation complète.
- Les exécutions suivantes utilisent la synchronisation incrémentale et sont beaucoup plus rapides
- Utilisez
tokensave sync(pas--force) pour les mises à jour quotidiennes - La péremption est vérifiée automatiquement à chaque appel d'outil MCP lorsqu'un agent est connecté
Désactiver tokensave pour des projets spécifiques
Si un projet est trop volumineux et que tokensave utilise trop de RAM, vous pouvez le désactiver par projet en définissant DISABLE_TOKENSAVE=true dans l'environnement du serveur MCP. Le serveur s'arrête proprement sans s'initialiser.
Claude Code — ajoutez à votre .claude/settings.json de projet :
{
"mcpServers": {
"tokensave": {
"command": "tokensave",
"args": ["serve"],
"env": {
"DISABLE_TOKENSAVE": "true"
}
}
}
}
Autres agents — définissez la variable d'environnement dans la configuration que votre agent utilise pour lancer les serveurs MCP.
Vous pouvez également la définir globalement via le shell (DISABLE_TOKENSAVE=true claude), mais cela désactive tokensave pour tous les projets de la session.
Origine
Ce projet est un portage en Rust de l'implémentation TypeScript originale CodeGraph par @colbymchenry. Le portage conserve la même architecture et la même interface d'outil MCP tout en tirant parti de Rust pour les performances et les liaisons natives tree-sitter.
Compilation
cargo build --release # full (50+ languages, default)
cargo build --release --features medium # medium tier
cargo build --release --no-default-features # lite (smallest binary)
cargo test # run all tests (requires full)
cargo check --no-default-features # verify lite compiles
cargo clippy --all
Historique des étoiles
Sponsors
|
| Signature de code gratuite sur Windows fournie par SignPath.io, certificat par SignPath Foundation |
Licence
Licence MIT — voir LICENSE pour plus de détails.