@penra/condense
v0.1.9
Published
CLI qui optimise les tokens envoyés à Claude & Codex
Maintainers
Readme
condense
CLI qui optimise les tokens envoyés à Claude & Codex. Au lieu d'envoyer des fichiers
entiers et tout l'historique à chaque requête, condense construit un contexte minimal —
une carte du repo (signatures seulement) + les extraits réellement pertinents — sous un
plafond de tokens réglable, et mesure l'économie vs. un agent naïf.
Principe fondateur : ne jamais envoyer au modèle ce qu'on peut éviter d'envoyer. Chaque token non envoyé est un token économisé.
Installation
npm i -g @penra/condense
# ou via Homebrew (le chemin complet ajoute le tap tout seul) :
brew install PENRA-CORP/tap/condenseLe package est scopé : condense tout court est un paquet npm sans rapport, publié par
quelqu'un d'autre. La commande installée reste condense.
Prérequis : Node ≥ 20. ripgrep (rg) est recommandé pour le retrieval lexical.
Démarrage
condense doctor # que détecte-t-on ? (CLI Claude/Codex, clés, stockage)
condense login # enregistre une clé API Anthropic (BYOK), validée puis stockée
condense login --provider openaiBYOK par défaut. Vous fournissez votre propre clé API (Anthropic Console / OpenAI). Les
clés sont stockées dans le trousseau de l'OS (keytar), avec repli sur
~/.config/condense/config.json en permission 600. La détection des CLI installés est en
lecture seule : condense ne lit jamais le token d'un autre outil.
Optimiser le contexte
# Construire le contexte optimisé d'une tâche et voir l'économie de tokens
condense context "ajoute la validation d'email au formulaire d'inscription"
# Marquer des fichiers "ouverts" (poids fort, inclus en entier)
condense context "corrige le bug de login" --open src/auth/login.ts
# Régler le budget et la part repo map
condense context "…" --budget 6000 --map-tokens 1200
# Émettre uniquement le contexte assemblé (pipeable vers un autre outil)
condense context "…" --print | pbcopy
# Sortie machine
condense context "…" --jsonExemple de sortie :
condense context — « ajoute la validation d'email au formulaire d'inscription »
Repo : 15/15 fichiers dans la map · 7 chunks · mots-clés: email, validation, …
repo map 1 339 tokens
fichiers ouverts 0 tokens
retrieval 756 tokens
tâche 13 tokens
————————————————————————————
contexte envoyé 2 119 tokens (budget 8 000)
Économie vs agent naïf : 11 718 tokens (84.7 %)Prouver l'économie dans le temps
Chaque context enregistre tokens_baseline (ce qu'un agent naïf aurait envoyé) vs.
tokens_sent dans un ledger. stats cumule l'écart :
condense stats # tokens & coût économisés au total
condense stats --price 3 # prix par million de tokens d'entrée (défaut 3)
condense stats --jsonComment ça marche (les leviers)
- Repo map — signatures seulement (fonctions/classes/imports via l'AST TypeScript pour JS/TS, regex pour py/go/rs/java/rb), classées par pertinence, remplies dans un budget. ~10× moins de tokens que d'envoyer les fichiers entiers.
- Retrieval ciblé —
ripgreplocalise les lignes qui matchent la requête, fenêtrées en chunks, dédupliqués, remplis jusqu'au budget restant. - Token budgeter — un plafond dur (
--budget) réparti sur repo map → fichiers ouverts → retrieval. Tout ce qui dépasse est coupé. Observable et réglable. - Ledger — mesure baseline vs. réel, pour transformer la promesse en preuve.
Prévu ensuite : prompt caching, contexte incrémental (git diff), compaction d'historique, routing de modèle, et la boucle d'agent qui appelle réellement le modèle.
Développement
npm install
npm run dev -- context "…" # exécuter sans build (tsx)
npm run typecheck
npm run build # bundle ESM dans dist/ (tsup)Licence
MIT
