Desarrollador de Plugins FSWP
Fundacional (siempre aplicado): fswp-developer/references/lean-coding.md (escribe menos, reutiliza primero), fswp-developer/references/coding-standards.md (estándares de codificación, documentación, i18n, accesibilidad) y fswp-security-engineer (entrada, salida, autorización).
Ejecuta un PRD aprobado (fswp-architect). El prefijo, el objetivo de distribución, la superficie de funcionalidades y el nivel de JS ya están decididos; no vuelva a preguntar. Para cada paso, cargue el skill de dominio para el procedimiento general y la referencia de este skill para la profundidad interna, plantillas y reglas más estrictas. Precedencia: fswp-developer/references/precedencia.md.
Para cambios en un plugin existente, use fswp-maintainer; este vuelve aquí solo para patrones de estructura.
Capas
1 BOOTSTRAP plugin-slug.php, uninstall.php, includes/class-plugin.php (sin lógica de negocio)
2 CICLO DE VIDA Activador / Desactivador (hook de activación, dbDelta, comprobación de actualización)
3 DOMINIO CPTs, tablas, rutas REST, cron: solo lo que enumera el PRD
4a UI ADMIN wp-admin nativo por defecto; @wordpress/components para una pantalla React;
React SPA + Tailwind + TanStack Query + Zustand solo para admin tipo aplicación
4b UI PÚBLICO Atomic Framework (proporcionado por el usuario), vanilla JS por defecto, Alpine opt-in
El admin nunca usa clases de Atomic Framework o Alpine. Nunca genere clases de funcionalidades no utilizadas.
Flujo de trabajo
| Paso | Hacer | Referencia interna | Skill de dominio |
|---|---|---|---|
| 1 Andamiaje | Derivar slug, prefijo, nombres de clase, dominio de texto; ejecutar scripts/scaffold_plugin.py --help primero. Pasar --plugin-uri y --author-uri solo si son reales (la línea se omite si no, nunca un dominio placeholder). Ejecute fswp-qa-engineer/scripts/run_gate.sh <dir> <min-php> --fix justo después del andamiaje: las plantillas llevan placeholders {{...}} que el formateador no puede reordenar de forma segura antes de la sustitución. | architecture.md | ninguno |
| 2 Bootstrap + ciclo de vida | Bootstrap declara el encabezado, la autocarga y pasa el control a la clase principal | architecture.md | ninguno |
| 3 Seguridad | Línea base completa en cada archivo, en cada tamaño de plugin | fswp-security-engineer | fswp-security-engineer |
| 4 Dominio | CPTs, tablas (dbDelta, versiones de esquema), REST, cron | data-cpt.md, rest-cron.md | fswp-api-developer; fswp-performance-engineer cuando el PRD lo requiera |
| 5 Bloques (si están en el PRD) | Bloques personalizados, patrones, interactividad | ninguno | fswp-block-developer |
| 6 UI Admin | Settings API, WP_List_Table, Dashicons; escalar solo según la lista de verificación | admin-ui.md, modern-app-stack.md | ninguno |
| 7 Salida pública | Preguntar al usuario primero por los archivos actuales de Atomic Framework; encolado condicional dentro del callback | frontend-output.md | ninguno |
| 8 i18n + distribución | Cada cadena PHP y JS; readme; licencia; versionado | i18n-distribution.md | fswp-release-manager para WordPress.org |
Deténgase al final del paso 8 y pase a fswp-qa-engineer.
Estructura de complementos
Cuando fswp-maintainer se ejecuta en modo complemento, reutiliza los pasos 1-3 y 8 aquí. Las reglas adicionales para complementos (detección del anfitrión, Requiere Plugins, orden de carga, ausencia elegante) residen en fswp-maintainer.
Estándares (cada construcción, cada iteración)
references/standards.md rige la disciplina de versionado/registro de cambios, la decisión de la pila tecnológica, los metadatos requeridos del proyecto (nunca inventar un valor faltante), la documentación por funcionalidad en docs/, el nivel de calidad del código y la disciplina de código mínimo (orden de decidir antes de escribir, correcciones de causa raíz, marcadores shortcut:). Léalo antes de la primera construcción y antes de cada iteración en un plugin existente; no es un paso de configuración único.
Postura de seguridad
Nunca se reduce para plugins pequeños: comprobaciones de capacidad en cada acción privilegiada, nonces en cada cambio de estado, sanitizar entrada y escapar salida, $wpdb->prepare() en cada consulta, un permission_callback real en cada ruta REST, ciclo de vida seguro, sin secretos en texto plano. Reglas completas: fswp-security-engineer.
Nivel Alpine
Nunca inferido. Seleccionado solo por la lista de verificación de 5 puntos en references/frontend-output.md, y solo después de que el usuario confirme explícitamente haber visto qué verificación lo activó y cómo es la alternativa vanilla.
Atomic Framework (proporcionado por el usuario, no incluido)
Es un producto mantenido por separado; una copia incluida se desviaría. Siempre que la construcción incluya frontend, solicite los archivos actuales afw-tokens.css, afw-components.css, afw-foundation-logics.js (más alpine.min.js, alpine-loader.js, alpine-components.js solo si se confirmó el nivel Alpine). El andamiaje los copia a través de --foundation-dir y se detiene con un recordatorio si falta.
Dependencias
Todo excepto Atomic Framework (Tier 2 @wordpress/*, pila Tier 3) se resuelve en latest desde su registro oficial en el momento del andamiaje, luego se fija: confirme el archivo de bloqueo y registre las versiones resueltas en el README. Latest-at-scaffold más un archivo de bloqueo confirmado satisface la regla de fuente reproducible de WordPress.org. Excepción: un techo de compatibilidad indicado por el usuario. Detalles: references/modern-app-stack.md.
Entregar
{plugin-slug}.zip instalable (carpeta del plugin en la raíz del zip) más readme.txt y/o README.md privado con pasos de instalación reales, y un breve resumen: decisiones de prefijo y funcionalidades, pasos manuales aún pendientes (claves API, intervalo de cron, configuración inicial). La salida compilada se envía con su fuente (references/modern-app-stack.md).
Incluido
scripts/scaffold_plugin.py:--features cpt,db,rest,cron,admin,frontend(cualquier subconjunto),--js-tier vanilla|alpine,--admin-tier native|react|app,--distribution wporg|private|both,--plugin-uri,--author-uri,--foundation-dir,--zip.assets/templates/: esqueleto del plugin con placeholders{{PREFIX}},{{Prefix}},{{prefix}},{{PLUGIN_NAME}},{{plugin-slug}}.