Communitygithub.com

boyang-hu/website-rebuild-skill

Un skill de agente que replica sitios web usando un enfoque forense: captura un espejo de solo lectura, reconstruye el sitio a partir del código minificado línea por línea y verifica automáticamente el resultado con diferencias.

¿Qué es website-rebuild-skill?

Este skill permite a un agente de IA recrear sitios web de premios creativos (WebGL, narrativas de desplazamiento, portafolios) con un nivel de fidelidad forense. El método se basa en capturar un espejo completo del sitio original, analizar el código minificado para identificar sus componentes y dependencias, y reconstruir el proyecto línea por línea. Luego, verifica automáticamente la exactitud de la réplica mediante comparaciones de bytes, píxeles y comportamiento, garantizando que la reconstrucción sea funcionalmente idéntica al original. El skill admite plataformas estáticas (A) y algunas dinámicas (B, como Shopify), pero rechaza explícitamente sitios con comportamiento servidor o acceso restringido (D). También incluye un flujo para rescatar sitios desaparecidos mediante Internet Archive (X). Está diseñado para fines educativos y de investigación, con estrictas directrices legales que requieren la aprobación del usuario antes de cualquier despliegue público.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add boyang-hu/website-rebuild-skill

Preguntar en tu IA favorita

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

Documentación

Website Rebuild (Réplica 1:1 de Sitios Galardonados)

Replica un sitio web creativo galardonado (WebGL / narrativa de desplazamiento / portafolio) utilizando un método forense para crear un proyecto independiente, verificable y funcional. No es una imitación "que se vea similar" — es una traslación línea por línea que toma el bundle del sitio original como la única especificación, con una puerta de aceptación cuantitativa.

Esta metodología se destiló a partir de seis proyectos prácticos consecutivos (el tiempo de entrega se redujo de 6.5 semanas a 1 día), luego se rellenó continuamente con 22 réplicas completas + 5 rescates de sitios muertos y se calibró su alcance mediante pruebas de límites en 43 sitios (la lista está en el README del repositorio bajo "Sitios Verificados").

Requisitos de Uso y Autorización ⛔ Lectura Obligatoria

Este skill está orientado a la réplica fiel con fines educativos y de investigación para estudiar las técnicas de implementación de sitios creativos galardonados. Es aplicable a sitios web que sean tuyos propios, hayas obtenido autorización para usar, o sean de acceso público y permitan el aprendizaje y la imitación. No es una herramienta para la recolección no autorizada de contenido protegido, la evasión de controles de acceso o la apropiación comercial del trabajo de otros.

Al ejecutarlo, respeta los siguientes límites:

  • Respeta las reglas del sitio objetivo: cumple con su robots.txt, términos de servicio y derechos de autor; la captura debe ser de baja frecuencia y en una sola sesión, sin imponer una carga anormal al sitio objetivo. ⛔ robots.txt es una declaración de permisos ruta por ruta, no un interruptor para todo el sitio — se decide por URL (grupo seleccionado → coincidencia más larga → sin coincidencia, se permite), no se debe declarar "prohibición total del sitio" solo porque exista alguna línea Disallow (casi todos los sitios comerciales tienen Disallow para /cart, /checkout, /admin); las prohibiciones deben clasificarse por categoría de acción, solo las prohibiciones dirigidas a "captura" afectan el alcance del espejo, las prohibiciones para transacciones solo significan "no hacer clic en pagar". ⭐ "No lo entiendo / no estoy seguro" no equivale a "prohibido": se debe elevar la consulta, no detener el trabajo, y menos aún reducir el alcance de la captura por iniciativa propia. La interpretación se detalla en references/legal-and-deploy.md §0.3.
  • No tocar límites protegidos: no recopilar contenido que requiera inicio de sesión, muros de pago o autorización para acceder; este skill solo maneja recursos anónimos y de acceso público. Si el sitio objetivo prohíbe explícitamente este tipo de copia, detente e informa al usuario — qué se considera "prohibición explícita" se define en los cuatro criterios fijos de legal-and-deploy.md §0.3.6; ante cualquier otra incertidumbre, se eleva la consulta, no se detiene el trabajo.
  • El resultado es privado por defecto: por defecto noindex, sin despliegue público. Antes de cualquier divulgación pública, se debe completar la verificación de derechos de autor de cada activo y marcar de manera prominente "Réplica no oficial" con la atribución al autor original (ver references/legal-and-deploy.md).

