Communitygithub.com

mac-declutter

Fertigkeit für die gründliche Reinigung von macOS-Entwicklermaschinen: KI-Agenten-Wildwuchs, Zombie-Dienste, App-Überreste, Proxy-Fallen, Cache-Bereinigung und Leistungsaudits.

Was ist mac-declutter?

Diese Fertigkeit bietet ein erprobtes Handbuch für die Tiefenreinigung eines Entwickler-Macs. Sie adressiert typische Probleme wie die Hinterlassenschaften von KI-Agenten (z. B. `~/.claude`, `~/.codex`), tote Hintergrunddienste, App-Überreste nach der Deinstallation und Proxy-Fallen, die die Netzwerkkonnektivität lahmlegen können. Der Prozess folgt einem strengen, nicht-destruktiven Ansatz: Zuerst wird eine Bestandsaufnahme der installierten Komponenten erstellt, bevor gelöscht wird. Die Fertigkeit führt durch die Phasen Netzwerk-Triage, Inventarisierung, Deinstallation nach einer Playbook-Reihenfolge, gefahrlose Cache-Bereinigung und abschließende Leistungs- sowie Verifikationsaudits. Sie respektiert die System Integrity Protection (SIP) und vermeidet unnötige Risiken für Benutzerdaten oder Sitzungsaufzeichnungen. Unterstützt wird die Fertigkeit über ein Shell-Skript (`scripts/inventory.sh`) und detaillierte `bash`-Befehle, die den Zustand von Diensten, Ports, Apps und Caches offenlegen. Sie ist für den Einsatz in KI-gestützten Entwicklungstools wie Claude Code, Cursor oder Codex gedacht und gibt dem Nutzer stets die Entscheidungsgewalt über zu entfernende Elemente.

Funktioniert mit✓Claude Code✓Codex CLI~Cursor✓OpenCode
npx skills add Offwhite-Del/mac-declutter

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht mac-declutter?

Ein erprobtes Handbuch zur Bereinigung eines Entwickler-Macs: KI-Agenten-Wildwuchs, tote Hintergrunddienste, App-Überreste, Proxy-Fallen und Leistungsaudits.

Grundprinzipien:

  • Vor dem Löschen inventarisieren. Niemals blind deinstallieren – zuerst Größe, letztes Nutzungsdatum und Ausführungszustand messen, dann den Benutzer wählen lassen.
  • Niemals Sitzungsaufzeichnungen oder Benutzerdaten berühren, es sei denn, es wird explizit darum gebeten. Caches regenerieren sich; Sitzungen nicht.
  • Nach jeder Mutation verifizieren – Prozess weg, Port geschlossen, Anmeldeobjekt entfernt.
  • System Integrity Protection (SIP) ist eine harte Grenze. Root-eigene Apps, Sandbox-Container und DriverKit-Erweiterungen haben jeweils einen sanktionierten Entfernungspfad; kämpfen Sie nicht gegen das Betriebssystem.

Phase 0 – Netzwerk-Triage (zuerst durchführen)

Das Symptom „Alles ist getrennt“ ist fast immer ein toter lokaler Proxy, nicht defekte Apps:

scutil --proxy                       # Wohin zeigt der System-Proxy?
nc -z -w 2 127.0.0.1 <port>        # Hört überhaupt jemand?
lsof -nP -iTCP:<port> -sTCP:LISTEN # Wer ist der Besitzer?

Die klassische Falle: Clash/V2Ray-artige Tools setzen den macOS-System-Proxy auf 127.0.0.1:PORT, dann stirbt der Kern – der Regelmodus spielt keine Rolle, der gesamte Verkehr stirbt an der Tür. Apps, die den System-Proxy beachten (die meisten GUI-Apps, einige CLIs), scheitern alle; curl funktioniert noch, weil es den System-Proxy umgeht, was die Diagnose in die Irre führt. Korrekturen: Starten Sie den Proxy-Kern neu, oder deaktivieren Sie den Proxy (networksetup -setwebproxystate Wi-Fi off + -setsecurewebproxystate + -setsocksfirewallproxystate + WPAD aus), oder setzen Sie die eigene Proxy-Einstellung der App auf nichts. Denken Sie daran: curl ignoriert den System-Proxy – testen Sie die App-ähnliche Konnektivität mit curl -x http://127.0.0.1:PORT.

Phase 1 – Inventarisierung (schreibgeschützt)

