Communitygithub.com

beavon2010/claude-skills

Extrae HTML estático autocontenido de una aplicación web compilada o componentes React, incluyendo CSS e imágenes. Usa esta skill cuando necesites capturar un estado específico de la interfaz, compartir una versión estática de una página o preparar activos para subir a Stitch, incluso si el usuario solo pide 'guardar el HTML' o 'simular la vista'.

¿Qué es claude-skills?

Esta habilidad permite extraer archivos HTML estáticos autocontenidos desde aplicaciones web modernas, incluyendo aquellas construidas con React, Vue, Angular, Next.js u otros frameworks. Ofrece dos estrategias principales: la Estrategia A (Puppeteer), recomendada por defecto, lanza un navegador headless Chrome, captura el DOM completamente renderizado y genera un archivo HTML con todo el CSS inline y las imágenes convertidas a base64, sin necesidad de modificar el código de la aplicación. La Estrategia B (Subagente de Navegador) es útil cuando se necesita interactuar primero con la página (hacer clic, llenar formularios) antes de la captura. La habilidad maneja automáticamente la inclusión de estilos dinámicos (Vite, Tailwind, CSS-in-JS), la conversión de imágenes y fuentes de iconos a base64, y la eliminación de scripts y elementos no deseados. También incluye un método de respaldo estático (MockPage.jsx) para casos donde la aplicación no puede ejecutarse localmente. Es compatible con Claude Code, Cursor y otros agentes de IA, y su script principal `snapshot.ts` ofrece múltiples banderas para personalizar la captura, como el tiempo de espera, el tamaño de viewport, la eliminación de elementos fijos y la autenticación.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/beavon2010/claude-skills/tree/HEAD/.claude/skills/extract-static-html

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Extraer HTML Estático

Extrae un archivo HTML estático autocontenido de cualquier aplicación web.

Qué Estrategia Usar

DEBES preguntar al usuario qué estrategia desea usar antes de proceder. Presenta las opciones claramente, recomienda la Estrategia A como la opción predeterminada preferida, y proporciona un breve resumen de pros/contras para cada opción para ayudarlos a tomar una decisión informada.

Estrategia A (Puppeteer)Estrategia B (Subagente de Navegador)
CuándoLa aplicación se ejecuta localmente, sin muro de autenticaciónNecesitas interactuar primero con la página (hacer clic, llenar formularios)
FidelidadLa más alta — estilos computados resueltosAlta — DOM renderizado
ConfiguraciónCero — no se necesita mockCero — no se necesita mock
FrameworkCualquieraCualquiera
SalidaEscribe a archivo — sin límite de tamañoPuede truncarse en el contexto del agente

[!WARNING] Punto de Control — Se Requiere Confirmación del Usuario. DEBES preguntar al usuario qué estrategia prefiere antes de proceder. Presenta la tabla comparativa anterior, recomienda la Estrategia A como la predeterminada, y espera la aprobación explícita. NO tomes la decisión tú mismo ni continúes hasta que el usuario confirme.


Estrategia A: Instantánea con Puppeteer (Recomendada)

Lanza Chrome headless, captura el DOM completamente renderizado y produce un archivo HTML autocontenido con todo el CSS inline y las imágenes como base64. Funciona con cualquier framework — no se necesita MockPage.jsx.

Prerrequisitos

  • Aplicación ejecutándose localmente (ej., npm run dev)
  • Node.js con puppeteer disponible (verifica: node -e "require('puppeteer')")

Flujo de Trabajo

  1. Inicia la Aplicación y anota el puerto.

    [!WARNING] Punto de Control — Se Requiere Confirmación del Usuario. Después de iniciar el servidor local, DEBES pausar y pedir al usuario confirmación antes de ejecutar el script de instantánea o lanzar un subagente de navegador. Reporta la URL y el puerto al usuario para que pueda verificar que la aplicación se está ejecutando y renderizando correctamente. NO continúes con el paso de instantánea hasta que el usuario confirme.

  2. Ejecuta el Script de Instantánea:

    npx tsx <SKILL_DIR>/scripts/snapshot.ts \
      --url http://localhost:5173 \
      --output .stitch/home.html \
      --wait 2000
    
  3. Múltiples páginas — ejecuta una vez por ruta:

    npx tsx <SKILL_DIR>/scripts/snapshot.ts \
      --url http://localhost:5173 --output .stitch/home.html --wait 2000
    npx tsx <SKILL_DIR>/scripts/snapshot.ts \
      --url http://localhost:5173/pricing --output .stitch/pricing.html --wait 2000
    npx tsx <SKILL_DIR>/scripts/snapshot.ts \
      --url http://localhost:5173/dashboard --output .stitch/dashboard.html --wait 2000 --html-class dark
    
  4. Limpia el Servidor de Desarrollo: Si se inició un servidor de desarrollo local específicamente para la extracción de instantáneas, asegúrate de detener el proceso del servidor o finalizar la tarea en segundo plano una vez que se complete la extracción.