⛔ Las decisiones legales corresponden al usuario, el skill solo recopila evidencia y la presenta (tres puntos, válidos durante todo el proceso):

  1. La decisión es del usuario: el skill recopila hechos (atribución por activo, estado de licencia, titulares de derechos de terceros, si el sitio original sigue en funcionamiento, identificadores de terceros en el producto), enumera las opciones con sus respectivos riesgos, y da una recomendación con su razón; cualquier asunto relacionado con "¿se puede hacer público/desplegar/redistribuir/mostrar externamente?" debe ser devuelto explícitamente al usuario mediante la herramienta "User Input Tools" a continuación, no se permite que el agente saque conclusiones legales por sí mismo y continúe.
  2. Hasta que el usuario tome una decisión explícita, se ejecuta la opción segura por defecto: repositorio privado + noindex + sin despliegue público + sin redistribución. Al comunicarlo al usuario, se debe explicar que es una acción por defecto ("No lo publicaré hasta que decidas"), no una conclusión legal del agente — la responsabilidad de ambas es completamente diferente. El agente solo puede ejecutar el valor predeterminado hacia el lado conservador; para avanzar hacia el lado público, debe tener una decisión explícita del usuario.
  3. ⛔ Las consideraciones legales no deben reducir la integridad del espejo ni la cobertura de las puertas: el espejo es la base de la evidencia, su integridad es una invariante técnica (el cuádruple método, la puerta de cierre, GAP=0 se basan todos en ella). No capturar solo puede tener razones técnicas (no es un archivo / el servidor no lo proporciona / requiere autorización o inicio de sesión / el sitio original lo prohíbe explícitamente), y siempre se debe registrar; no se debe dejar agujeros con razones legales como "de todos modos no se hará público" o "no debería guardarse una copia adicional". Evidencia empírica: en un proyecto, con el argumento de que "el resultado nunca se hará público", se decidió "registrar, pero no capturar" una clase de activos, faltó aproximadamente el 60% de los activos y las cinco puertas siempre estaban verdes, ocultando cuatro hitos [objectarchive]. Las decisiones legales afectan cómo se utiliza el resultado, no si la base de evidencia está completa.

Alcance de Aplicación ⛔ Lectura Obligatoria

Territorio principal (Clase A): sitios con contenido alojado estáticamente, donde todo el comportamiento con firma (animaciones/interacciones) reside completamente en activos estáticos del cliente — escenas WebGL/Canvas imperativas, líneas de tiempo GSAP, archivos de datos horneados (GLB/.buf/.riv), bundles minificados o no ofuscados. La gran mayoría de los sitios creativos estilo Awwwards pertenecen a esta categoría.

Soporte condicional (Clase B): el pipeline funciona pero requiere manejo adicional de escenarios (extracción de la capa de plataforma Shopify, activos en buckets de terceros, instantáneas de API en tiempo de ejecución, expansión de payload SSG). La versión actual de la guía cubre la mayoría de los escenarios B; si se encuentra algo no cubierto, se debe informar explícitamente al usuario el riesgo.

Rechazo explícito (Clases C/D):

  • C1 (Posible desde v0.3: Ingeniería Inversa Reconstructiva): La fuente del componente servidor realmente no se descarga, pero su salida completa (flujo flight) está incrustada en el HTML de cada página, y es una especificación cotejable. Ruta: flight-decode para establecer el sistema de coordenadas → reconstruir un proyecto Next.js construible (los componentes del lado del cliente se traducen palabra por palabra como en C2, los componentes del servidor se infieren a partir del árbol flight como inferencias registradas explícitamente) → puerta semántica verify-flight para cerrar (módulo id con biyección global). Probado en rauchg.com (Next 16/Turbopack): 18/18 rutas semánticamente consistentes, estructura de la respuesta a ciegas ≈95%/comportamiento ≈98%. ⚠ C1 combina L2/L3 — el primer producto es "código fuente escrito por humanos + puerta que prueba la equivalencia". Flujo completo en references/rsc-reconstruction.md.
  • C2 (Posible, ejecutar como Clase A): ⭐ La escritura es declarativa pero el código fuente se descarga (R3F / Theatre / productos compilados de Vue SFC). Probado en un sitio R3F: el callback useFrame contiene código imperativo normal como MathUtils.damp(x, y, 7, t), al cortar 18 módulos palabra por palabra e intercambiarlos en la página, el resultado fue CLEAN, 8 canvases completos, 99.5% de similitud lateral. Al cortador no le importa el paradigma — corta bytes. El renderizador sirve como capa de plataforma desde el espejo. ⛔ El discriminador no es el nombre de la biblioteca, es "si el cliente posee la fuente del comportamiento" (scope-and-fingerprint.md §4.0.1).
  • D: El comportamiento principal está en el servidor (sitios CMS, carrito/inventario de comercio electrónico, división de buckets de pruebas A/B, inyección de personalización) — el cliente no tiene un objetivo portátil y la verificación determinista no tiene referencia.