Führen Sie scripts/inventory.sh aus oder decken Sie diese Dimensionen manuell ab:

  • Agent-Konfigurationsverzeichnisse: ~/.claude, ~/.codex, ~/.pi, ~/.jcode, ~/.config/opencode, usw. Für jedes: Größe (du -sh), letzte Aktivität (mtime der neuesten Datei), ob die CLI-Binärdatei noch existiert (which).
  • Anmelde-/Authentifizierungsstatus: auth.json, openai-auth.json, Anmeldedatendateien – Schlüssel auflisten, niemals Geheimnisse ausgeben.
  • Hintergrunddienste: launchctl list | grep -v com.apple und ~/Library/LaunchAgents/*.plist – lesen Sie die ProgramArguments jeder plist, um zu erfahren, was tatsächlich ausgeführt wird.
  • Apps: Sammeln Sie für jede .app, die nicht von Apple stammt, in /Applications und ~/Applications die Größe, kMDItemLastUsedDate über mdls und das Vorhandensein von _MASReceipt (App-Store-Apps). „Nie geöffnet“ + groß = Hauptkandidat.
  • Caches: ~/Library/Caches, ~/.npm, pip/bun-Caches – groß und immer sicher zu leeren.

Präsentieren Sie die Ergebnisse als Tabelle „Behalten/Entfernen“ und lassen Sie den Benutzer wählen. Kennzeichnen Sie kostenpflichtige/Abonnement-Apps (z. B. _MASReceipt, bekannte Abonnementprodukte), sodass der Benutzer die Abrechnung kündigt, bevor er sie löscht.

Phase 2 – Deinstallations-Playbook

Pro Ziel, in dieser Reihenfolge:

  1. Dienste stoppen: launchctl remove <label> für jeden zugehörigen LaunchAgent/Daemon.
  2. Plists löschen: ~/Library/LaunchAgents/<label>.plist.
  3. App/CLI löschen: rm -rf die .app / npm uninstall -g <pkg> / die Binärdatei entfernen.
    • Permission denied → root-eigen (pkg-installiert). Verwenden Sie osascript -e 'do shell script "rm -rf ..." with administrator privileges' (eine GUI-Passwortaufforderung). Niemals blind sudo verwenden.
  4. Überreste in der Library: Überprüfen und entfernen Sie ~/Library/{Application Support,Caches,Containers,HTTPStorages,Preferences}/<app-or-bundle-id>.
    • Sandbox-Containers/* können selbst Root widerstehen (Container-Manager-Schutz). Wenn winzig, lassen Sie sie – das Betriebssystem räumt verwaiste Container auf; SIP zu deaktivieren ist es nie wert.
  5. Systemerweiterungen: systemextensionsctl list. SIP blockiert die direkte Deinstallation – der einzige saubere Weg ist die Neuinstallation der Hersteller-App und die Ausführung ihres offiziellen Deinstallationsprogramms (suchen Sie nach uninstall.sh unter /Library/Application Support/<vendor>/). DriverKit-.dext-Treiber entladen sich erst beim nächsten Neustart – teilen Sie dem Benutzer mit, dass sie nach dem Neustart verschwunden sind.
  6. Veraltete Anmeldeobjekte: Nach dem Löschen einer App bleibt der Eintrag „Beim Anmelden öffnen“ oft als Zombie erhalten. Entfernen Sie ihn mit osascript -e 'tell application "System Events" to delete login item "<name>"'.
  7. Laufende Überreste: Gelöschte Apps können Prozesse hinterlassen, die aus temporären Update-Verzeichnissen laufen (z. B. Squirrel ShipIt-Staging). ps aux | grep -i <name>, töten Sie sie und prüfen Sie auf ein Datenverzeichnis in $HOME (~/.<appname>) – von Updatern gestartete Daemons verstecken dort oft hunderte MB.

Phase 3 – Cache-Bereinigung (kein Risiko)

npm cache clean --force
rm -rf ~/Library/Caches/pip ~/.bun/install/cache
rm -rf ~/Library/Caches/<deleted-app>/*

Caches regenerieren sich. Sitzungsverläufe (sessions/, projects/, *.jsonl-Konversationsprotokolle) nicht – lassen Sie sie, es sei denn, der Benutzer sagt explizit etwas anderes.

Phase 4 – Leistungsaudit

memory_pressure | tail -2    # freier % und Druck
sysctl -n vm.swapusage       # verwendeter Swap sollte bei einem gesunden Rechner ~0 sein
sysctl -n vm.loadavg
ps -axm -o rss,comm | awk 'NR>1 {rss=$1; $1=""; sub(/^ /,""); a[$0]+=rss} END {for (k in a) printf "%d\t%s\n", a[k]/1024, k}' | sort -rn | head -15
  • „Belegter Arbeitsspeicher“ in der Aktivitätsanzeige enthält den Dateicache – beurteilen Sie die Situation anhand der Farbe des Speicherdrucks und des Swaps, nicht anhand der GB-Zahl.
  • Nach einer Massenlöschung indiziert Spotlight (mds_stores, corespotlightd) für einige Stunden neu – vorübergehend, nicht „reparieren“.
  • Gruppieren Sie den RSS nach App-Familie (Browser und Chat-Apps erzeugen viele Helfer); melden Sie Summen pro Familie, nicht prozessbezogenes Rauschen.
  • Optimieren Sie nicht, was kein Problem ist: Auf einem Rechner mit null Swap und grünem Druck ist der Tausch eines täglich genutzten Tools (z. B. einer intelligenten Eingabemethode) gegen ein paar hundert MB ein schlechter Tausch – sagen Sie es.

Phase 5 – Abschließende Verifikation

  • Gelöschte Labels fehlen in launchctl list; Plists sind weg; keine Prozesse, die gelöschten Namen entsprechen (außer von Neustart ausstehenden Treibern).
  • Der lauschende Proxy-Port stimmt mit scutil --proxy überein; wichtige API-Endpunkte sind erreichbar (401 = erreichbar, aber Authentifizierung erforderlich – das ist ein Bestehen).
  • Jeder überlebende Agent-CLI besteht einen echten End-to-End-Test (eine einzeilige Eingabeaufforderung senden, eine Antwort erwarten).
  • df -h / vorher/nachher für den Punktestand.

Verwandte Skills