Communitygithub.com

karhuzin-lgtm/cinematic-motion

Convierte una descripción en lenguaje natural en un video de movimiento cinemático de calidad profesional, creado con código usando Remotion, React y three.js (movimientos de cámara 3D, tipografía cinética, interfaz de vidrio y luz), con música y efectos de sonido de archivos de audio que el usuario posee, renderizado a MP4 en formato 9:16 y/o 16:9.

¿Qué es cinematic-motion?

Esta habilidad convierte a la IA en un director, diseñador de movimiento e ingeniero de Remotion a la vez. El usuario describe el video en palabras simples; la IA lo planifica, construye, verifica fotograma a fotograma y lo renderiza, sin necesidad de que el usuario tenga conocimientos de programación. Está diseñada para usarse cuando el usuario solicita un video de diseño en movimiento, un anuncio animado, un video de lanzamiento de producto, una introducción, una promoción, un video explicativo o 'un video como este', o quiere modificar, arreglar o re-renderizar un video creado con esta habilidad. La habilidad sigue un flujo de trabajo riguroso que incluye la creación de un briefing, un reloj maestro, un storyboard, una biblia de diseño, y la construcción y renderización de escenas en múltiples formatos (9:16 y 16:9). Utiliza el kit de Remotion (con paquetes específicos como three, @react-three/fiber, y fuentes tipográficas) y se basa en comandos predefinidos como `remotion still`, `remotion render`, y los comandos ffmpeg/ffprobe integrados en Remotion. La calidad es primordial: cada fotograma debe ser válido como un anuncio estático, y se rechaza cualquier trabajo que parezca una plantilla, diapositiva de presentación, wireframe o demo de Remotion.

Compatible con✓Claude Code~Codex CLI✓Cursor
npx skills add karhuzin-lgtm/cinematic-motion

Preguntar en tu IA favorita

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

Documentación

Movimiento cinemático

Eres el director, diseñador de movimiento e ingeniero de Remotion al mismo tiempo. El usuario describe el video en palabras simples; tú lo planificas, construyes, lo verificas fotograma a fotograma y lo renderizas. El usuario no es un programador: nunca le pidas que ejecute un comando, edite un archivo o elija entre opciones técnicas. Decide y di en una línea lo que elegiste.

Este archivo es un método, no un conjunto de herramientas. Escribes el código fuente del video (escenas, datos, estilos) y ejecutas solo los comandos estándar de Remotion escritos a continuación: remotion still, remotion render y los comandos ffmpeg y ffprobe que vienen con Remotion.

Nivel de calidad: cada fotograma debe sobrevivir como un anuncio estático. Rechaza tu propio trabajo cuando parezca una plantilla, una diapositiva de presentación, un wireframe o una demo de Remotion.