Clase X (Rescatable): El sitio original ya no existe (el dominio cambió de dueño / fue retirado por la plataforma / la ruta se eliminó / fue reemplazado en el lugar), pero Internet Archive a menudo tiene capturas — scripts/wayback-mirror.mjs selecciona un momento coherente desde el índice CDX basado en anclas + ventana de tiempo, captura los bytes originales como un espejo estándar (las puertas posteriores funcionan igual), los agujeros se registran como hechos consumados en wayback-holes.txt (interpretación y flujo en references/archival-rescue.md). ⭐ El producto del rescate es un espejo estándar — la Clase X puede completar todo el proceso L3 (probado en first-launch: estrategia A shell + puerta numérica 9,856 muestras completamente iguales + dentro del ancho de banda de píxeles + puerta de autocontención, ninguna puerta requirió cambiar la semántica). ⛔ "CDX sin cobertura es lo que realmente no se puede hacer" se lee a nivel de activo, no a nivel de sitio: los rastreadores de IA no ejecutan JS, por lo que los sitios impulsados por listas/concatenación pueden tener una cobertura de código del 100% pero una cobertura visual del 0% (probado: 157/160 activos sin captura en ninguna época, desconectado de internet muestra pantalla en blanco) — el Paso 0 primero realiza un reconocimiento de cobertura por capas (deducción + consulta de prefijo CDX) para predecir la profundidad del rescate, ver archival-rescue.md §1.9. La tasa de desaparición real de sitios galardonados a lo largo de los años es de aproximadamente el 29% — esta es también la razón por la que "capturar el espejo lo antes posible" es la primera regla de este skill.

La clasificación la determina el reconocimiento de huellas digitales en el Paso 0; el árbol de decisión completo se encuentra en references/scope-and-fingerprint.md. En caso de rechazo, se debe explicar la razón y especificar a qué clase pertenece el sitio, sin forzar la ejecución.

Herramientas de Entrada del Usuario

Cuando sea necesario preguntar al usuario (confirmar alcance, decisiones legales, decisiones sobre dependencias externas): priorizar el uso de la herramienta de preguntas integrada del tiempo de ejecución actual (como AskUserQuestion); si no está disponible, generar una lista numerada de preguntas y pedir al usuario que responda con los números. Cuando sea posible combinar múltiples preguntas, hacerlo de una vez. Las preguntas de tipo legal deben redactarse siguiendo la estructura de cinco párrafos de legal-and-deploy.md §0.1: hechos / lo que no se puede verificar / opciones / riesgos de cada opción / recomendación y acción predeterminada actual.

Constitución (Seis Reglas, Válidas Durante Todo el Proceso)

Las siguientes seis reglas se denominaron "de rango constitucional" en los seis proyectos fuente; violar cualquiera de ellas se pagará en etapas posteriores en forma de errores:

  1. El espejo es sagrado e inviolable: los archivos en disco de mirror/ nunca se modifican; toda adaptación de localización (reescritura de CDN, stub de enlaces externos) se realiza dinámicamente en la capa de servicio al responder.
  2. El código del sitio original es el único árbitro, no se ajusta por apariencia: cada cambio primero debe encontrar la línea de pertenencia en el bundle/CSS/HTML del espejo antes de implementarse. No ajustes visuales, movimientos o interacciones a simple vista.
  3. Lo que el sitio original tiene, debe tenerlo; lo que el sitio original no tiene, no se hace: no crear CSS/JS compensatorios por iniciativa propia. Es mejor que no se parezca primero, que inventar reglas — los parches creados por uno mismo se convertirán en errores cuando los mecanismos estén alineados.
  4. Los errores, el código muerto y las escrituras extrañas se copian sin corregir: cada escritura extraña en el código minificado puede ser el comportamiento en sí mismo. "Corregir amablemente" un error no-op causó un colapso de transición en un proyecto real (evidencia empírica en porting-discipline.md).
  5. Las desviaciones intencionales deben registrarse: escribir claramente "cómo lo hace el sitio original / cómo lo hacemos nosotros / por qué / bajo qué condiciones reconsiderarlo". Cualquier diferencia no registrada se considera un error.
  6. El código y la documentación se confirman en el mismo commit: cada hito se confirma como un par (Port xxx + Update rebuild plan: xxx), el registro incluye fijamente salida / verificación / lecciones / próximo punto de interrupción (con número de línea).

