Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01At3V6SjwbMe6eMzVGW3Hs7
168 lines
10 KiB
Markdown
168 lines
10 KiB
Markdown
# Etappe 2b – Manuelle Abnahme (Divi schreiben)
|
||
|
||
Vorbereitet von Task 10 (Hinweise, Guides, Version 0.3.0, Ende-zu-Ende-Test). Automatisch geprüft sind
|
||
bereits:
|
||
|
||
- alle Unit-Tests (`composer test`) und Lint (`composer lint`);
|
||
- die fünf Integrationsskripte `divi-write-smoke.sh`, `divi-read-smoke.sh`, `mcp-smoke.sh`,
|
||
`wp-basis-smoke.sh` und `media-admin-smoke.sh` (alle in `tests/Integration/`).
|
||
|
||
`divi-write-smoke.sh` prüft über den OAuth-Endpunkt:
|
||
|
||
- Einfügen, Ändern, Verschieben, Löschen und Duplizieren;
|
||
- Ersetzen mit Probelauf;
|
||
- `lit-content-create` mit Divi-Inhalt;
|
||
- den ersten Abschnitt auf einer leeren Seite;
|
||
- einen Redakteur ohne `unfiltered_html`: unberührte Bytes bleiben gleich, und es wird weder Skript,
|
||
Event-Handler, `javascript:` noch ein eingeschleustes Attribut gespeichert oder gerendert;
|
||
- Divis eigene Speicherfilter (Seite mit eigenen HTML-Attributen);
|
||
- keine Wege am Divi-Pfad vorbei: Rohtext-`content` mit Divi-Markup wird abgelehnt, und bei Divi
|
||
„nur lesen“ lehnt `lit-content-create` `divi` ab und `lit/divi-insert` ist auch über
|
||
`mcp-adapter-execute-ability` nicht erreichbar.
|
||
|
||
Details stehen im Report von Task 10 (`.superpowers/sdd/2026-09-26-etappe-2b-divi-schreiben/task-10-report.md`).
|
||
|
||
Die folgenden Punkte lassen sich nicht automatisch prüfen, weil sie den echten Divi Visual Builder und den
|
||
claude.ai-Connector brauchen. Jan-Niclas prüft sie selbst (Spec §1.3 Nr. 2, §13 „Bearbeitbarkeit im
|
||
Visual Builder“). Abweichungen als kurze Notiz zurückmelden; sie werden Folgeaufgaben (z. B. anders
|
||
gespeicherte Spaltenbreiten, D8).
|
||
|
||
## Vorbereitung: Testdaten des Probelaufs entfernen
|
||
|
||
Der Probelauf „Tischlerei Holzwerk Berger“ (trial-feedback.md) hat Daten auf der DDEV-Seite hinterlassen.
|
||
Vor der Abnahme von Hand zurücksetzen, sonst laufen §1–§3 auf einer veränderten Seite und das Testmenü
|
||
ist live. Nicht automatisch gelöscht – bitte selbst prüfen und ausführen
|
||
(`cd /home/janniclas/Projekte/WordPress && ddev wp …`):
|
||
|
||
- [ ] Website-Titel und Untertitel zurücksetzen:
|
||
`ddev wp option update blogname "Breva Map Dev"` und `ddev wp option update blogdescription ""`
|
||
(vorher leer).
|
||
- [ ] Die „[Test]“-Entwürfe löschen: Seiten 831, 834, 837, 839 und Beiträge 854, 856, 858
|
||
(vorher mit `ddev wp post list --post_type=page,post --post_status=draft --fields=ID,post_title`
|
||
prüfen, dass es genau diese sind), dann `ddev wp post delete 831 834 837 839 854 856 858 --force`.
|
||
- [ ] Das Menü „[Test] Hauptmenü“ (ID 22) aus der Position `primary-menu` nehmen und löschen:
|
||
`ddev wp menu location remove 22 primary-menu` und `ddev wp menu delete 22`; falls vorher ein
|
||
anderes Menü dort zugewiesen war, dieses wieder zuweisen (`ddev wp menu location assign <id>
|
||
primary-menu`).
|
||
- [ ] Die Platzhalter-Medien 828, 829, 830 löschen: `ddev wp post delete 828 829 830 --force`
|
||
(vorher in der Mediathek prüfen, dass sie nirgends mehr verwendet werden).
|
||
- [ ] Optional: Einträge des Probelaufs im Protokoll-Tab über „Protokoll leeren“ entfernen.
|
||
|
||
## 0. Verbindung, Zugriff, Tools- und Protokoll-Tab
|
||
|
||
- [ ] Discovery ohne Weiterleitung (Fix DiscoveryCanonical, bb85868):
|
||
`curl -si https://wordpress.ddev.site:8443/.well-known/oauth-protected-resource | head -1` und
|
||
`curl -si https://wordpress.ddev.site:8443/.well-known/oauth-authorization-server | head -1`
|
||
antworten beide mit `200` (kein `301` auf eine URL mit Schrägstrich) und JSON.
|
||
- [ ] Den Connector in claude.ai neu verbinden (Einstellungen → Connectors → LIT MCP → Verbinden):
|
||
Login, Zustimmung, danach sind die Tools in einer neuen Unterhaltung sichtbar.
|
||
- [ ] Mit einem Konto verbinden, dessen Rolle unter Zugriff **nicht** freigegeben ist (z. B. ein
|
||
Abonnent): die Autorisierung bricht mit „Dein Benutzer hat keinen Zugriff auf LIT MCP.“ ab; es
|
||
entsteht keine Verbindung (kein Anwendungspasswort im Profil).
|
||
- [ ] Einstellungen → LIT MCP → Zugriff: die Spalte „Zuletzt genutzt“ zeigt für die eben genutzte
|
||
Verbindung ein Datum (Aktualisierung höchstens einmal am Tag).
|
||
- [ ] Tools-Tab: je Gruppe Modus und „nur lesen“; die Warnung zur Zahl direkter Tools erscheint erst,
|
||
wenn mehr als 25 Tools direkt sichtbar sind (z. B. testweise eine Gruppe auf „direkt“ stellen,
|
||
danach zurücksetzen).
|
||
- [ ] Protokoll-Tab: Liste wie die WordPress-Listen (Filter nach Tool, Benutzer und Ergebnis links über
|
||
der Tabelle, Blättern, „Einträge pro Seite“ in den Ansichtsoptionen oben rechts); Links zu
|
||
Bearbeiten/Revision je Eintrag.
|
||
|
||
## 1. Visual Builder: von Claude gebaute Seite
|
||
|
||
- [ ] Dieser Auftrag in claude.ai:
|
||
„Lege eine Entwurfsseite ‚Abnahme Divi‘ an mit Hero (Überschrift, Text, Button mit Preset), einer
|
||
Zeile 1/3 + 2/3 mit Bild und Blurb, einem Akkordeon und einem Kontaktformular.“
|
||
Erwartet:
|
||
- Claude liest vorher `lit-divi-design-system` und `lit-divi-catalog`;
|
||
- dann `lit-content-create` mit `divi` (oder eine leere Seite plus `lit-divi-insert`);
|
||
- die Antwort nennt `preview_url` und `edit_url` (bei `divi` der Link in den Visual Builder,
|
||
`…&et_fb=1`).
|
||
- [ ] Die Seite im Divi Visual Builder öffnen (`edit_url`) und prüfen:
|
||
- [ ] Alle Module erscheinen als **native Module**, nicht als Code-Modul.
|
||
- [ ] Die Admin-Labels folgen dem Muster „<Abschnitt> – <Modul>“, z. B. „Hero – Button“.
|
||
- [ ] Jedes Modul lässt sich anklicken, ändern und speichern, ohne Fehlermeldung des Builders.
|
||
- [ ] Die Spaltenbreiten stimmen (1/3 + 2/3), auch in der Spalteneinstellung des Builders.
|
||
- [ ] Farben aus `{{color:…}}` sind als **globale Farbe** verknüpft: der Farbwähler zeigt die globale
|
||
Farbe, nicht einen festen Hex-Wert.
|
||
- [ ] Das Button-Preset ist im Builder als Preset ausgewählt.
|
||
- [ ] Akkordeon-Einträge und Kontaktformular-Felder sind einzeln bearbeitbar.
|
||
- [ ] Eine zweite Seite nur mit `lit-divi-insert` aufbauen lassen: leere Seite anlegen, dann
|
||
„Füge einen Abschnitt ‚Start‘ mit Überschrift und Text ein“. Im Builder öffnen: der Abschnitt
|
||
erscheint normal und ist bearbeitbar (Ruling S9: Hülle `divi/placeholder` wie beim Builder).
|
||
|
||
## 2. Visual Builder: von Claude geänderte Seite
|
||
|
||
- [ ] Eine bestehende, im Builder gebaute Seite kopieren (`lit/post-duplicate`) und an der Kopie per
|
||
claude.ai einen Button-Text ändern, ein Modul verschieben und einen Abschnitt duplizieren lassen.
|
||
- [ ] Die Kopie im Builder öffnen und prüfen:
|
||
- [ ] Alle unveränderten Module sehen aus wie vorher (Einstellungen, Presets, globale Farben).
|
||
- [ ] Die geänderten Module sind bearbeitbar, und die Änderung ist sichtbar.
|
||
- [ ] Die Kopie eines Abschnitts heißt „<Label> (Kopie)“.
|
||
|
||
## 3. Zurück zu Claude nach einer Builder-Änderung
|
||
|
||
- [ ] Die Seite aus Schritt 1 im Builder ändern und speichern.
|
||
- [ ] Danach per claude.ai eine weitere Änderung verlangen. Erwartet:
|
||
- [ ] `rev_mismatch` erscheint nur, wenn Claude eine alte `tree_rev` benutzt.
|
||
- [ ] Nach erneutem Lesen (`lit-divi-outline`) gelingt die Änderung.
|
||
- [ ] Die im Builder gemachten Einstellungen bleiben erhalten.
|
||
|
||
## 4. Rückgängig
|
||
|
||
- [ ] Einen Abschnitt löschen lassen. Claude fragt nach (`confirm_required`) und löscht erst nach der
|
||
Bestätigung.
|
||
- [ ] Den Abschnitt über `lit/revision-restore` mit der gemeldeten `revision_id` zurückholen und im Builder
|
||
prüfen, dass er wieder vollständig da ist.
|
||
|
||
## 5. Text auf mehreren Seiten ersetzen
|
||
|
||
- [ ] „Ersetze auf allen Seiten ‚Termin‘ durch ‚Beratungstermin‘“. Erwartet:
|
||
- [ ] Claude zeigt erst den Probelauf (Treffer je Seite) und fragt nach.
|
||
- [ ] Erst danach ersetzt es.
|
||
- [ ] Im Protokoll-Tab (Einstellungen → LIT MCP → Protokoll) steht je geänderter Seite ein Eintrag mit
|
||
eigener Revision.
|
||
- [ ] Liegt ein Treffer in einem **globalen Modul**, ändert Claude ihn nicht, sondern nennt ihn
|
||
(`skipped_nodes`, „in der Divi-Bibliothek bearbeiten“).
|
||
|
||
## 6. Redakteur ohne `unfiltered_html`
|
||
|
||
- [ ] Mit einem Redakteurs-Konto verbinden; unter Einstellungen → LIT MCP → Zugriff muss die Rolle
|
||
freigegeben sein.
|
||
- [ ] Auf einer Seite eines Administrators einen Text ändern lassen.
|
||
- [ ] Die Seite im Builder öffnen. Erwartet:
|
||
- [ ] Eingebettete Inhalte des Administrators (z. B. iframe, eigenes HTML im Code-Modul) sind
|
||
unverändert.
|
||
- [ ] Die Änderung des Redakteurs ist da.
|
||
- [ ] Den Redakteur eigenes HTML/CSS/Attribute eines Moduls setzen lassen, z. B. „füge dem Button das
|
||
HTML-Attribut data-x hinzu“. Erwartet: Ablehnung mit „nur im Divi-Builder änderbar“.
|
||
|
||
## 7. Tool-Gruppen und „nur lesen“
|
||
|
||
- [ ] Unter Einstellungen → LIT MCP → Tools die Gruppe Divi auf „nur lesen“ stellen.
|
||
- [ ] Neu verbinden. Die Divi-Schreibwerkzeuge (`lit-divi-insert` usw.) fehlen; die Lesewerkzeuge sind
|
||
noch da.
|
||
- [ ] „Lege eine Entwurfsseite ‚Nur lesen‘ mit einem Abschnitt und einer Überschrift an“: `lit-content-create`
|
||
mit `divi` → `unsupported` mit Hinweis auf den Tools-Tab; ohne `divi` (einfacher Entwurf) gelingt
|
||
das Anlegen weiterhin. Dasselbe gilt, wenn nur `lit-divi-insert` deaktiviert oder die Gruppe Divi
|
||
ganz deaktiviert ist.
|
||
- [ ] `lit-content-create` bzw. `lit-content-update` mit Divi-Markup im Feld `content`
|
||
(`<!-- wp:divi/section -->…`) → `validation_failed` mit Hinweis auf `divi` bzw. die lit-divi-*-Tools
|
||
(unabhängig von „nur lesen“).
|
||
- [ ] Hinweis: `lit/post-duplicate`, `lit/post-replace-with-copy` und `lit/revision-restore` gehören zur
|
||
Gruppe WordPress und kopieren bzw. stellen gespeicherte Divi-Inhalte auch bei Divi „nur lesen“ her;
|
||
sie schreiben keine neuen Divi-Werte vom Client.
|
||
- [ ] Die Einstellung zurücksetzen.
|
||
|
||
## 8. Builder-Fixtures aus 2a (falls noch offen; Ruling S20)
|
||
|
||
- [ ] Seiten mit **globalem Modul**, Preset, Variablen und Dynamic Content exportieren:
|
||
`tests/Integration/divi-export-page.php` (Anleitung in `2026-09-26-etappe-2a-abnahme.md` §1).
|
||
`composer test` bleibt grün.
|
||
- [ ] Auf einer Kopie einer solchen Seite `lit-divi-update` an einem normalen Modul ausführen. Das
|
||
globale Modul bleibt byte-identisch: Export vorher und nachher vergleichen.
|
||
- [ ] Hat die Seite Module mit eigenen HTML-Attributen oder einem eigenen HTML-Element (Erweitert →
|
||
Attribute/HTML), meldet die Antwort evtl. „Inhalt beim Speichern verändert“. Das ist dokumentiert
|
||
(Ruling S7: Divi normalisiert solche Seiten selbst). Prüfen, dass die Seite im Builder danach
|
||
einwandfrei ist.
|