Download FOR_SMLFLG.md from smlflg/ClaudeCodePanel: direct link, hf CLI and curl.
- Browser
- Download file 11.2 kB
-
https://huggingface.co/smlflg/ClaudeCodePanel/resolve/main/FOR_SMLFLG.md
- Command line
-
hf download hf://smlflg/ClaudeCodePanel/FOR_SMLFLG.md
-
curl -L -o FOR_SMLFLG.md https://huggingface.co/smlflg/ClaudeCodePanel/resolve/main/FOR_SMLFLG.md
ClaudeCodePanel β Wie dein Panel funktioniert
Die Kurzversion
Dein Panel ist wie ein Cockpit fuer Claude Code. Statt 15 Terminal-Fenster und Config-Dateien zu jonglieren, hast du ein GTK3-Fenster mit 7 Tabs und ein Tray-Icon das immer da ist. Denk an ein Auto-Armaturenbrett: Tacho (Monitor), Bordcomputer (Hub), Fehlerlampen (Logs), Navigationsliste (Sessions).
Stack: Python 3.12 + PyGObject (GTK3) + Catppuccin Theming + systemd Service
Architektur β 14 Module
panel.py (2373 Zeilen) β Der Dirigent
Das Hauptfenster. Baut alle Tabs zusammen, startet die Timer, verwaltet das Tray-Icon. Wie ein Dirigent: spielt selbst kein Instrument, aber koordiniert alle anderen.
Key: ControlPanel Klasse mit _build_*_tab() Methoden, _refresh_hub(), _refresh_monitor().
monitor.py (729 Zeilen) β Der Daten-Butler
Holt alle Zahlen: Kosten, Top-Tools, aktive Sessions, Timeline. Hat einen TTL-Cache (30 Sekunden) β fragt nicht staendig die Festplatte.
Key: get_daily_cost(), get_top_tools(), get_active_sessions(). Nutzt MyAIGame's tui.data.* Module.
log_viewer.py (435 Zeilen) β Der Protokollant
Zeigt heutige Usage-Eintraege und Coaching-Log. Filterbar nach Tools/Errors/Hooks.
Key: build_logs_tab(), refresh_logs(). Liest ~/.claude/usage/YYYY-MM-DD.jsonl.
session_browser.py (1039 Zeilen) β Das Telefonbuch
Alle Claude-Sessions durchsuchbar. Zeigt Projekt, Vorschau, Groesse. Resume-Button oeffnet kitty.
Key: build_sessions_tab(), _scan_all_sessions(), _on_resume_clicked().
process_manager.py (588 Zeilen) β Der Hausmeister
Scannt ps aux nach Claude-relevanten Prozessen. Zeigt RAM, CPU, Uptime.
Kill-Button pro Prozess + "Kill All Ghosts" fuer Prozesse >24h.
Key: build_processes_tab(), _scan_processes(), Ghost-Detection via /proc/<pid>/stat.
theme.py (620 Zeilen) β Der Maler
Erkennt ob COSMIC Desktop dunkel oder hell ist, generiert passendes CSS. Catppuccin Mocha (dark) / Latte (light). Wechselt live wenn du das System-Theme aenderst.
Key: is_dark_mode() liest ~/.config/cosmic/com.system76.CosmicTheme.Mode/v1/is_dark.
setup_theme_watcher() nutzt Gio.FileMonitor fuer Live-Updates.
config_io.py (168 Zeilen) β Der Tresorwaerter
Liest und schreibt ~/.claude/settings.json atomar β nie direkt.
Immer: Backup β Temp-Datei β os.replace(). So geht nie was kaputt.
Key: read_settings(), write_settings(), update_setting("key.path", value).
swarm_tab.py (974 Zeilen) β Der Lageplaner
Zeigt die laufende Agent Team Pipeline in Echtzeit. Liest ~/.claude/teams/ und
~/.claude/tasks/ und stellt ScoutβWeaverβBuilderβValidatorβPruefer als Karten dar.
Key: build_swarm_tab(), _scan_teams(), _refresh_swarm().
swarm_visual.py (708 Zeilen) β Der Kartograf
Generiert HTML-Seiten mit interaktiven Agent-Kommunikationsgraphen: Hub-and-Spoke-Layout, Bezier-Kurven, Partikel-Animationen. Wird von swarm_tab.py aufgerufen und in WebKit2 eingebettet.
Key: generate_swarm_html(), Bezier + Partikel-Rendering via Canvas.
event_tab.py (426 Zeilen) β Der Horcher
Live-Viewer fuer Hook-Events aus ~/.claude/events/YYYY-MM-DD.jsonl. Filterbar
nach Event-Typ, Auto-Scroll wenn neue Events reinkommen.
Key: build_events_tab(), _tail_events(), Filter-Logik nach Typ/Quelle.
shortcut_counter_tab.py (450 Zeilen) β Der Strichlisten-Fuehrer
Zeigt Keyboard-Shortcut-Statistiken aus der ShortcutCounter-Datenbank. Wie oft hast du Ctrl+C vs. Ctrl+Z genutzt? Welcher Shortcut spart am meisten Zeit?
Key: build_shortcut_tab(), liest ShortcutCounter SQLite DB.
project_dashboard_tab.py (254 Zeilen) β Das Fenster
Bettet das Project Dashboard als WebKit2-Webview direkt ins Panel ein, statt einen Browser oeffnen zu muessen. Ein Tab = ein komplettes Web-Dashboard.
Key: build_project_dashboard_tab(), WebKit2.WebView Setup + Reload-Button.
utils.py (33 Zeilen) β Der Werkzeugkasten
Kleine Hilfsfunktionen die ueberall gebraucht werden (Format-Helpers, Pfad-Utilities). Klein aber da wenn man ihn braucht.
Key: Shared Utilities fuer alle anderen Module.
tools-gui/ (623 Zeilen) β Das Zweite Cockpit
Separates GTK3-Fenster mit 3 eigenen Tabs: Kosten-Analyse, Session-Uebersicht, Tool-Statistiken. Laeuft als eigenstaendiges Fenster neben dem Hauptpanel (main.py + 3 Tab-Module).
Key: tools-gui/main.py als Einstiegspunkt, 3 Tab-Module fuer costs/sessions/tools.
Wie die Tabs zusammenhaengen
panel.py (Dirigent)
βββ importiert monitor.py β liefert Daten fuer Hub + Monitor Tab
βββ importiert log_viewer.py β baut Logs Tab
βββ importiert session_browser.py β baut Sessions Tab
βββ importiert process_manager.py β baut Prozesse Tab
βββ importiert swarm_tab.py β baut Agent Swarm Tab
βββ importiert swarm_visual.py β generiert Swarm-Graphen (HTML)
βββ importiert event_tab.py β baut Events Tab
βββ importiert shortcut_counter_tab.py β baut Shortcut Counter Tab
βββ importiert project_dashboard_tab.py β baut Project Dashboard Tab (WebKit2)
βββ importiert theme.py β CSS + Theme Watcher
βββ importiert config_io.py β Settings + Hooks Tabs lesen/schreiben Config
Jedes Modul ist eigenstaendig β kann theoretisch allein funktionieren. panel.py ist nur der Rahmen der sie zusammenbringt.
Timer-System β Das Herzschlag-System
Dein Panel hat 6 Timer die wie Herzschlaege funktionieren. Jeder Timer ruft periodisch eine Funktion auf die Daten aktualisiert:
| Timer | Intervall | Funktion | Was wird aktualisiert? |
|---|---|---|---|
| Hub | 30s | _refresh_hub() |
Kosten, Top-Tools, Sessions |
| Monitor-Start | 15s | _start_monitor_timer() |
Startet Monitor-Timer |
| Logs | 10s | refresh_logs() |
Usage + Coaching Eintraege |
| Sessions | 60s | refresh_sessions() |
Session-Liste |
| Prozesse | 30s | refresh_processes() |
Prozess-Scan |
| Monitor | 30s | _refresh_monitor() |
Timeline, Skills |
Warum gestaffelt? Damit nicht alle gleichzeitig feuern und die UI einfriert. Logs sind am schnellsten (10s) weil Usage-Daten sich oft aendern. Sessions am langsamsten (60s) weil sich Sessions selten aendern.
Was wenn ein Timer haengt? Jeder Timer returned True um am Leben zu bleiben.
Wenn einer Exception wirft, faengt try/except es ab und der Timer laeuft weiter.
Worst case: ein Tab zeigt veraltete Daten, aber das Panel stuerzt nicht ab.
Daten-Flow
~/.claude/usage/YYYY-MM-DD.jsonl βββ monitor.py (Cache 30s) βββ Hub Tab (Kosten, Tools)
ββββ log_viewer.py βββ Logs Tab (Eintraege)
~/.claude/projects/*/ βββββββββββββ monitor.py + session_browser βββ Sessions Tab
ps aux βββββββββββββββββββββββββββββ process_manager.py βββ Prozesse Tab
~/.claude/settings.json βββββββββββ config_io.py βββ Settings + Hooks Tab
Theme-System
Detection: Liest
~/.config/cosmic/com.system76.CosmicTheme.Mode/v1/is_darktrueβ Catppuccin Mocha (dunkle Palette)falseβ Catppuccin Latte (helle Palette)- Datei fehlt β Fallback auf GTK
gtk-application-prefer-dark-theme
CSS:
build_css(palette)generiert ~150 Zeilen CSS aus der PaletteLive-Switch:
Gio.FileMonitorbeobachtet die COSMIC Config-Datei. Aendert sich das System-Theme, wirdapply_theme()viaGLib.idle_addaufgerufen.
Config-System β Atomare Writes
Warum nicht einfach json.dump(data, open(file, "w"))?
Weil: wenn der Prozess mittendrin stirbt, hast du eine kaputte halbe Datei.
Stattdessen (config_io.py):
- Backup:
settings.jsonβsettings.json.backup-20260302-143000 - Temp: Schreibe in
settings-XXXX.tmp(gleicher Ordner) - Rename:
os.replace(tmp, settings.json)β atomar auf Linux!
Entweder hast du die alte ODER die neue Datei. Nie eine kaputte.
Sprint 2026-03-04 Learnings
Das Wichtigste zuerst: Deine vorherige Arbeit war solide.
4 von 5 Warnings waren bereits gefixt bevor der Sprint anfing (Commit 67a4362).
Du hast einen 5-Agenten-Sprint geplant fuer... einen einzigen verbleibenden Fix (subprocess.run β Popen).
Das Panel ist zu 95%+ fertig. Was wirklich noch offen ist: 4 Suggestions (nice-to-have), kein Critical.
Muster: Erst schauen, dann planen.
Tendency erkannt: Samuel plant gross (5 Agents, detaillierter PLAN-File) bevor er den aktuellen Stand prueft.
Regel fuer dich: /check-state vor jedem Sprint-Start. Eine Minute Status-Check spart eine Stunde Overhead.
Konkret: Bevor du Tasks erstellst, kurz pruefen:
- Welche Punkte der Checkliste sind schon erledigt? (PLAN-File lesen)
- Laeuft der Service gerade fehlerfrei? (
systemctl --user status claude-panel.service) - Wie gross ist der echte Rueckstand? (1 Fix β 5-Agenten-Aufwand)
Was gut lief (verstaerken!)
- Dokumentations-Disziplin: PLAN-File erstellt, Review-Findings dokumentiert, Entscheidungen festgehalten. Das ist wertvoll.
- Commit-Hygiene: Criticals sofort gefixt und committed. Kein "ich mach das spaeter".
- Code-Review Workflow: Sonnet Review + MiniMax Zweitmeinung. Zwei Perspektiven fangen mehr.
- Architektur-Entscheidungen klar begruendet:
**/*.jsonlfuer rekursive Suche,"anthropic"Key-Aggregation, Fingerprint-Mechanismus β alles dokumentiert.
Was noch aussteht (die echte Restliste)
Nur Suggestions, kein muss:
monitor.py:~662βsorted()mit stat()-Lambda vereinfachenlog_viewer.py:~456β unbenutztensort_modelParameter entfernenpanel.py:~812β_DETECTOR_LAYOUTNaming-Konventionlog_viewer.pyβ Status-Farben aus Theme-Palette statt hardcoded
Das Panel laeuft. Diese Fixes machen es sauberer, nicht funktionsfaehiger.
Bekannte Gotchas
CPU Spin-Loop (GEFIXT):
GLib.idle_add(refresh_logs)mitreturn True= Endlosschleife. Fix: One-Shot Wrapper mitreturn False. Regel:idle_addCallbacks muessen IMMERFalsereturnen.Ghost-Prozesse: MCP-Server (opencode-mcp, gemini-mcp) werden pro Session gestartet aber nie beendet. Der Prozesse-Tab zeigt sie als "Ghosts" (>24h).
MyAIGame Dependency:
monitor.pyimportierttui.data.usage_readeraus~/Projekte/MyAIGame/. Wenn das Projekt nicht existiert, fallen Kosten- und Tool-Statistiken auf Null zurueck (graceful fallback, kein Crash).COSMIC-only Theme Detection: Auf nicht-COSMIC-Desktops funktioniert nur der GTK-Fallback. Die Catppuccin-Farben bleiben, aber Live-Switching nur per GTK.
Singleton Lock (GEFIXT): Frueher konnten mehrere Panel-Instanzen gleichzeitig laufen (systemd restart + manueller Start). Fix:
fcntl.flockauf/tmp/claude-panel.lock. Zweite Instanz erkennt Lock und beendet sich mitsys.exit(0).