Drei offene Punkte aus dem Simplify-Review: settings.rs, struct Pool, free_path/Sync

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
marcusH
2026-07-19 23:22:35 +02:00
parent 84eb15ca01
commit e56b5698d6
+33
View File
@@ -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,