Communitygithub.com

Sticky Director

Directa y exporta cortometrajes mudos y emocionales con personajes animados en chándal, usando fotos locales y música, a través de herramientas MCP o CLI.

¿Qué es Sticky Director?

Sticky Director es un motor de animación y cine mudo que permite a los agentes de IA dirigir cortometrajes emocionales. El sistema utiliza un personaje de silueta negra con sudadera gris, que actúa frente a fotos locales (como imágenes de Google Flow) con música, sonido ambiental, movimientos de cámara y subtítulos. Se controla mediante herramientas MCP (registradas en `.mcp.json` como `sticky-studio`) o mediante CLI (`node cli.js ...`). Soporta múltiples escenas, emociones (10), gestos (18), transiciones, fondos de fotos importados, y exportación a MP4 (60 fps H.264 + AAC). Es ideal para historias sobre soledad, ansiedad social, agotamiento o disciplina, con un flujo de trabajo que va desde la inspección visual hasta la exportación final. El usuario puede cargar música, importar fotos, construir un storyboard, ajustar escenas y renderizar el video final, todo desde un solo conjunto de comandos MCP o CLI.

Compatible con~Claude Code~Codex CLI~Cursor✓Antigravity
npx skills add https://github.com/sijanpaudel6-hash/stickyman/tree/HEAD/.agent/skills/sticky-director

Preguntar en tu IA favorita

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

Documentación

Sticky Director — Manual del Director de Cine IA

Este repositorio es un motor de animación y cine mudo local. Un personaje de silueta negra con sudadera gris actúa frente a fotos (por ejemplo, imágenes de Google Flow), con música, sonido ambiental, movimientos de cámara y subtítulos. Lo diriges a través de herramientas MCP (.mcp.json registra sticky-studio → node mcp-server.js) o mediante la CLI (node cli.js …). Ambos inician server.js automáticamente, y las acciones de canvas abren el estudio (Chromium sin cabeza cuando no hay pantalla).

Siempre usa rutas de archivo absolutas. Cada ID a continuación se valida. Los valores desconocidos vuelven como warnings y no se aplican, así que lee las advertencias.

Ejecutando desde Antigravity: si las herramientas MCP de sticky-studio no están disponibles, usa la CLI desde la raíz del repositorio. Cada herramienta MCP tiene un gemelo CLI (tabla más abajo); node cli.js snapshot <t> <abs.png> escribe un PNG que puedes abrir con visión. Todos los comandos inician el servidor del estudio automáticamente.


Herramientas (MCP) ↔ CLI

Herramienta MCPCLIQué hace
sticky_statusnode cli.js statusModo, aspecto, duración, BPM / número de pulsos, pestaña conectada, lista de escenas
sticky_get_projectnode cli.js get-project [out.json]Proyecto completo en formato plano de agente (escenas, fxMarkers, mediaCards, audio.beats/strongBeats, fondos + lightProfile)
sticky_load_audionode cli.js load-audio <path> --mode silentCarga música/voz → {duration, bpm, beats[], strongBeats[]}
sticky_import_photosnode cli.js import-photos <p1> <p2> … [--auto-build]Registra fotos → [{bgId, name, path, width, height, lightProfile}]
sticky_apply_templatenode cli.js template <id> [--no-photos]Carga un storyboard de cine mudo ajustado al audio y las fotos
sticky_set_projectnode cli.js set-project <file.json | '{…}'>Envía un storyboard completo o parcial (solo se aplican las claves que envías)
sticky_update_scenenode cli.js update-scene <index|id> '{…}'Parchea una escena
sticky_split_scenenode cli.js split <timeSec> [--no-snap]Divide en un tiempo, ajustando al pulso más cercano (±0.35 s)
sticky_add_fxnode cli.js add-fx <type> <timeSec> [--duration s]Golpe de cámara / SFX / card
sticky_render_framenode cli.js snapshot <timeSec> [out.png]Fotograma exacto como PNG (MCP también lo devuelve como imagen)
sticky_export_mp4node cli.js exportRenderizado en tiempo real → exports/sticky_video_*.mp4 (60 fps H.264 + AAC)