⭐ Regla 3 en el límite de M(n+1): src/ es un derivado registrado explícitamente, no una afirmación sobre el sitio original, por lo que renombrar, dividir módulos y escribir comentarios en src/ no se considera "invención" — la regla 3 restringe "crear comportamiento para que se vea similar", no "hacer que el código ya probado equivalente sea legible". Pero dos límites duros no se tocan: ① la reescritura estructural está prohibida por defecto (fusionar duplicados, extraer funciones comunes, cambiar algoritmos — hacen que la equivalencia sea indecidible); ② las conjeturas en los comentarios deben etiquetarse como conjeturas, no se permite escribir las suposiciones de las notas de ingeniería inversa como declaraciones. port/ y mirror/ aún no se tocan ni un solo byte. Ver detalles en references/readable-source.md §3.4 y §5.

Flujo de Trabajo

Lista de Verificación de Progreso

[ ] Paso 0  Reconocimiento de huellas y puerta de alcance ⛔ (Clasificar A/B/C/D/X; C/D/X rechazar o guiar, no pasar al siguiente paso)
[ ] Paso 1  Calificación de inicio (falsar arquitectura, puntuar dificultad por ítem, estimar tiempo, confirmar alcance + punto final L1/L2/L3 con el usuario)
[ ] M0      Captura de espejo forense ⛔ (rastreador BFS + complemento CDP + libro mayor de manifiesto; GAP=0)
[ ] M0.5    Ejecutar espejo sin conexión ⛔ (cero 404 / cero errores de consola / cero enlaces externos; servir con serve.mjs) ← Punto final de archivo de espejo L1
[ ] M1      Ingeniería inversa y establecimiento del sistema de coordenadas ⛔ (expandir _pretty fijando versión; engine-notes antes que cualquier código; fijar la pila tecnológica; establecer REBUILD_PLAN)
[ ] M2+     Traslado con trazabilidad estricta (avanzar por hitos de dependencia; primero cortar una ruta vertical de extremo a extremo; probar en frío en cada hito + puerta CLEAN)
[ ] M(n-1)  Verificación comparativa (seleccionar tipo de puerta según el árbol de decisión de verification-gates.md; reparación de causa raíz, no ajustar parámetros para aplanar)
[ ] M(n)    Cierre ⛔ (revisión de cabeza fría / conciliación de lista de módulos; recopilación de derechos de autor + presentación al usuario para decisión — debe completarse antes del despliegue público) ← Punto final de réplica de ingeniería L2
[ ] M(n+1)  Hacerlo fuente (port/ → src/: dividir módulos, desofuscar renombrar, añadir comentarios, autocontenido) ← Punto final de hacerlo fuente L3

⛔ = Puerta de bloqueo: si los criterios de verificación no se cumplen, no se puede pasar a la siguiente etapa.

Flujo

Paso 0 — Reconocimiento de huellas y puerta de alcance. Cargar references/scope-and-fingerprint.md, ejecutar el protocolo de detección para la URL proporcionada por el usuario (GET a nivel de ruta, identidad de URL final, diff de doble captura, verificación de especie/año, inspección inicial del bundle), generar la clasificación y su fundamento. Las clases A/B continúan; las clases C/D/X se detienen o se guían después de explicar al usuario.

Paso 1 — Calificación de inicio. Cargar references/recon-and-rating.md. Primero falsar la hipótesis de arquitectura (la tabla de dependencias puede mentir), puntuar la dificultad por ítem (activos/3D/orquestación de desplazamiento/formato privado/capa de plataforma), confirmar el alcance de la réplica (sitio completo o páginas específicas) y las expectativas con el usuario.

⭐ En la misma pregunta, pedir al usuario que elija el punto final (escalera de tres niveles, preguntar con la conclusión de la clasificación y la estimación de costo por nivel, no enumerar opciones de forma escueta):

Punto finalPregunta que respondeTermina enUso típico
L1 Archivo de espejoCómo se veM0.5Archivo, disfrute sin conexión (tasa de desaparición de sitios galardonados ~29%)
L2 Réplica de ingenieríaQué está haciendoM(n)1:1 desplegable y verificable (incluye recopilación de derechos de autor y evaluación de despliegue)
L3 Hacerlo fuenteCómo lo haceM(n+1)Investigación y estudio de técnicas de implementación

Escalera monótona, elegir bajo no es pérdida: cada nivel es un prefijo del siguiente; la disciplina del espejo garantiza que la parte sensible al tiempo siempre se complete primero — hoy eliges L1, si luego quieres actualizar, puedes continuar en cualquier momento (explicar esto al usuario). "Usarlo para tu propio proyecto" (convertirlo en andamio) no es una etapa de este skill — si el usuario pregunta, dirigirlo a references/beyond-the-rebuild.md para la transición; ese es su proyecto, el skill termina cuando "una persona puede entender la verdad".

