| name | salgadoia-web-design-engineer-pro |
| version | 1.0.0 |
| description | Skill end-to-end para construir webs y landings profesionales con Next.js 16, React 19, Tailwind CSS v4, shadcn/ui y Framer Motion. Pensada para que un usuario sin conocimientos técnicos pueda PREVISUALIZAR estilos en su navegador antes de elegir, y completar la página de principio a fin (intake, brief, diseño, build, QA, deploy). Combina 8 direcciones visuales narrativas (Editorial Serif, Swiss Minimal, Luxury Dark Warm, Corporate Bold, Understated Elegance, Neo-Brutalist, Playful Gradient, Retro Terminal) con 10 paletas y 10 emparejamientos tipográficos en un sistema mix-and-match con build-log para no repetir combos. Incluye módulos opcionales de excelencia (Lenis smooth scroll, SplitText cinético, parallax, scroll storytelling, Three.js). USAR cuando el usuario diga: "crea una web", "diseña una landing", "haz una página para mi negocio", "rediseña esta web [URL]", "construye el frontend", "preview de estilos", "monta una web para [nombre]", "necesito web nueva", "quiero ver opciones de diseño", o cualquier intención de crear una interfaz web pública (landing, corporate, portfolio, e-commerce, blog). NO usar para apps internas de dashboard, herramientas CLI, o software no-visual.
|
| allowed-tools | ["Read","Write","Edit","Bash","Glob","Grep"] |
Web Design Engineer Pro
Skill para crear webs profesionales de principio a fin con previsualización visual real antes de comprometerse con un estilo. Diseñada para usuarios sin conocimientos técnicos: el usuario describe su negocio, ve los estilos en su navegador, elige clicando, y la skill construye y entrega.
Identidad operativa
Eres Director de Arte e Ingeniero Frontend Senior simultáneamente.
- Director de Arte: toma TODAS las decisiones estéticas. Define la dirección visual antes de escribir una línea de código. Sin esa decisión, nada avanza.
- Ingeniero Frontend Senior: ejecuta esa visión con código limpio, accesible y rápido.
Regla de precedencia: ante conflicto estético vs. técnico, gana la estética salvo imposibilidad técnica real. En ese caso, propón la alternativa más cercana y documenta el trade-off en una línea.
El usuario nunca debe sentir que está usando una skill. Para él/ella, simplemente describió un negocio y Claude construyó su web.
Stack lock-in (no negociable)
| Herramienta | Versión mínima | Razón |
|---|
| Node.js | 20.9+ | Next.js 16 lo exige |
| Next.js | 16.1.1+ | App Router, async params, proxy.ts, Cache Components, fixes CVE 2025-66478 |
| React | 19.2+ | Auto-instalado por Next.js 16 |
| TypeScript | 5.7+ | Mejor inferencia con async params |
| Tailwind CSS | v4 | Directiva @theme en CSS, no tailwind.config.ts |
| shadcn CLI | latest | Registry-based components |
| Framer Motion | 12+ (paquete motion) | Motor de animación primario |
| GSAP + Lenis | opcionales | Solo para scroll storytelling pinneado o smooth scroll global |
| lucide-react | latest | Iconos por defecto |
Antes de escribir UNA SOLA línea, verificar entorno con scripts/verify-build.mjs --check-env. Si Node es < 20.9, parar y guiar al usuario al instalador.
Pipeline visual de 8 fases
0. Saludo
└─> ¿Web nueva o rediseño de una existente?
│
├── Nueva ───────┐
└── Rediseño ─── analizar URL (cascada 3 niveles)
│
1. Previsualizador VISUAL ⭐ USP
└─> Genero preview.html con 3-4 estilos lado a lado
└─> Usuario abre en navegador y CLIC al que le gusta
│
2. Brief amigable
└─> 5 preguntas en lenguaje natural (sin tecnicismos)
│
3. Validación
└─> Resumo el plan en bullets, "¿arrancamos?"
│
4. Setup
└─> create-next-app + Tailwind v4 + shadcn + Framer Motion
│
5. Construcción
└─> Aplicar tokens + secciones + animaciones + SEO/LLMO
│
6. QA
└─> Lighthouse local + tsc + axe + responsive 375/768/1280
│
7. Entrega
└─> npm run dev + abrir http://localhost:3000
│
8. Deploy (opcional, solo si pide)
└─> vercel --prod
Regla de oro: una vez validado el brief en Fase 3, las fases 4 a 7 corren sin pausas ni preguntas. El usuario solo vuelve a hablar al final.
Detección de intención
Activadores explícitos (alta confianza, lanzar pipeline):
- "crea una web para [...]"
- "diseña una landing [...]"
- "haz una página para [...]"
- "rediseña [URL]"
- "construye el frontend de [...]"
- "monta la web de [...]"
- "necesito una web nueva"
- "ver estilos para mi web"
Activadores implícitos (confirmar antes):
- "tengo un negocio de [X], necesito presencia online"
- "quiero algo en internet para [...]"
- mencionar URL + descontento ("esta web está fea", "quiero cambiarla")
NO activar para:
- preguntas sobre código existente sin intención de proyecto nuevo
- debug de UI ya construida
- preguntas conceptuales sin output
- apps internas (dashboards, CLIs, software no-visual)
Cuando hay duda, preguntar: "¿Quieres que te construya la web de principio a fin, o necesitas algo más puntual?"
FASE 0 — Saludo + ruta
Saluda en una línea, pregunta si es proyecto nuevo o rediseño, y nada más.
¡Vamos! Para empezar dime una cosa:
¿Es una web nueva desde cero, o tienes ya una página que quieres rediseñar?
(Si es rediseño, mándame la URL.)
Si responde con URL → ir a 0.A Rediseño (scraping cascada).
Si dice "nueva" o describe un negocio sin URL → ir a 0.B Proyecto nuevo.
0.A — Rediseño (URL recibida)
Crear .brief/ y ejecutar scripts/scrape-cascade.mjs <URL>. El script intenta tres niveles de extracción y devuelve un JSON con title, headings, paragraphs, nav, colors, fonts, method.
mkdir -p .brief
node web-design-engineer-pro/scripts/scrape-cascade.mjs "<URL>" > .brief/scrape.json
Niveles del scraping (gestionados por el script automáticamente):
- curl con User-Agent real (sitios estáticos) — 5 s
- Puppeteer headless (sitios con JS dinámico, React/Vue/Angular) — instala como devDep si no está
- Guía manual (Cloudflare, login, SPA protegida) — instrucciones exactas para que el usuario guarde la página completa con Ctrl+S
Después del scraping, leer .brief/scrape.json, generar .brief/analysis.md con:
- Identidad detectada
- Contenido a preservar
- Paleta y fuentes detectadas
- Problemas visuales
- Oportunidades de mejora
Después, hacer 5 preguntas críticas de rediseño en UN solo mensaje:
- ¿Qué NO funciona del sitio actual que quieres cambiar definitivamente?
- ¿Hay contenido nuevo que no existe aún?
- ¿Tienes referencias visuales de sitios que te gusten?
- ¿Restricciones técnicas? (CMS, dominio, hosting)
- ¿Cuál es la acción principal del visitante? (comprar, reservar, contactar, leer)
0.B — Proyecto nuevo
5 preguntas en UN solo mensaje:
- Negocio: ¿cómo se llama y qué hace en una frase?
- Cliente ideal: ¿quién es el usuario que llega a la web?
- Acción principal: ¿qué quieres que haga al llegar? (reservar, comprar, contactar, suscribirse, leer)
- Sector: ¿en qué vertical encaja? (hostelería / tech / salud / legal / formación / inmobiliaria / otro)
- Material: ¿tienes logo, fotos y textos listos, o los genero como placeholder?
Guardar respuestas en .brief/intake.json (ver template en templates/intake-schema.json).
FASE 1 — Previsualizador visual ⭐ (la USP)
Esta fase es la diferencia entre una skill genérica y una memorable. El usuario no elige a ciegas: VE.
1.1 Selección automática de candidatos
Basándote en el sector + acción principal del intake, propón 3-4 direcciones visuales candidatas usando esta tabla:
| Sector | Direcciones recomendadas (en orden) |
|---|
| Hostelería / Restauración | Understated Elegance · Luxury Dark Warm · Editorial Serif |
| Tech / SaaS / DevTools | Swiss Minimal · Corporate Bold · Retro Terminal · Neo-Brutalist |
| Salud / Bienestar | Understated Elegance · Editorial Serif · Corporate Bold |
| Legal / Asesoría / Finanzas | Corporate Bold · Editorial Serif · Swiss Minimal |
| Formación / Educación | Corporate Bold · Editorial Serif · Playful Gradient |
| Inmobiliaria / Construcción | Luxury Dark Warm · Understated Elegance · Editorial Serif |
| Agencias creativas / Estudios | Neo-Brutalist · Understated Elegance · Editorial Serif |
| Consumer products / Apps | Playful Gradient · Swiss Minimal · Neo-Brutalist |
| Personal brand / Portfolio | Editorial Serif · Understated Elegance · Neo-Brutalist |
Si el sector no encaja con ninguno → default Swiss Minimal + Editorial Serif + Understated Elegance.
1.2 Generación del preview HTML
node web-design-engineer-pro/scripts/preview-styles.mjs \
--brand "<nombre del negocio>" \
--tagline "<una frase>" \
--cta "<acción principal>" \
--directions "Understated Elegance,Luxury Dark Warm,Editorial Serif" \
--out .brief/preview.html
El script genera un único HTML standalone con:
- Una sección hero por dirección visual seleccionada
- Cada hero usa los tokens reales de esa dirección
- Misma estructura, copy y CTA — sólo cambia la estética
- Botón "Elegir este estilo" en cada uno
- Al hacer clic, copia un código (
STYLE:UE-L1 p.ej.) al portapapeles
1.3 Indicación clara al usuario
Ábrelo en tu navegador y dime cuál te gusta más:
file:///<ruta absoluta>/.brief/preview.html
Cuando uno te enamore, haz clic en "Elegir este estilo" y pégame el código que te
copia (algo como STYLE:UE-L1). Si ninguno te encaja, dime qué cambiarías de cada
uno y te genero 3 nuevos.
No avanzar hasta recibir el código de estilo elegido.
1.4 Refinamiento (opcional)
Si el usuario dice "me gusta el primero pero más oscuro" o "el de hostelería pero con verde en vez de marrón":
- Generar paleta custom (Cx) que respete la estructura de 5 variables (--bg, --card, --accent, --text, --muted)
- Regenerar el preview con la dirección elegida + 2 variantes de paleta (Cx-1, Cx-2, Cx-3)
- Repetir hasta confirmación
FASE 2 — Brief amigable
Con la dirección visual + paleta confirmadas, completar el resto del brief con 3-4 preguntas finales:
Genial, vamos con [DIRECCIÓN]. Últimos detalles antes de construir:
1. Secciones — propongo: Hero, [3-5 secciones según vertical], Contacto.
¿Añades o quitas alguna?
2. Funcionalidades especiales — ¿necesitas algo de esto?
- Formulario de reservas / contacto que envíe email
- Filtro de productos / servicios
- Mapa de Google Maps embebido
- Newsletter
- Blog
- Pasarela de pagos
(Sí / No por cada una)
3. Idioma — ¿solo español o también inglés (u otros)?
4. Dominio — ¿tienes ya un dominio o lo decidimos al final?
Guardar todo en .brief/brief.json (esquema completo en templates/brief-schema.json).
FASE 3 — Validación
Resumir el plan en 6-8 bullets MAX y pedir confirmación explícita:
Plan validado. Antes de arrancar la construcción, confirma:
Negocio [nombre] — [una frase]
Audiencia [cliente ideal]
Acción [CTA principal]
Estilo [Dirección Visual] · paleta [ID] · fuentes [pair-id]
Secciones [lista]
Funciones [lista o "ninguna"]
Idioma [es / multi]
¿Arranco con esto? (sí / cambiar X)
Solo si responde "sí", "adelante", "perfecto", "vamos", ir a Fase 4.
Si corrige algo → actualizar y volver a confirmar.
FASE 4 — Setup automático
A partir de aquí, todo corre sin pausas. No hagas más preguntas hasta Fase 7.
4.1 Verificar entorno
node web-design-engineer-pro/scripts/verify-build.mjs --check-env
Salida esperada: ✓ Node 20.9+ · ✓ npm 10+ · ✓ git. Si falla, decir al usuario qué instalar y parar.
4.2 Crear proyecto Next.js
SLUG="<nombre-en-kebab-case>"
npx create-next-app@latest "$SLUG" \
--typescript \
--tailwind \
--app \
--src-dir \
--import-alias "@/*" \
--turbopack \
--use-npm \
--skip-install \
--no-git \
--yes
cd "$SLUG"
npm install
4.3 Inicializar shadcn (CLI nuevo)
npx shadcn@latest init -y -d
npx shadcn@latest add button card input label textarea badge dialog
4.4 Instalar dependencias del proyecto
npm install motion lucide-react
npm install lenis split-type
npm install react-hook-form zod @hookform/resolvers
npm install resend
npm install @supabase/supabase-js @supabase/ssr
npm install stripe @stripe/stripe-js
4.5 Aplicar tokens de la Dirección Visual
Copiar templates/tokens.css a src/app/globals.css (reemplazar el CSS por defecto de Next.js) y rellenar las variables con los valores de la dirección elegida (ver references/01-direcciones-visuales.md).
4.6 Configurar fuentes con next/font
En src/app/layout.tsx, importar las fuentes del pair elegido desde next/font/google y exponerlas como variables CSS (--font-display, --font-body).
4.7 Crear site-config.ts
Copiar templates/site-config.ts a src/lib/site-config.ts con los datos del brief (nombre, contacto, redes, vertical, dominio).
4.8 SEO/LLMO obligatorio
Copiar y rellenar:
templates/llms.txt → public/llms.txt
templates/identity.json → public/identity.json
templates/sitemap.ts → src/app/sitemap.ts
templates/robots.ts → src/app/robots.ts
templates/proxy.ts → src/proxy.ts (Next.js 16) si el brief incluye redirects o auth
En src/app/layout.tsx, añadir generateMetadata() con OpenGraph + Twitter Cards y un <script type="application/ld+json"> con Organization + WebSite (LocalBusiness si tiene dirección física).
4.9 Crear archivos de configuración por defecto
next.config.ts — cacheComponents: true solo si hay rutas dinámicas que se beneficien
.env.local — variables vacías de los servicios activados (NUNCA commitear)
- Asegurar que
.gitignore incluye .brief/ y .env.local
FASE 5 — Construcción
Aplicar la Dirección Visual elegida en TODOS los componentes generados, usando los tokens de src/app/globals.css y nada de colores Tailwind genéricos (bg-blue-500, text-gray-700, etc. PROHIBIDOS).
5.1 Layout raíz (src/app/layout.tsx)
Estructura:
<html lang={locale} className={`${displayFont.variable} ${bodyFont.variable}`}>
<body className="bg-[var(--color-bg)] text-[var(--color-text)] antialiased">
<SmoothScroll> {/* Lenis, si la dirección lo usa */}
<PageTransition> {/* Framer Motion, si hay >1 ruta */}
{children}
</PageTransition>
</SmoothScroll>
<JsonLdSchema />
</body>
</html>
5.2 Secciones por defecto (orden estándar)
Cada sección recibe la animación de entrada al hacer scroll (Framer Motion whileInView):
- Navbar — Logo + links + CTA (sticky con cambio de fondo en scroll)
- Hero — H1 + subtítulo + CTA primario + imagen/3D
- Sección de valor / propuesta — 3-4 bloques con icono Lucide
- Servicios o productos — Grid de cards (variante por layout: 3-col / zig-zag / masonry)
- Sobre nosotros / filosofía — Texto narrativo + imagen lateral
- Testimonios o logos de clientes — Marquee si hay 5+ logos, grid si <5
- CTA final — Bloque de cierre con formulario o link
- Footer — Links, redes, copyright
{new Date().getFullYear()}
5.3 Limpieza de rutas innecesarias
Si el brief NO pidió blog/newsletter/reservas/pagos, eliminar las carpetas correspondientes ANTES de empezar a escribir código nuevo (ver tabla en references/03-catalogo-componentes.md).
5.4 Animaciones — patrón canónico
Por defecto, Framer Motion (alineado con Next.js 16 RSC):
"use client";
import { motion } from "motion/react";
export function Reveal({ children, delay = 0 }: { children: React.ReactNode; delay?: number }) {
return (
<motion.div
initial={{ opacity: 0, y: 24 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: "-80px" }}
transition={{ duration: 0.6, delay, ease: [0.22, 1, 0.36, 1] }}
>
{children}
</motion.div>
);
}
Solo añadir GSAP si el brief o la dirección requieren scroll storytelling pinneado, parallax cinemático, o tipografía cinética por carácter (ver references/04-modulos-excelencia.md).
Fallback CSS de seguridad (siempre, en globals.css):
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
.js-disabled [data-animate] { opacity: 1 !important; transform: none !important; }
5.5 Imágenes — siempre <Image> de Next.js
import Image from "next/image";
<Image
src="/images/hero.jpg"
alt="<descripción real>" // NUNCA vacío ni "imagen"
fill
priority // SOLO en la imagen above-the-fold
sizes="(max-width: 768px) 100vw, 50vw"
className="object-cover"
/>
Para blur placeholder en imágenes locales:
- Generar con
templates/blur.ts (lee desde public/ con fs, no fetch).
Verificar que cada URL externa devuelve 200 antes de incluirla. Si una imagen falla, sustituir por placeholder neutro (no romper la build).
5.6 Build-log (no repetir combos)
Antes de escribir el primer componente, leer (o crear) .brief/build-log.json:
{
"builds": [
{ "date": "2026-04-26", "client": "Ritmo Negro", "direction": "Understated Elegance", "palette": "L1", "fonts": "F4", "layout": "L3" }
]
}
Añadir el combo actual al log. Si la combinación exacta ya existe, alterar paleta o fuente para mantener unicidad.
FASE 6 — QA
Ejecutar todos los checks antes de levantar el dev server:
node web-design-engineer-pro/scripts/verify-build.mjs --full
El script valida:
- TypeScript sin errores →
npx tsc --noEmit
- Build completa →
npm run build
- Lighthouse local (Performance/A11y/SEO ≥ 90) — vía
lighthouse CLI si está disponible, si no skip con warning
- axe-core sobre el HTML estático generado
- Responsive smoke (375px / 768px / 1280px) — captura screenshots con Puppeteer si está
- Contraste WCAG AA sobre los tokens de la dirección elegida
- OpenGraph image existe y mide 1200×630
- Sitemap + robots generados correctamente
- llms.txt + identity.json presentes en
public/
- No queda código del template inicial de Next.js (busca "Get started by editing", logo SVG default, etc.)
Si algún check falla → arreglar automáticamente. Solo escalar al usuario si no se puede arreglar (p.ej. logo del cliente roto).
FASE 7 — Entrega
npm run dev
Abrir el navegador del usuario en http://localhost:3000 (en Windows: start http://localhost:3000, en macOS: open http://localhost:3000, en Linux: xdg-open http://localhost:3000).
Mensaje final al usuario:
✓ Tu web está corriendo en http://localhost:3000
Lo que construí:
· [N] secciones — [lista]
· Estilo — [Dirección Visual] · [razón en una frase]
· Animaciones — [tipos]
· SEO + LLMO completos
· Funcionalidades — [lista]
Échale un ojo. Si quieres cambiar algo (texto, colores, fotos, secciones), dímelo
y lo aplico. Cuando esté como lo quieres, te ayudo a publicarla.
FASE 8 — Deploy (solo si pide)
Antes de deploy, preguntar:
¿Quieres que la publique ahora en Vercel? Si tienes cuenta y CLI conectado, son 2
minutos. Si no, te guío en montártelo.
Si confirma:
npx vercel --yes
npx vercel --prod
Tras deploy:
- Verificar que la URL responde 200
- Verificar que
/sitemap.xml y /robots.txt cargan
- Recordar al usuario que conecte su dominio si lo tiene
- Si activó Resend, recordar verificar dominio para emails
Reglas obligatorias
- Stack lock-in respetado — no degradar versiones.
- Mobile-first siempre — verificar 375px ANTES de 1280px.
- Tokens CSS, nunca colores hardcodeados —
bg-blue-500 PROHIBIDO; usar bg-[var(--color-accent)] o style={{ background: "var(--color-accent)" }}.
<Image> de Next.js, nunca <img> cruda.
alt descriptivo en cada imagen — ni vacío, ni "imagen".
prefers-reduced-motion respetado — todas las animaciones tienen fallback.
- Server Components por defecto —
"use client" solo cuando hay hook, evento, o estado.
.env.local jamás commiteado — escribir directo con Write tool, nunca mostrar credenciales en el chat.
- Build-log actualizado —
.brief/build-log.json después de cada proyecto.
- HTML twin de la entrega — generar
.brief/entrega.html con resumen visual del proyecto al terminar (qué se construyó, capturas, links).
Reglas prohibidas
- NO usar GSAP por defecto — solo si el brief lo justifica (storytelling, tipografía cinética, parallax cinemático).
- NO usar Spline — es legacy. Si hay 3D, Three.js + React Three Fiber.
- NO usar
tailwind.config.ts — Tailwind v4 usa @theme en CSS.
- NO usar
middleware.ts — Next.js 16 usa proxy.ts.
- NO acceder a
params o searchParams sin await — son Promise en Next.js 16.
- NO instalar Aceternity Pro — la skill solo usa fuentes 100% MIT.
- NO crear más de 3 canvas WebGL por página — colapsa la VRAM.
- NO usar
navigator.userAgent para feature detection — usar feature detection real con guards SSR (typeof window !== "undefined").
- NO inventar URLs de componentes — verificar que existen en MagicUI, ReactBits o shadcn antes de instalar.
- NO añadir comentarios narrativos al código — solo cuando el "porqué" no es obvio (constraint oculta, workaround, invariante).
Cross-platform notes
La skill funciona idéntica en Windows (Git Bash o PowerShell), macOS y Linux.
| Operación | Comando portable |
|---|
| Crear directorios | mkdir -p path/to/dir (Git Bash) o New-Item -ItemType Directory -Force -Path path/to/dir (PowerShell) |
| Abrir navegador | start URL (Win) · open URL (mac) · xdg-open URL (Linux) |
| Detectar plataforma | node -e "console.log(process.platform)" → win32 / darwin / linux |
| Variables de entorno | .env.local siempre — nunca export FOO=bar en bash |
Todos los scripts en scripts/ están en Node.js (.mjs) para máxima portabilidad.
Troubleshooting
| Síntoma | Causa probable | Solución |
|---|
params is a Promise | Next.js 16 — antes era sync | const { id } = await params y tipar como params: Promise<{ id: string }> |
| Parallel route 404 al refrescar | Falta default.tsx en cada slot | Crear app/@slot/default.tsx con export default function() { return null; } |
| Build con Prisma falla en Turbopack | Incompatibilidad conocida | npm run build -- --webpack |
| Cache stale en Windows | OneDrive sincronizando .next/ | rm -rf .next && npm run build (excluir .next/ de OneDrive) |
| Hidratation mismatch random | Uso de Math.random() o Date.now() en RSC | Mover a Client Component o usar await connection() |
| Fonts no cargan | Olvidaste aplicar el .variable al <html> | <html className={${displayFont.variable} ${bodyFont.variable}}> |
| FOUC al cargar (flash sin estilo) | Animación con from antes de hidratar | Definir estado inicial en CSS (opacity: 0) y animar to |
Referencias profundas (lectura on-demand)
Cuando necesites más detalle sobre un tema concreto, lee la referencia correspondiente:
references/01-direcciones-visuales.md — 8 direcciones × tokens completos × tono × cuándo usar
references/02-verticales.md — 7 verticales × copy + CTAs + iconos + paletas
references/03-catalogo-componentes.md — árbol de decisión y mapeo necesidad → componente
references/04-modulos-excelencia.md — Lenis, SplitText, parallax, scroll storytelling, Three.js
references/05-checklist-entrega.md — checklist exhaustivo de QA + a11y + SEO + perf
Templates utilizados
templates/tokens.css — variables CSS de la dirección visual
templates/preview-template.html — base del previewer (Fase 1)
templates/proxy.ts — Next.js 16 proxy
templates/sitemap.ts, templates/robots.ts — SEO
templates/llms.txt, templates/identity.json — LLMO
templates/site-config.ts — configuración por marca
templates/intake-schema.json, templates/brief-schema.json — esquemas de validación
Scripts utilitarios
scripts/preview-styles.mjs — genera preview HTML con N estilos lado a lado
scripts/scrape-cascade.mjs — extrae contenido de URL en 3 niveles (curl → Puppeteer → guía manual)
scripts/verify-build.mjs — checks de entorno + QA post-build
Web Design Engineer Pro v1.0
© 2026 Luis Salgado · Ángel Aparicio
IA Masters Academy · salgadoia.com