Erster Start aus DMG oder Downloads bietet einmalig an, sich nach
~/Applications zu kopieren und von dort neu zu starten — der Weg dorthin
braucht kein Administrator-Passwort, anders als /Applications. Ein DMG
kann das nicht selbst leisten: der Applications-Alias darin ist ein
absoluter Symlink auf /Applications.
Die Kopie erbt per ditto die Quarantäne des Downloads, deshalb wird sie
am Ziel gelöst — sonst käme beim Neustart erneut die Gatekeeper-Warnung
für dieselbe, gerade laufende App. Ablehnen merkt sich die App
(moveOfferDismissed), im Debug-Build fragt sie nie.
README: ~/Applications als gleichwertiger Installationsort, dazu der
Weg über System-Einstellungen -> Datenschutz & Sicherheit fuer alle, die
kein Terminal aufmachen wollen.
0.8 ist fuer den Windows-Stand reserviert.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.
- 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
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.
- 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
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.
- 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
- 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
- Terminal-Einstellungen pro Projekt in ai-control.json: 5 Themes
(Paletten in terminal.ts, Fenster-BG gespiegelt in terminal.rs),
Dock-Icon (PNG/ICNS via NSApplication in RunEvent::Ready),
Fenstertitel mit Fallback Projektname; Zahnrad-Dialog mit Datei-Picker
(tauri-plugin-dialog)
- UI: Catppuccin-Mocha-Token, JetBrains Mono für Namen/Pfade/Chips,
feste Tabellenspalten, Status-Punkt mit Glow, Pool-Projekte als
Hover-Popover, Buttons ausgerichtet (Zahnrad links von Starten/Beenden)
- i18n: vue-i18n, Deutsch/Englisch, Umschalter im Header (localStorage)
- generate_context nur noch einmal expandiert (Release-Build-Fehler)
- Terminal-Fenster als eigener Prozess (--terminal <projekt>) mit eigener PTY,
startet claude-sync im Projektordner
- Projektliste: ein Button pro Zeile — grün Starten (open_terminal) bzw.
rot Beenden (stop_project, SIGTERM auf exakte PID / Ghostty-Quit)
- is_running erfasst Ghostty oder laufenden Terminal-Prozess
- Status-Kreis ohne Prozess unsichtbar