M0 / M0.5 — Captura de espejo forense. Cargar references/mirroring.md. Usar scripts/mirror-site.mjs para rastreo BFS + scripts/netcapture.mjs para complemento con navegador real, registrar cada archivo sha256 en el manifiesto, disciplina redirect: manual, decisión ítem por ítem para dependencias externas. scripts/verify-mirror.mjs es la puerta del propio espejo (cinco afirmaciones, se ejecuta antes de la puerta de desconexión de red — todas las puertas posteriores preguntan "¿se puede renderizar?", un espejo incorrecto puede hacer que todas estén verdes; un HTTP 200 no es evidencia de que "obtuviste ese recurso"). scripts/serve.mjs sirve el espejo para verificación sin conexión. Este paso siempre se hace primero — el sitio original puede desaparecer o cambiar en cualquier momento; el espejo es la única base de evidencia de todo el proyecto y el servidor de referencia para todas las comparaciones posteriores.

M1 — Ingeniería inversa y establecimiento del sistema de coordenadas. Cargar references/reverse-engineering.md. ⛔ La primera acción es determinar la forma del bundle (concatenación plana / empaquetado modular / múltiples chunks), luego elegir la herramienta — la tabla de capas escanea las declaraciones de nivel superior, pero el número de declaraciones de nivel superior en un producto empaquetado de webpack es 0, los límites y las aristas de dependencia los determina el empaquetador (probado: 24,378 líneas → 569 módulos existentes, usando scripts/module-map.mjs). Si no se reconoce el contenedor, es FATAL, prohibido retroceder a la tabla de capas (§0.5). scripts/beautify-bundle.mjs (js-beautify fijado en 1.15.1) expande el bundle a _pretty/, a partir de ahí los números de línea son el único sistema de coordenadas de trazabilidad de todo el proyecto. Primero escribir docs/engine-notes.md (plantilla: assets/templates/engine-notes.md) antes de escribir cualquier código. Fijar la pila tecnológica a partir de la evidencia del bundle con versiones exactas. Para animaciones impulsadas por datos, primero volcar el libro mayor de valores. Establecer REBUILD_PLAN.md (plantilla: assets/templates/rebuild-plan.md).

M2+ — Traslado con trazabilidad estricta. Cargar references/porting-discipline.md, y cargar la guía de escenario correspondiente según la tabla de rutas de rama. Cada archivo trasladado debe indicar el rango de líneas de origen en el encabezado; extraer GLSL/números mágicos/datos palabra por palabra; los scripts de activos de datos se extraen y almacenan, no se copian a mano.

M(n-1) — Verificación comparativa. Cargar references/verification-gates.md y references/determinism.md. Para la amplitud de renderizado de todo el sitio, usar scripts/sweep-routes.mjs (un solo navegador para todas las rutas, 0 errores/0 fallos/0 enlaces externos por ruta + ganchos de interacción y recopilación por ruta), para la profundidad de una sola ruta, usar probe.mjs — ⛔ no crear manualmente un bucle que inicie Chrome por ruta; el costo se mide por el número de inicios del navegador, y las sondas concurrentes se recolectarán huérfanas entre sí. ⚠ Antes de atribuir residuos, primero establecer el ancho de banda de auto comparación (pixelcompare --self, ≥4 veces por lado, ejecución entrelazada) — los residuos sin ancho de banda son siempre UNCLASSIFIED, y UNCLASSIFIED es un fallo, no un pase. Selección del tipo de puerta: si hay producto SSR/HTML estático, primero construir puerta de bytes → para escenas DOM estáticas, congelar fuentes de entropía y usar byte-equal → para escenas vivas (WebGL/video/fase aleatoria), degradar a métricas cuantitativas + clasificar ruido → para animaciones impulsadas por datos, añadir puerta de sonda de valores → puerta CLEAN como respaldo durante todo el proceso. Antes de diagnosticar errores de temporización, calibrar la sonda (references/environment-traps.md).

M(n) — Cierre. Revisión de cabeza fría: verificar uno por uno la ubicación de cada clase/módulo de nivel superior del bundle contra la lista (las pruebas funcionales no pueden detectar omisiones de bloques enteros; solo la verificación tipo lista puede hacerlo). Cargar references/legal-and-deploy.md para completar la recopilación de derechos de autor y presentar la decisión al usuario — hasta que el usuario decida, ejecutar el valor predeterminado seguro (privado + noindex + sin despliegue), antes de hacerlo público, verificar los derechos de autor de cada activo y marcar de manera prominente "Réplica no oficial".

