diff --git a/docs/guides/divi-design-system.md b/docs/guides/divi-design-system.md index 5002cfd..830ad91 100644 --- a/docs/guides/divi-design-system.md +++ b/docs/guides/divi-design-system.md @@ -71,7 +71,8 @@ Einzelne Module bekommen Presets mit `lit-divi-insert`, `lit-divi-update` und `l - Filter: `post_ids` (1–50 Einträge; ohne die Angabe alle Fundstellen mit diesem Modultyp), `only_without_preset: true` (nur Module ohne Preset) oder `only_with_preset: ""` (nur Module, die dieses Preset schon tragen; nicht zusammen), `clear_overrides: true` (lokale Werte entfernen, die das Preset überdecken). -- `preset: null` und `null` als Wert in `group_presets` werden abgewiesen (`validation_failed`): site-weit entfernt +- `preset: null`, ein leerer Text und `null` oder ein leerer Text als Wert in `group_presets` werden abgewiesen + (`validation_failed`): site-weit entfernt `lit/divi-design-detach` Verweise. - Ablauf: erst ohne `confirm` aufrufen (Probelauf: `confirm_required` mit `pages` – je Seite `post_id`, `title`, `status`, die betroffenen Knoten mit Pfad-ID, Modul und Label sowie `warnings` zu überdeckten Werten –, dazu @@ -89,10 +90,15 @@ Einzelne Module bekommen Presets mit `lit-divi-insert`, `lit-divi-update` und `l - Mit `post_ids` blockieren nur die genannten Seiten, die Obergrenze von 2000 gilt nicht. Eine genannte veröffentlichte, private oder geplante Seite ohne Bearbeitungsrecht verweigert den ganzen Aufruf (`forbidden` mit `blocked_ids`, nichts wird geschrieben; der Probelauf listet sie unter `blocked_ids`). Eine genannte - Seite, die nicht live ist (Entwurf usw.) und nicht bearbeitet werden darf, steht unter `skipped`. -- Scheitert das Speichern mitten im Lauf, - meldet `partial_write` die bis dahin gespeicherten Seiten (`saved`); die übrigen mit einem neuen Probelauf - weiterführen. + Seite, die nicht live ist (Entwurf usw.) und nicht bearbeitet werden darf, steht unter `skipped`. Gibt es mehr als + 2000 Live-Fundstellen, entfällt die Vorabprüfung der Bearbeitungsrechte; dann steht auch eine genannte Live-Seite + ohne Bearbeitungsrecht unter `skipped` statt in `forbidden`. +- Die Sperre für Live-Seiten ergibt sich allein aus der Fundstellensuche: Eine Live-Seite, die das Konto nicht + bearbeiten darf, blockiert den ganzen Aufruf, auch wenn die Filter (`only_with_preset`, `only_without_preset`) + auf dieser Seite nichts ändern würden. +- Scheitert das Speichern mitten im Lauf, meldet `partial_write` die bis dahin gespeicherten Seiten (`saved`): + zuerst die genannte fehlgeschlagene Seite prüfen (`lit-divi-outline`), dann denselben Aufruf mit `confirm: true` + wiederholen; bereits geänderte Module trifft er nicht noch einmal. - Globale Module und die Bibliothek: Eine globale Instanz (`[global ]` in `lit-divi-outline`) wird auf der Seite nicht umgeschrieben, sondern unter `skipped` gemeldet – „globales Modul – im Bibliothekseintrag ändern“, wenn das Konto Bibliotheks-IDs sehen darf, sonst „globales Modul – im Divi-Builder ändern“. Der @@ -120,5 +126,7 @@ Einzelne Module bekommen Presets mit `lit-divi-insert`, `lit-divi-update` und `l entfernt dort nur ausdrückliche Verweise und sagt das in `warnings`. Zum Beenden der Standardwirkung das Preset löschen (`lit/divi-presets-delete`) oder mit `make_default: false` den Standard aufheben. - Variablen: `variable` wird noch nicht unterstützt (`unsupported`; Variablen folgen mit Etappe 4c). +- Meldet die Antwort `hidden_count` größer als 0, können Seiten, die dieses Konto nicht lesen darf, noch Verweise + enthalten; dann nennt sie den Hinweis auf `lit/divi-presets-delete` nicht. - Danach `lit/divi-presets-delete` aufrufen (Probelauf, `confirm`, `design_rev`); es meldet kein `in_use` mehr, solange niemand das Preset neu zugewiesen hat. diff --git a/docs/superpowers/notes/2026-09-28-etappe-4-entscheidungen-entwurf.md b/docs/superpowers/notes/2026-09-28-etappe-4-entscheidungen-entwurf.md index c12e3f8..542087a 100644 --- a/docs/superpowers/notes/2026-09-28-etappe-4-entscheidungen-entwurf.md +++ b/docs/superpowers/notes/2026-09-28-etappe-4-entscheidungen-entwurf.md @@ -50,8 +50,9 @@ Ansätze vorschlagen → Entwurf abschnittsweise freigeben → Spec schreiben - P8a mit post_ids: nur die genannten Seiten können das Schreiben blockieren, HARD_CAP gilt nicht (die Rechteprüfung der Live-Seiten entfällt dann vorab, loadWritable() prüft jede Seite einzeln und meldet skipped). Eine genannte veröffentlichte, private oder geplante Seite ohne Bearbeitungsrecht verweigert den ganzen Aufruf (forbidden, blocked_ids, nichts geschrieben; der Probelauf listet sie in blocked_ids); eine genannte Seite, die nicht live ist (Entwurf usw.) und nicht bearbeitet werden darf, steht in skipped. Ohne post_ids verweigert jede blockierte Live-Fundstelle oder zu viele Fundstellen den ganzen Aufruf, nichts wird geschrieben. - R9 Kein unfiltered_html-Zwang: der Umschreiber ändert nur Preset-Verweise und entfernt lokale Werte, Speichern über DiviSaver. - R10 detach nur Presets: Eingabe preset = Objekt {module|group, preset}; variable → unsupported (4c); ohne post_ids zuerst verschachtelte Verweise über DesignChange (Snapshot, design_rev), danach Seiten (≤ 50); scheitert die erste Seite danach, nennt der Fehler Snapshot und diff; Standard-Presets nur ausdrückliche Verweise. -- lit/divi-presets-assign: preset: null und null in group_presets werden abgewiesen (Hinweis auf lit/divi-design-detach); ein leerer Probelauf ist ein normales „nichts zu tun“. +- lit/divi-presets-assign: preset: null, leerer Text und null in group_presets werden abgewiesen (Hinweis auf lit/divi-design-detach); ein leerer Probelauf ist ein normales „nichts zu tun“. - R11 Standard-Gruppen-Presets: PresetUsageMatcher erkennt implizite Nutzung (Modul hat die Gruppe, kein ausdrücklicher Eintrag); Kandidaten fail closed über wp:divi/; der 4a-Hinweis „nicht aufgelistet“ entfällt. +- 4b-Nachtrag zu R11: Das ändert das 4a-Verhalten. lit/divi-presets-set und lit/divi-presets-delete eines Standard-GRUPPEN-Presets nehmen jetzt jede Divi-Seite mit dieser Gruppe in ihren Fundstellenbericht auf; auf Sites mit mehr als 2000 Live-Divi-Seiten wird die bestätigte Änderung daher abgewiesen (tooMany), wie bisher nur bei Standard-Modul-Presets; konsistent mit P8a. - Grenze je Aufruf A6: 50 Seiten, remaining; Teilerfolg partial_write mit den gespeicherten Seiten. - Offen für 4c: detach für Variablen (A7: Referenz durch den aktuellen Wert ersetzen, bei Farben entfällt detach), Wiederverwendung des PageRewriter/TreeRewrite dafür (NodeRewrite-Strategie `VariableDetachRewrite`). - Offen für 4c/4e: Smoke divi-presets-assign-smoke.sh läuft nur mit deaktivierten Plugins postlos und asynclistry. diff --git a/src/Integrations/Divi/Design/DiviDesignDetachAbility.php b/src/Integrations/Divi/Design/DiviDesignDetachAbility.php index 2465cd6..d6d837e 100644 --- a/src/Integrations/Divi/Design/DiviDesignDetachAbility.php +++ b/src/Integrations/Divi/Design/DiviDesignDetachAbility.php @@ -65,12 +65,13 @@ final class DiviDesignDetachAbility implements Ability . 'Module fallen auf das nächste Preset im Stapel bzw. das Standard-Preset zurück. post_ids beschränkt auf ' . 'diese Seiten (Verweise in Presets bleiben dann). Zuerst Probelauf (pages; bei Verweisen in Presets diff ' . 'und design_rev), nach Rückfrage beim Nutzer confirm: true (mit design_rev, wenn der Probelauf eine ' - . 'nennt); je Aufruf höchstens 50 Seiten, remaining nennt den Rest. Mit post_ids können nur die ' - . 'genannten Seiten das Schreiben blockieren und die Obergrenze für sehr viele Seiten gilt nicht; eine ' - . 'genannte veröffentlichte, private oder geplante Seite ohne Bearbeitungsrecht verweigert den ganzen ' - . 'Aufruf (forbidden, blocked_ids), eine genannte andere Seite ohne ' - . 'Bearbeitungsrecht steht in skipped. Danach kann lit/divi-presets-delete ' - . 'das Preset löschen. ' . self::VARIABLES; + . 'nennt); je Aufruf höchstens ' . PageRewriter::PAGE_LIMIT . ' Seiten, remaining nennt den Rest. Mit ' + . 'post_ids können nur die genannten Seiten das Schreiben blockieren und die Obergrenze für sehr viele ' + . 'Seiten gilt nicht; eine genannte veröffentlichte, private oder geplante Seite ohne Bearbeitungsrecht ' + . 'verweigert den ganzen Aufruf (forbidden, blocked_ids), eine genannte andere Seite ohne ' + . 'Bearbeitungsrecht steht in skipped (bei mehr als 2000 Live-Fundstellen entfällt die Vorabprüfung, ' + . 'dann auch eine genannte Live-Seite). Danach kann lit/divi-presets-delete das Preset löschen. ' + . self::VARIABLES; } public function inputSchema(): array diff --git a/src/Integrations/Divi/Design/DiviPresetsAssignAbility.php b/src/Integrations/Divi/Design/DiviPresetsAssignAbility.php index 859ff89..7d226df 100644 --- a/src/Integrations/Divi/Design/DiviPresetsAssignAbility.php +++ b/src/Integrations/Divi/Design/DiviPresetsAssignAbility.php @@ -56,11 +56,12 @@ final class DiviPresetsAssignAbility implements Ability . 'und/oder Gruppen-Presets (group_presets) zu. Filter: post_ids, only_without_preset oder ' . 'only_with_preset; clear_overrides: true entfernt lokale Werte, die das Preset überdecken. Zuerst ' . 'Probelauf (betroffene Seiten und Module), nach Rückfrage beim Nutzer confirm: true; je Aufruf höchstens ' - . '50 Seiten, jede mit Revision; remaining nennt den Rest. Mit post_ids können nur die genannten Seiten ' - . 'das Schreiben blockieren und die Obergrenze für sehr viele Seiten gilt nicht; eine genannte ' - . 'veröffentlichte, private oder geplante Seite ohne Bearbeitungsrecht verweigert den ganzen Aufruf ' - . '(forbidden, blocked_ids), eine genannte andere Seite ohne ' - . 'Bearbeitungsrecht steht in skipped. Verweise entfernen: lit/divi-design-detach.'; + . PageRewriter::PAGE_LIMIT . ' Seiten, jede mit Revision; remaining nennt den Rest. Mit post_ids ' + . 'können nur die genannten Seiten das Schreiben blockieren und die Obergrenze für sehr viele Seiten ' + . 'gilt nicht; eine genannte veröffentlichte, private oder geplante Seite ohne Bearbeitungsrecht ' + . 'verweigert den ganzen Aufruf (forbidden, blocked_ids), eine genannte andere Seite ohne ' + . 'Bearbeitungsrecht steht in skipped (bei mehr als 2000 Live-Fundstellen entfällt die Vorabprüfung, ' + . 'dann auch eine genannte Live-Seite). Verweise entfernen: lit/divi-design-detach.'; } public function inputSchema(): array