social-calendar

Convierte una pieza de contenido en publicaciones para redes sociales, las redacta con la voz de cada canal y las agenda en un calendario de Airtable para su aprobación.

¿Qué es social-calendar?

Este skill ayuda a crear y gestionar un calendario de redes sociales a partir de una única fuente de contenido (nota de funcionalidad, captura de pantalla, enlace de noticia, clip de podcast, reseña de cliente, foto de evento, dato). Automatiza la redacción de publicaciones adaptadas a la voz y formato de cada canal (LinkedIn, X, Instagram, Facebook, Threads, TikTok, YouTube, Bluesky, Substack, perfiles de empleados o fundadores), las organiza en el calendario de Airtable evitando colisiones y duplicados, y gestiona el flujo de aprobación hasta la publicación final mediante el script `publish_approved.py`. Es útil para equipos de marketing, creadores de contenido o fundadores que quieren maximizar el alcance de una idea sin esfuerzo manual. Se integra con Airtable como base de datos, permite vista previa en seco, manejo de medios (subida a catbox.moe) y genera un reporte final con el estado de cada publicación.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/faloppad/agent-social-calendar/tree/main/skills/social-calendar

Installed? Explore more Productividad y colaboración skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

Preguntar en tu IA favorita

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

Documentación

Calendario social

Convierte una pieza de contenido en publicaciones para varios canales y las coloca en el calendario de Airtable para que las personas las aprueben. La publicación se realiza a través de scripts/publish_approved.py, que entrega las publicaciones aprobadas al programador de Upload-Post. Solo lo ejecutas cuando el usuario lo solicita.

Los nombres de campos, valores de estado y variables de entorno provienen de docs/data-model.md en el repositorio. No renombres nada. Las rutas de los scripts a continuación son relativas a la carpeta de este skill.

Antes de empezar

  1. Verifica que AIRTABLE_TOKEN y AIRTABLE_BASE_ID estén configurados (como variables de entorno o en un archivo .env en el directorio de trabajo o raíz del repositorio). Ejecuta python3 scripts/airtable_calendar.py channels como prueba de humo. Si las tablas aún no existen, indica al usuario que ejecute scripts/setup_airtable.py en la raíz del repositorio.
  2. Encuentra la carpeta de estrategia. Usa STRATEGY_DIR si está configurado. De lo contrario, busca strategy.md en el directorio de trabajo, ./my-strategy/ y ./strategy/. Si no hay ninguna, pregunta dónde se encuentra. Si el usuario no tiene ninguna, ofrécete a copiar templates/strategy.md y templates/channels/_channel-template.md y rellenarlos juntos antes de escribir cualquier publicación.

Si el conector MCP de Airtable está disponible, puedes usarlo en lugar del script para lecturas y escrituras. Las reglas de este archivo siguen aplicándose. Consulta references/airtable.md.

Flujo de trabajo

1. Lee la estrategia y los archivos de canal