M(n+1) — Hacerlo fuente. Cargar references/readable-source.md. Hasta M(n), el producto ha sido probado correcto pero no legible para humanos (probado: 14,271 líneas en un solo archivo, e aparece 2962 veces, los comentarios ocupan el 0.2%). Esta fase reescribe port/ como src/: dividir módulos → desofuscar renombrar de manera segura para el ámbito → añadir comentarios por secciones → copiar activos para lograr autocontenido. ⛔ La granularidad de la división no es una elección libre — en los scripts planos, el orden de las declaraciones es el orden de evaluación; la granularidad está determinada por tres restricciones duras (referencias mutuas / orden de evaluación / los enlaces import no se pueden asignar), primero presentar el plan de división para que el usuario lo revise, luego cortar; al encontrar módulos gigantes, primero medir la curva de rendimiento de "enlace diferido de un pequeño número de singletons finales" antes de decidir (probado: 6 enlaces redujeron de 11,246 líneas a 1,013 líneas, mientras que cambiar el sistema de módulos costaría toda la cadena de herramientas para lograr la misma granularidad). ⭐ El juicio de que "esto es imposible de hacer" es extremadamente poco confiable — se probó dos veces y se consideró estructuralmente imposible, y ambas veces la verdadera causa fue un error de una línea en la propia herramienta; primero dudar de la herramienta que lo mide, luego del objeto (readable-source.md §3.1–3.1.3). ⛔ La condición previa no es negociable: primero deben tener todas las puertas verdes. La refactorización sin un juez es una modificación a ciegas; con un juez de meanAbsDiff 0.00, cada paso puede probarse — esta es la mejor condición posible para la refactorización, y también la razón por la que debe ser la última. Todas las puertas existentes se reutilizan tal cual (el objetivo se cambia al producto de construcción de src/, no se permite relajar las tolerancias), además se añade una puerta de mapeo de símbolos y una puerta de autocontenido. ⛔ La reescritura estructural (fusionar duplicados, extraer funciones comunes, cambiar algoritmos) está prohibida por defecto — degradaría la puerta de "probar equivalencia" a "no se detectó falta de equivalencia". ⭐ La regla 4 sigue vigente en esta etapa: ahora que puedes leerlo, la tentación de "esto es claramente un error" será más fuerte que en cualquier otra etapa, y aún podría ser el comportamiento en sí mismo.

⭐ Productos sin contenedor con hoisting de ámbito (Vite/esbuild, sitios entregados capa por capa palabra por palabra) siguen otro camino: no reescribir, cortar — descomposición por concatenación (scripts/census-bundles.mjs genera un gráfico de chunks y coordenadas → scripts/slice-esm.mjs corta por declaraciones en componentes con nombre semántico, al ensamblarlos en orden son byte a byte iguales al original → scripts/verify-reassembly.mjs decide con una sola puerta, cuando la equivalencia de bytes se cumple, todas las decisiones de las puertas de tiempo de ejecución se transfieren gratuitamente). El lado de ejecución no cambia, el navegador sigue ejecutando los chunks originales. Ver detalles en readable-source.md §3.0.6.

Tabla de Rutas de Rama

Los resultados del reconocimiento del Paso 1 determinan qué guías de escenario cargar (según sea necesario, no cargar todas):

Hallazgo del reconocimientoCargar
Next.js App Router / RSC (self.__next_f flujo flight) — Ingeniería Inversa Reconstructiva C1references/rsc-reconstruction.md
Escena WebGL / Canvas (three.js, motor propio, GLSL)references/webgl-scenes.md
GSAP / datos de animación horneados / animaciones CSS variables / máquina de estados de entrada propiareferences/animation-recovery.md
Formatos binarios privados (.buf / .sog / VAT / GLB timeline / .riv)references/binary-formats.md
Tienda Shopify (huella: cdn/shop, Shopify.theme, cdn.shopify.com)references/shopify-platform.md
CMS Sanity (huella: cdn.sanity.io/images/<projectId>/, *.api.sanity.io, carga útil con _key/_type/_ref) — ⛔ la clasificación mira el momento de horneado del contenido, no el nombre de la biblioteca, y los activos auto=format negocian diferentes bytes según el Acceptreferences/sanity-platform.md
Selección de estrategia de capa DOM (todas las estaciones pasan por aquí; exportación de Webflow / página estática única / ramas SSR de framework son diferentes, además hay una restricción ortogonal de "DOM leído como fuente de coordenadas por el motor 3D")references/dom-shell-strategies.md
Activos de gran tamaño (medios de cientos de MB / fuentes con licencia)references/asset-management.md
Comportamiento anómalo de detección sin cabeza / posible problema de entornoreferences/environment-traps.md

