¿Qué hace one-take?
Pregunta todo una vez. Luego haz toda la película, cada formato, revisada, sin más preguntas.
Este skill orquesta; HyperFrames hace el renderizado. Necesita los skills de HyperFrames (hyperframes, hyperframes-core, hyperframes-animation) y es mejor con hyperframes-registry, hyperframes-keyframes, media-use, figma y humanizer. Si falta hyperframes-core, detente y da la línea de instalación: npx skills add heygen-com/hyperframes.
SKILL_DIR a continuación significa la carpeta de este skill. Los scripts son Node plano (≥ 22) más ffmpeg, sin instalaciones.
El contrato
- Una única ronda de ingesta. Detecta primero, luego pregunta una vez (Fase 1). Después de las respuestas, no preguntes nada más. La única excepción es un bloqueo duro que no puedas sortear por defecto, como un archivo que no existe o un sitio que se niega a cargar. Entonces haz esa única pregunta exacta y continúa.
- La respuesta de ingesta autoriza los renders. No autoriza publicar, subir, publicar, enviar ni descargar nada que el usuario no haya nombrado. Pide eso por separado, después del informe.
- Los hechos se calculan, nunca se escriben. Cada número en pantalla proviene de
facts.jsono de una fuente que el usuario haya proporcionado. Nunca inventes estadísticas, citas, logotipos o testimonios. - La imagen escribe el sonido. Cada movimiento que deba ser escuchado llama a
T.cue()en el momento en que ocurre. La partitura se construye a partir de esas señales, por lo que el sonido y la imagen no pueden desincronizarse. - Hecho significa que ha pasado el QA. Un archivo se entrega cuando
qa.mjslo aprueba, o cuando se escribe un fallo en el informe con el motivo por el que no se pudo corregir en dos pasadas.
Fase 0: detectar (silencioso, antes de preguntar)
node SKILL_DIR/scripts/detect.mjs <rutas de fuentes…> --out /tmp/one-take-detect.json
- Ejecútalo en el repositorio actual y en cualquier ruta o sitio que el usuario haya mencionado.
- Devuelve, por fuente: título y eslogan del README, período de git y número de commits, logotipos, archivos de fuentes y familias, tokens de color. También devuelve el toolchain: node, ffmpeg, versión de
hyperframesen caché, Chrome, CLI de heygen, y si las claves de la API de música están configuradas. - Si
take.jsonya existe en el proyecto de destino, se trata de una reanudación. Lée, omite la ingesta y continúa desde la primera fase cuya salida falte.
Fase 1: la ingesta (un mensaje, una ronda)
Lee references/intake.md. En un mensaje:
-
Muestra la hoja de ingesta: cada campo pre-rellenado a partir de la detección o un valor por defecto recomendado, cada uno en una línea. El usuario solo cambia lo que está mal.
-
Llama a AskUserQuestion una vez con las cuatro decisiones que más cambian el trabajo: formatos (selección múltiple), duración, sonido y voz/subtítulos. El texto de la pregunta les indica que añadan cualquier cambio en la hoja como una nota en cualquier respuesta.
Si AskUserQuestion no está disponible, pon las mismas cuatro como opciones numeradas al final de la hoja y pide una respuesta.
Luego, sin preguntar de nuevo:
- Escribe
take.json(esquema:references/take-json.md). Los códigos de idioma, los identificadores de formato, el slug youtput.namedeben coincidir con[a-z0-9][a-z0-9._-]{0,63}(cualquier mayúscula/minúscula, sin..), o la ejecución se detiene. Deja fuerahyperframesa menos que el usuario lo pida: la versión por defecto está fijada enscripts/lib/platforms.mjs(HF_VERSION, 0.8.223). - Escribe un
BRIEF.mdde HyperFrames conworkflow: general-video,flow: automation,storyboard: no. Esto significa que una futura llamada a/hyperframesreanudará este proyecto en lugar de volver a entrevistar. - Graba las respuestas en el cuerpo de BRIEF.md: formatos, sonido, subtítulos, límites de plataforma.
Fase 2: fuentes
- Hechos de Git. Ejecuta
node SKILL_DIR/scripts/facts.mjs --repo <ruta> [--repo …] [--since …] --out <proyecto>/facts.json. Recoge commits, período, días activos, racha más larga, día más ocupado, líneas por lenguaje, líneas añadidas y eliminadas, y las palabras principales de los commits, además del asunto del primer y último commit. Los nombres y correos de los autores nunca se registran. Usa solo los hechos que el usuario haya permitido. - Sitios. Para una URL que mostrar, ejecuta
npx hyperframes capture <url> -o <proyecto>/src/assets/cap. Detente siok:falseoBLOCKED.md: eso es un bloqueador. - Referencias. Para cada una, escribe una línea en STORYBOARD.md sobre lo que tomas de ella: ritmo, tipo, color, una transición. Para un enlace de Figma, ejecuta
/figmaprimero. - Marca. Copia el logotipo SVG y los archivos de fuentes en
src/assets/brandysrc/assets/fonts, decláralos entake.jsonfonts, y extrae los tokens de color en el:rootde la plantilla.
Fase 3: dirección y storyboard
Lee references/direction.md antes de escribir nada visual. Escribe STORYBOARD.md:
- Dirección, un párrafo: la idea única, el movimiento característico, la combinación de tipos, la paleta, la referencia de la que proviene cada elección.
- Tempo primero. Elige el bpm para que la duración objetivo sea un número entero de compases (4/4). Luego da a cada escena una duración en compases, una
energía(0–1, que impulsa el arreglo de la partitura), y cómo entra (in). - Tabla de escenas: id, compases, energía, qué hay en pantalla, movimiento, señales, texto.
- La última escena es la tarjeta final,
end: true, con suficientes compases para mantenerla completa durante 3 s o más. - Marca las escenas que puedan ir en un corte como
optional(1–9, el más alto va primero).
- La última escena es la tarjeta final,
- Texto va en
copy/<idioma>.json, una clave por línea de texto. Ejecútalo con/humanizersi está disponible. Mantén los titulares lo suficientemente cortos como para leerlos dos veces durante el tiempo que están en pantalla.
Fase 4: construir
- Copia
SKILL_DIR/templates/index.htmla<proyecto>/src/index.htmly reescribe sus escenas a partir del storyboard. - Lee
references/kit.md(la APIT.*) y las reglas no negociables dehyperframes-core. Para movimiento, lee las reglas y los planos dehyperframes-animation. Antes de construir manualmente cualquier efecto con nombre, busca enhyperframes-registry.
Reglas que mantienen honestos a todos los formatos y al QA:
- Las escenas son
<section class="clip scene" data-scene="id">de nivel superior, nunca anidadas, nunca constyleen línea. - Tamaño en píxeles de diseño a través de
--u(1% del lado corto). El texto legible nunca está por debajo de--t-min(3.4u ≈ 37 px a 1080). - Mantén el texto legible dentro de
.safe, las bandas de la interfaz de usuario de la plataforma para ese formato. - Reorganiza por formato con reglas
.f-tall,.f-wide,.f-square,.f-portrait, no escalando un solo diseño. - Limpia las palabras de una escena antes de que la transición de la siguiente escena las cubra (
T.sink/T.leavecerca des.end). El texto bajo una revelación falla la verificación de diseño. - Cada escena se mueve:
T.driftla cámara a través de ella. Nada se queda quieto antes de la tarjeta final. T.endCard(t)en el momento en que la tarjeta final está completa. El último fotograma debe seguir mostrándola: sin fundido a negro durante la pausa.- Señala todo lo que deba escucharse (
references/sound.mdenumera las categorías). La mayoría de los helpers del kit señalan por defecto; pasacue: falsepara mantener un momento en silencio. - Los números provienen de
T.factso del texto.T.countnecesita un número finito y lanza un error sin uno, por lo que un hecho faltante detiene la sonda en lugar de poner un número inventado en pantalla. - Termina el script con
window.__timelines["main"] = T.done();.T.done()registra la línea de tiempo una vez, después de que se haya añadido cada interpolación, y la plantilla la repite en esa línea. Construye todas las interpolaciones primero, no dentro de una fuente lista u otra devolución de llamada asíncrona: la verificación de HyperFrames rechaza un registro temprano.
Fase 5: pasada de borrador
node SKILL_DIR/scripts/run.mjs <proyecto> --draft
Esto ejecuta, por formato × idioma: construir → sondear (señales, tamaños de texto, marca de tarjeta final desde Chrome sin cabeza) → partitura → hyperframes check → renderizado de borrador → codificar → QA → REPORT.md.
HyperFrames se ejecuta en la versión fijada como HF_VERSION en scripts/lib/platforms.mjs (0.8.223), o en hyperframes de take.json. La primera ejecución lo obtiene con npx, y la construcción obtiene GSAP 3.14.2 una vez desde jsDelivr en ~/.cache/one-take/. El archivo GSAP se verifica contra un sha256 fijado después de la descarga y cada vez que se lee desde la caché. Un archivo que no coincide nunca se utiliza: una descarga incorrecta no se almacena en caché, y un archivo en caché incorrecto se elimina y la construcción se detiene. Ejecútalo de nuevo para obtener una copia nueva.
Luego:
- Abre cada hoja de contactos
*.sheet.jpgy mírala. - Lee
REPORT.md. - Corrige los fallos y cualquier cosa que parezca incorrecta: superposiciones, recortes, fotogramas muertos, texto demasiado pequeño, un corte que no encaja.
Hay como máximo dos pasadas de corrección. Cada una reejecuta run.mjs --draft; usa --only <formato>-<idioma> para reejecutar solo lo que cambió.
Fase 6: final
node SKILL_DIR/scripts/run.mjs <proyecto>
Este es el renderizado de calidad completa de cada salida. Los entregables caen en renders/ (o output.dir). Cada salida obtiene:
<nombre>.mp4: x264 CRF 12, AAC 320k, faststart.cover.jpg: la tarjeta final.sheet.jpg.qa.json
Las pistas de la partitura y marks.json se guardan en out/<formato>-<idioma>/score/.
Fase 7: informe
Responde con:
- la tabla de salidas de
REPORT.md(archivo, tamaño, duración, veredicto) - la hoja de contactos del formato principal
- una línea sobre el sonido
- elementos pendientes, si los hay
Ofrece los siguientes pasos sin hacerlos: publicar texto, más idiomas, un corte, publicación. Nada se publica ni se envía a menos que el usuario lo pida.
Modos de sonido
sound.mode | Qué sucede |
|---|---|
score (predeterminado) | score.mjs sintetiza cama, banda y batería a partir de las energías de la escena en la cuadrícula de compases: plan de acordes de mood y key, sidechained al bombo, elevadores en cada subida, un impacto en cada llegada. La pista de efectos se construye a partir de las señales, sintonizada con el acorde debajo de cada una y paneada desde donde ocurre en pantalla. Mezclada, limitada, luego loudnorm de dos pasadas a lufs (predeterminado −14) con pico verdadero −1.5. Original, por lo que no hay nada que licenciar. |
track | El archivo del usuario. Obtén bpm y el primer tiempo con score.mjs --analyze <archivo> (o npx hyperframes beats), establece bpm con ese valor y coloca las escenas en sus compases. La pista de efectos se reproduce encima. |
library | /media-use resolve --type bgm (necesita la CLI de heygen) o sus generadores. El resultado se usa como track, y su licencia se registra en sound.licence. |
none | Sin elemento de audio en absoluto. |
Para una voz en off, colócala en src/assets/audio/vo.wav, desde Kokoro a través de npx hyperframes tts o la grabación del usuario. La partitura talla la música debajo de ella (duckDb, predeterminado −9). Para subtítulos, tempórizalos desde npx hyperframes transcribe vo.wav --model <modelo>. Los subtítulos quemados son texto de escena colocado dentro de .safe en --t-cap o más grande. Para subtítulos sidecar, escribe <nombre>.srt desde la misma transcripción junto a cada salida.
Archivos
scripts/detect.mjs,facts.mjs: qué hay, y los númerosscripts/build.mjs: una fuente → proyectos HyperFrames enout/<formato>-<idioma>/. Rellena tamaños, bandas seguras y tiempos de escena, en líneaTAKE(texto, hechos, escenas), agrega el kit y GSAP 3.14.2 (verificado con sha256), elimina escenas para cortesscripts/probe.mjs: pasada de Chrome sin cabeza que lee señales, tamaños y posiciones de texto a lo largo del tiempo, y marcasscripts/score.mjs: partitura sintética, pistas, mezcla, master,marks.json;--analyzepara el tempo de una pistascripts/encode.mjs,qa.mjs,report.mjs,run.mjs: entrega, comprobaciones, informe y la ejecución completascripts/selftest.mjs: comprueba el toolchain, luego prueba que QA falle un archivo construido para fallarscripts/lib/: ayudantes compartidos (git, plataformas conHF_VERSIONy la comprobación de nombre, WAV, DSP)kit/take.js: el kit de movimiento (references/kit.md)templates/index.html: el escenario inicialreferences/:intake.md,take-json.md,direction.md,sound.md,formats.md,qa.md,kit.md