FSWP Plugin-Entwickler
Grundlegend (immer angewendet): fswp-developer/references/lean-coding.md (weniger schreiben, zuerst wiederverwenden), fswp-developer/references/coding-standards.md (Codierungsstandards, Dokumentation, i18n, Barrierefreiheit) und fswp-security-engineer (Eingabe, Ausgabe, Autorisierung).
Führt ein genehmigtes PRD (fswp-architect) aus. Präfix, Distributionsziel, Funktionsumfang und JS-Stufe sind bereits entschieden; nicht erneut nachfragen. Für jeden Schritt das Domain-Skill für das allgemeine Verfahren und die Referenz dieses Skills für die Tiefe der Hausstandards, Vorlagen und strengeren Regeln laden. Rangfolge: fswp-developer/references/precedence.md.
Bei Änderungen an einem bestehenden Plugin stattdessen fswp-maintainer verwenden; es greift nur für Strukturmuster hierher zurück.
Ebenen
1 BOOTSTRAP plugin-slug.php, uninstall.php, includes/class-plugin.php (keine Geschäftslogik)
2 LEBENSZYKLUS Aktivator / Deaktivator (Aktivierungs-Hook, dbDelta, Upgrade-Prüfung)
3 DOMÄNE CPTs, Tabellen, REST-Routen, Cron: nur was das PRD auflistet
4a ADMIN-UI standardmäßig natives wp-admin; @wordpress/components für einen React-Bildschirm;
React SPA + Tailwind + TanStack Query + Zustand nur für app-ähnliche Administration
4b ÖFFENTLICHE UI Atomic Framework (benutzergeliefert), standardmäßig Vanilla JS, Alpine optional
Admin verwendet niemals Atomic Framework oder Alpine-Klassen. Niemals ungenutzte Feature-Klassen generieren.
Arbeitsablauf
| Schritt | Aktion | Hausreferenz | Domain-Skill |
|---|---|---|---|
| 1 Gerüst | Slug, Präfix, Klassennamen, Textdomäne ableiten; zuerst scripts/scaffold_plugin.py --help ausführen. --plugin-uri und --author-uri nur übergeben, wenn sie real sind (die Zeile wird sonst weggelassen, niemals ein Platzhalter-Domain). Direkt nach dem Gerüstbau fswp-qa-engineer/scripts/run_gate.sh <verz> <min-php> --fix einmal ausführen: Vorlagen enthalten {{…}}-Platzhalter, die der Formatierer vor der Substitution nicht sicher umbrechen kann. | architecture.md | keins |
| 2 Bootstrap + Lebenszyklus | Bootstrap deklariert den Header, Autoload und übergibt an die Hauptklasse | architecture.md | keins |
| 3 Sicherheit | Vollständige Basislinie für jede Datei, jede Plugin-Größe | fswp-security-engineer | fswp-security-engineer |
| 4 Domäne | CPTs, Tabellen (dbDelta, Schema-Versionen), REST, Cron | data-cpt.md, rest-cron.md | fswp-api-developer; fswp-performance-engineer wenn das PRD es erfordert |
| 5 Blöcke (falls im PRD) | Benutzerdefinierte Blöcke, Patterns, Interaktivität | keins | fswp-block-developer |
| 6 Admin-UI | Settings API, WP_List_Table, Dashicons; nur gemäß Checkliste eskalieren | admin-ui.md, modern-app-stack.md | keins |
| 7 Öffentliche Ausgabe | Zuerst den Benutzer nach den aktuellen Atomic Framework-Dateien fragen; bedingtes Einbinden innerhalb des Callbacks | frontend-output.md | keins |
| 8 i18n + Distribution | Jeder PHP- und JS-String; Readme; Lizenz; Versionierung | i18n-distribution.md | fswp-release-manager für WordPress.org |
Am Ende von Schritt 8 anhalten und an fswp-qa-engineer übergeben.
Add-on-Struktur
Wenn fswp-maintainer im Add-on-Modus läuft, verwendet es hier die Schritte 1-3 und 8 wieder. Die zusätzlichen Add-on-Regeln (Host-Erkennung, Requires Plugins, Ladereihenfolge, gnädiges Fehlen) befinden sich in fswp-maintainer.
Standards (jeder Build, jede Iteration)
references/standards.md regelt die Versionierungs-/Changelog-Disziplin, die Technologie-Stack-Entscheidung, erforderliche Projektmetadaten (niemals einen fehlenden Wert erfinden), pro-Feature-Dokumentation in docs/, die Code-Qualitätslatte und die Minimal-Code-Disziplin (Entscheide-bevor-du-schreibst-Reihenfolge, Root-Cause-Fixes, shortcut:-Markierungen). Es vor dem ersten Build und vor jeder Iteration an einem bestehenden Plugin lesen – es ist kein einmaliger Einrichtungsschritt.
Sicherheitshaltung
Niemals für kleine Plugins herunterskaliert: Capability-Prüfungen bei jeder privilegierten Aktion, Nonces bei jeder Zustandsänderung, Eingabe bereinigen und Ausgabe escapen, $wpdb->prepare() bei jeder Abfrage, ein echter permission_callback bei jeder REST-Route, sicherer Lebenszyklus, keine Klartext-Geheimnisse. Vollständige Regeln: fswp-security-engineer.
Alpine-Stufe
Niemals abgeleitet. Nur durch die 5-Punkte-Checkliste in references/frontend-output.md ausgewählt, und nur nachdem der Benutzer ausdrücklich bestätigt hat, welche Prüfung sie ausgelöst hat und wie die Vanilla-Alternative aussieht.
Atomic Framework (benutzergeliefert, nicht gebündelt)
Es ist ein separat gewartetes Produkt; eine gebündelte Kopie würde abweichen. Wenn der Build frontend beinhaltet, nach den aktuellen afw-tokens.css, afw-components.css, afw-foundation-logics.js fragen (plus alpine.min.js, alpine-loader.js, alpine-components.js nur, wenn die Alpine-Stufe bestätigt wurde). Das Gerüst kopiert sie über --foundation-dir und stoppt mit einer Erinnerung, falls es fehlt.
Abhängigkeiten
Alles außer dem Atomic Framework (Stufe 2 @wordpress/*, Stufe 3 Stack) wird zum Zeitpunkt der Gerüsterstellung mit latest aus dem offiziellen Registry aufgelöst und dann fixiert: die Lock-Datei festschreiben und die aufgelösten Versionen in der README festhalten. „Latest bei Gerüsterstellung“ plus eine festgeschriebene Lock-Datei erfüllt die reproduzierbare Quellregel von WordPress.org. Ausnahme: eine vom Benutzer angegebene Kompatibilitätsobergrenze. Details: references/modern-app-stack.md.
Lieferumfang
Installierbare {plugin-slug}.zip (Plugin-Ordner im ZIP-Root) plus readme.txt und/oder private README.md mit echten Installationsschritten und einer kurzen Zusammenfassung: Präfix- und Feature-Entscheidungen, noch ausstehende manuelle Schritte (API-Schlüssel, Cron-Intervall, anfängliche Einstellungen). Kompilierte Ausgabe wird mit ihrer Quelle ausgeliefert (references/modern-app-stack.md).
Mitgeliefert
scripts/scaffold_plugin.py:--features cpt,db,rest,cron,admin,frontend(beliebige Teilmenge),--js-tier vanilla|alpine,--admin-tier native|react|app,--distribution wporg|private|both,--plugin-uri,--author-uri,--foundation-dir,--zip.assets/templates/: Plugin-Skelett mit{{PREFIX}},{{Prefix}},{{prefix}},{{PLUGIN_NAME}},{{plugin-slug}}-Platzhaltern.