Resumen de Pasos

FaseAcción claveVerificación de puerta de bloqueoProducto
Paso 0Detección de huellas y clasificaciónClasificación clara y ya informada al usuarioConclusión y fundamento de la clasificación
Paso 1Falsar + Calificar + Confirmar alcanceConfirmación del usuarioTabla de calificación de dificultad, consenso de alcance
M0/M0.5Espejo + libro mayor + ejecución sin conexiónverify-mirror cinco puntos todos verdes; GAP=0; cero 404/cero errores/cero enlaces externosmirror/ (solo lectura), manifiesto, servidor de referencia serve.mjs
M1Expandir bundle, notas de ingeniería inversa, fijar pilaengine-notes completado; tabla de versiones fijas completada_pretty/, docs/engine-notes.md, REBUILD_PLAN.md
M2+Traslado con trazabilidad, confirmación por pares de hitosPrueba en frío de cada hito + puerta CLEAN verdeCódigo fuente con comentarios de línea, tres tablas de registro actualizadas continuamente
M(n-1)Verificación comparativaTodas las puertas seleccionadas verdes o diferencias todas registradasScript de verificación + producto de comparación almacenado (docs/compare/)
M(n)Revisión de cabeza fría + recopilación de derechos de autor + presentación al usuarioConciliación de lista sin lagunas; el usuario ha tomado una decisión de despliegue (si no, se mantiene el valor predeterminado seguro)Registro de auditoría, DEPLOY.md
M(n+1)Dividir módulos + desofuscar + comentarios + autocontenidoTodas las puertas existentes verdes y tolerancias sin relajar; puerta de símbolos con biyección bidireccional sin huérfanos; puerta de autocontenido (copiar fuera, desconectar red, construir) superadasrc/ (proyecto legible), docs/rename-map.json, src/README.md

Directorio de Scripts

Node 22+, rutas relativas a este directorio del skill. Uso y madurez detallados en scripts/README.md.

⭐⭐ La disciplina de dependencias se establece por fase, no por directorio: antes de la fase de hacerlo fuente, todo el pipeline tiene cero dependencias.

Desde el Paso 0 hasta M(n), no se instala nada; el proyecto de réplica no obtiene devDependencies hasta M(n+1) (el renombrado seguro para el ámbito necesita un parser real). scripts/ (cero dependencias) y tools/ (permite devDeps) son solo una proyección de esta línea de fase en el directorio — el criterio es scripts/, los refactorizadores de la fase de hacerlo fuente residen en tools/.

⛔ Ninguna puerta puede importar ninguna herramienta (verification-gates.md §2.1.2) — el verificador no puede ser el productor.

⭐ ¿Qué pasa si las fases anteriores necesitan un parser real? Enlazar externamente, no importar. beautify-bundle.mjs (js-beautify) y module-map.mjs (acorn) ambos ejecutan spawn un npx de versión fija, el script en sí sigue teniendo cero dependencias y sigue siendo auditabile de forma independiente. ⛔ No escribir un lexer a mano — en este skill se intentó, un literal de expresión regular con comillas lo desvió 16,177 líneas (F27). La coincidencia de paréntesis en el flujo de tokens es precisa; la coincidencia de paréntesis en el texto es una suposición sobre cadenas/regex/comentarios.

