ClaudeCodePanel / FOR_SMLFLG.md
smlflg's picture
Initial public upload from Projekte/ClaudeCodePanel
bbc65cd verified
|
Raw History Blame Contribute Delete
11.2 kB

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

  1. Detection: Liest ~/.config/cosmic/com.system76.CosmicTheme.Mode/v1/is_dark

    • true β†’ Catppuccin Mocha (dunkle Palette)
    • false β†’ Catppuccin Latte (helle Palette)
    • Datei fehlt β†’ Fallback auf GTK gtk-application-prefer-dark-theme
  2. CSS: build_css(palette) generiert ~150 Zeilen CSS aus der Palette

  3. Live-Switch: Gio.FileMonitor beobachtet die COSMIC Config-Datei. Aendert sich das System-Theme, wird apply_theme() via GLib.idle_add aufgerufen.


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):

  1. Backup: settings.json β†’ settings.json.backup-20260302-143000
  2. Temp: Schreibe in settings-XXXX.tmp (gleicher Ordner)
  3. 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: **/*.jsonl fuer rekursive Suche, "anthropic" Key-Aggregation, Fingerprint-Mechanismus β€” alles dokumentiert.

Was noch aussteht (die echte Restliste)

Nur Suggestions, kein muss:

  1. monitor.py:~662 β€” sorted() mit stat()-Lambda vereinfachen
  2. log_viewer.py:~456 β€” unbenutzten sort_model Parameter entfernen
  3. panel.py:~812 β€” _DETECTOR_LAYOUT Naming-Konvention
  4. log_viewer.py β€” Status-Farben aus Theme-Palette statt hardcoded

Das Panel laeuft. Diese Fixes machen es sauberer, nicht funktionsfaehiger.


Bekannte Gotchas

  1. CPU Spin-Loop (GEFIXT): GLib.idle_add(refresh_logs) mit return True = Endlosschleife. Fix: One-Shot Wrapper mit return False. Regel: idle_add Callbacks muessen IMMER False returnen.

  2. Ghost-Prozesse: MCP-Server (opencode-mcp, gemini-mcp) werden pro Session gestartet aber nie beendet. Der Prozesse-Tab zeigt sie als "Ghosts" (>24h).

  3. MyAIGame Dependency: monitor.py importiert tui.data.usage_reader aus ~/Projekte/MyAIGame/. Wenn das Projekt nicht existiert, fallen Kosten- und Tool-Statistiken auf Null zurueck (graceful fallback, kein Crash).

  4. COSMIC-only Theme Detection: Auf nicht-COSMIC-Desktops funktioniert nur der GTK-Fallback. Die Catppuccin-Farben bleiben, aber Live-Switching nur per GTK.

  5. Singleton Lock (GEFIXT): Frueher konnten mehrere Panel-Instanzen gleichzeitig laufen (systemd restart + manueller Start). Fix: fcntl.flock auf /tmp/claude-panel.lock. Zweite Instanz erkennt Lock und beendet sich mit sys.exit(0).