Files
WP-LIT-MCP/docs/superpowers/notes/2026-09-28-etappe-4-entscheidungen-entwurf.md
T

63 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Etappe 4 – Designsystem schreiben: Entscheidungen (Entwurf)
Stand 2026-09-28, Brainstorming läuft (Weg: architektonisch → Spec → Plan). Branch `etappe-4` (ab main 903246d).
## Verstandenes Ziel
- Corporate Design in einem Rutsch übernehmen: lesen (`lit/divi-design-system`) → Zuordnung vorschlagen → nach Bestätigung schreiben.
- Schreiben nur über Divis eigene Funktionen; vor jeder Änderung ein Snapshot (Standard 20), Wiederherstellen per Tool.
- Preset-Sperren wie bei Modulen (Lottie, Interactions, rohes HTML/CSS ohne `unfiltered_html`) – offen aus 3a.
- Rechte: `edit_theme_options`, für Variablen zusätzlich Divis `variables_manager` (strenger als Divi selbst).
## Antworten der Auftraggeberin/des Auftraggebers
- G1 Echte Designdaten: (b) selbst über Divis Funktionen anlegen → erledigt, Commit 65bd86f, Formate in `2026-09-28-etappe-4-divi-formate.md`, Fixtures in `tests/Fixtures/divi/stage4/`, Seite 3182 „[Fixture] Designsystem“ (Entwurf).
- G2 Site-weite Änderungen (Presets, Farben, Variablen): (a) wie globale Module – Probelauf zeigt Änderung und betroffene Seiten, erst `confirm: true` schreibt; Snapshot immer.
- G4 Zuschnitt (2026-10-16): (b) ganz Etappe 4 in einer Spec; Presets lesen (inkl. Einstellungen), anlegen, ändern und zuweisen (Modul- und Gruppen-Presets) sind ausdrücklicher Teil.
- G3 Theme-Optionen-Umfang (2026-10-16): (a) Design-Optionen ohne SEO (Theme-Schriften/-Größen, Akzent-/Linkfarben, Layout-Breiten). Annahme: Button-Standards (`all_buttons_*`) und Logo (`divi_logo`, ePanel) bleiben draußen.
- G5 Löschen (2026-10-16): (b) Preset/Variable nur löschen, wenn nirgends verwendet; sonst Fehler mit Fundstellen. Dazu eigene site-weite Funktion „Verweise überall entfernen“ (Seiten, Bibliothek, Theme Builder): (a) nur den Verweis entfernen, Module fallen auf Standard zurück; Probelauf je Seite, `confirm: true`, Revision je Seite, Snapshot vorher.
- G6 Snapshots (2026-10-16): (a) je Bereich (Farben, Variablen, Presets, Theme-Optionen) getrennt, je 20; Liste per Tool; Wiederherstellen mit Probelauf (Diff) und `confirm: true`, vorher selbst ein Snapshot; Seiteninhalte nicht (WordPress-Revisionen).
- Farben löschen: nur „inaktiv“ wie Divi (Annahme, nicht widersprochen).
- G7 Preset-Inhalt (2026-10-16): (a) `set` (Kurzform) + `attrs` (Vollform) wie lit-divi-update, gleiche Prüfung/Sperren/Platzhalter; zusätzlich `from_node` {post_id, id} übernimmt das Design eines Moduls (ohne Texte/Inhalte). Gruppen-Presets analog mit `group`, nur Attribute dieser Gruppe.
- G8 Zuweisen (2026-10-16): insert/update um Stapel (`preset` als Liste) und `group_presets` {Gruppe: Name|null} erweitern; zusätzlich site-weite Massenzuweisung (a) – gleiches Gerüst wie „Verweise entfernen“ (G5), Filter Modultyp, Seiten, nur ohne Preset / mit bestimmtem bisherigem Preset.
- G9 Lokale Werte vs. Preset (2026-10-16): (a) Probelauf/Antwort meldet je Modul lokale Werte, die das Preset überdecken; `clear_overrides: true` entfernt genau diese; sonst nur Warnung. Gilt für Einzel- und Massenzuweisung.
- G10 Schriften (2026-10-16): (b) Google-Fonts aus Divis Liste (Namensprüfung mit Vorschlägen) und eigene Schriftdateien hochladen (Divi „Custom Fonts“, Option `et_uploaded_fonts`). Annahme: Quelle per URL wie lit-media-upload-from-url. Code: `FontsUtility::font_add()` (B5 `VisualBuilder/Fonts/FontsUtility.php:102`) nutzt `wp_handle_upload` (prüft `is_uploaded_file`) → für geladene Dateien eigener Sideload mit Divis Filtern `upload_dir_font`/`check_filetype_and_ext_font` nötig; DSGVO-Lokal-Laden bleibt Theme-Einstellung.
- G11 Ablauf „Corporate Design übernehmen“ (2026-10-16): (c) kein eigener Ablauf/Prompt, nur Tools; Claude stellt den Ablauf selbst zusammen.
- G12 Schleifen-Inhalte (2026-10-16): in Etappe 4 aufnehmen. Befund: `DynamicContentRules::fieldsFor()` (`src/Integrations/Divi/Compose/DynamicContentRules.php:117`) lehnt `loop_*` immer ab (Ruling S36, E12) – kein Erkennungsfehler; Meldung „nur innerhalb von Divi-Schleifen“ irreführend. Praxisfall: Datumsformat in Karten (`loop_post_date`), Pills (Kategorien/Tags) in Modulen unter einer Schleifen-Spalte. Ziel: Schleifen-Kontext aus dem nächsten Vorfahren mit `module.advanced.loop.desktop.value.enable` (+ `queryType`) bestimmen und passende `loop_*`-Optionen zulassen (S36 lockern, Sicherheitsblick).
- Ansatz (2026-10-16): A – ein Tool je Bereich, gemeinsame Änderungs-Pipeline; gemeinsamer Baustein für Seiten-Umschreiben (Zuweisen/Entfernen); `lit/divi-preset-get` zum Lesen.
- Entwurf Abschnitt 1 (Pipeline + Snapshots) freigegeben (2026-10-16); übrige Abschnitte direkt in die Spec `docs/superpowers/specs/2026-10-16-etappe-4-designsystem-design.md` (Annahmen A1–A11), Freigabe der Spec ausstehend.
## Noch zu klären (je eine Frage)
- (alle Fragen beantwortet)
## Danach
Ansätze vorschlagen → Entwurf abschnittsweise freigeben → Spec schreiben → Plan (writing-plans) → Umsetzung subagent-driven mit Reviews, Security-Audit am Ende.
## Umsetzung 4a (Plan 2026-10-16-etappe-4a-presets.md)
- Pipeline `DesignChange` (alle Bereiche), Snapshots `SnapshotStore`, Bereich `presets`.
- Tools: lit/divi-preset-get, lit/divi-presets-set, lit/divi-presets-delete, lit/divi-design-snapshots, lit/divi-design-restore (alle indirekt).
- Schreiben über die Schrittfolge von `GlobalPresetController::sync` (Mirror `preset-sync`).
- Offen für 4b: Fundstellen von Standard-Gruppen-Presets (Gruppenliste je Modul), lit/divi-design-detach.
## Offene Kleinpunkte aus 4a (Reviews, nicht merge-relevant)
- Task 1: minor (deferred): Nachtrag verweist nicht auf §7 Punkt 4 („strenger als Divi“ gilt für Presets nicht mehr)
- Task 2: minor (deferred): PresetBook::with() erzwingt kein id-Feld
- Task 2: minor (deferred): rein numerische IDs/Namen werden int-Keys → TypeError bei new PresetScope (scopeOf/nestedUsers/toRest); (string)-Cast
- Task 2: minor (deferred): PresetScope-Regex lehnt "_" ab
- Task 3: minor (deferred): Standardwechsel X→Y meldet nur default_set Y, nicht default_cleared X
- Task 3: minor (deferred): Testabdeckung dünn (Gruppen, Standardwechsel, name-only)
- Task 4: minor (deferred): attachLog ignoriert fehlgeschlagenes update_option; RMW ohne Lock; Testlücken (Grenze MAX_BYTES, attachLog null/unbekannt)
- Task 5: minor (deferred): savePresets bereinigt bei mayRemove beide Arten (Obermenge von Divi), ACTION_DELETE_GROUP ungenutzt, Docblock erwähnt es nicht
- Task 5: minor (deferred): keine Unit-Tests für WP_Error→RuntimeException und Cleanup-Pfad (Integration in Task 14)
- Task 6: minor (deferred): UsageQuery-Vertrag „bereits vorbereitet“ nur Konvention; kein reportFor()-Test
- Task 7: minor (deferred): leere ID → LIKE %% (teuer); Testlücken _initial/[""]/Legacy-String beim Standard
- Task 8: minor (deferred): kein RED-Lauf dokumentiert (Tests und Code in einem Schritt)
- Task 8: minor (deferred): kein Test für DiviLocked aus area->write(); Read-back-Test prüft Rollback nur lose; kein Test für fehlende design_rev
- Task 9: minor (deferred): META_KEYS (modulePreset, groupPreset, globalModule, localAttrs) im Post-Check unsichtbar – heute nicht erreichbar; explizite Ablehnung als Defense in Depth
- Task 10: minor (deferred): Scope-Fehler immer unter fields.module; fehlendes preset → not_found statt validation_failed
- Task 11: minor (deferred): Test „nichts geschrieben“ prüft nicht, dass items[0] fehlerfrei ist
- Task 12: minor (deferred): in_use-Antwort ohne affected_count/hidden_count; Testlücken (verschachtelt+mitgelöscht, mehrere Items, Rechte)
- Task 13: minor (deferred): kein Paginierungs-/next_cursor-Test; Restore-Rechte nicht im Ability-Test
- Task 14: minor (deferred): Guide nennt Exklusivität name/rename und Namensgrenzen nicht ausdrücklich; Smoke hinterlässt Snapshots im SnapshotStore; Restore-Check vergleicht nicht den ganzen Bestand
- DesignLock: zwei gleichzeitige Übernahmen einer veralteten Sperre möglich (sehr kleines Fenster); Schreibvorgang > 120 s kann Sperre verlieren
- Verwaister @param-Docblock in DiviPresetsDeleteAbility
- Smoke divi-presets-smoke.sh läuft nur mit deaktivierten Plugins postlos (Monolog 2) und asynclistry (Deprecated-Ausgabe)