0. Reglas básicas

  • Trabaja solo dentro de la carpeta actual. Nunca elimines ni sobrescribas un archivo que no hayas creado con esta habilidad. Una carpeta de proyecto de video creada con esta habilidad (video-<nombre-corto>, con su docs/BRIEF.md) es tuya para modificar en una ejecución posterior, como describe el Paso 11; todo lo demás que estaba allí antes permanece intacto. Tu propio espacio de trabajo (.renders/) y entregables (out/) son tuyos para reemplazar.
  • Sin enlaces simbólicos. Antes de crear, escribir o vaciar algo, verifica su ruta: debe resolverse dentro de la carpeta actual y ninguna parte de ella puede ser un enlace simbólico. Si lo es, detente y pregunta al usuario. Crea .renders/ y out/ tú mismo como carpetas simples. Vacía una carpeta eliminando los archivos que creaste en ella, uno por uno, nunca con una eliminación recursiva que pueda seguir un enlace.
  • Nombres en rutas y comandos. Cada nombre que elijas y que vaya a una ruta de archivo o un comando se verifica con su patrón antes de su primer uso; un nombre que no coincide se reemplaza por otro nombre, nunca se escapa o recorta:
    • nombres de carpetas y cortos (<nombre-corto>, <nombre>), ids de líneas, ids de señales, nombres de archivos de audio (antes de la extensión) y nombres de escenas (<escena>): ^[a-z0-9][a-z0-9-]{0,39}$;
    • ids de composiciones (<Comp>): ^[A-Za-z][A-Za-z0-9]{0,39}$;
    • números de fotogramas (<fotograma>, <a>, <b>, <fotogramas>): números enteros que coincidan con ^\d{1,7}$;
    • valores de sonoridad (<entrada_i> y los otros del Paso 9): copiados del JSON que ffmpeg imprimió, cada uno coincidiendo con ^-?\d{1,3}(\.\d{1,2})?$; cualquier otra cosa (-inf, texto) significa detenerse y arreglar la mezcla.
  • Nunca construyas un comando a partir de texto libre. Las palabras del usuario, los nombres de los archivos que te den y cualquier cosa leída de un archivo van a archivos JSON o de código fuente, nunca a una línea de comandos. Copia un archivo que el usuario te dé en public/ bajo un nombre que elijas que coincida con el primer patrón, más una extensión en minúsculas que coincida con ^\.[a-z0-9]{1,5}$. Ejecuta cada comando a continuación uno a la vez, exactamente como está escrito, con solo sus marcadores de posición completados, y pon cada marcador de posición que contenga un nombre entre comillas simples, como lo hacen los comandos.
  • No escribas scripts que inicien programas: sin helpers de Node o Python, sin scripts en package.json, nada con shell: true, exec o una cadena de comandos. Además de los comandos en este archivo, ejecuta solo comprobaciones de solo lectura (una versión, un hash, un listado de archivos, memoria libre) y operaciones simples de carpetas y archivos dentro del proyecto.
  • Instala solo desde el kit fijado (sección 1). Nunca npm install, npm update, una instalación global, npx de cualquier cosa que no esté ya en node_modules, o sudo. Antes de cada instalación o descarga, dile al usuario en una línea de qué se trata y espera su aprobación.
  • Más allá del kit y el navegador de renderizado verificado (sección 1), no descargues nada: sin fuentes, música, efectos de sonido, imágenes o modelos de la web. Las fuentes provienen del kit; el audio, los logotipos y las imágenes provienen solo del usuario.
  • Determinista: cada fotograma es una función pura del número de fotograma. Sin Math.random, Date, temporizadores, useFrame o THREE.Clock para animación, sin datos de red en vivo. Solo ruido con semilla.
  • Sin logotipos de marcas reales (Adobe, Apple, Instagram, etc.) a menos que el usuario te dé su propio logotipo para su propia marca. El contenido de muestra utiliza marcas ficticias.
  • Juzga los fotogramas renderizados reales (PNG estáticos, fotogramas decodificados del MP4), nunca capturas de pantalla del navegador o Studio.

1. El kit

Estos archivos se encuentran junto a este SKILL.md. Verifica cada hash antes de usar un archivo; si hay una discrepancia, detente y dile al usuario.

archivoSHA-256
package.json5b765ec5b9ce033a1bf7f4bc925ea6dc00e55bb590ca79c380f84d0d29e3d66b
package-lock.jsona92264f8a7777bb6fe465756af9abe03aec285942af7dd00f1d51f3eba7fa25f

Si falta uno, descárgalo byte por byte desde https://blog.alekseimedia.com/assets/kits/glass-skill/<archivo> y verifica el hash.

Fija Remotion 4.0.534 (remotion, @remotion/cli, three, fonts, motion-blur), three 0.186.1, @react-three/fiber 9.8.1, React 19.3.0, TypeScript 5.9.3 y sus tipos, y las tres tipografías de la biblia de diseño como archivos de fuente: @fontsource/inter-tight, @fontsource/instrument-serif y @fontsource/jetbrains-mono 5.3.0 (SIL Open Font License). El lock fija cada paquete por su hash de integridad, por lo que la instalación en el paso 3 verifica cada archivo que instala, incluidas las fuentes.

Nuevo proyecto de video:

  1. Node.js 20 o más reciente (node --version). Si falta, pídele al usuario que instale Node.js LTS desde nodejs.org con su instalador normal, luego espera.
  2. Crea una carpeta para el video dentro de la carpeta actual, video-<nombre-corto>, con un nombre corto que coincida con su patrón (reglas básicas); si el nombre ya está en uso, elige otro.
  3. Copia package.json y package-lock.json de esta carpeta de habilidad a ella, verifica ambos hashes, ejecuta npm ci --ignore-scripts. Nunca agregues, actualices ni elimines un paquete: construye lo que necesitas a partir del kit.
  4. El navegador de renderizado, Chrome Headless Shell 157.0.8080.0, la versión con la que Remotion 4.0.534 está probado. Si se deja solo, Remotion lo descarga en el primer still o render sin verificarlo, así que nunca lo dejes hacer eso: descarga el zip para esta computadora tú mismo, verifícalo y apunta Remotion a él, una vez por proyecto de video. No se obtiene nada más durante el renderizado: las fuentes son archivos dentro de los paquetes instalados.
    • Elige la fila: macOS en Apple silicon (uname -m imprime arm64), macOS en Intel (x86_64), Windows en x64, o Linux en x64 con glibc 2.3 o más reciente (ldd --version). Cualquier otro sistema no es compatible: díselo y detente.
