Config GC — Garbage Collection für Claude Code Einrichtungen
Entlehnt aus der Laufzeit-Speicherbereinigung: regelmäßig nach Objekten suchen, die nicht mehr referenziert werden, redundant, abgelaufen oder wertarm sind, und den Platz zurückgewinnen. Der entscheidende Unterschied: Hier erfordert die Bereinigung einen menschlichen Eingriff. Niemals autonom löschen.
Wann aktivieren
- Der Benutzer bittet um Aufräumen, Prüfung oder Verschlankung seiner Claude Code Konfiguration
- Der Benutzer beschwert sich über zu viele Skills, laute Hooks oder langsamen Start von Sitzungen
- Eine monatliche/periodische Konfigurationsüberprüfung steht an
- Nach der Installation eines großen Skill-Packs (z. B. dieses Repos), um Überschneidungen mit der bestehenden Einrichtung zu bereinigen
NICHT aktivieren für: Bereinigung von Projektquellcode (das ist Refactoring), Löschen des Chat-Verlaufs oder Deinstallation von Claude Code selbst.
Design-Philosophie
- Anhänge-Konfigurationen lecken. Skills, Memory-Dateien, Hooks und Berechtigungseinträge werden nur hinzugefügt. Ohne regelmäßige Überprüfung verrotten sie still.
- Regelmäßige Audits sind besser als einmalige Säuberungen. Alle ~30 Tage scannen, jedes Mal eine kleine Anzahl von Kandidaten vorschlagen.
- Strategien pro Kanal. Jeder Akkumulationstyp (Skills, Hooks, Berechtigungen, ...) hat eigene Signale für Veralterung – nicht eine Regel für alle anwenden.
- Zuerst Soft-Delete. Umbenennen in
.disabled> verschieben nach~/.claude/_gc_trash/> echte Löschung. Immer einen Rückgängig-Pfad bereithalten. - Erzwungener menschlicher Eingriff. Jeder Kandidat erhält seine eigene
[y/n/skip]-Bestätigung. Keine „Allen zustimmen“-Abkürzung. - Ein Log führen. Jeder GC-Durchlauf hängt an
~/.claude/gc_log.mdan: was war betroffen, warum und wie rückgängig zu machen.
Scan-Kanäle
| # | Kanal | Pfad | Signale für Veralterung / Redundanz |
|---|---|---|---|
| 1 | Skills | ~/.claude/skills/*/ | Stark überlappende Namen; nie in aktuellen Transkripten ausgelöst; Domänenkonflikt mit der tatsächlichen Arbeit des Benutzers; defekte oder leere SKILL.md |
| 2 | Memory | ~/.claude/**/memory/*.md + sein Index | Mehrere Indexeinträge zu einem Thema; Inhalte widersprechen neueren Einträgen; abgelaufene Daten; verwaiste Dateien, die im Index fehlen; Fragmente unter 100 Wörtern, die zusammengeführt werden sollten |
| 3 | Hooks | ~/.claude/hooks/ + Einstellungen | Skripte auf der Festplatte, die von keiner Hook-Konfiguration referenziert werden; alte Versionen, die durch Umschreibungen ersetzt wurden |
| 4 | Berechtigungen | permissions.allow in settings.json / settings.local.json | Doppelte Einträge; spezifische Einträge, die bereits von einem Platzhalter abgedeckt werden (z. B. Bash(git push) wenn Bash(*) erlaubt ist); einmalige Genehmigungen aus früheren Experimenten |
| 5 | MCP-Server | ~/.claude.json oder Projekt .mcp.json | Server, die keine Verbindung herstellen können; funktionale Duplikate; lange ungenutzt |
| 6 | Geplante Erinnerungen / Jobs | wo auch immer der Benutzer sie aufbewahrt | Einmalige, die älter als 30 Tage sind; Jobs, deren Zielskripte nicht mehr existieren |
| 7 | Projekthistorie | ~/.claude/projects/*/ | Veraltete Übergabe-Schnappschüsse; Sitzungsaufzeichnungen, die durch neuere Zustände ersetzt wurden |
| 8 | Laufzeit-Caches | cache/, file-history/, logs/, shell-snapshots/ | Nach Größe und mtime sortieren; Elemente älter als 30 Tage und groß vorschlagen |
Arbeitsablauf
- Scannen aller Kanäle (oder der vom Benutzer genannten Teilmenge). Kandidaten sammeln mit: Pfad, Kanal, Signal, das sie markiert hat, Größe, letzte Änderung.
- Rangfolge nach Vertrauenswürdigkeit (defekt/verwaist = hoch; nur alt = niedrig) und als nummerierte Tabelle präsentieren. Pro Durchlauf auf ~20 Kandidaten begrenzen – GC ist periodisch, nicht erschöpfend.
- Eins nach dem anderen bestätigen. Bei jedem Kandidaten die Evidenz zeigen, dann
[y/n/skip]fragen. Der Benutzer kann jederzeit abbrechen. - Bestätigte Elemente soft-löschen:
.disabled-Umbenennung für Skills/Hooks bevorzugen und_gc_trash/<Datum>/-Verschiebung für Dateien. Berechtigungseinträge leben in JSON (keine Kommentare möglich): Settings-Datei sichern, jeden entfernten Eintrag wörtlich ingc_log.mdprotokollieren, dann aus demallow-Array mitjqentfernen. Nur hart löschen, wenn der Benutzer explizit darum bittet. - Den Durchlauf protokollieren in
~/.claude/gc_log.md: Zeitstempel, bearbeitete Elemente, Rückgängig-Anleitung. - Bericht: freigegebene Größe, noch gesunde Kanäle, vorgeschlagenes nächstes Überprüfungsdatum.
Beispiel-Scan-Befehle
Verwaiste Hook-Skripte (Kanal 3) – Skripte auf der Festplatte, die keine Hook-Konfiguration referenziert:
for f in ~/.claude/hooks/*; do
name=$(basename "$f")
grep -rq "$name" ~/.claude/settings.json ~/.claude/settings.local.json 2>/dev/null \
|| echo "VERWAIST: $f"
done
Redundante Berechtigungseinträge (Kanal 4) – Duplikate und spezifische Genehmigungen, die von einem Platzhalter überschattet werden:
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
Größte veraltete Caches (Kanal 8) – du -k statt GNU-only find -printf, damit es auch auf macOS/BSD funktioniert:
find ~/.claude/file-history ~/.claude/shell-snapshots -type f -mtime +30 \
-exec du -k {} + 2>/dev/null | sort -rn | head -20
Soft-Delete mit Rückgängig-Pfad (Datum einmal erfassen, damit das Log nicht mit dem Verzeichnis uneins sein kann):
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) moved skills/dead-skill -> _gc_trash/$gc_date/ (undo: mv back)" >> ~/.claude/gc_log.md
Entfernen eines bestätigt redundanten Berechtigungseintrags (JSON hat keine Kommentare – sichern, protokollieren, dann bearbeiten):
cp ~/.claude/settings.local.json ~/.claude/settings.local.json.bak
echo "$(date -Iseconds) removed permission entry: Bash(git push) (undo: restore from .bak or re-add)" >> ~/.claude/gc_log.md
jq '.permissions.allow -= ["Bash(git push)"]' ~/.claude/settings.local.json.bak \
> ~/.claude/settings.local.json
Anti-Patterns
- Massenbestätigung. Die Frage „Alle 15 löschen? [y/n]“ widerspricht dem Design. Ein Element, eine Entscheidung.
- Hartlöschung beim ersten Durchlauf. Wenn es keine
_gc_trash/-Kopie oder.disabled-Umbenennung gibt, hast du es falsch gemacht. - „Alt“ mit „tot“ gleichsetzen. Ein Skill, der 60 Tage nicht angerührt wurde, kann saisonal sein (Steuerzeit, Quartalsüberprüfungen). Alter ist ein Signal, kein Urteil – deshalb bestätigt ein Mensch.
- Memory durch Kürzen bereinigen. Das Zusammenführen zweier widersprüchlicher Memory-Dateien erfordert das Lesen beider und das Behalten der neueren Wahrheit, nicht das Löschen der längeren.
- Außerhalb von
~/.claude(oder dem.claude/des Projekts) etwas anfassen. Config GC wandert nie in Quellbäume.
Best Practices
- Nach großen Ergänzungen ausführen, nicht nur nach Kalender: Die Installation eines 50-Skill-Packs ist genau der Zeitpunkt, an dem Überschneidungen mit bestehenden Skills auftreten.
- Wenn sich zwei Skills überschneiden, den mit der schwächeren Auslöserbeschreibung deaktivieren – es ist der, der wahrscheinlich sowieso nie ausgelöst hat.
- Berechtigungsbereinigung ist der Kanal mit dem höchsten Wert pro investierter Minute: Redundante Allow-Einträge erschweren die Sicherheitsüberprüfung.
gc_log.mdfür immer behalten. Es ist winzig, und die Frage „Wann habe ich diesen Hook deaktiviert und warum“ kommt häufiger vor, als man denkt.
Verwandte Skills
skill-stocktake– prüft die Qualität von Skills; config-gc prüft die Existenz von Skills. Stocktake auf dem ausführen, was GC überlebt hat.workspace-surface-audit– das additive Gegenstück: empfiehlt, was zu installieren ist. config-gc ist die subtraktive Hälfte desselben Lebenszyklus.configure-ecc– nach der Installation von Skills damit, config-gc ausführen, um Überschneidungen mit der bestehenden Einrichtung zu bereinigen.continuous-learning– produziert die Memory-Dateien, die dieser Skill später prüft.security-review– passt gut zum Berechtigungskanal.