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

8.1 KiB
Raw Blame History

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)