get_status, get_project, set_project y update_scene también funcionan sin una pestaña abierta del estudio: leen y escriben projects/live_state.json, y el estudio lo carga cuando se conecta.


IDs de referencia

Emociones (10)

idusar para
neutralpor defecto, calmado
happycalidez, alivio, pequeñas victorias
tired3 AM, agotamiento, cansancio extremo
cryingduelo, derrumbarse (combinar con silentMouth: quiver)
angryfrustración
shockedpánico, darse cuenta
skepticalduda, mirada de reojo
confusedmomentos de "¿?"
excitedhype (ojos de estrella)
deadpanvacío, entumecimiento

Gestos (18) — gesture

iddescripciónmejor vista
pocketmanos en los bolsillos de la sudadera (tranquilo por defecto)cualquiera
idlebrazos relajados (balanceo al caminar)cualquiera
talkinggolpes de mano reactivos al audio (voz en off)frente
explainambas palmas hacia afuerafrente
point_screenapunta hacia un lado (a una tarjeta multimedia)frente
point_viewerapunta a la cámarafrente / 3/4
crossedbrazos cruzadosfrente
facepalmmano sobre la carafrente
hands_headmanos en la cabeza (pánico)frente
shrugencogimiento de hombros, palmas arribafrente
wavesaludar con la manofrente
typingse sienta en un escritorio y escribe (se dibujan escritorio + taburete)automático 3/4–lateral
slouch_lonelyprofunda inclinación, cabeza colgando, respiración lenta y pesadafrente / 3/4
heavy_sighciclo de 4.5 s: inhalar → mantener → hundirse (foley de respiración automática)frente / 3/4
check_phone_darksostiene un teléfono brillante; cono de luz azul en la cara y sudaderafrente / 3/4
sit_curb_hug_kneesse sienta en el suelo abrazando las rodillas, cabeza bajaautomático 3/4
look_back_horizonde pie mirando el paisaje, viento en la sudaderaback / 3/4
pull_hood_upacción: lleva la mano atrás y se sube la capucha (~2.3 s desde el inicio de la escena)frente

Claves de cuerpo y pose

clavevalores
poserig (articulado, por defecto) · sprites v1: front, bust, side, back
viewfront, threeQuarter, side, back
hoodUptrue / false (la capucha se dibuja en cada vista; la vista trasera por defecto está arriba)
walkSpeed0 quieto · 0.1–1.0 caminar · 1.1–2.5 trote → sprint
walkDirleft, right
walkInPlacetrue (cinta de correr) / false (se desplaza por el encuadre, se envuelve)
wind0..1 (dobladillo, cordones, capucha)
silentMouthclosed (por defecto) · sigh · quiver (llanto / ansiedad)
handLeft, handRightauto, relaxed, open_palm, pointing, fist, holding_prop, in_pocket
propnone, phone, mug, mic, controller, book
spineLean, headTilt, headNodgrados (≈ −25…25; headNod + = mirar hacia abajo)
ikPins{ rightHand|leftHand|rightFoot|leftFoot|head: {x, y} } en unidades del rig (origen = suelo entre los pies, +x = dirección de la mirada, arriba es negativo y; la cabeza está cerca de y ≈ −300, las manos cuelgan cerca de y ≈ −130). {} limpia
x, y, scale, flipXposición 0..1 (x 0.5 = centro; y ≈ 0.55 = de pie en el tercio inferior), tamaño (1 = por defecto), espejo
motionbreathe (por defecto para mudo), talk_bounce, walk, shake (temblor), float, none
emotionver la tabla anterior

Fondos — background

Integrados: paper_sketch, cozy_night, rainy_window, streetlight (lámpara de medianoche), classroom (escritorio al atardecer), dark_spotlight, rooftop_dusk, green_screen. Fotos: usa el bgId devuelto por sticky_import_photos, o simplemente pon la ruta absoluta de la foto en background (se importa automáticamente).

Cámara de foto y profundidad

clavevalores
kenBurnsnone, push_in, pull_out, drift_left, drift_right, breathing (la foto se mueve al 100%, el personaje al 30% → paralaje)
foregroundnone, bokeh, rain_streaks, window_reflection
camerastatic, zoom_in, zoom_out, pan_right, handheld (se aplica sobre kenBurns)
atmospheredust (brilla con el ritmo de la música), rain, none
dutchScene / spotlightScenehorizonte inclinado en toda la escena / fondo atenuado al 60%