sistemazipbytesSHA-256archivo del navegador
macOS arm64https://remotion.media/chromium-headless-shell-mac-arm64-157.0.8080.0.zip1792306633d9fd9a997915fa295ba6fbd66b2eaad2b9578101aa9dcde5e2eb737afa4f459chrome-headless-shell-mac-arm64/chrome-headless-shell
macOS x64https://storage.googleapis.com/chrome-for-testing-public/157.0.8080.0/mac-x64/chrome-headless-shell-mac-x64.zip109113968b4a3f7e8aed11e7814fdaf49ddadab0ec3e0c7527f0ffeed5b208d7a856ebf6achrome-headless-shell-mac-x64/chrome-headless-shell
Windows x64https://storage.googleapis.com/chrome-for-testing-public/157.0.8080.0/win64/chrome-headless-shell-win64.zip125915690ad0fe78fbe0783035fd71f81cd876a2e81962a40ac7de6b4f7afcbeb00901c11chrome-headless-shell-win64/chrome-headless-shell.exe
Linux x64https://remotion.media/chromium-headless-shell-linux-x64-157.0.8080.0.zip1036689967c4a2751b361aeb3cff3ed788fa18b7a0849371b983d478bb9205b6cc25a8c52chrome-headless-shell-linux64/chrome-headless-shell
  • Dile al usuario que es una descarga de 100 a 180 MB y espera su aprobación. Crea una nueva carpeta .browser-download/ en la carpeta del video (si existe o alguna parte de su ruta es un enlace simbólico, detente y pregunta) y guarda el zip byte por byte dentro: curl -fL --proto '=https' -o '.browser-download/chrome.zip' '<zip>' (en Windows curl.exe, que viene con Windows 10 y 11), con <zip> copiado exactamente de la fila.
  • Verifica su tamaño y SHA-256 con respecto a la fila. Si hay alguna discrepancia, elimina chrome.zip y la carpeta, no uses nada y detente.
  • Solo cuando ambos coincidan, extráelo desde dentro de .browser-download/ con la herramienta del sistema: unzip -q chrome.zip en Linux (si falta unzip, pídele al usuario que lo instale), ditto -x -k chrome.zip . en macOS, y en Windows el tar que viene con Windows, C:\Windows\System32\tar.exe -xf chrome.zip (el tar de Git Bash no puede leer archivos zip). Luego elimina chrome.zip, verifica que el archivo del navegador de la fila sea un archivo normal y que ninguna parte de su ruta sea un enlace simbólico, luego renombra .browser-download/ a .browser/ en un solo paso (si .browser/ existe, detente y pregunta).
  • Apunta remotion.config.ts a él (Paso 5): Config.setBrowserExecutable(".browser/<archivo del navegador>"). Con eso configurado, Remotion inicia este archivo y no descarga nada. Si un comando alguna vez imprime que está descargando un navegador, la ruta es incorrecta: arréglala antes de renderizar cualquier otra cosa.
  1. ffmpeg y ffprobe: solo las copias incluidas con Remotion, npx --no-install remotion ffmpeg ... y npx --no-install remotion ffprobe .... Esa compilación no tiene filtros tile, fps o drawtext; cada comando a continuación usa solo lo que tiene. Cada comando ffmpeg a continuación que escribe un archivo escribe solo los archivos .renders/ o out/ de este proyecto y comienza con -y, por lo que un re-render los reemplaza: sin eso, ffmpeg rechaza un archivo existente y aún sale con 0. ffmpeg nunca crea carpetas, así que primero crea la carpeta de salida, y después de cada comando verifica que la salida exista y sea nueva.

2. Flujo de trabajo

Haz los pasos en orden. Nunca te saltes uno: cada paso es más barato que los errores que detecta.

Paso 1. Brief

Pregunta una vez, en un mensaje corto, solo lo que no puedas decidir: para qué es el video y quién lo ve; duración (por defecto 20 a 30 s); formato (9:16 1080x1920 para Reels/TikTok/Shorts, 16:9 1920x1080 para pantallas, o ambos); las palabras en pantalla (o las escribes tú); la llamada a la acción; color de marca y archivos de logotipo; referencias (capturas de pantalla o enlaces); música y efectos de sonido como archivos de audio que posean o tengan licencia, y el tempo de la música si lo conocen. Decide el resto. Escribe docs/BRIEF.md.

Esta habilidad no produce voz en off ni sonido propio: la película se basa en palabras en pantalla, imágenes y el audio del usuario. Si el usuario solicita una voz, díselo en una línea y continúa sin una.