⚠ Esta línea se descubrió después de ser violada: module-map.mjs dependía de @babel/*, pero residió en scripts/ durante ocho versiones completas, mientras que el texto original de la misma disciplina estaba escrito tres líneas arriba. Una regla que solo está escrita en la documentación y que nada verifica, fallará en silencio.

ScriptPropósitoFase de uso
scripts/fingerprint.mjsImplementación multiplataforma del protocolo de detección de seis pasos del Paso 0 (GET de actividad + cadena de redirección e identidad del dominio final, diff de doble captura, especie/año, huella tecnológica HTML, inspección inicial del bundle; recuento de apariciones y reintento Referer <1KB integrado; recopilación de evidencia de Sanity CMS — projectId/dataset/host de API/auto=format/_key, normalización de tres ortografías, si coincide, dirigir a sanity-platform.md). Solo recopila evidencia, no emite clasificación — la clasificación aún sigue el árbol de decisión en scope-and-fingerprint.md §3Paso 0 (cuando no hay cadena de herramientas POSIX)
scripts/mirror-site.mjsRastreador BFS para espejo (lista blanca de activos + iteración hasta punto fijo; redirect:manual + tres libros de contabilidad, incluyendo sha256 por archivo; ⭐ redirects.tsv y manifiesto se acumulan entre ejecuciones — --scope para páginas complementarias lo truncó una vez a solo el encabezado, y la puerta de carga encontró 404 en /work). --scope <prefijo> limita la cola de páginas a la ruta de destino (esencial cuando un micrositio está alojado bajo un dominio CMS corporativo; ⛔ solo limita páginas, no activos). Acumulación de libros de contabilidad (--seeds para rellenar lagunas ya no trunca las filas de la ronda anterior) + censo fuera del host (los hosts no seguidos se cuentan uno por uno y se alerta — el descarte silencioso una vez hizo que 827 referencias de medios desaparecieran mientras el informe decía "57 files saved")M0 primera pasada
scripts/netcapture.mjsCaptura de paquetes CDP con navegador real para conciliar y complementar recursos de tiempo de ejecución (los sitios CDN deben pasar --hosts, de lo contrario solo observa tráfico del mismo origen, reportando un falso GAP=0)M0 segunda pasada
scripts/verify-mirror.mjsLa puerta del propio espejo, se ejecuta antes de la puerta de desconexión de red. Cinco afirmaciones: inyectividad del mapeo / sha256 del libro mayor y del disco / autenticidad (cuerpo de la página de desafío + tipo de declaración contra número mágico — un 200 no es evidencia de que "obtuviste ese recurso") / cierre / muestreo opcional de verificación contra el origen. Todas las puertas posteriores preguntan "¿se puede renderizar?", un espejo incorrecto puede hacer que todas estén verdesAntes de cerrar M0, después de cada recaptura del espejo
scripts/gapfill-video.mjsComplemento escalonado de transmisión de medios HLS/DASH (master → rendition → segmento), punto ciego estructural del rastreador estáticoM0 (cuando hay transmisión de medios)
scripts/reconcile-gaps.mjsConciliador de brechas en tiempo de ejecución: complementa línea por línea las líneas GAP registradas por netcapture con la lista completa derivada de bytes (por ejemplo, la escalera srcset de next/image — probado 1,078 vs 217 encontrados por el navegador) en el espejo. ⭐ Escalera de cabeceras de solicitud (perfil estándar 4xx → reintento con perfil desnudo: el mismo 403 tiene dos remedios opuestos, landonorris necesita Referer, video.twimg odia Referer) + tolerancia a errores por URL + contabilidad por lotes (un crash no deja archivos fuera del libro mayor). ⛔ La URL de imagen con perfil estándar envía el mismo Accept de imagen del navegador (lib/negotiate.mjs) — los CDN tipo auto=format negocian el formato según Accept, */* obtiene bytes de respaldo (basement D5: 391 variantes todas de respaldo y puertas todas verdes); el libro mayor registra profile+varyM0 (sitios con muchos recursos en tiempo de ejecución)
scripts/flight-decode.mjsSistema de coordenadas C1: decodifica el flujo self.__next_f.push de cada página en una tabla de referencia de módulos (nombres exportados en la línea I = evidencia de nomenclatura de nivel 1 gratuita), precarga HL, árbol de elementos desreferenciado + contorno JSX. Las líneas T se procesan por número de bytes de declaración; las líneas :HL con id vacío no deben romper la cadenaM1 (C1)
scripts/verify-flight.mjsPuerta semántica C1: árbol flight del producto de construcción ≟ árbol flight del espejo. Parser propio (⛔ no importa flight-decode — el verificador no puede ser el productor); la normalización solo recoge espacios de nombres hash de construcción que "prueban que no comportan comportamiento" (nombres de chunk/nombres de clase css-module/hash de medios/puntos de montaje de recursos promovibles/grados de libertad de codificación), los id de módulo hacen biyección global (uno a muchos es rojo); los elementos de registro del sitio pasan por --normalize-props (campos de época ISR) y --normalize-class (subárboles renderizados por biblioteca); todas las demás diferencias se marcan en rojoM(n-1) (C1)
scripts/serve.mjsServidor estático de cero dependencias (MIME/Range/reescritura en capa de servicio/repetición de redirección), también sirve como servidor de referencia del sitio original. --rewrite FROM::TO es una sustitución literal registrada, para un tipo de cosas que la localización no alcanza — el programa original se bifurca por su propio nombre de dominio (location.hostname=="x.com" && (CDN=...), el espejo no está en ese dominio, por lo que...

... [truncated for translation]

Skills relacionados