Communitygithub.com

Interior Reels

Transforma clips de proyectos de interiorismo en Reels 9:16 listos para subir, con transiciones y texto, y permite crear patrones reutilizables a partir de un reel de ejemplo.

¿Qué es Interior Reels?

Esta skill está diseñada para asistentes de IA que trabajan con editores de video en la creación de contenido vertical para redes sociales (Instagram Reels, TikTok) a partir de clips de proyectos de interiorismo, arquitectura o propiedades. Su función principal es guiar al asistente en la selección, organización y edición de clips de video sin procesar en un reel final de formato 9:16, respetando las decisiones editoriales basadas en la revisión visual de cada clip. El asistente debe analizar cada clip, elegir los mejores segmentos, aplicar patrones de edición predefinidos (que definen secuencia, duración, movimientos, transiciones y gradación de color) y seguir reglas estrictas sobre texto, logotipos y audio, que son gestionados por el cliente a través de una interfaz gráfica (GUI) y un archivo `overlay.json`. La skill también soporta modos de revisión y training de patrones, donde el asistente puede hacer preguntas al cliente para aclarar cambios o probar patrones contra videos de ejemplo, siempre comunicándose a través de bloques JSON estructurados. Está implementada para plataformas como Claude Code, Cursor o Codex, y se activa con frases como "edit video", "bikin reels" o "video proyecto".

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/alfianwilfredo/edit-skill/tree/main/skill/interior-reels

Preguntar en tu IA favorita

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

Documentación

¿Qué hace Interior Reels?

Transforma clips sin editar de proyectos de interiorismo en un Reel 9:16 listo para subir. El script es solo una herramienta. Las decisiones editoriales (qué toma, qué parte, qué orden) son tarea de Claude y deben basarse en ver la imagen de cada clip, no en adivinar por el nombre del archivo.

SKILL = carpeta de esta skill. Todos los scripts: python3 SKILL/scripts/<nombre>.py.

Antes de comenzar (una vez por sesión)

Ejecuta bash SKILL/setup.sh. Si algo FALLA, resuélvelo primero. Lee SKILL/brand.json para obtener el nombre del estudio, CTA, logo, patrón predeterminado y preferencias del cliente.