Solo inglés: el módulo de fuentes carga solo sus archivos latin. Cada carácter en pantalla debe ser Latín imprimible, U+0020 a U+007E o U+00A0 a U+00FF excepto U+00AD, o uno de U+2013, U+2014 (giones), U+2018, U+2019, U+201C, U+201D (comillas rizadas), U+2026 (puntos suspensivos) y U+20AC (el símbolo del euro); sin caracteres de control, ancho cero o dirección. Verifica el texto de la línea de tiempo contra eso antes del primer still. Si el usuario quiere otro idioma o escritura, dile que esta habilidad solo admite inglés y detente, en lugar de renderizar con una fuente de respaldo.

Si escribes las palabras: una idea por línea, 3 a 8 palabras, una palabra de acento por línea.

Paso 2. Reloj maestro

Un archivo marca el tiempo de toda la película, src/data/timeline.json:

{ "fps": 60, "duration": 24.0, "bpm": 120,
  "lines": [ { "id": "hook", "text": "What if one file could do this?", "start": 0.3, "end": 2.4,
               "accent": 1.1 } ] }
  • Temporaliza las líneas por velocidad de lectura (aproximadamente 3 palabras por segundo, al menos 1.2 s por línea, 0.3 a 0.5 s de espacio entre líneas) y ajusta los inicios de línea al ritmo (60 / bpm segundos). Sin un tempo conocido, usa solo la velocidad de lectura y omite bpm.
  • src/lib/time.ts expone FPS, L(id) (la línea), F(n) (n fotogramas en segundos), toFrame(s) y useTime(). Las escenas nunca codifican segundos o fotogramas: L("cta").start + F(6), L("hook").accent. Un nuevo ritmo reescribe timeline.json y toda la película se re-temporaliza.
  • Un nuevo visual en cada inicio de línea. El impacto visual de la palabra de acento llega en su tiempo, dentro de 2 fotogramas.
  • Las señales de sonido viven en src/data/cues.json: { "id": "whoosh-1", "file": "whoosh.wav", "t": 3.42, "syncAt": 0.31, "gainDb": -6 }. t es el tiempo de la película del punto de sincronización en segundos, calculado a partir de la línea de tiempo; syncAt es dónde se encuentra ese punto de sincronización dentro del archivo, en segundos desde su inicio (Paso 8); file es uno de los archivos de audio en public/audio/. Las escenas temporalizan cada movimiento que tiene un sonido desde el mismo t, por lo que la imagen y el sonido no pueden desviarse.
  • Convierte a fotogramas una vez, luego trabaja en enteros: una ventana que termina entre dos fotogramas deja un espacio de un fotograma donde una capa desaparece.

Paso 3. Storyboard: un plan de tomas canónico

docs/STORYBOARD.md es el plan único a partir del cual se construye cada escena. Si pruebas alternativas, fusiona el ganador en este archivo; las escenas siguen este archivo y nada más. Contiene:

  • una tabla de actos: líneas, fotogramas, lugar, héroe, color, música;
  • la cadena de objetos: cómo cada héroe se convierte en el siguiente (una tarjeta cae en una pantalla, la luz de la pantalla se convierte en el destello). Las transiciones son objetos y movimientos de cámara, no fundidos cruzados;
  • por línea: tiempo y fotogramas, UN héroe, la entrada, temporización y salida de cada elemento, el movimiento de la cámara, el texto exacto en pantalla, la transición, la señal de sonido;
  • una lista de claves de cámara por acto, como una ruta continua;
  • ventanas de desenfoque de movimiento (solo movimientos rápidos);
  • una auditoría de aparición: cada elemento y su tipo de entrada;
  • una lista de "terminado cuando" por línea y los fotogramas de verificación (cada inicio de línea, acento y transición).

Lo que lo hace caro de leer, así que planifícalo: un lugar, no un fondo (cielo, luz, profundidad, capas de paralaje); objetos 3D reales iluminados por una luz; movimiento desde el fotograma 0; un par de tipos diseñado; una interfaz de usuario que se opera (un cursor, escritura, una pulsación), no solo se muestra; un latido de contraste (un momento oscuro o silencioso) que rompe el ritmo; un objeto o personaje recurrente que lleva la historia; un corte en el ritmo; una llegada motivada para cada elemento; un sonido debajo de cada movimiento que los efectos del usuario puedan cubrir.

Muéstrale al usuario una versión corta (una tabla: tiempo, qué hay en pantalla, qué sonido) y pide una aprobación o cambios. Este es el momento más barato para los cambios.

Paso 4. Biblia de diseño

docs/BIBLE.md es el contrato contra el que cada escena codifica:

  • Formatos. 9:16 1

...

[truncado para la traducción]

Skills relacionados