Coincidencia de luz (armonización de fotos) — lightMatch

true = recomendado (tint 0.35, rim 0.55, exposure 0.5) · false = desactivado · un número 0..1 = fuerza general · o { tint, rim, exposure, side } con side = auto (desde la foto) | left | right | back (contraluz, ambos bordes). Usa true en cada escena de foto. Aumenta rim (0.7–0.9) para atardeceres y horizontes con contraluz; usa side: "back" para look_back_horizon.

Transiciones (cómo ENTRA una escena) — transitionType, transitionDur (0–2 s)

cut · dissolve (ambos planos se renderizan en vivo y se mezclan) · fade_black (paso del tiempo, soledad) · fade_white (flashback, realización, esperanza). La escena 0 con dissolve o fade_black aparece desde negro. fadeOutEnd: true funde la película a negro al final.

Capas ambientales (continuas, por escena) — ambientBed, ambientVol 0..1

idambiente
none—
rain_windowlluvia suave + truenos lejanos (también moja las pisadas)
night_windviento solitario de medianoche
vinyl_cracklepolvo lo-fi cálido
clock_tickingtic reverberante a 60 BPM: 3 AM, insomnio, vacío
heartbeatlatido profundo y apagado: ansiedad, pánico
crowd_mufflemurmullo filtrado paso bajo: solo en una habitación llena

Marcadores FX — sticky_add_fx / fxMarkers: [{type, timeSec, …}]

  • Golpes de cámara: snap_zoom (1.0→1.25× muelle en la cara), dutch_tilt, shake, spotlight (+ duration, intensity 0..3, dir ±1 para holandés)
  • SFX / foley (10): whoosh, pop, vine_boom, record_scratch, shutter, typing, footstep_wet, heavy_sigh_breath, phone_vibrate, door_close_echo (+ volume)
  • Las escenas también pueden establecer transitionSfx (un SFX reproducido en el corte) y foley: true (pisadas automáticas en cada golpe de talón + respiraciones de suspiro; activado por defecto en modo mudo)
  • Tarjetas multimedia: type: "card" con card: {kind: image|meme|post|note, text, imagePath, side: auto|left|right, hold, size}

Claves a nivel de proyecto (sticky_set_project)

clavevalores
modesilent (solo música, la boca nunca sincroniza labios) · voiceover
aspectRatio16:9 · 16:9-letterbox (barras de cine 2.35:1) · 9:16 (Shorts / Reels / TikTok, 720×1280)
fadeOutEndtrue o segundos
masterAmbientVol0..1
captionStylecinematic (serifa de cine mudo), pop, karaoke, classic, off, o {mode, highlight, position: bottom|middle|top, chunk, uppercase, size}
snapToBeatspor defecto true: los cortes se ajustan al pulso más cercano
scenesobjetos de escena planos. Temporización: proporciona start/end en todas las escenas, o ninguna y usa duration / weight (distribuido sobre la música)
fxMarkersver arriba
mediaCards[{sceneIndex | timeSec, kind, text, imagePath, appear, hold, side}]

Plantillas — sticky_apply_template

loneliness_3am (teléfono en la oscuridad → caminata bajo la lluvia con capucha → abrazando rodillas en el bordillo → amanecer en el horizonte) · social_anxiety (encorvado en una esquina + murmullo de multitud → pánico con latido del corazón → salir al viento → suspiro de alivio) · burnout (escribir en el escritorio → mirada vacía con reloj → fundido a negro → caminata bajo la lluvia) · discipline (despertar cansado → subir la capucha → trote a 1.2× → sprint a 2.0× hacia el amanecer).