Reglas absolutas (no se pueden violar)

  1. El texto y el logo no son tarea del asistente. El texto y el logo los configura el cliente en la GUI y se guardan en <carpeta>/_edit/overlay.json. render.py lee este archivo y sobrescribe todo texto y logo en el plan. No escribas texto ni logo en plan.json, no preguntes al cliente por el contenido del texto y no añadas texto propio a overlay.json (incluyendo CTA de brand.json) a menos que el cliente lo solicite.
  2. El patrón solo define cortes y apariencia. Lo que se toma del patrón: secuencia de slots, duración, movimiento, transiciones y gradación. texto, ejemplo_contenido y logo en el patrón son solo anotaciones del video de referencia, no se renderizan.
  3. Cambiar texto o logo por chat = editar overlay.json. Si el cliente pide cambiar el contenido del texto, fuente, posición, momento de aparición, tamaño, color o logo, edita <carpeta>/_edit/overlay.json (formato en PLAN.md sección overlay.json), luego renderiza de nuevo. La GUI recarga este archivo después de tu respuesta. Las fuentes solo provienen de SKILL/fonts/. La lista de fuentes, categorías, características y usos está en fonts/fonts.json; elige de ahí según el ambiente que pida el cliente. Las fuentes o tamaños diferentes por línea (ej. "segunda línea usa Great Vibes") se configuran mediante texto[].por_linea. El logo solo puede ser negro (brand/logo.png) o blanco (brand/logo-blanco.png). Los datos del estudio (nombre, sitio web keziakarin.com, Instagram @keziakarin.studio) se mantienen de brand.json.
  4. El audio también viene de overlay.json (audio). No elijas ni cambies la música por tu cuenta, y no escribas musica en el plan. Si el cliente lo pide por chat (cambiar canción, volumen, punto de inicio, final con/sin música, sincronizar al ritmo), edita audio en overlay.json (formato en PLAN.md). La música solo proviene del audio guía del patrón (patterns/audio/) o de la biblioteca del estudio (brand/musica/). Recuerda al cliente que el audio de referencia es propiedad de otros si quieren usarlo en el producto final.
  5. Si overlay.json aún no existe, el renderizado se ejecuta sin texto ni logo del patrón. Menciona al cliente que el texto y el logo se pueden completar en la sección Detalle de la GUI.
  6. No elimines ni reemplaces overlay.json sin que te lo pidan. Este archivo son las elecciones del cliente.
  7. La estabilización se maneja automáticamente. render.py mide el movimiento en cada segmento y estabiliza por sí solo ("estabilizar": "auto", predeterminado). No rellenes estabilizar a menos que haya una razón: true fuerza la estabilización, false la desactiva (ej. movimiento intencional de la cámara). Lee la tabla "Estabilización" en el registro de renderizado: ! movimiento visible restante = revisa el resultado; ! FALLO = el renderizado se detiene, elige otro rango o clip para ese segmento. Al revisar, sigue rellenando movimiento en _review/*.json para las partes claramente movidas/desenfocadas: ese rango no se usará cuando el renderizado desplace inicio.
  8. Selecciona las partes adecuadas, no uses todos los segundos del clip. Al renderizar, render.py analiza automáticamente el clip (_calidad/) y marca las partes oscuras, vacías (sin objeto) o borrosas. Los segmentos que contengan más de 0.3 segundos de partes malas se rechazan y se sugiere un inicio. Obligatorio: desplaza inicio a la sugerencia, o reduce duracion, o cambia de clip. No está permitido usar --ignorar-calidad sin permiso del usuario.
  9. La duración sigue al metraje, no al patrón. Si el rango bueno del clip es más corto que el slot del patrón, acorta ese slot. La duración total del reel puede ser más corta que duracion_total del patrón. No rellenes slots con partes malas.
  10. Mira el fotograma antes del final. Las sugerencias del análisis deben verificarse mirando el fotograma en ese rango (cuadrícula o vista previa). El análisis no sabe si el objeto principal es bueno o si esa parte es la apertura adecuada.
  11. Revisa todos los clips de material primero. Ejecuta scripts/review_material.py <carpeta-material>, mira CADA hoja en _review/ hasta terminar, luego rellena el JSON de cada clip (visto, movimiento, rango_valido, decision). render.py rechaza el renderizado si el clip no ha sido revisado o si el segmento está fuera de rango_valido (a menos que se use --ignorar-calidad).
  12. Verifica el texto después del renderizado. La posición del texto la elige el cliente (cuadrícula 3x3). Después del renderizado, mira *_texto<N>_check.jpg (cuadro rojo = área aproximada del texto). Si el texto cubre una cara u objeto principal, informa al cliente y sugiere otra posición. No cambies la posición por tu cuenta sin aprobación.
  13. Los clips elegidos por el cliente están en <carpeta>/_edit/clips.json. Lee este archivo antes de crear el plan (formato en PLAN.md sección clips.json). apertura = clip del primer segmento, cierre = clip del último segmento, evitar = no se puede usar en ningún segmento. Las elecciones del cliente prevalecen sobre tipo_toma del patrón; si el tipo de toma del clip es diferente al slot del patrón, informa al cliente. Los mejores segundos dentro del clip elegido los sigue seleccionando el asistente. render.py rechaza los planes que violen este archivo (no se puede omitir con --ignorar-calidad). No modifiques ni elimines clips.json; este archivo lo escribe la GUI.

Flujo: editar clips en un reel

  1. Recopila información. Lo obligatorio: carpeta de clips. Lo opcional: patrón y archivo de audio (narración/voz en off, mp3/m4a/wav). El texto y el logo ya están en _edit/overlay.json, no los preguntes. Pregunta solo lo que realmente falte, máximo 1 pregunta. Si hay un archivo de audio, rellena voz en el plan (ver PLAN.md). La voz no la graba la skill: el usuario debe proporcionar el archivo de audio. Compara el número de clips en la carpeta con min_clips del patrón. Si es insuficiente, informa al cliente y sugiere un patrón con min_clips más pequeño o que añada clips. Puedes continuar si el cliente está de acuerdo.
  2. Escanea. Ejecuta scan_clips.py <carpeta> para crear <carpeta>/_scan/.
  3. Mira CADA cuadrícula _scan/<clip>.jpg con la herramienta de vista. Para cada clip, anota en una tabla: tipo de toma (general / medio / detalle / recorrido / paneo), habitación, calidad (movimiento, oscuro, demasiado claro, presencia de personas o desorden), mejores segundos (segundo_fotograma en manifest.json asigna los cuadros de la cuadrícula a segundos) y dirección del movimiento de la cámara. No continúes hasta que todas las cuadrículas hayan sido vistas.
  4. Elige el patrón de SKILL/patterns/*.json, según la solicitud o el predeterminado. Si la selección es automática, elige aquel cuyo adecuado_para coincida mejor con la cantidad y contenido de los clips. Lee las notas_entrenamiento del patrón elegido (si las hay) y aplica sus lecciones al rellenar los slots.
  5. Rellena los slots. Para cada slot en flujo, elige un clip y un segundo inicio que coincida con tipo_toma, siguiendo las reglas narrativas a continuación. Copia duracion, movimiento, transicion_entrada, efecto_entrada, efecto_salida, atenuar y la gradación del patrón. Copia también marco y final al plan, cambia logo_slot por logo_segmento (índice del segmento de ese slot), y rellena apertura_segmento con el índice del segmento del primer slot de texto del patrón (texto[0].slot), para que el texto de apertura de la GUI aparezca en ese slot. Si el patrón tiene texto[0].duracion, escribe también apertura_duracion_texto (valor numérico, segundos) en el plan — esto asegura que el texto de apertura se muestre el tiempo suficiente para ser leído. Si el patrón tiene texto[0].hasta_slot, escribe también apertura_texto en el plan: inicio, animacion, fundido, salida se copian de texto[0], y hasta_segmento = índice del segmento del slot hasta_slot. No copies el texto ni el logo. Escribe <carpeta>/_edit/plan.json según SKILL/PLAN.md, usando rutas absolutas.
    • Patrón con marco letterbox: prioriza clips apaisados. Los clips verticales se recortan en el centro formando una banda 16:9; si es necesario usarlos, informa al cliente.
    • Reutilizar clips está permitido si los clips son insuficientes para el número de slots: los rangos inicio en el mismo clip deben estar separados por al menos 1 segundo, y no deben estar en dos segmentos consecutivos. El renderizado muestra una advertencia si se viola esta regla.
    • Si el patrón tiene aun_no_soportado, menciona ese efecto al cliente antes de renderizar.
    • Modo de edición desde la GUI (mencionado en el mensaje "Iniciar edición"):
      • seguir referencia (predeterminado): copia el flujo del patrón exactamente, no elimines, intercambies ni combines slots. El texto superpuesto ya está numerado según el slot del patrón (cuando), y el logo usa logo_segmento, por lo que el orden de los segmentos debe ser el mismo que flujo. Si faltan clips, reutiliza clips (regla anterior), no elimines slots.
      • personalizado: el patrón es solo un punto de partida de estilo (gradación, transiciones, efectos, marco). La duración y el número de segmentos se pueden ajustar a los clips. Escribe "modo": "personalizado" en el plan, para que el audio de referencia se sincronice con el ritmo.
  6. Vista previa. Ejecuta render.py <plan> --vista-previa, luego mira *_vista-previa_check.jpg. Verifica: orden lógico, sin tomas malas, texto de superposición legible y que no cubra el objeto principal, sin fotogramas congelados extraños. Corrige el plan y repite si es necesario.
  7. Final. Ejecuta render.py <plan>, mira *_check.jpg una vez más, luego reporta la ruta del video junto con un resumen del orden de las tomas en 1-2 frases.

Reglas narrativas de interiorismo

  • Los primeros 3 segundos determinan si la gente deja de hacer scroll. La apertura debe ser la toma más impactante: luminosa, recta, espacio completo visible.
  • Sigue el plano. Orden de espacios desde la entrada hasta las áreas públicas (salón, comedor, cocina) y luego a las áreas privadas (dormitorios, baños). No saltes de un lado a otro entre habitaciones.
  • Alterna escalas. General, luego detalle, luego general. Dos tomas generales de diferentes habitaciones seguidas deberían unirse con una transición, no con un corte.
  • La dirección del movimiento debe continuar. Un paneo a la izquierda se une con una toma que se mueva a la izquierda o una transición slideleft/smoothleft. Evita direcciones opuestas en una misma unión.
  • Toma partes estables. Elige segundos en medio del movimiento, no cuando la cámara empieza o se detiene. Omite las partes con movimiento, borrosas o con personas.
  • El cierre usa la toma más bonita que tenga un área lisa para el CTA y el logo.
  • Texto: lo configura el cliente mediante overlay.json. Si pides consejo, sugiere un máximo de 6 palabras por texto.
  • Si hay menos clips que slots: elimina primero los slots de detalle. Si hay clips de sobra: usa solo los mejores, no es necesario usar todos los clips.
  • Clips apaisados: usa "relleno": "desenfoque" si la composición es importante. Si el objeto principal está en el centro, recortar es suficiente.

Flujo: revisión después del resultado

Se aplica si el mensaje del cliente termina con [modo revision: ...] (la GUI lo añade cuando _edit/plan.json ya existe). El objetivo: entender la intención de la revisión antes de cambiar nada, porque renderizar de nuevo lleva tiempo. El cliente solo hace clic en un botón, por lo que todas las preguntas DEBEN enviarse mediante un bloque preguntas, no en texto libre.

  1. Nuevo mensaje de revisión (no es una respuesta, ni "Ejecutar"):
    • Lee plan.json y mira *_check.jpg del último resultado. No modifiques ningún archivo.
    • Envía una ronda: máximo 4 preguntas. Su contenido son preguntas sobre la intención (qué toma, cuánto, qué estilo) y un máximo de 2 hallazgos del resultado (ej. toma oscura, texto que cubre un objeto), cada uno con opciones como "Corregir" / "Dejar".
    • Cada pregunta debe tener 2-4 opciones cortas (≤ 6 palabras), exactamente una opción con "recomendado": true. "multi": true solo para opciones que permitan más de una selección (ej. qué tomas reemplazar). No añadas la opción "Otros"; la GUI ya la proporciona.
    • Escribe un máximo de 1 frase introductoria, luego el bloque, luego detente y espera.
  2. Mensaje que comienza con Respuesta: = respuesta de la ronda. Si aún hay algo poco claro y esta es la primera ronda, envía una segunda ronda (mismas reglas). Después de eso (o si ya está claro), envía un bloque resumen: lista de cambios que se harán, un punto por cambio. Detente y espera.
  3. Ejecutar resumen: = usa la opción recomendado para todas las preguntas de la última ronda, luego ejecuta sin resumen.
  4. Ejecutar según resumen. = ejecuta exactamente el contenido del último resumen (editar plan/overlay, vista previa, final), luego reporta como de costumbre.
  5. Mensaje de texto libre cuando la tarjeta está abierta = respuesta libre. Trátalo como Respuesta:.
  6. Máximo 2 rondas de preguntas por revisión. Las solicitudes muy claras (ej. "cambia la fuente a Great Vibes") pasan por una ronda corta (solo hallazgos, o 1 pregunta de confirmación), luego resumen.
  7. Mensaje "clip elegido ha cambiado" (enviado por la GUI después de que el cliente cambie el clip de apertura, cierre o evitar usar) = revisión normal: lee el _edit/clips.json más reciente y aplícalo al plan mediante los pasos 1-4 anteriores (regla absoluta 13).

Formato del bloque (JSON válido, un bloque por respuesta):

```preguntas
{"tipo": "preguntar", "preguntas": [
  {"id": "q1", "titulo": "¿Qué toma quieres cambiar?", "multi": true,
   "opciones": [{"etiqueta": "Toma 2 (cocina)", "recomendado": true}, {"etiqueta": "Toma 4 (dormitorio)"}]},
  {"id": "q2", "titulo": "Hallazgo: la toma 3 está un poco oscura", "multi": false,
   "opciones": [{"etiqueta": "Corregir", "recomendado": true}, {"etiqueta": "Dejar"}]}
]}
```
```preguntas
{"tipo": "resumen", "resumen": ["Toma 2 reemplazada por clip de cocina segundo 4", "Toma 3 iluminada"]}
```

Flujo: entrenamiento de estilo

Se aplica si el mensaje termina con [modo entrenamiento: ...] (enviado desde la pestaña Entrenamiento de estilo en la GUI). El objetivo: probar patrones existentes contra su video de ejemplo, reportar las discrepancias y corregir el patrón con la aprobación del cliente. Todas las preguntas DEBEN ir mediante bloques preguntas (formato en "Flujo: revisión después del resultado").

  1. Entrada del mensaje de la GUI: nombre del patrón, modo (seguir referencia / personalizado) y carpeta de clips.
  2. Material. Lee SKILL/patterns/<patron>.json incluyendo notas_entrenamiento. Video de ejemplo = skill/ejemplo-video/<video_ejemplo> (carpeta ejemplo-video junto a la carpeta de la skill). Hoja de referencia: usa SKILL/_ref/<nombre>/ existente (busca el nombre del patrón o el nombre del archivo video_ejemplo sin extensión; mira filmstrip.jpg/shots.jpg). Si no existe, ejecuta analyze_ref.py <video de ejemplo> --name <patron> --out <carpeta>/_training/<patron>/ref.
  3. Carpeta de trabajo = <carpeta>/_training/<patron>/. No toques <carpeta>/_edit/ en absoluto. El plan de entrenamiento se escribe en <carpeta>/_training/<patron>/plan_entrenamiento.json. El video renderizado va a <carpeta>/_training/<patron>/.
  4. Flujo: sigue la misma secuencia que "Editar clips en un reel", pero con estas diferencias:
    • Después del paso 5, primero pregunta al cliente qué tomas del patrón son incorrectas. Muestra el flujo actual del patrón y shots.jpg como referencia. Haz preguntas de opción múltiple: "¿La toma X debería ser un detalle en lugar de un plano general?" (opciones: "Sí, corregir patrón" / "No, dejar patrón"). Elige los segmentos de video con el comando yy-mm y herramientas de vista.
    • Después de que el cliente responda, aplica los cambios al patrón en patterns/<patron>.json (solo flujo, audio, tipo_toma, duracion, movimiento, transicion_entrada, efecto_entrada y efecto_salida por slot) y vuelve al paso 5. No toques texto ni logo.
    • Después de cada actualización del patrón, ejecuta analyze_ref.py de nuevo, luego renderiza con --vista-previa.
    • La renderización final se hace solo cuando el cliente dice "Listo".
    • Si el patrón no tiene un video de ejemplo o falta el archivo de video de ejemplo, el entrenamiento no puede continuar. Informa al cliente.
    • Patrón no encontrado: responde con un bloque de preguntas que liste todos los patrones disponibles como opciones con multi: false.
  5. Notas de entrenamiento. Si el cliente hace una petición que no se puede codificar directamente en el patrón, escríbela en catálogo_notas_entrenamiento del patrón para referencia futura.

Archivo de plan: formato

Ver SKILL/PLAN.md para el esquema completo de plan.json. Los campos clave:

  • patron: ruta al archivo del patrón usado
  • modo: "seguir referencia" o "personalizado"
  • segmentos: lista de objetos de segmento
    • Cada segmento: clip, inicio (segundos), duracion, movimiento, transicion_entrada, efecto_entrada, efecto_salida, atenuar, estabilizar, tipo_toma
    • logo_segmento: índice del slot del logo en el patrón (para posicionamiento)
    • apertura_segmento: índice del segmento donde aparece el primer texto de apertura
    • apertura_duracion_texto: cuánto tiempo se muestra el texto de apertura (segundos)
  • voz: lista de objetos de voz en off (si los hay)
  • audio: ruta al archivo de música de fondo (desde overlay.json, no desde el plan)
  • marco: objeto de marco (letterbox, etc.)
  • final: efecto final del patrón

Herramientas

  • scan_clips.py <carpeta>: genera miniaturas de cuadrícula para cada clip en <carpeta>/_scan/.
  • analyze_ref.py <video> [--name <nombre>] [--out <carpeta>]: analiza un video de ejemplo y extrae fotogramas de referencia.
  • render.py <plan> [--vista-previa] [--ignorar-calidad]: renderiza el plan a un video 9:16. --vista-previa hace un renderizado rápido de baja resolución.
  • review_material.py <carpeta>: genera hojas de revisión para clips.
  • Scripts de utilidad en SKILL/scripts/.

Skills relacionados