Config GC — Garbage Collection pour les configurations Claude Code
Emprunté au garbage collection des runtimes : analyser périodiquement les objets qui ne sont plus référencés, redondants, expirés ou de faible valeur, et récupérer l'espace perdu. La différence cruciale : ici, la collecte nécessite un humain dans la boucle. Ne jamais supprimer de manière autonome.
Quand activer
- L'utilisateur demande de nettoyer, auditer ou réduire sa configuration Claude Code
- L'utilisateur se plaint d'avoir trop de skills, de hooks bruyants ou d'un démarrage de session lent
- Une révision mensuelle/périodique de la configuration est due
- Après l'installation d'un pack de skills volumineux (par exemple ce dépôt), pour réconcilier les chevauchements avec la configuration existante
Ne PAS activer pour : nettoyer le code source du projet (c'est du refactoring), effacer l'historique de chat ou désinstaller Claude Code lui-même.
Philosophie de conception
- Les configurations en mode 'append-only' fuient. Les skills, fichiers mémoire, hooks et entrées de permission ne font que s'ajouter. Sans révision périodique, ils pourrissent en silence.
- Les audits réguliers valent mieux qu'un nettoyage unique. Analyser tous les ~30 jours, proposer un petit lot de candidats à chaque fois.
- Des stratégies par canal. Chaque type d'accumulation (skills, hooks, permissions, ...) a ses propres signaux d'obsolescence — ne pas appliquer une règle unique partout.
- Suppression douce d'abord. Renommer en
.disabled> déplacer vers~/.claude/_gc_trash/> suppression réelle. Toujours conserver une voie d'annulation. - Humain obligatoire dans la boucle. Chaque candidat reçoit sa propre confirmation
[y/n/skip]. Pas de raccourci 'oui à tout'. - Tenir un journal. Chaque exécution de GC ajoute à
~/.claude/gc_log.md: ce qui a été touché, pourquoi et comment annuler.
Canaux d'analyse
| # | Canal | Chemin | Signaux d'obsolescence / redondance |
|---|---|---|---|
| 1 | Skills | ~/.claude/skills/*/ | Noms fortement chevauchants ; jamais déclenchés dans les transcriptions récentes ; domaine inadapté au travail réel de l'utilisateur ; SKILL.md cassé ou vide |
| 2 | Mémoire | ~/.claude/**/memory/*.md + son index | Plusieurs entrées d'index pour un même sujet ; contenus contredisant des entrées plus récentes ; dates dépassées ; fichiers orphelins absents de l'index ; fragments de moins de 100 mots qui devraient être fusionnés |
| 3 | Hooks | ~/.claude/hooks/ + paramètres | Scripts présents sur disque mais non référencés par une configuration de hook ; anciennes versions remplacées par des réécritures |
| 4 | Permissions | permissions.allow dans settings.json / settings.local.json | Entrées en double ; entrées spécifiques déjà couvertes par un joker (par ex. Bash(git push) alors que Bash(*) est autorisé) ; autorisations ponctuelles d'expériences passées |
| 5 | Serveurs MCP | ~/.claude.json ou .mcp.json du projet | Serveurs qui ne parviennent pas à se connecter ; doublons fonctionnels ; inutilisés depuis longtemps |
| 6 | Rappels / tâches planifiées | là où l'utilisateur les conserve | Rappels uniques vieux de plus de 30 jours ; tâches dont les scripts cibles n'existent plus |
| 7 | Historique de projet | ~/.claude/projects/*/ | Instantanés de transfert obsolètes ; enregistrements de session remplacés par un état plus récent |
| 8 | Caches d'exécution | cache/, file-history/, logs/, shell-snapshots/ | Trier par taille et mtime ; proposer les éléments de plus de 30 jours et volumineux |
Flux de travail
- Analyser tous les canaux (ou le sous-ensemble nommé par l'utilisateur). Collecter les candidats avec : chemin, canal, signal déclencheur, taille, dernière modification.
- Classer par confiance (cassé/orphelin = élevée ; simplement vieux = faible) et présenter sous forme de tableau numéroté. Limiter chaque exécution à ~20 candidats — GC est périodique, pas exhaustif.
- Confirmer un par un. Pour chaque candidat, montrer la preuve, puis demander
[y/n/skip]. L'utilisateur peut s'arrêter à tout moment. - Supprimer en douceur les éléments confirmés : préférer un renommage en
.disabledpour les skills/hooks et un déplacement vers_gc_trash/<date>/pour les fichiers. Les entrées de permission vivent dans du JSON (pas de commentaires possibles) : sauvegarder le fichier de paramètres, enregistrer chaque entrée supprimée textuellement dansgc_log.md, puis la retirer du tableauallowavecjq. Ne supprimer définitivement que si l'utilisateur le demande explicitement. - Journaliser l'exécution dans
~/.claude/gc_log.md: horodatage, éléments traités, instructions d'annulation. - Rapporter : taille récupérée, canaux toujours sains, date de prochaine révision suggérée.
Exemples de commandes d'analyse
Scripts de hook orphelins (canal 3) — scripts sur disque qu'aucune configuration de hook ne référence :
for f in ~/.claude/hooks/*; do
name=$(basename "$f")
grep -rq "$name" ~/.claude/settings.json ~/.claude/settings.local.json 2>/dev/null \
|| echo "ORPHELIN: $f"
done
Entrées de permission redondantes (canal 4) — doublons et autorisations spécifiques masquées par un joker :
jq -r '.permissions.allow[]' ~/.claude/settings.local.json | sort | uniq -d
if jq -e '.permissions.allow | index("Bash(*)")' ~/.claude/settings.local.json >/dev/null; then
jq -r '.permissions.allow[]' ~/.claude/settings.local.json \
| grep '^Bash(' | grep -vF 'Bash(*)'
fi
Caches les plus volumineux et obsolètes (canal 8) — du -k au lieu de find -printf spécifique à GNU, pour fonctionner aussi sur macOS/BSD :
find ~/.claude/file-history ~/.claude/shell-snapshots -type f -mtime +30 \
-exec du -k {} + 2>/dev/null | sort -rn | head -20
Suppression douce avec chemin d'annulation (capturer la date une fois pour que le journal ne puisse pas contredire le répertoire) :
gc_date=$(date +%Y-%m-%d)
mkdir -p ~/.claude/_gc_trash/$gc_date
mv ~/.claude/skills/dead-skill ~/.claude/_gc_trash/$gc_date/
echo "$(date -Iseconds) déplacé skills/dead-skill -> _gc_trash/$gc_date/ (annulation : mv inverse)" >> ~/.claude/gc_log.md
Suppression d'une entrée de permission confirmée redondante (le JSON n'a pas de commentaires — sauvegarder, journaliser, puis éditer) :
cp ~/.claude/settings.local.json ~/.claude/settings.local.json.bak
echo "$(date -Iseconds) entrée de permission supprimée : Bash(git push) (annulation : restaurer depuis .bak ou rajouter)" >> ~/.claude/gc_log.md
jq '.permissions.allow -= ["Bash(git push)"]' ~/.claude/settings.local.json.bak \
> ~/.claude/settings.local.json
Anti-patrons
- Approbation en bloc. Demander « Supprimer les 15 ? [y/n] » va à l'encontre de la conception. Un élément, une décision.
- Suppression définitive dès le premier passage. S'il n'y a pas de copie dans
_gc_trash/ou de renommage en.disabled, c'est une erreur. - Considérer 'vieux' comme 'mort'. Un skill non utilisé depuis 60 jours peut être saisonnier (saison des impôts, bilans trimestriels). L'âge est un signal, pas un verdict — c'est pourquoi un humain confirme.
- Nettoyer la mémoire par troncature. Fusionner deux fichiers mémoire contradictoires nécessite de lire les deux et de conserver la vérité la plus récente, pas de supprimer le plus long.
- Toucher à quoi que ce soit en dehors de
~/.claude(ou du.claude/du projet). Config GC ne s'aventure jamais dans les arbres source.
Bonnes pratiques
- Exécuter après de gros ajouts, pas seulement sur un calendrier : installer un pack de 50 skills est exactement le moment où des chevauchements avec les skills existants apparaissent.
- Lorsque deux skills se chevauchent, privilégier la désactivation de celui dont la description de déclenchement est la plus faible — c'est celui qui ne se déclenchait probablement de toute façon jamais.
- Le nettoyage des permissions est le canal le plus rentable par minute passée : les entrées
allowredondantes rendent la revue de sécurité plus difficile. - Conserver
gc_log.mdpour toujours. C'est minuscule, et « quand ai-je désactivé ce hook et pourquoi » revient plus souvent qu'on ne le pense.
Compétences associées
skill-stocktake— audite la qualité des skills ; config-gc audite l'existence des skills. Exécuter stocktake sur ce qui survit au GC.workspace-surface-audit— le pendant additif : recommande quoi installer. config-gc est la moitié soustractive du même cycle de vie.configure-ecc— après avoir installé des skills avec elle, exécuter config-gc pour réconcilier les chevauchements avec votre configuration préexistante.continuous-learning— produit les fichiers mémoire que cette compétence audite ensuite.security-review— se combine bien avec le canal des permissions.