Commit Graph

55 Commits

Author SHA1 Message Date
marcus hinz 23f6562f50 Settings-Dialog neu: drei Gruppen, festes Zeilen-Grid, Sofort-Schreiber abgesetzt
Darstellung (Titel/Theme/Dock-Icon), Ordner (Projekt/Arbeitsordner/Archiv)
und Session (Todoliste) als Gruppen mit Eyebrow-Überschriften; jede Zeile
im Grid Label | Wert | Aktionen. Pfade ~-kontrahiert mit vollem Pfad im
Hover-Pop. Die Ordner-Gruppe schreibt sofort und ist als eigene Fläche
abgesetzt (eigener Hinweis); „gilt ab nächstem Start" hängt an der
Darstellungs-Gruppe statt global. Nur ProjectList.vue + i18n-Schlüssel.
2026-07-20 11:06:40 +02:00
marcus hinz a1c95dae4a Build und Deploy getrennt: gemeinsames build.sh, Deploy-Skripte pro OS
build.sh baut nur noch (OS-Weiche für die Bundle-Liste: macOS app,dmg,
Linux deb,rpm, Git-Bash nsis); die macOS-Nachbereitung (lsregister,
.noindex) zieht nach deploy-macos.sh um. deploy-linux.sh installiert das
jüngste Bundle (dnf: rpm -Uvh --force, apt: dpkg -i),
deploy-windows.ps1 startet den NSIS-Installer.
2026-07-20 11:01:33 +02:00
marcus hinz b9d006184a Projekt-Identität und -Config neu: .ai-control/config.json mit UUID und Name
- Projekt-Config zieht von ai-control.json nach .ai-control/config.json um,
  das Icon liegt daneben und synct mit dem Projekt.
- Jedes Projekt trägt eine UUID (id) und den Anzeigenamen (name) in der
  Config; die UUID ist Registry-Schlüssel und project-Parameter aller
  Commands, der Name reine Darstellung.
- Pool-Zuordnung ist maschinenlokal und liegt in der projects.json-Registry,
  nicht mehr in der syncbaren Projekt-Config.
- open_terminal prüft die ID im Ordner gegen die Registry (verschobene oder
  ersetzte Ordner scheitern laut).
- Import übernimmt eine mitgebrachte ID, legt Arbeitsordner und Archiv-Home
  an und zieht die Archiv-Permission nach.
- Migration beim App-Start: Alt-Datei umziehen, Pool in die Registry,
  Icons aus ~/.config/ai-control/icons ins Projekt, Registry auf UUIDs.
- ProjectConfig reicht unbekannte Keys per serde(flatten) durch den
  Round-Trip (Regressionstest config_roundtrip_erhaelt_fremde_keys).
2026-07-20 11:01:33 +02:00
marcusH 6d44f77671 Sicherheitsrunde: Befehlsinjektion, Pool-Pfad, Namensprüfung, Bild-Beacon
Vier Befunde aus einer Prüfung entlang der Angriffsflächen (MCP-Tools,
Command-Grenze, Credentials, Schreibpfade und Abhängigkeiten):

- todo.rs: Der SessionStart-Hook interpolierte den Projektpfad unquotiert in
  eine Shell-Kommandozeile, die Claude Code bei jedem Sessionstart ausfuehrt.
  Ein Ordner `repo$(...)` -- etwa aus einem geklonten Fremd-Repo -- ergab
  dauerhafte Codeausfuehrung; ein Leerzeichen zerbrach den Hook still.
  Der Pfad wird jetzt gequotet, inklusive Apostroph.
- project_pool_dir: Der Pool-Name kommt aus der ai-control.json im
  Projektordner, also aus einer versionierten Datei. Ungeprueft bestimmte er
  mit ../ ein beliebiges Verzeichnis als CLAUDE_CONFIG_DIR, dessen
  settings.json wiederum apiKeyHelper traegt -- ein Kommando, das beim
  Sessionstart laeuft. Jetzt durch check_name abgesichert.