Banderas del Script

BanderaPredeterminadoDescripción
--url(requerido)URL a capturar
--output(requerido)Ruta del archivo de salida
--wait1000Espera adicional (ms) después de que la red esté inactiva. Aumenta para aplicaciones con carga diferida.
--viewport1280x800Tamaño del viewport como ANCHOxALTO
--html-class—Clase(s) para el elemento <html> (ej., dark)
--remove-fixedfalseElimina elementos fijos/pegajosos (banners de cookies, widgets de chat)
--full-heightfalseRedimensiona el viewport a la altura total del scroll
--title—Sobrescribe el título de la página (establécelo en la ruta, ej., /dashboard o /settings/profile)
--auth-script—Ruta a un módulo JS/TS que exporta una función por defecto async (page) => void para autenticación
--inline-canvasfalseConvierte elementos <canvas> (ECharts, Chart.js, D3) a etiquetas <img> base64

Qué Hace Automáticamente

  • Captura todas las reglas CSSOM de document.styleSheets (preserva estilos dinámicos de desarrollo de Vite/Tailwind y CSS-in-JS)
  • Inlinea todos los <link rel="stylesheet"> → bloques <style>
  • Convierte <img> src y srcset → URIs de datos base64 (omite fuentes externas)
  • Inlinea archivos de fuentes de icono del mismo origen y relativos (@font-face) como URIs de datos base64 para que las ligaduras nunca se rendericen como texto ASCII
  • Inlinea URLs de <source srcset> como base64
  • Elimina entradas srcset fallidas/muertas para que el navegador recurra al src inlineado
  • Elimina etiquetas <script>, bloques de estilo de desarrollo de Vite HMR (createHotContext, import.meta.hot) y superposiciones de desarrollo
  • Resuelve rutas relativas de CSS url() antes de inlinear

Notas por Framework