Lee strategy.md por completo: objetivos, OKR, audiencias, pilares de contenido, reglas globales. Luego lista channels/*.md y lee los archivos de los canales a los que podría ir este contenido. Cada archivo de canal contiene la voz de esa cuenta, objetivos, cadencia, formatos, listas de qué hacer y qué no hacer, y ejemplos de publicaciones.

Empareja los archivos de canal con las filas de la tabla Canales mediante el campo Channel file. Solo los canales que están Active en Airtable pueden recibir publicaciones. Si un archivo de canal no tiene una fila correspondiente en Canales, indícalo y omítelo.

2. Identifica el tipo de publicación y la campaña

Determina qué es el contenido: lanzamiento de funcionalidad, noticia, clips de podcast o video, reseña de cliente, fotos de evento, información de datos o texto, promoción de artículo, u otro. Lee references/post-types.md para saber cómo cada tipo se convierte en publicaciones, qué canales son adecuados y hasta dónde difundirlo.

Asigna a este lote una etiqueta de Campaign con el formato YYYY-MM <Tipo> <Etiqueta>, por ejemplo 2026-11 Podcast Episodio 12 o 2026-11 Función Exportar CSV. Coloca la entrada original en Source (enlace, nombre de archivo, episodio o una nota de una línea).

Haz una pregunta solo cuando la respuesta cambie las publicaciones, como "¿qué canales?" cuando la estrategia no lo deje claro, o "¿esto está embargado hasta una fecha?". De lo contrario, decide y di lo que decidiste.

3. Mira el calendario

Lista lo que ya está planificado para el período que vas a llenar (por defecto las próximas 4 semanas, más para clips de podcast):

python3 scripts/airtable_calendar.py list --from today --to +28 --json > /tmp/calendar.json

Para cada canal objetivo, determina:

  • Brechas de cadencia. Publicaciones por semana frente al objetivo del archivo de canal. Cuenta todos los estados excepto Rejected y Failed.
  • Colisiones. Días que ya tienen una publicación en ese canal. Por defecto, como máximo una publicación por día por canal, a menos que el archivo de canal indique lo contrario.
  • Mezcla de temas. Demasiado de un tipo en una semana (tres publicaciones de noticias, dos promociones seguidas). Mueve la nueva publicación a una semana más ligera.
  • Duplicados. El mismo mensaje ya programado o publicado recientemente. El comando create ejecuta una comprobación de similitud. Puedes ejecutarlo solo con check-duplicates.

4. Redacta las publicaciones

Escribe una publicación por canal por fecha. Cada una sigue el archivo de ese canal: voz, longitud, formato, hashtags, llamada a la acción. Reglas que aplican en todas partes:

  • Usa solo hechos que estén en la fuente o en los archivos de estrategia. No inventes números, citas, nombres de clientes ni resultados.
  • No pegues el mismo texto en todos los canales. El perfil de un fundador y la página de la empresa dicen cosas diferentes sobre la misma funcionalidad.
  • Los canales de empleados y cofundadores están escritos en la voz de esa persona y necesitan su aprobación. Establece Owner como el aprobador nombrado en el archivo de canal.
  • PostContent contiene el texto final con saltos de línea reales. Los emojis y Unicode están bien. Los hashtags van en línea, generalmente al final, como indica el archivo de canal.
  • LinkedIn y X muestran **texto** como asteriscos literales. Usa **negrita** solo para canales donde un humano pegue en un editor que reconozca Markdown, como Substack. Sigue el archivo de canal si dice lo contrario.
  • Límites de longitud: X divide cualquier cosa de más de 280 caracteres en un hilo, Threads más de 500, Bluesky más de 300. Escribe para que quepa a menos que el archivo de canal solicite hilos.
  • Sigue las reglas de escritura en strategy.md. Si no tiene ninguna, escribe oraciones directas y simples, y omite relleno, palabras de exageración y frases hechas.

5. Elige las fechas

Scheduled for es solo una fecha, YYYY-MM-DD. La hora proviene del Post time y Timezone del canal, así que no incluyas horas en la publicación.

  • Llena primero las brechas de cadencia, luego distribuye el resto. Las publicaciones promocionales para un solo artículo se reparten en 2 a 3 semanas, no todas el mismo día.
  • Las noticias salen el mismo día o al día siguiente, o no salen.
  • Los clips de podcast van aproximadamente uno o dos por canal por semana durante unos 3 meses.
  • Mezcla tipos a lo largo de una semana: educación, participación, producto, prueba social.
  • Nunca uses una fecha pasada. Usa hoy solo si el usuario lo solicita y sabe que la ejecución diaria ya pudo haber ocurrido.
  • Si una semana está llena, mueve la publicación a la semana siguiente e indícalo en el informe.

6. Aloja los medios

Airtable solo ingiere URLs públicas. Las rutas locales y los enlaces file:// se ignoran silenciosamente. Las imágenes y videos en un lote de creación pueden ser rutas locales. El script los sube primero a catbox.moe y pasa la URL pública a Airtable, que copia el archivo a su propio almacenamiento. Las subidas a Catbox son públicas y no se pueden eliminar, así que no lo uses para nada confidencial. Pide al usuario un alojamiento diferente en ese caso. Los detalles están en references/airtable.md.

Para publicaciones de texto y datos que necesitan un visual (Instagram, TikTok, o un archivo de canal que lo solicite), crea una imagen simple. Sigue references/visuals.md.

7. Crea los registros

Escribe el lote como una lista JSON usando los nombres de campo de Publicaciones:

[
  {
    "Name": "Función - Exportar CSV",
    "Status": "Por aprobar",
    "Scheduled for": "2026-11-12",
    "Channel": "Brightloop LinkedIn",
    "PostContent": "Ahora puedes exportar cualquier informe a CSV.\n\nUn clic, arriba a la derecha.",
    "Media": ["/tmp/csv-export.png"],
    "Source": "Nota de versión 2026-11-10",
    "Campaign": "2026-11 Función Exportar CSV",
    "Owner": "[email protected]"
  }
]

Elige el estado de esta manera:

SituaciónEstado
Listo para que el propietario lo revise (por defecto)To approve
Instagram, TikTok, YouTube o Pinterest sin medios aúnNeeds media
El usuario quiere iterar sobre el texto primeroDraft
El usuario aprueba explícitamente en nombre de sus propios canales (ver más abajo)Approved

Primero haz una prueba en seco, muestra el plan al usuario, luego crea:

python3 scripts/airtable_calendar.py create /tmp/batch.json --dry-run
python3 scripts/airtable_calendar.py create /tmp/batch.json

create valida nombres de campo, estados, fechas y nombres de canal, degrada las publicaciones sin medios para plataformas solo de imagen a Needs media, y se niega a escribir si encuentra posibles duplicados. Corrige el lote, o pasa --allow-duplicates si el usuario confirma que quiere la repetición. Escribe en lotes de 10. Los planes guardados en un CSV con columnas Date, Channel, Content Type, Post Text, Hashtags, Image Suggestion pueden ir directamente con --csv.

8. Informa

Termina con una tabla, una fila por registro creado, ordenada por fecha:

FechaCanalEstadoNombreLínea de apertura

Debajo, lista en oraciones simples: canales que omitiste y por qué, publicaciones que pospusiste a una semana posterior, publicaciones en Needs media y qué necesitan, y cualquier cosa que el propietario deba verificar (afirmaciones, nombres, enlaces).

Otras solicitudes

  • "Añade la imagen a estas publicaciones." Ejecuta python3 scripts/airtable_calendar.py attach <record_id> <file or URL>. Una publicación en Needs media pasa automáticamente a To approve.
  • "Mueve esta publicación", "rechaza esa". Ejecuta update <record_id> --set "Scheduled for=2026-11-20" o --set Status=Rejected. Si la publicación ya está Scheduled, ejecuta python3 scripts/publish_approved.py --sync después para que la copia de Upload-Post también cambie.
  • "¿Qué sale esta semana?" Ejecuta list --from today --to +7 y resume por canal y día.
  • Cambios en la estrategia o voz. Edita los archivos markdown, no Airtable. El skill semanal social-calendar-review propone estas ediciones.

Aprobación en nombre del usuario

Solo cuando el usuario lo diga explícitamente ("aprueba las mías", "estas pueden salir directamente"), y solo para canales donde él sea el Owner. Nunca apruebes publicaciones en el perfil de un empleado o cofundador, incluso si se pide de pasada. Dirige al usuario a esa persona. Establece esos registros como Approved, ya sea al crearlos o con update <record_id> --set Status=Approved, y menciónalos por separado en el informe.

Entrega para publicación

Cuando el usuario solicite programar publicaciones aprobadas ("programa todo lo que esté aprobado", "saca estas"):

  1. Ejecuta python3 scripts/publish_approved.py --sync --reconcile --mode schedule --dry-run y muestra lo que enviaría: canal, fecha y hora, tipo de medio, primera línea de texto.
  2. Después de que el usuario confirme, ejecútalo sin --dry-run. Upload-Post mantiene la programación y las publicaciones pasan a Scheduled.
  3. Si alguna publicación aprobada ya pasó su horario, menciónalo y ofrece --mode now.

El usuario también puede tener una rutina o cron ejecutando el script, en cuyo caso las publicaciones aprobadas se programan sin ti. Lee references/publishing.md para reprogramar, cancelar, reconciliar y el mapeo completo de campos. Prefiere el script en lugar de hacer las llamadas a Upload-Post tú mismo, porque el script no consume tokens por publicación.

Nunca publiques ni programes nada que el usuario no haya solicitado en esta conversación. Escribir registros con To approve es el final normal de este skill.

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Skills relacionados