claude-code-gc: alte Claude-Code-Versionen entfernen

Ein kleines Linux-Werkzeug, das die von Updates hinterlassenen Claude-Code-Versionen auflistet, zeigt, welche laufende Prozesse noch nutzen, und den Rest entfernt.

Das Problem

Claude Code aktualisiert sich häufig, und jedes Update lässt die vorherige Version auf der Platte liegen. Auf einem entfernten Entwicklungsrechner liegt dieselbe Version meist bis zu dreimal vor: das CLI-Binary in ~/.local/share/claude/versions/, die Editor-Erweiterung in ~/.vscode-server/extensions/ und die heruntergeladene VSIX-Datei im Cache der Erweiterungen. Jede Kopie ist 250 bis 290 MB groß. Ein kleiner VPS ist damit innerhalb weniger Wochen voll.

Man kann die alten Kopien von Hand löschen, muss aber vorher jedes Verzeichnis prüfen: Eine vor Tagen gestartete Session kann noch ein älteres Binary ausführen, und die Editor-Erweiterung läuft aus ihrem eigenen, versionierten Verzeichnis.

Wie es funktioniert

claude-code-gc durchsucht eine feste Liste von Verzeichnissen. CLI-Versionen kommen aus ~/.local/share/claude/versions/, Erweiterungen aus den Erweiterungsverzeichnissen von VS Code, Cursor und Windsurf, VSIX-Dateien aus den beiden Download-Caches von VS Code. In den Verzeichnissen für Erweiterungen und VSIX-Dateien berücksichtigt es nur Einträge mit dem Namen anthropic.claude-code-<version>....

Danach liest es /proc. Eine Version gilt als in Benutzung, wenn ein laufender Prozess sie als ausführbare Datei hat (/proc/<pid>/exe) oder eine Datei darin auf seiner Kommandozeile nennt. Der zweite Fall deckt die VS-Code-Erweiterung ab, die als node .../extension.js läuft. Jede benutzte Version bleibt erhalten, ebenso die neueste Version jeder Art (cli, extension, vsix). --keep N behält die neuesten N Versionen pro Art, --keep 0 nur das, was in Benutzung ist.

Standard ist ein Probelauf. Das ist das Beispiel aus dem README, aufgenommen auf einem VPS mit mehreren offenen Sessions:

$ claude-code-gc
cli        2.1.299     253.0 MB  in use (pid 324791)    ~/.local/share/claude/versions/2.1.299
cli        2.1.300     253.8 MB  remove                 ~/.local/share/claude/versions/2.1.300
cli        2.1.302     272.6 MB  in use (pid 1683736)   ~/.local/share/claude/versions/2.1.302
extension  2.1.300     266.9 MB  remove                 ~/.vscode-server/extensions/anthropic.claude-code-2.1.300-linux-x64
extension  2.1.301     267.5 MB  keep (newest)          ~/.vscode-server/extensions/anthropic.claude-code-2.1.301-linux-x64

2 item(s) removable, 520.7 MB. Run with --delete to remove them.
note: pid 3581507 still runs deleted ~/.local/share/claude/versions/2.1.292; its space returns when it exits.

--delete entfernt die mit remove markierten Einträge. Die note-Zeilen nennen lange laufende Sessions, die noch ein bereits gelöschtes Binary ausführen. Linux gibt diesen Platz erst frei, wenn der Prozess endet. Man bekommt ihn also nur zurück, indem man alte Sessions beendet.

Das Werkzeug braucht Python 3.10 oder neuer und hat keine Abhängigkeiten.

Tests

Die Tests bauen ein künstliches Home-Verzeichnis mit drei CLI-Versionen, zwei Erweiterungsversionen und einer fremden Erweiterung sowie ein künstliches /proc mit exe-Symlinks und cmdline-Dateien. Geprüft wird, dass fremde Erweiterungen ignoriert werden, dass die neueste und die benutzten Versionen erhalten bleiben und dass eine Erweiterung über ihre Kommandozeile als benutzt erkannt wird. Ein Test stellt sicher, dass ein Prozess mit Version 2.1.301 das Verzeichnis 2.1.30 nicht als benutzt markiert. Weitere Tests decken die Meldung eines gelöschten, noch laufenden Binarys ab, einen Probelauf mit anschließendem --delete und --keep 0.

Es sind 8 Tests. Das CI führt sie auf Python 3.10, 3.11, 3.12 und 3.13 aus, zusammen mit ruff check und ruff format --check, und ruft den Befehl einmal auf dem Runner auf.

Grenzen

  • Es läuft nur unter Linux, weil es /proc liest, um laufende Prozesse zu finden.
  • Es durchsucht nur die im README aufgeführten Verzeichnisse. Installationen an anderen Orten findet es nicht.
  • Platz, den ein Prozess mit einem gelöschten Binary noch belegt, kann das Werkzeug nicht freigeben. Es meldet diese Prozesse nur.

Code und Installationsanleitung liegen unter github.com/Jwrede/claude-code-gc.