- check_name: Steuerzeichen, Backslash und fuehrender Punkt werden abgelehnt.
  Ein Newline im Projektnamen hing bisher eigene Schluessel an die .desktop-
  Datei; Exec= braucht keinen Schraegstrich, den der alte Check verbot.
- markdown.ts: Bilder duerfen nur noch lokale Ziele laden. Ein auswaertiges
  <img> laedt ohne Zutun und meldet damit IP, Zeitpunkt und im Pfad kodierte
  Daten -- der Panelinhalt stammt aus einer LLM-Session, ist also
  injizierbar. Schema-relative URLs (//host/x) waren durch ein zu laxes
  Muster erfasst. Links bleiben auswaerts erlaubt, jetzt mit
  rel="noopener noreferrer". escapeHtml escaped zusaetzlich das Apostroph.

Dazu cargo audit nachgeholt: plist 1.9.0 -> 1.10.0 hebt quick-xml auf 0.41.0
und schliesst RUSTSEC-2026-0194/0195 fuer den Laufzeitpfad. Die zweite
Instanz von quick-xml 0.39.4 bleibt ueber wayland-scanner im Lockfile --
ein proc-macro, das nur zur Compile-Zeit laeuft und ausgelieferte
Protokoll-XMLs parst, nicht im Binary landet.

77 Rust-Tests, 39 Frontend-Tests.
2026-07-19 23:47:29 +02:00
marcusH e245600235 Aufräumrunde zur Bugfix-Runde: Suche entzerrt, Flatten-Fix vervollständigt
- archive_search: match_expr in search() aufgelöst. sanitize_query lief zweimal
  pro Anfrage, und die Leer-Entscheidung stand an zwei Stellen mit leicht
  abweichender Bedingung.
- Der Tag-Filter geht jetzt durch dieselbe Quoting-Regel wie der Volltext. Ein
  leerer Tag ergab tags:"" und damit einen Syntaxfehler — erreichbar durch das
  angetippte #, den ersten Tastendruck jeder Tag-Suche.
- sanitize_query von 26 auf 12 Zeilen: split('"') und split_whitespace statt
  handgeschriebenem Tokenizer. Gleiches Ergebnis fuer alle Testeingaben.
- TerminalConfig bekommt ebenfalls serde flatten. Der Block wird als Ganzes
  mitgeschrieben, ein terminal.fontSize waere also weiterhin verloren gegangen;
  set_terminal_config_in traegt die unbekannten Keys jetzt herueber.
- markdown.test.ts enthielt ein literales NUL-Byte, wodurch git die Datei als
  binaer behandelte. Der Test erzeugt das Zeichen jetzt selbst.
- Kleineres: commands_delete-Bedingung als direkter Vergleich, eine
  Verschachtelungsebene in pool.rs, zwei redundante Kommentarbloecke.
  commands_delete benennt sich in der Doku als Provisorium.
2026-07-19 23:22:25 +02:00
marcusH b127269e89 Bugfix-Runde Panel/Archiv: Datenverlust, Suche, Löschen, Markdown
- ProjectConfig reicht unbekannte Keys durch (serde flatten). Bisher verlor
  jeder read-modify-write die Felder neuerer Versionen; so ging archiveHome
  bei der Pool-Zuweisung durch einen älteren Build verloren.
- Archiv-Suche: Nutzereingabe wird in einen FTS5-Ausdruck übersetzt, der nicht
  scheitern kann. ai-control, C++ oder eine halbe Phrase warfen bisher einen
  Syntaxfehler — bei der Live-Suche in jedem Tippzwischenstand.
- commands_delete: Befehlstext als Identität, Indizes werden geprüft. Bisher
  Panik oder Löschen der falschen Kachel, wenn die Panel-Indizes der Datei
  hinterherhingen.
- Archivieren überschreibt keine Datei mehr: Der Stempel hat Minutenauflösung,
  bei Kollision wird -2, -3, ... angehängt.
- archive_panel prüft erst auf leeres Panel, dann wird das Archiv-Home gesetzt;
  bisher blieb ein umkonfiguriertes Home trotz Meldung "nicht archiviert".
- Kaputte .claude.json eines Pools wird nicht mehr durch eine frische ersetzt;
  nur eine fehlende Datei rechtfertigt das.
- Archiv-Formular leert beim Schließen — sonst galten Ordner und Schlagwörter
  des vorigen Dokuments unbemerkt fürs nächste.
- Markdown fürs Panel entschärft (src/markdown.ts): rohes HTML wird als Text
  ausgegeben, Link- und Bildziele auf harmlose Schemata beschränkt. Das Panel
  teilt sich den Webview mit dem Terminal, dessen term_write in die PTY
  schreibt; ohne CSP war das ein Weg von Fremdinhalt zu Befehlsausführung.

Regressionstests je Fix: 73 Rust-Tests, 35 Frontend-Tests.
2026-07-19 23:04:17 +02:00
marcus hinz 1345ef799c panel-update: erst auf Dokument schalten, dann Inhalt setzen
Der Modus-Umschalter restauriert beim Wechsel den gemerkten Dokument-Titel;
kam ein Dokument aus der Suche, überschrieb das den frisch gesetzten Titel —
der Wiki-Sprung lief damit ins Leere.
2026-07-19 17:21:26 +02:00
marcus hinz 286513def8 Refinement-Runde Panel/Wiki: Bedienung, Themes, Archiv-Wahl, Frontend-Tests
- Slug transliteriert Umlaute/ß (fuer statt f-r); aktiver Tab mit Akzent +
  Unterstrich; kein aktiver Tab bei zugeklapptem Panel (mode.clear)
- Suche: Live-Update auch beim Löschen (<3 Zeichen: Hinweis), #tag-Filter in
  der Query, Treffer öffnen im Dokument-Tab (panel_load, ohne Frontmatter);
  Wiki-Sprung-Button im Dokument; Wiki-Fehler sichtbar als Toast
- Archiv-Formular am Archiv-Button (Ordner/Beschreibung/Schlagwörter);
  panel_archive_cmd nimmt Meta entgegen
- Wiki-Übersicht: Zuletzt-Sektion, Backlink-Zähler, Wurzel-Eyebrow
- Themes: Panel-Farben über CSS-Variablen, applyTheme leitet sie aus dem
  jeweiligen Theme ab (auch helle); gemeinsames themes.ts
- Fenster: Doppelklick maximiert; gelöstes Fenster merkt Größe/Position
  (Window-ACL: set-position/outer-position/inner-size ergänzt);
  open_panel_window async (GTK-Deadlock-Vorgabe); Panel-Fenster spiegelt
  JS-Fehler ins Dev-Log
- Archiv pro Projekt wähl-/abwählbar (Einstellungsdialog, setzt/entfernt
  Permissions); require_archive_home legt den Ordner an; ohne Archiv nur
  Befehle+Dokument im Panel
- Frontend-Tests: vitest + happy-dom, 27 Tests über Modus-, Such-, Wiki-,
  Editor- und Formular-Logik (npm test)
2026-07-19 17:08:05 +02:00
marcus hinz 81a663e020 Panel-Feinschliff: Fensterrahmen, Live-Suche, Min/Max im gelösten Fenster
- 1-px-Fensterrahmen in Theme-Rahmenfarbe für die rahmenlosen Fenster (Linux)
- Suchfeld: Live-Suche ab 3 Zeichen mit 300-ms-Debounce, letztes Wort als
  Präfix (arch → arch*); Enter sucht wörtlich (exakte FTS-Syntax)
- Gelöstes Fenster: Minimieren/Maximieren neben Andocken/Schließen
2026-07-19 15:32:05 +02:00
marcus hinz 994d5070f0 Archiv-Wiki im Panel: vier Tabs, FTS5-Suche, strukturierbares Archiv
- Archiv-Home pro Projekt (archiveHome in ai-control.json); archive_panel
  mit Ordner, Beschreibung und Schlagwörtern (Frontmatter + Zeitstempel-Stem)
- Archiv-Index (archive_index.rs): Scan mit Frontmatter, Wikilinks,
  Backlinks; Wiki-Seiten als strukturierte Daten (Übersicht/Tag-Seiten)
- FTS5-Suche (archive_search.rs, rusqlite bundled): in-memory-Index pro
  Anfrage; MCP search_archive und Panel-Suchfeld (search_run) teilen die Engine
- Panel: vier Puffer/Ansichten (Dokument, Befehle, Suche, Wiki) mit Tabs im
  Fenster-Header; gemeinsame Verdrahtung panel-wiring.ts, Kachel-CSS,
  Wiki-View mit Tag-Chips, Ordner-Sektionen und Backlinks
- Archivieren speichert offene Bearbeitung (flush); Tab-Wechsel speichert
  statt zu blockieren; Fehler sichtbar als Panel-Toast
- Abgelöstes Fenster: rahmenlos (Linux), eigene Kopfleiste mit Tabs und
  Fensterknöpfen, Theme-Kopplung über gemeinsames themes.ts
- MCP-Tools show_commands, show_archive; Befehls-History mit Kachel-Löschen
2026-07-19 15:25:40 +02:00
marcus hinz d4d455fa08 Popup-Fokus auf SNI-X11-Desktops: present() nach jedem Map
Muffin (Cinnamon) mappt das Popup ohne Fokus — das set_focus aus show_popup
läuft vor dem Map und fällt der Focus-Stealing-Prevention zum Opfer; ohne
initialen Fokus greift das Blur-Schließen nie. Ein map-event-Handler ruft
present(), GTK besorgt sich unter X11 dabei den echten Server-Timestamp.

Registriert nur unter X11 außerhalb von GNOME: auf GNOME/Wayland zeigt die
Extension das Popup, dort brach das Fokus-Grab den Klick-Weg (Ubuntu/Kubuntu).
Bestätigt auf Mint/Cinnamon, Ubuntu und Kubuntu.
2026-07-17 19:37:05 +02:00
marcus hinz be1e4aad3f Popup-Blur-Guard ohne Timer: Sperre fällt mit dem ersten Focused(true)
Bisher löste ein Thread die Sperre nach 350 ms (geraten gegen das
spuriose Focused(false), das KDE direkt nach show/set_focus feuert).
Jetzt steht die Sperre ab dem Anzeigen und fällt deterministisch mit
dem ersten echten Fokus-Event des Popups.
2026-07-17 00:17:17 +02:00
marcus hinz 3fe911040d KWin-Script lauffähig unter Plasma 6: KPackageStructure + frameGeometry-Objekt
- metadata.json: ohne KPackageStructure=KWin/Script verwirft KWin 6 das
  Paket schon beim Einsammeln (isScriptLoaded blieb false)
- main.js: KWin-Scripts laufen in reiner QJSEngine ohne QML-Globals,
  Qt.rect warf 'Qt is not defined' — die Engine konvertiert ein
  {x,y,width,height}-Objekt selbst nach QRectF
2026-07-16 20:47:23 +02:00
marcus hinz 8aba0eb315 GNOME-Extension: Popup schließt bei Klick auf Desktop/Shell-Chrome
Klick auf leere Fläche wechselt den Fensterfokus nicht, der Blur-Pfad
der App greift dort nicht. Solange das Popup offen ist, fängt ein
captured-event-Handler am Stage solche Klicks ab und relayt Hide per
D-Bus; Klicks auf den Panel-Button toggeln weiter selbst.
2026-07-15 20:10:33 +02:00
marcus hinz 9a99bca466 Modul-Split: Fachlogik nach domain/, OS-Code nach platform/, Tauri-Verdrahtung in app.rs/commands.rs
- lib.rs nur noch Prozessrollen-Dispatch + Panic-Tracer
- KWin-Script als KDE-Pendant zur GNOME-Extension (Popup ans Zeiger-
  Rechteck), wird von deb/rpm mit ausgeliefert
- SNI-Tray auf ksni (pure Rust), appindicator-Depends entfallen
2026-07-15 20:10:33 +02:00
marcus hinz cf844c45da Linux: nativer SNI-Tray für Nicht-GNOME-Desktops, pfadtragende fs-Fehler, Panic-Tracer
- Tray verzweigt: GNOME -> Extension/D-Bus, KDE/Cinnamon/LXQt -> natives
  SNI-Tray-Icon mit Menue (libappindicator liefert keine Klick-Events)
- fs-Aufrufe nennen bei Fehlern den Pfad statt bloss 'os error 2';
  is_dir-Guard in list_pools_in und Usage-Auswertung
- Panic-Hook schreibt kopierbaren Backtrace (profile.release debug = 1)
- AppImage unter GNOME gesperrt (rfd-Dialog), Verweis auf deb/rpm
- deb/rpm liefern die GNOME-Extension mit; Appindicator als Depends
- Bundle-Targets um deb/rpm/appimage erweitert
2026-07-12 18:06:35 +02:00
marcus hinz b1a2291aef EOB 2026-07-12 00:35:09 +02:00
marcus hinz ce4e48e311 SVG-Icons statt ICNS, Popup-Höhe an Monitor begrenzt, GNOME-Shell-Extension für Popup-Positionierung, Bundle-Targets explizit 2026-07-11 21:45:20 +02:00
marcus.hinz 165501c8f9 Panel: Clobber-Schutz, Content-Editor, Archiv-Reveal/Guard, Rechtschreib-Sprache
- register_mcp_server schreibt .claude.json nur bei fehlendem/abweichendem
  Eintrag (claudes Live-State nicht unnötig ueberschreiben).
- Content-Editor im Panel (Rohtext-Textarea): Cmd/Ctrl+Enter speichert via
  panel_set, Esc verwirft; eingehende Updates werden waehrend der Bearbeitung
  gepuffert (Button "geaendert"), Speichern gewinnt.
- Archivieren zeigt die Datei danach im Dateimanager (reveal_path_cmd, cfg pro
  OS). Breadth-Guard: Archiv-Ordner darf kein Home-Vorfahre sein, muss absolut
  sein; expand_home loest bare ~ auf.
- Rechtschreibpruefung: Default in settings.json (spellcheckLang "de"), pro
  Text per Selector ueberschreibbar.
2026-07-11 14:24:16 +02:00
marcus.hinz e2e9992b1c Panel: Entwürfe archivieren, Titel aus Überschrift, Titel-Edit
- Archiv pro Projekt: Panel-Button „Archivieren" und MCP-Tool archive_panel
  legen den Entwurf als <YYYY-MM-DD_HHMM>-<slug>.md mit Frontmatter im
  Archiv-Ordner ab. Ordner in ai-control.json (archiveDir) + als
  additionalDirectories/Edit in .claude/settings.json (scanbar). Kein Ordner:
  Panel öffnet Ordner-Dialog, Zuruf nutzt Argument dir.
- Panel-Titel zeigt die erste Überschrift des Entwurfs (Inline-Markdown
  gestrippt), Fallback „Entwurf"; Bleistift-Button macht ihn editierbar,
  schreibt die Überschrift via panel_set zurück.
- Panel-Kopf zweizeilig: Titel + Edit oben, Aktionen rechtsbündig darunter.
- AI_CONTROL_PROJECT als PTY-Env für den MCP-Server.
2026-07-11 13:40:17 +02:00
marcus.hinz 8aa758ae64 Entwurfs-Panel mit MCP-Tool write_panel
- Andockbares Panel im Terminal-Fenster: Markdown-Rendering, Copy-Button,
  normale Selektion; in eigenes Fenster ablösbar und wieder andockbar
  (Splitter, panel-detached/panel-attached).
- MCP-stdio-Server (app --mcp-panel) mit Tool write_panel; schreibt in die
  Datei aus AI_CONTROL_PANEL, Watcher zieht sie ins Panel.
- Provisionierung je Pool: Server-Registrierung in .claude.json (alwaysLoad),
  Freigabe mcp__text-panel__write_panel in settings.json, Panel-Skill; bei
  App-Start (alle Pools) und Pool-Anlage. Alte tee-Freigaben werden entfernt.
- Capability deckt panel-*-Fenster ab.
2026-07-11 12:44:51 +02:00
marcus.hinz c39330bffb Tray auf HTML-Popup vereinheitlicht (macOS/Windows), Version 0.2.0
macOS und Windows öffnen jetzt dasselbe rahmenlose Popup-Fenster wie Linux,
ausgelöst über den nativen Tray-Klick und am Icon-rect positioniert; das
native macOS-Menü (tray_menu/menu_icon/project_icon_rgba_36/scale_rgba)
entfällt. Popup-Fenster wird plattformübergreifend gebaut, macOSPrivateApi
für die Transparenz aktiviert, Fokusverlust schließt das Popup überall.
2026-07-07 09:09:18 +02:00
marcus hinz 8434255101 Hauptfenster: Header fest, nur Inhalt scrollt 2026-07-06 22:46:09 +02:00
marcus hinz d3231ccecb git-sync: 2026-07-06 22:34 2026-07-06 22:34:16 +02:00
marcus hinz 1df0da4d48 Linux-Port: GNOME-Popup + Tray, Terminal-Schriftgröße global
- Popup als rahmenloses Fenster mit D-Bus-Relay (popup.html/ts, Popup.vue);
  GNOME-Extension schiebt es unter den Panel-Button
- Terminal: globale Schriftgröße via settings.json (terminalFontSize),
  Zoom mit Ctrl/Cmd +/-/0 im Terminal
- trayLinux-Icon, Capabilities, App.vue/terminal.html angepasst
2026-07-06 20:08:16 +02:00
marcus.hinz 85c18eb8f0 Version 0.1.1 2026-07-05 17:03:21 +02:00
marcus.hinz c5fca165bd Terminal-Header: Projekt-Icon vor dem Titel, Pool-Chip zeigt Anzeigenamen statt Pool-ID (neues Command pool_label); project_icon/pool_label im Command-Satz des Terminal-Prozesses registriert 2026-07-05 17:02:19 +02:00
marcus.hinz 63c8062743 repository-URL: github.com/mHinz-hub/ai-control 2026-07-05 16:24:05 +02:00
marcus.hinz fb7eab1c5b Buy-me-a-coffee-Link (marcusH) im Installationsabsatz + .github/FUNDING.yml für den GitHub-Sponsor-Button 2026-07-05 16:20:56 +02:00
marcus.hinz f83231af10 DMG-Bundle im Build (CI=true wegen TCC-blockiertem Finder-AppleScript); README: Installation mit Quarantäne-Hinweis, xattr-Befehl und Sponsoring-Bemerkung zur fehlenden Signierung 2026-07-05 16:02:02 +02:00
marcus.hinz 438ee69f90 Version durchgängig 0.1.0 2026-07-05 15:53:31 +02:00
marcus.hinz 387a9e964a poolSyncDir konfigurierbar: Pool-Runtime-Verlinkung nur bei gesetztem Sync-Ordner (settings.json), Ziel <poolSyncDir>/<pool> statt hartem ~/claude-projects/pool; ungesetzt bleibt alles lokal 2026-07-05 15:51:31 +02:00
marcus.hinz 8a831af8a8 README: API-Keys liegen im Keychain; ausdrückliche Warnung vor dem Datei-Fallback im Pool-Verzeichnis 2026-07-05 15:41:29 +02:00
marcus.hinz 0ebdaf0460 Projektordner im ⚙︎-Dialog änderbar: Registry-Eintrag neu zuordnen, autoMemoryDirectory + Edit-Permission ziehen auf den neuen Root um; gesperrt bei laufender Session 2026-07-05 15:37:49 +02:00
marcus.hinz 2075f9aa71 Working-folder-Anzeige im ⚙︎-Dialog: Projektordner zuerst (fest), dann Zusatzordner mit Entfernen; Label oben ausgerichtet; Projektpfade überall ~-kontrahiert 2026-07-05 15:33:47 +02:00
marcus.hinz 0908385a9d Icons zentral unter ~/.config/ai-control/icons (pool-/repo-unabhängig), nicht ladbares Icon crasht den Tray nicht mehr; Arbeitsordner nachträglich im ⚙︎-Dialog erfassbar (additionalDirectories + Edit-Permission); Import-Button umbenannt; claudeCommand konfigurierbar + CLAUDE_CONFIG_DIR aus Pool; Pool-Tabellen-Layout; README englisch mit Screenshots; MIT-Lizenz 2026-07-05 15:19:58 +02:00
marcus.hinz b5995da755 Alt-Layout-Fallback entfernt: Projekte kommen ausschließlich aus projects.json; README angepasst 2026-07-05 14:09:48 +02:00
marcus.hinz 65e9df131f Terminal öffnet als aktives Fenster: Starter tritt Aktivierung per yieldActivationToApplicationWithBundleIdentifier ab, Terminal-Prozess aktiviert sich beim Ready-Event (kooperative Aktivierung seit macOS 14) 2026-07-05 14:09:30 +02:00
marcus.hinz ec3d2f4fb3 Projekt-Registry statt festem ~/claude-projects-Root: projects.json (Name → Pfad, ~-relativ) mit Alt-Layout-Fallback; Ordner frei mappbar (add/remove_project, Wizard-Ablageort); Session-Sync per Projekt-Repo (add/commit/pull --rebase/push) statt git-sync-Skript; README + GitHub-Release-Fassung 2026-07-05 13:58:52 +02:00
marcus.hinz ddd8984462 Tray-Menü: Aktionswörter raus — Status-Punkt (grün = läuft) ganz links im Menü-Icon, daneben Projekt-Icon, Label nur der Name 2026-07-05 13:13:44 +02:00
marcus.hinz e21db6845c Tray-Menü listet alle Projekte mit Icon: Klick startet („starten") oder holt das laufende Terminal nach vorn („zeigen"); Session-Watcher baut das Menü bei Status-/Listenänderung neu 2026-07-05 13:08:01 +02:00
marcus.hinz 69fa8b338c Terminal-Start übersteht nicht ladbares Dock-Icon (z. B. TCC-geschützter Pfad) — Meldung statt Panic 2026-07-05 12:47:34 +02:00
marcus.hinz be6c56d7eb Pools: Anzeigename von Pool-ID (UUID-Ordner) getrennt + Umbenennen; API-Keys in Keychain/Keyring, Datei-Fallback nur nach Rückfrage 2026-07-05 12:16:16 +02:00
marcus.hinz 23aa315b8f Terminal: Output-Batching (8 ms) + helle Themes, Projekt-Icons in der Liste, neues App-Icon inkl. Tray-Template, build.sh: Dev-Bundle nach .noindex 2026-07-05 12:16:16 +02:00
marcus.hinz 09488ae5ea Pool-Runtime (projects/todos/history) als Symlinks ins synced Repo, auch bei Pool-Anlage 2026-07-04 20:28:12 +02:00
marcus.hinz 3e022311ee Ghostty raus, Session-Watcher mit Sync-Opt-in, Tooltip WKWebView-tauglich
- Ghostty komplett entfernt: bundle_id/ghostty_running/open_project/start_project
  weg, is_running nur noch über terminal_pids; restart_project über das interne
  Terminal (kill_terminals + open_terminal) statt osascript-Quit
- Session-Watcher im Tray-Prozess: synct das claude-projects-Repo bei
  Session-Ende (Prozess verschwindet, greift auch bei HUP/Kill)
- Sync als Opt-in (~/.config/ai-control/settings.json, default aus) und nur
  wenn ein Git-Repo vorhanden ist; Commands sync_setting/set_sync_setting
- Löschen-Button in der Pool-Übersicht gesperrt bei laufendem Projekt, Grund per
  CSS-Hover-Pop (WKWebView zeigt keine nativen title-Tooltips)
2026-07-04 19:09:06 +02:00
marcus.hinz 20fc8474d2 Pools initialisieren, Pool-Guard raus, Löschschutz bei laufenden Sessions
- pool-guard-Hook aus Projekt-Scaffold und allen bestehenden Projekten entfernt
- neue Pools: settings.json mit aufgeräumten UI-Defaults
  (promptSuggestionEnabled/awaySummaryEnabled aus) + CLAUDE.md
- delete_pool bricht bei laufendem zugeordnetem Projekt ab; Übersicht sperrt
  den Delete-Button und zeigt den Grund per Hover-Pop (WKWebView-tauglich)
- Running-Erkennung zentralisiert (running_projects_using_pool),
  list_pools liefert pro Pool die laufenden Projekte
- Todo-Umschalter im Projekt-Wizard/Settings
- ungenutzte Dependencies ureq/getrandom entfernt
2026-07-04 17:21:47 +02:00
marcus.hinz 42d975874e Projekt-Wizard und Projekt löschen
- create_project_full: Scaffold nach 08-07-Muster (memory/, Sentinel-
  .gitignore, settings.json mit autoMemoryDirectory/Permissions/pool-guard-
  Hook, ai-control.json mit Pool/Terminal); Arbeitsordner anlegen oder
  vorhandenen verknuepfen, Pruefung vor dem Anlegen; ersetzt create_project
- Wizard-Dialog: Name, Pool, Arbeitsordner (keiner/anlegen/Picker),
  Terminal-Titel + Theme
- delete_project: Guard bei laufender Session, optional Arbeitsordner
  mitloeschen (additionalDirectories, via project_work_dirs); Papierkorb-
  Button mit Bestaetigungs-Dialog inkl. Checkbox und Pfadliste
- 8 neue Tests (36 gesamt), i18n de/en
2026-07-04 14:26:10 +02:00
marcus.hinz f8fcd8d033 Verbrauch-Tab: Tokens/Kosten pro Pool und Projekt aus Transcripts
- usage_stats: streamt <pool>/projects/*/*.jsonl, zählt message.usage,
  Dedup über message.id+requestId, Zeitfilter (eigener RFC3339-Parser),
  Projektpfad-Mapping wie claudes Ordnerkodierung
- Preistabelle je Modell (Fable/Opus/Sonnet/Haiku, Cache 1.25x/0.1x),
  Kosten als API-Gegenwert ausgewiesen
- UI-Tab mit 7/30-Tage-Filter: Pool-Zeilen aggregiert, Projekte
  aufklappbar darunter, Summenzeile; i18n de/en
- Tests: Aggregation+Dedup+Zeitfilter, leerer Fall, parse_ts-Referenz
2026-07-04 14:10:53 +02:00
marcus.hinz 62ce802465 Hand-Icon als App-/Tray-Icon, App heißt ai-control, Tests für Keychain/Key-Status
- Icons komplett aus hand.png regeneriert (tauri icon)
- Tray-Icon explizit per include_bytes (cargo trackt die Datei) und als
  Template-Icon für helle/dunkle Menüleiste; tauri-Feature image-png
- Cargo-Paket app -> ai-control, Fenstertitel ai-control
- Tests: keychain_service-Suffix gegen verifizierten Referenzwert,
  hasCredentials-Status (Key vorhanden/leer/fehlt)
2026-07-04 13:45:02 +02:00