diff --git a/OFFENE-PUNKTE.md b/OFFENE-PUNKTE.md index a70174e..99f5418 100644 --- a/OFFENE-PUNKTE.md +++ b/OFFENE-PUNKTE.md @@ -44,6 +44,39 @@ (`src/markdown.ts`), aber eine echte CSP wäre die Schranke dahinter. Braucht eine Runde Prüfen, was inline benötigt wird (Themes, xterm). +- [ ] **`write_app_setting` verliert die übrigen App-Settings (`settings.rs:71`).** + Dieselbe Fehlerklasse wie die `.claude.json` in `pool.rs`, nur eine Datei + weiter — beim Simplify-Review gefunden, bewusst nicht mitgefixt. + `read_app_settings` (settings.rs:11-14) wirft mit zweimal `.ok()?` fehlende + Datei, Lesefehler und kaputtes JSON in denselben `None`; `write_app_setting` + macht daraus `json!({})` und schreibt die Datei mit einem Key neu. + Konkret: halb geschriebene `~/.config/ai-control/settings.json`, dann einmal + Schriftgröße verstellen — `claudeCommand`, `poolSyncDir`, `syncOnSessionEnd` + und `spellcheckLang` sind endgültig weg. Fix wie in `pool.rs`: nur eine + *fehlende* Datei rechtfertigt ein frisches Objekt. + +- [ ] **`struct Pool` verliert unbekannte Keys beim Umbenennen (`pool.rs:20`).** + Dritte Stelle derselben Klasse. `rename_pool_in` (pool.rs:402-408) liest + typisiert in `Pool` (nur `name` + `credentialType`) und schreibt die ganze + `pool.json` über `write_pool_json` neu — jeder künftige Key stirbt beim + Umbenennen. `ProjectConfig` und `TerminalConfig` haben dafür inzwischen + `#[serde(flatten)] rest`. + + Grundsätzlicher: `flatten` bildet pro Struct nach, was read-modify-write auf + `serde_json::Value` von Natur aus kann (so macht es `add_archive_permission`, + archive.rs:56-90). Statt es an jedem Struct einzeln zu wiederholen, wäre ein + gemeinsamer Helfer die Lösung, die die Klasse wirklich schließt. + +- [ ] **Archiv-Dateinamen: `create_new` statt `exists()` (`archive.rs`, `free_path`).** + Die Kollisionsprüfung schaut vorab nach (`exists()`), die Garantie liegt aber + nicht im Schreibvorgang — klassisches TOCTOU. Als Einbenutzer-App folgenlos, + **aber nicht mehr beim Maschinen-Sync**: Zwei Rechner können in derselben + Minute mit derselben Titelzeile ins synchronisierte Archiv schreiben, und + dann greift der Vorabblick zu spät. `OpenOptions::new().create_new(true)` in + der Schleife gibt dieselbe Struktur, holt die Kollisionsfreiheit aber vom + Dateisystem. Mitzudenken: Was der Sync-Mechanismus selbst bei zwei gleichen + Namen macht (Konfliktkopien?) — der Fix deckt nur die lokale Seite. + - [ ] **Projekt-Artefakte im Projektordner bündeln (`.ai-control/`?).** `ai-control.json` und das Projekt-Icon liegen heute lose im Projektordner. Idee: beides in ein Unterverzeichnis (z. B. `.ai-control/`) zusammenziehen,