diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 0000000..f220412 --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,497 @@ +# Claude Desktop — Roadmap + +Stand: 14.04.2026 + +## Aktueller Status + +### Implementiert (Phase 1-4) + +| Feature | Status | Commit | +|---------|--------|--------| +| Tauri 2.0 + SvelteKit 5 App | ✅ | Initial | +| Claude Agent SDK Integration | ✅ | Phase 2 | +| Live-Streaming Text im Chat | ✅ | Phase 2 | +| SQLite Persistierung | ✅ | Phase 3 | +| Guard-Rails System | ✅ | Phase 3 | +| Claude Bridge (Node.js) | ✅ | Phase 3 | +| 4-Panel Layout (PaneForge) | ✅ | Phase 4 | +| Tab-Switching | ✅ | Phase 4 | +| Markdown-Rendering | ✅ | Phase 4 | +| Activity Panel (Tool-Tracking) | ✅ | Phase 4 | +| Memory Panel | ✅ | Phase 4 | +| Audit Log Panel | ✅ | Phase 4 | +| Agent-View | ✅ | Phase 4 | +| Modell-Auswahl (Haiku/Sonnet/Opus) | ✅ | 433e2de | +| Session-Historie persistent | ✅ | 4ba14a5 | +| STOPP-Button + Escape-Shortcut | ✅ | Vorhanden | +| Token/Kosten-Anzeige im Footer | ✅ | Vorhanden | +| Modell-Badge (Titlebar + Footer) | ✅ | 9129163 | +| Tray-Icon mit Menu | ✅ | 3c6da3b | + +--- + +## Phase 5: Subagent-Hierarchie (KRITISCH) + +### Problem +Der aktuelle `claude-bridge.js` behandelt nur einen Main-Agent. Wenn Claude das Task-Tool nutzt und Subagents (Explore, Plan, Bash) spawnt, werden diese **nicht angezeigt**. + +### Ziel +``` +┌─ Main Agent (claude-opus-4) +│ ├─ Explore Agent (Codebase durchsuchen) +│ │ └─ Tool: Grep "handleError" +│ └─ Plan Agent (Implementierung planen) +│ └─ Tool: Read README.md +``` + +### Aufgaben + +- [ ] **scripts/claude-bridge.js** + - [ ] `subagent_start` Event-Handler hinzufugen + - [ ] `subagent_stop` Event-Handler hinzufugen + - [ ] `parentAgentId` und `depth` im Event-Payload senden + +- [ ] **src-tauri/src/claude.rs** + - [ ] `AgentEvent` Struct erweitern: `parent_id: Option` + - [ ] Hierarchie-Info an Frontend weitergeben + +- [ ] **src/lib/stores/app.ts** + - [ ] `Agent` Interface erweitern: + ```typescript + interface Agent { + id: string; + parentAgentId?: string; // NEU + depth: number; // NEU: 0 = Main, 1 = Subagent, etc. + type: 'main' | 'explore' | 'plan' | 'bash'; + // ... + } + ``` + +- [ ] **src/lib/components/AgentView.svelte** + - [ ] Baumansicht mit Einruckung implementieren + - [ ] Linien zwischen Parent/Child + - [ ] Subagent-Badge anzeigen + - [ ] Collapsed/Expanded State pro Agent + +### Verifikation +```bash +# App starten, Prompt eingeben der Task-Tool triggert +# Prufen: AgentView zeigt verschachtelte Hierarchie +``` + +--- + +## Phase 6: Session-Management Verbesserungen + +### Problem +1. Session wird nur geladen wenn SessionList-Panel sichtbar ist +2. `agentId` geht bei DB-Speicherung verloren +3. Kein Compacting — alte Sessions werden unbegrenzt gross +4. `claude_session_id` wird nicht fur SDK-Fortsetzung genutzt + +### Aufgaben + +- [ ] **src/routes/+layout.svelte** + - [ ] Session-Auto-Load bei App-Start (nicht nur in SessionList) + ```typescript + onMount(async () => { + const active = await invoke('get_active_session'); + if (active) { + currentSessionId.set(active.id); + const messages = await invoke('load_messages', { sessionId: active.id }); + setMessagesFromDb(messages); + } + }); + ``` + +- [ ] **src-tauri/src/db.rs** + - [ ] `agent_id` Spalte in `messages` Tabelle + - [ ] Migration fur bestehende Daten + - [ ] `compact_session(session_id, keep_last_n)` Funktion + - [ ] `archive_messages(session_id, before_timestamp)` Funktion + +- [ ] **src/lib/stores/app.ts** + - [ ] `DbMessage` Interface: `agent_id?: string` + - [ ] `messageToDb()` anpassen + +- [ ] **Compacting-Logik** + - [ ] Bei > 50 Nachrichten: Altere zusammenfassen + - [ ] Summary-Nachricht: "Bisheriger Kontext: ..." + - [ ] Original-Nachrichten in `messages_archive` Tabelle + +- [ ] **Claude-Session-ID nutzen** + - [ ] Bei `send_message`: Session-ID an SDK ubergeben + - [ ] `--resume` Flag nutzen fur Fortsetzung + +### Verifikation +```bash +# App starten → Letzte Session automatisch geladen (ohne SessionList) +# 100 Nachrichten senden → Compacting aktiv +# App beenden → Neu starten → Exakt gleicher Stand +``` + +--- + +## Phase 7: UI-Verbesserungen + +### Features die fehlen (Standard bei ChatGPT, Claude.ai, Cursor) + +| Feature | Prioritat | +|---------|-----------| +| Nachricht bearbeiten | Hoch | +| Antwort regenerieren | Hoch | +| Code-Block Copy-Button | Hoch | +| Diff-View fur Anderungen | Hoch | +| File-Preview inline | Mittel | +| Conversation Fork | Niedrig | + +### Aufgaben + +- [ ] **src/lib/components/MessageBubble.svelte** (oder ChatPanel) + - [ ] Edit-Button bei User-Nachrichten + - [ ] Regenerate-Button bei Assistant-Nachrichten + - [ ] Inline-Editor fur Nachrichtenbearbeitung + +- [ ] **src/lib/components/CodeBlock.svelte** (NEU) + - [ ] Syntax-Highlighting (bereits via marked?) + - [ ] Copy-Button oben rechts + - [ ] Sprache anzeigen + - [ ] Zeilennummern optional + +- [ ] **src/lib/components/DiffView.svelte** (NEU) + - [ ] Split-View: Alt | Neu + - [ ] Unified-View: +/- Zeilen + - [ ] Syntax-Highlighting + - [ ] Wird bei Edit-Tool-Results angezeigt + +- [ ] **src/lib/components/FilePreview.svelte** (NEU) + - [ ] Bei Read-Tool: Dateiinhalt inline anzeigen + - [ ] Collapsible (eingeklappt by default) + - [ ] Syntax-Highlighting nach Dateiendung + +- [ ] **Keyboard Shortcuts** + - [ ] Cmd/Ctrl+Enter = Senden + - [ ] Cmd/Ctrl+Shift+Enter = Senden ohne Tools + - [ ] Cmd/Ctrl+K = Input fokussieren + +### Verifikation +```bash +# User-Nachricht bearbeiten → Neue Antwort generiert +# Code-Block → Copy-Button kopiert in Clipboard +# Edit-Tool → Diff-View zeigt Anderungen +``` + +--- + +## Phase 8: Claude-DB Integration + +### Problem +Die App hat keinen direkten Zugriff auf die zentrale Wissensbasis (`claude` DB auf 192.168.155.1). + +### Ziel +- Wissensbasis durchsuchen direkt in der App +- Erkenntnisse speichern ("Das merken") +- Skills/Hooks/Patterns aus DB laden + +### Aufgaben + +- [ ] **src-tauri/src/knowledge.rs** (NEU) + - [ ] MySQL-Verbindung zu claude-db + - [ ] `search_knowledge(query)` — Volltextsuche + - [ ] `save_knowledge(entry)` — Neuer Eintrag + - [ ] `get_sticky_context()` — Fur Claude-Prompt + +- [ ] **src-tauri/src/lib.rs** + - [ ] Knowledge-Modul registrieren + - [ ] Tauri-Commands exportieren + +- [ ] **src/lib/components/KnowledgePanel.svelte** (NEU) + - [ ] Suchfeld fur Wissensbasis + - [ ] Ergebnisliste mit Titel, Tags, Preview + - [ ] Detail-View fur einzelnen Eintrag + +- [ ] **"Das merken" Feature** + - [ ] Button in Chat bei wichtigen Erkenntnissen + - [ ] Modal: Kategorie, Tags, Titel eingeben + - [ ] Speichert in `knowledge` Tabelle + +- [ ] **Sticky Context** + - [ ] Beim Chat-Start: Sticky-Eintrage laden + - [ ] Als System-Prompt an Claude senden + +### Verifikation +```bash +# Wissensbasis durchsuchen → Ergebnisse in App +# "Das merken" klicken → Eintrag in claude.knowledge +# Neuer Chat → Sticky Context wird geladen +``` + +--- + +## Phase 9: Intelligentes Context-Management (WICHTIG) + +### Das Problem: Context-Verlust nach Compacting + +Compacting ist **notwendig** (Token-Limit, Kosten, Latenz), aber dabei geht kritischer Kontext verloren: +- Zugänge (DB-Hosts, API-Keys) +- Projekt-Kontext (CLAUDE.md) +- Getroffene Entscheidungen +- Aktuelle Aufgabe + +### Lösung: Drei-Schichten-Gedächtnis + +``` +┌─────────────────────────────────────────────────────────────┐ +│ SCHICHT 1: IMMER PRÄSENT (~200 Token) │ +│ • User-Info (Name, Firma) │ +│ • Aktive Zugänge (komprimiert) │ +│ • Aktuelle Projekt-ID + Phase │ +│ → Bei JEDEM API-Call dabei │ +├─────────────────────────────────────────────────────────────┤ +│ SCHICHT 2: PROJEKT-KONTEXT (~500 Token) │ +│ • CLAUDE.md (komprimiert) │ +│ • Architektur-Entscheidungen │ +│ • Offene TODOs │ +│ → Nach Compacting neu injiziert │ +├─────────────────────────────────────────────────────────────┤ +│ SCHICHT 3: WISSENS-HINTS (on-demand) │ +│ • Relevante DB-Einträge │ +│ • Ähnliche Probleme/Lösungen │ +│ → Bei Tool-Aufrufen automatisch geladen │ +└─────────────────────────────────────────────────────────────┘ +``` + +### Aufgaben + +- [ ] **src-tauri/src/context.rs** (NEU) + - [ ] `StickyContext` Struct (Schicht 1) + - [ ] `ProjectContext` Struct (Schicht 2) + - [ ] `get_sticky_context()` → ~200 Token + - [ ] `get_project_context(project_id)` → ~500 Token + - [ ] `extract_critical_before_compacting()` → JSON + +- [ ] **src-tauri/src/credentials.rs** (NEU) + - [ ] Credentials aus DB laden (verschlüsselt) + - [ ] `inject_for_context(tool_name)` → Zugang wenn nötig + - [ ] Credentials NIE im Chat-Verlauf speichern + +- [ ] **scripts/claude-bridge.js** + - [ ] Schicht 1 bei jedem `query()` Call als System-Prompt + - [ ] Hook vor Compacting: `extract_critical_before_compacting()` + - [ ] Hook nach Compacting: `restore_critical_context()` + +- [ ] **Datenbank-Schema** (SQLite lokal) + ```sql + CREATE TABLE sticky_context ( + key TEXT PRIMARY KEY, + value TEXT, + priority INT -- 1=kritisch, niemals entfernen + ); + + CREATE TABLE compacting_archive ( + id INTEGER PRIMARY KEY, + session_id TEXT, + extracted_at TEXT, + decisions JSON, + open_questions JSON, + key_insights JSON + ); + ``` + +- [ ] **Pre-Tool-Hook: Wissens-Hints** + - [ ] Bei Tool-Aufruf: Schlüsselwörter extrahieren + - [ ] Claude-DB nach relevantem Wissen durchsuchen + - [ ] Als `` injizieren (max 200 Token) + +### Wichtig: Nicht ALLES wiederherstellen! + +``` +❌ FALSCH: 130.000 Token zurück injizieren + → Sofort wieder Compacting → Endlosschleife + +✅ RICHTIG: 700 Token kritischen Kontext + Schicht 1: 200 Token (Zugänge, User) + Schicht 2: 500 Token (Projekt, Entscheidungen) +``` + +### Verifikation +```bash +# Lange Session (>100 Nachrichten) → Compacting passiert +# Danach: Zugänge noch bekannt? Projekt-Kontext da? +# Tool aufrufen → Relevante Hints erscheinen? +``` + +--- + +## Phase 10: Sprach-Interface (Optional) + +### Technologie-Stack + +| Komponente | Technologie | Ort | +|------------|-------------|-----| +| Speech-to-Text | Whisper.cpp | Lokal | +| Voice Activity Detection | Silero VAD | Lokal | +| Text-to-Speech | OpenAI TTS API | Cloud | +| Audio-Capture | Web Audio API | Browser | + +### Aufgaben + +- [ ] **Whisper Integration** + - [ ] whisper.cpp als Tauri-Sidecar oder WASM + - [ ] Streaming-Transkription + - [ ] Deutsch-Modell (small oder medium) + +- [ ] **VAD (Voice Activity Detection)** + - [ ] Erkennt wann User aufhort zu sprechen + - [ ] Pause > 1.5s → Nachricht senden + +- [ ] **TTS (Text-to-Speech)** + - [ ] OpenAI TTS API Integration + - [ ] Streaming-Wiedergabe + - [ ] Interrupt bei User-Sprache + +- [ ] **UI** + - [ ] Mikrofon-Button in Chat + - [ ] Pegel-Anzeige + - [ ] Transkript live anzeigen + +### Aufwand +Gross — eigenes Teilprojekt, 2-3 Wochen + +--- + +## Phase 11: Hook-System für Automatisierung + +### Konzept + +Hooks die automatisch bei bestimmten Events laufen: + +| Hook | Wann | Was | +|------|------|-----| +| `SessionStart` | App startet | Schicht 1+2 laden | +| `PreToolUse` | Vor jedem Tool | Wissens-Hints aus DB | +| `PostToolUse` | Nach Tool | Bei Fehler → Pattern speichern | +| `BeforeCompacting` | Vor Komprimierung | Kritisches extrahieren | +| `AfterCompacting` | Nach Komprimierung | Schicht 1+2 injizieren | + +### Aufgaben + +- [ ] **src-tauri/src/hooks.rs** (NEU) + - [ ] `HookManager` Struct + - [ ] `register_hook(event, callback)` + - [ ] `fire_hook(event, payload)` + +- [ ] **scripts/hooks/** (NEU) + - [ ] `session-start.js` → Lädt Projekt-Kontext + - [ ] `pre-tool.js` → Wissens-Hints aus claude-db + - [ ] `post-tool.js` → Fehler-Patterns speichern + - [ ] `before-compacting.js` → Kritisches extrahieren + - [ ] `after-compacting.js` → Context wiederherstellen + +- [ ] **UI: Hook-Konfiguration** + - [ ] Settings-Panel: Hooks ein/ausschalten + - [ ] Hook-Log im Audit-Panel + +### Verifikation +```bash +# Session starten → Hook-Log zeigt "Kontext geladen" +# Tool aufrufen → Hook-Log zeigt "Wissens-Hints: 3 gefunden" +# Fehler provozieren → Pattern wird gespeichert +``` + +--- + +## Claude-DB Schema-Erweiterungen + +Neue Tabellen für die zentrale Wissensbasis (192.168.155.1): + +```sql +-- Projekt-Kontext (für Schicht 2) +CREATE TABLE project_context ( + id INT PRIMARY KEY AUTO_INCREMENT, + project_id VARCHAR(100), + type ENUM('claude_md', 'architecture', 'decision', 'todo', 'insight'), + content TEXT, + priority INT DEFAULT 5, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + expires_at TIMESTAMP NULL, + INDEX idx_project (project_id) +); + +-- Credentials (verschlüsselt) +CREATE TABLE credentials ( + id INT PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(100) UNIQUE, + type ENUM('mysql', 'api', 'ssh', 'oauth'), + value_encrypted BLOB, + inject_pattern TEXT, -- Regex: wann automatisch laden + last_used TIMESTAMP +); + +-- Compacting-Archive +CREATE TABLE compacting_archive ( + id INT PRIMARY KEY AUTO_INCREMENT, + session_id VARCHAR(100), + extracted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + decisions JSON, + open_questions JSON, + key_insights JSON, + zugaenge JSON +); + +-- Begriff-Cache (für schnelle Wissens-Hints) +CREATE TABLE concept_cache ( + concept VARCHAR(100) PRIMARY KEY, + relevant_knowledge_ids JSON, + last_queried TIMESTAMP, + hit_count INT DEFAULT 0 +); +``` + +--- + +## Nicht geplant / Zukunft + +- [ ] Computer Use (VM mit Desktop) +- [ ] MCP-Server Integration in App +- [ ] Plugin-System +- [ ] Multi-User / Team-Features +- [ ] Cloud-Sync zwischen Geraten + +--- + +## Technische Schulden + +- [ ] Dead Code in `memory.rs` (MemorySystem struct ungenutzt) +- [ ] Warnings bei `cargo check` beheben +- [ ] TypeScript strict mode aktivieren +- [ ] E2E Tests mit Playwright +- [ ] CI/CD Pipeline (Forgejo Runner) + +--- + +## Build & Entwicklung + +```bash +# Entwicklung +cd "/mnt/17 - Entwicklungen/20 - Projekte/ClaudeDesktop" +CARGO_TARGET_DIR=/tmp/claude-desktop-target nix-shell --run "npx tauri dev" + +# Produktion (AppImage) +CARGO_TARGET_DIR=/tmp/claude-desktop-target nix-shell --run "npx tauri build" +``` + +--- + +## Commits Ubersicht + +| Datum | Commit | Beschreibung | +|-------|--------|--------------| +| 13.04.2026 | Initial | Grundgerust | +| 13.04.2026 | Phase 2 | Claude SDK + Events | +| 13.04.2026 | Phase 3 | SQLite, Guard-Rails, Bridge | +| 13.04.2026 | Phase 4 | Tabs, Markdown, UI | +| 14.04.2026 | 433e2de | Modell-Auswahl | +| 14.04.2026 | 4ba14a5 | Session-Historie | +| 14.04.2026 | 9129163 | Titlebar aufgeraumt | +| 14.04.2026 | 3c6da3b | Tray-Icon |