Flujo de trabajo de dirección

  1. Mira y escucha. Mira las fotos del usuario con visión (lee los archivos de imagen) y decide el arco emocional (p. ej., aislamiento → punto de quiebre → liberación → esperanza). Carga la música con sticky_load_audio {path, mode: "silent"} y anota duration, bpm y strongBeats (los mejores puntos de corte).
  2. Importa y mapea fotos. sticky_import_photos {paths: [...]} en orden de la historia. Usa cada lightProfile (tone cálido/frío, brightness, lightFrom) para elegir el pulso. Las habitaciones oscuras y frías son adecuadas para check_phone_dark / slouch_lonely + clock_ticking. Las calles lluviosas son adecuadas para caminatas con capucha pocket + rain_window + rain_streaks. Los atardeceres y horizontes urbanos son adecuados para look_back_horizon (vista trasera, lightMatch {rim: 0.8, side: "back"}) + night_wind.
  3. Construye el storyboard con una sola llamada sticky_set_project: mode: "silent", captionStyle: "cinematic", fadeOutEnd: true, y una escena por foto. Dale a cada escena background (la ruta o bgId), gesture, emotion, view, hoodUp, kenBurns, lightMatch: true, ambientBed, transitionType (primera escena fade_black, principalmente dissolve 1.0–1.5 s, fade_black para saltos temporales, fade_white para el giro hacia la esperanza), subtitles poéticos cortos (≤ 8 palabras, o vacío), y weight para énfasis. Añade algunos fxMarkers (phone_vibrate, door_close_echo, un snap_zoom en el pico emocional). Comprueba los warnings en el resultado.
  4. Inspecciona visualmente. sticky_render_frame en 2–3 momentos clave: dentro de la primera escena (después de su fundido, ~1.5 s), a mitad de la película, y en el clímax. Verifica que el personaje esté completamente en el encuadre y apoyado (ajusta y, scale, x), que el borde y el tinte coincidan con la foto (ajusta lightMatch), que los subtítulos sean legibles y no estén tapados, y que las caras no estén ocultas por tarjetas. Corrige con sticky_update_scene y vuelve a renderizar.
  5. Exporta con sticky_export_mp4 cuando el usuario esté listo. Tarda aproximadamente la duración de la película más la codificación. Informa el mp4Path.

Guía de gusto para cortos mudos emocionales

  • Menos, pero más largos planos (4–8 s). Corta en strongBeats. Deja que heavy_sigh y slouch_lonely respiren durante al menos un ciclo completo (≥ 4.5 s).
  • hoodUp: true = retraimiento / lluvia / ansiedad; capucha abajo = apertura, alivio.
  • Mantén walkSpeed 0.4–0.6 para caminatas melancólicas, 1.2 para un trote decidido, 2.0+ solo para sprints culminantes.
  • Empareja emoción y boca: crying + quiver, tired + sigh. En modo mudo nunca uses talking.
  • Usa una capa ambiental por escena al volumen 0.4–0.8. Cambia las capas en los cortes para marcar un nuevo lugar.
  • Para 9:16, mantén x ≈ 0.5 y scale 0.9–1.1. Los subtítulos y tarjetas se reposicionan automáticamente.

Ejemplo de storyboard

{
  "mode": "silent", "aspectRatio": "16:9-letterbox", "captionStyle": "cinematic", "fadeOutEnd": true,
  "scenes": [
    { "title": "3 AM", "background": "/abs/photos/bedroom.jpg", "gesture": "check_phone_dark", "emotion": "tired",
      "kenBurns": "push_in", "lightMatch": true, "ambientBed": "clock_ticking", "transitionType": "fade_black", "transitionDur": 1.2, "subtitle": "3:07 AM." },
    { "title": "Caminata bajo la lluvia", "background": "/abs/photos/street.jpg", "gesture": "pocket", "view": "threeQuarter", "hoodUp": true,
      "walkSpeed": 0.55, "walkInPlace": false, "x": 0.25, "foreground": "rain_streaks", "ambientBed": "rain_window",
      "lightMatch": true, "transitionType": "dissolve", "transitionDur": 1.2, "weight": 1.2 },
    { "title": "Amanecer", "background": "/abs/photos/sunset.jpg", "gesture": "look_back_horizon", "view": "back", "wind": 0.6,
      "lightMatch": { "rim": 0.8, "side": "back" }, "kenBurns": "pull_out", "ambientBed": "night_wind",
      "transitionType": "fade_white", "subtitle": "Pero el sol seguía saliendo." }
  ],
  "fxMarkers": [ { "type": "phone_vibrate", "timeSec": 0.8 } ]
}

Skills relacionados