FrameworkNotas
React + ViteFunciona de inmediato. --wait 1000.
Next.js--wait 3000 para hidratación SSR. URL: http://localhost:3000. <img srcset> de /_next/image se inlinea automáticamente como base64.
Angular (@angular/cli / v17+)Funciona de inmediato con ng serve (URL predeterminada: http://localhost:4200). --wait 2000 para hidratación de animaciones de Angular Material / PrimeNG y rutas con carga diferida.
Vue / NuxtFunciona de inmediato.
Svelte / SvelteKitFunciona de inmediato.
StorybookUsa la URL de la historia: --url http://localhost:6006/?path=/story/...
SSR (Webpack)Puede necesitar un --wait más largo.

Solución de Problemas

ProblemaSolución
Faltan imágenesAumenta --wait
Las imágenes se muestran rotas después de que el servidor se detieneVerifica que srcset se haya inlineado — busca en el registro "Inlined N images". Si las URLs de srcset fallaron, se eliminan automáticamente para que se use src (inlineado).
Los iconos se muestran como texto / fuente Serif sin estiloAsegúrate de que snapshot.ts capture CSSOM de document.styleSheets (paso 0) y que las fuentes de icono del mismo origen (@font-face) se inlineen como URIs de datos base64.
/_next/image de Next.js no inlineadoAsegúrate de que el servidor de desarrollo esté ejecutándose cuando se ejecute la instantánea — el script obtiene las imágenes optimizadas del servidor en ejecución.
El modo oscuro no se aplica--html-class dark
Banner de cookies en la salida--remove-fixed
La página requiere inicio de sesiónUsa --auth-script ./auth.ts (ver Páginas con Autenticación más abajo)
Los gráficos/diagramas se muestran como cuadros en blancoUsa --inline-canvas para serializar <canvas> a <img> base64
Cannot find module 'puppeteer'npm install -g puppeteer

Páginas con Autenticación

Para aplicaciones con guardias de inicio de sesión (Vue Router beforeEach, React ProtectedRoute, etc.), crea un pequeño script de autenticación que se ejecute en la sesión de Puppeteer:

// auth-myapp.ts
import type { Page } from 'puppeteer';

export default async function authenticate(page: Page) {
  // Ejemplo 1: Llenar y enviar un formulario de inicio de sesión
  await page.type('#username', 'admin');
  await page.type('#password', 'password123');
  await page.click('#login-button');
  await page.waitForNavigation({ waitUntil: 'networkidle2' });

  // Ejemplo 2: Inyectar cookies/localStorage directamente
  // await page.evaluate(() => {
  //   localStorage.setItem('token', 'mock-jwt-token');
  // });

  // Ejemplo 3: Llamar a la API de inicio de sesión de la propia aplicación mediante inyección de módulo (Vue/Vite)
  // await page.evaluate(() => {
  //   return new Promise((resolve) => {
  //     const script = document.createElement('script');
  //     script.type = 'module';
  //     script.textContent = `
  //       import { useUserStore } from '/src/store/modules/user.ts';
  //       import { fetchLogin } from '/src/api/auth.ts';
  //       const res = await fetchLogin({ userName: 'Admin', password: '123456' });
  //       useUserStore().setToken(res.token, res.refreshToken);
  //       window.dispatchEvent(new CustomEvent('auth-done'));
  //     `;
  //     document.head.appendChild(script);
  //     window.addEventListener('auth-done', () => resolve(true), { once: true });
  //   });
  // });
}

Luego úsalo:

npx tsx <SKILL_DIR>/scripts/snapshot.ts \
  --url http://localhost:5173/#/dashboard \
  --output .stitch/dashboard.html \
  --auth-script ./auth-myapp.ts \
  --inline-canvas \
  --wait 5000

El script navega primero a la --url (que puede redirigir al inicio de sesión), ejecuta tu función de autenticación, y luego vuelve a navegar a la --url original con la sesión autenticada.


Estrategia B: Captura con Subagente de Navegador

Úsala cuando necesites interactuar con la página (hacer clic en botones, llenar formularios, navegar por pestañas) antes de la captura. El subagente de navegador te da control total, pero la salida puede truncarse para páginas grandes.

Flujo de Trabajo

  1. Inicia la Aplicación localmente.

  2. Navega usando un subagente de navegador.

  3. Interactúa según sea necesario (hacer clic, desplazarse, llenar formularios).

  4. Extrae el DOM: document.documentElement.outerHTML

    [!WARNING] Las páginas grandes pueden truncarse. Para manejar esto:

    • Elimina las etiquetas <style> antes de la extracción: document.querySelectorAll('style').forEach(el => el.remove())
    • Vuelve a agregar los estilos estáticamente (enlace CDN de Tailwind, CSS fuente)
  5. Guarda a archivo.


Apéndice: Respaldo Estático (MockPage.jsx)

[!NOTE] Este método es un último recurso para cuando la aplicación no puede ejecutarse localmente (dependencias rotas, backend faltante, muros de autenticación sin bypass). Requiere aplanar manualmente los componentes React en un solo archivo JSX. Prefiere la Estrategia A siempre que sea posible.

Cuándo Usarlo

  • La aplicación no puede ejecutarse localmente en absoluto
  • La página requiere autenticación sin mock/bypass
  • Necesitas un estado de UI específico que es imposible de alcanzar mediante navegación (pantallas de error, estados vacíos)

Referencia Rápida

npx tsx <SKILL_DIR>/scripts/extract_inline_html.ts \
  --index-css src/css/App.css \
  --extra-css index.html \
  --outdir .stitch \
  --page src/MockPage.jsx:Page.html:"Page Title"

Banderas clave: --no-tailwind (apps sin Tailwind), --html-class dark (modo oscuro), --css-files (archivos CSS adicionales).

Detección automática: La configuración de Tailwind se detecta automáticamente. Las directivas @apply usan automáticamente <style type="text/tailwindcss">.

Reglas de MockPage.jsx

  1. Incluye el diseño completo — encabezado, barra lateral, pie de página (lee App.js primero)
  2. Aplana todos los condicionales — elige un estado, elimina todos los ternarios y guardias &&
  3. Codifica todos los datos — reemplaza {variable} con valores concretos, desenrolla los bucles .map()
  4. Preserva los logotipos — usa <img> con rutas locales (el posprocesamiento los inlineará)
  5. Elimina elementos flotantes — banners de cookies, widgets de chat, botones de retroalimentación

Posprocesamiento

Inlinea imágenes locales:

npx tsx <SKILL_DIR>/scripts/post_process.ts \
  .stitch/Page.html --base-dir <directorio-de-la-aplicación>

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

beavon2010/claude-skills

>- Convert frontend code (Vite, React, Angular, Vue, etc.) to a Stitch Design by chaining static HTML extraction, design system extraction, and file upload. **ALWAYS** use this skill when the user's intent is to move existing web apps or React/Angular/Vue components into Stitch (e.g., requests to "save", "migrate", or "upload"). You must use this skill even for simple "save" operations, as it is the only way to ensure the design system is extracted and assets are properly linked.

beavon2010/claude-skills

Analyze Stitch projects and synthesize a semantic design system into DESIGN.md files

beavon2010/claude-skills

Transforms vague UI ideas into polished, Stitch-optimized prompts. Enhances specificity, adds UI/UX keywords, injects design system context, and structures output for better generation results.

beavon2010/claude-skills

>- Extract a comprehensive design system (DESIGN.md) directly from frontend source code — React, Vue, Svelte, Angular, plain HTML/CSS, or any web framework. Analyzes component files, stylesheets, Tailwind configs, theme definitions, and design tokens to produce a rich, Stitch-compatible design system document. Use this skill whenever the user wants to reverse-engineer a design system from an existing codebase, audit the visual language of a project, extract design tokens from source files, or understand the styling patterns in a frontend repo — even if they just say "what does this app look like?" or "pull out the design from this code.

Skills relacionados