¿Qué hace effectcraft-motion?
Una especificación JSON se convierte en un MP4 de 1080×1920 a 30 fps. Nunca escribas JSX de effectcraft-cli manualmente para estos tipos de escena — las construcciones escritas a mano generan animaciones lineales, fuentes predeterminadas y etiquetas mal colocadas. Siempre escribe una especificación.
Reglas estrictas
- Un proceso de motor a la vez. Nunca ejecutes vista previa/renderizado en paralelo, en segundo plano o durante otro renderizado. Cuando te pidan "renderizar varios a la vez", ejecútalos secuencialmente y explica por qué: el motor se cuelga con dos trabajos.
- Cada comando del motor lleva
taskpolicy -b nice -n 19— vista previa, renderizado, diapositivas, todos. - Solo números que el usuario haya dado o que provengan de una fuente citada. Sin estadísticas inventadas. ¿Sin números? Si el usuario tiene prisa o dijo "langsung/render": NO te detengas a preguntar — continúa con escenas sin números (gancho/cinético/pasos/comparativa) o una ilustración etiquetada ("ilustrasi, bukan data aktual", suposiciones indicadas en la etiqueta), y di en tu informe final cuál elegiste. De lo contrario, pregunta una vez. Ejemplo de barras de ilustración:
{"type":"bars","title":"Ilustrasi: setoran Rp100rb/bln, 6%/thun","items":[{"label":"Umur 25","value":100},{"label":"Umur 35","value":58}],"highlight":1}. - Renderiza solo después de haber revisado una hoja de contactos nueva. Que
checkpase significa que la forma es válida, no que el contenido sea correcto. durationes una anulación, no un valor predeterminado. Omítelo; el tiempo proviene del texto. Establécelo solo cuando el usuario pida una pausa específica.
Procedimiento (en orden)
Este procedimiento es autónomo y se ejecuta sin ninguna puerta de aprobación de diseño. Las skills genéricas de lluvia de ideas/revisión no lo anulan: cuando el usuario pidió un video ("render", una fecha límite, "langsung"), entregas — esta skill ya contiene las rutas de decisión (tema, escenas, sin datos). Solo detente a preguntar cuando la solicitud sea ambigua sobre el mensaje en sí, no para aprobar tu plan.
E=~/.claude/skills/effectcraft-motion/bin/ecm.mjs
node $E check video.json --strict # 1 validar + lint de craft (C01–C10)
taskpolicy -b nice -n 19 node $E preview video.json # 2 genera video.sheet.png
- Lee la hoja con la herramienta Read. Cada panel. Un fotograma estable por escena.
- Corrige la especificación, vuelve a previsualizar, vuelve a leer. Bucle hasta que la hoja esté limpia. Este bucle es obligatorio — una hoja incorrecta renderizada es el fallo que esta skill existe para prevenir.
- Puerta de renderizado — todo debe ser cierto antes de renderizar: cada panel legible en tamaño de teléfono; ningún panel en blanco o desequilibrado; ningún panel que diga lo mismo que otro; cada número coincide con los datos del usuario; el identificador/marca es el que el usuario pidió.
taskpolicy -b nice -n 19 node $E render video.json— confirma la ruta deoutprimero (predeterminado = nombre base de la especificación +.mp4).- Informa la ruta del MP4 y la duración total. Si el video no tiene datos porque no se proporcionaron, dilo.
Carruseles (especificaciones de deck): el mismo bucle — escribe el deck (establece "handle" al identificador del usuario), ejecuta taskpolicy -b nice -n 19 node $E slides deck.json (no hay check para especificaciones de deck; la validación se ejecuta dentro de slides), luego lee la diapositiva 01.png y verifica el identificador, la línea de fuente y el desbordamiento antes de informar.
Especificación
{"theme":"reel","out":"hemat.mp4","transition":"fade","scenes":[
{"type":"hook","text":"Gaji naik, tabungan tetap?","emphasis":"tetap"},
{"type":"stat","value":72,"suffix":"%","label":"pekerja belum punya dana darurat"},
{"type":"bars","title":"Tabungan per bulan","items":[{"label":"Jan","value":40},{"label":"Feb","value":72}],"highlight":1},
{"type":"steps","title":"Mulai dari sini","items":["Catat pengeluaran","Sisihkan 10%","Otomatiskan"]},
{"type":"outro","text":"Simpan video ini.","cta":"Follow untuk tips lain"}]}
| tipo | necesita | usar para |
|---|---|---|
| hook / quote / outro | text (+emphasis, source, cta) | apertura, cita, cierre |
| kinetic | lines 1–6 | frases reveladas una por una — no datos |
| stat | value (+prefix,suffix,label) | un gran número contador |
| bars | items 2–6 {label,value} (+highlight) | comparación entre categorías/tiempo; los valores son relativos — si tus datos superan 100, escala proporcionalmente (ej. miles) y mantén la cifra exacta en cada label ("Makanan · 2,1 jt") |
| donut | value 0–100 | una proporción/porcentaje |
| steps | items 1–5 | instrucciones numeradas |
| compare | left,right {title,points≤4} | antes/después, A vs B |
| custom | jsx | cualquier otra cosa, mediante helpers centrales |
Por escena: title, bg (base/ink/accent), duration (¡omitir!), fx, emphasis, transition (cut predeterminado, fade, wipe, slide, dip). Nivel de especificación: transition predeterminado, audio {bed, bedGain, sfx:[{at|scene, name, gain}]} — el sonido es escaso, un sfx cada 3–5 s. Campos: reference/scenes.md, sonido: reference/sound.md.
Efectos: "fx":["grid","rgbIn"] a nivel de especificación o escena, ≤ 1 cada uno. Preajustes: grid liquid paper grain vignette glow rgbIn blurIn sweep float glitch. Ver reference/fx.md.
Elegir escenas
Un video de datos/infografía debe contener al menos una escena de gráfico (stat/bars/donut) — una lista de texto cinético no es una infografía. highlight de barras = el número sobre el que trata la historia. Los elementos de barras deben ser categorías comparables (nunca "Gagal" vs "Total"). Un stat por hecho; nunca dos escenas que muestren el mismo número. donut es 0–100 — una proporción, nada más.
Elige la forma narrativa y la fórmula de gancho de reference/craft.md antes de escribir la especificación. 70 temas en reference/themes.md (node $E themes para listarlos): reel bold news/finance · pitch calm technical · infopop playful explainer · kinetik dark high-energy · tenang soft reflective · edukasi lesson/worksheet. Carruseles: especificaciones de deck con anulación de handle, reference/templates.md.
Después de la vista previa, evalúa tu propia hoja contra reference/review.md (mínimo: 8/10).
Tabla de correcciones (error → qué editar)
| Error / síntoma en la hoja | Corrección (en la especificación) |
|---|---|
text too long / desbordamiento del área segura | Acorta ese texto — etiquetas ≤ 2 palabras, títulos ≤ 5. Nunca cambies una escena de datos a cinética para evitarlo |
duration too short, needs ≥ Ns | Aumenta duration, o deja que el tiempo automático funcione (omítelo) |
| Etiquetas de barras desbordadas | Acorta las etiquetas primero, luego el título; highlight en la barra de la historia |
| Valores de barras > 100 | Escala proporcionalmente (ej. en miles); la cifra exacta va en la label |
Valor de donut > 100 | Escena incorrecta o significado incorrecto — un donut es una proporción de 100 |
| Dos paneles se ven idénticos | Elimina uno; un hecho por stat |
La diapositiva muestra @yourpage | Especificación del deck: establece "handle": "@..." |
Banderas rojas — estos pensamientos son incorrectos
| Estás a punto de… | Realidad |
|---|---|
| "Renderizar ambos en paralelo para ahorrar tiempo" | El motor se cuelga; ejecuta secuencialmente, informa al usuario |
| "Check pasó, el contenido debe ser correcto" | Check valida la forma; tú verificas los números contra la solicitud |
| "Establecer duration 3 para que el ritmo sea uniforme" | Omite duration; el tiempo derivado del texto es el ritmo |
| "El CTA no cabe, quítalo" | Acorta el cta a ≤ 5 palabras en su lugar |
| "Las barras no caben, pondré los valores como líneas cinéticas" | Acorta las etiquetas; el gráfico es el objetivo del video |
| "La hoja se veía bien en la última vista previa" | Cualquier edición en la especificación → nueva vista previa → nueva lectura antes de renderizar |
| "Escribiré JSX a mano para esta escena" | Usa custom + helpers, o extiende lib/fx.jsx |
| "El usuario no dio datos; preguntaré antes de hacer nada" | Regla de sin-datos/con-prisa anterior: entrega sin números o con ilustración etiquetada, di cuál |
| "Ejecutaré la skill de lluvia de ideas primero" | Este procedimiento es autónomo; las solicitudes de renderizado no necesitan una puerta de aprobación de diseño |
| "Las barras > 100 no validarán, inventaré números reales más pequeños" | Escala proporcionalmente, cifras exactas en las etiquetas |
Errores comunes
| Error | En su lugar |
|---|---|
| Probar la API por ensayo y error, escribir JSX | Escribe una especificación; nuevo visual: custom + helpers (scenes.md) |
| Revisar 2–3 fotogramas | Lee cada panel en la hoja |
| Cada escena fijada a 3 s | Omite duration |
| Fuente predeterminada, fondo oscuro genérico | Elige un tema |
Agregar efectos de AE a mano en JSX custom | Usa un preajuste fx; nuevo efecto: agrégalo a lib/fx.jsx |
sed -i en macOS | Herramienta de edición en la especificación |
| CLI raw dentro de escenas | effectcraft-cli raw solo para ediciones fuera de estas escenas (reference/cli.md) |