en cours · 2026
Weave
Mémoire de projet pour agents de code IA
Un outil qui donne une mémoire aux agents de code IA. Après chaque session Claude Code ou pi, il lit le transcript et met à jour les documents du projet (décisions, backlog, statut) sans rien inventer : le code extrait les faits, le LLM ne fait que les mettre en forme.
- tests automatisés
- 291
- paquets publiés sur npm
- 5
- dépendance de production pour le moteur
- 0
↓ Problème, architecture et choix techniques ↑ Réduire
Le problème
Les agents de code comme Claude Code avancent vite, mais oublient tout d’une session à l’autre. Leurs décisions restent enfouies dans un transcript que personne ne relit, la compaction des longues sessions efface le raisonnement intermédiaire, et demander à l’agent de documenter son travail lui fait relire tout l’historique, à plein tarif.
Ce que j’ai construit
Un outil qui lit le transcript d’une session terminée et met à jour les documents de projet choisis : journal de décisions, backlog, page de statut, changelog. La session suivante, humaine ou agent, repart de ce qui s’est réellement passé.
- Rien d’inventé : le code extrait les faits, le LLM ne fait que les mettre en forme ; si la session n’apporte rien à un document, il reste intact
- Déclaratif : chaque document se décrit en quelques lignes de YAML (contenu attendu, structure, mode d’écriture)
- Rejouable : relancer sur la même session ne duplique aucune entrée
- Économe : le modèle reçoit un extrait compact préparé par du code, pas l’historique complet ; tout ce qui peut échouer est vérifié localement avant l’appel au LLM
- Fiable : 291 tests automatisés, soit ~1,6 ligne de test par ligne de code
- Intégré : CLI, commande
/weavedans pi, hook Claude Code ; 5 paquets publiés sur npm
Sous le capot
Trois étapes, et une frontière stricte entre ce qui dépend de l’agent et ce qui n’en dépend pas :
transcript (.jsonl)
└─ Extract → bundle faits structurés : actions, erreurs, fichiers (adaptateur)
└─ Scribe → fragment un appel LLM par document cible (moteur)
└─ Write → document append / prepend / replace, écritures gardées (moteur)
Deux contrats seulement relient le moteur aux agents : extract(transcript) → bundle et complete(prompt) → texte. Le moteur ne connaît ni format de transcript ni SDK : supporter un nouvel agent revient à écrire un adaptateur, sans toucher au cœur.
- Extraction : parsers des transcripts pi et Claude Code (actions réussies, erreurs d’outils, fichiers modifiés, compactions, délégations à des sous-agents avec leur résultat et leur coût)
- Prompt du scribe : contrat de données explicite ; le contenu du transcript est traité comme matériau, jamais comme instructions, ce qui le protège de l’injection de prompt
- Idempotence : chaque fragment ajouté porte un marqueur de session (
<!-- weaved:session=<id> -->), donc un rejeu n’écrit pas deux fois - Écritures sûres : chemins confinés au répertoire de la session, collisions refusées entre cibles, sauvegardes
.bak, transcript et configuration (liens symboliques et physiques compris), droits d’écriture vérifiés avant l’appel au LLM - Erreurs typées : codes
CONTRACT/DATA/RUNTIMEcomparés par valeur plutôt que parinstanceof, qui échoue dès qu’un paquet est dupliqué dansnode_modules - Publication : la CI GitLab publie sur npm à chaque version fusionnée dans
main, et des jobs de compatibilité tournent contre les vrais SDK de Claude Code et pi
Choix assumés
| Option écartée | Pourquoi |
|---|---|
| Demander à l’agent de documenter en fin de session | Renvoie tout l’historique au modèle et dépend de sa mémoire, que la compaction a déjà tronquée |
| Donner le transcript brut au LLM | Plus cher, et il invente : le code extrait les faits, le modèle les arrange |
| Un outil par agent | Un moteur commun et un adaptateur par agent : en ajouter un ne touche pas au cœur |
| Une bibliothèque YAML | Un sous-ensemble plat parsé en interne suffit au targets.yaml et garde le moteur sans aucune dépendance |