Agenda Social (Social Calendar)

Transforme qualquer conteúdo em posts para múltiplos canais sociais, escritos no tom de cada canal e agendados em um calendário Airtable para aprovação.

O que é Agenda Social (Social Calendar)?

Este skill transforma uma única peça de conteúdo (nota de funcionalidade, captura de tela, link de notícias, clipe de podcast, avaliação de cliente, foto de evento, dado) em postagens para múltiplos canais sociais, como LinkedIn, X, Instagram, Facebook, Threads, TikTok, YouTube, Bluesky, Substack ou perfis de funcionários e fundadores. Ele consulta as estratégias de conteúdo e arquivos de canal, analisa o calendário existente para identificar lacunas de cadência, colisões e duplicatas, e gera posts no tom e formato específicos de cada canal. As postagens são então registradas no Airtable com status como "Para aprovar", "Precisa de mídia" ou "Rascunho". O skill também gerencia aprovações, anexo de mídia, e pode passar posts aprovados para a ferramenta de agendamento Upload-Post. É útil para equipes de marketing, growth ou social media que desejam agilizar a criação e o agendamento de conteúdo social, evitando retrabalho e garantindo consistência entre canais. O skill é orientado por scripts Python e arquivos Markdown de estratégia, e requer configuração de token e base Airtable.

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

Installed? Explore more Produtividade e Colaboração skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que Agenda Social (Social Calendar) faz?

Transforme uma peça de conteúdo em postagens para vários canais e coloque-as no calendário Airtable para aprovação. A publicação acontece através de scripts/publish_approved.py, que entrega as postagens aprovadas ao agendador do Upload-Post. Você executa isso apenas quando o usuário solicitar.

Nomes de campos, valores de status e variáveis de ambiente vêm de docs/data-model.md no repositório. Não renomeie nada. Os caminhos de script abaixo são relativos à pasta deste skill.

Antes de começar

  1. Verifique se AIRTABLE_TOKEN e AIRTABLE_BASE_ID estão definidos (ambiente ou um arquivo .env no diretório de trabalho ou raiz do repositório). Execute python3 scripts/airtable_calendar.py channels como um teste de fumaça. Se as tabelas ainda não existirem, direcione o usuário para scripts/setup_airtable.py na raiz do repositório.
  2. Encontre a pasta de estratégia. Use STRATEGY_DIR se estiver definido. Caso contrário, procure por strategy.md no diretório de trabalho, ./my-strategy/ e ./strategy/. Se não houver nenhum, pergunte onde ele está. Se o usuário ainda não tiver um, ofereça copiar templates/strategy.md e templates/channels/_channel-template.md e preenchê-los juntos antes de escrever qualquer postagem.

Se o conector MCP do Airtable estiver disponível, você pode usá-lo em vez do script para leituras e escritas. As regras deste arquivo ainda se aplicam. Veja references/airtable.md.

Fluxo de trabalho

1. Leia a estratégia e os arquivos de canal

Leia strategy.md por completo: metas, OKRs, públicos-alvo, pilares de conteúdo, regras globais. Em seguida, liste channels/*.md e leia os arquivos dos canais para os quais este conteúdo pode ir. Cada arquivo de canal contém a voz, metas, cadência, formatos, listas de "faça" e "não faça", e exemplos de postagens daquele canal.

Combine os arquivos de canal com as linhas na tabela Canais (Channels) pelo campo Channel file. Apenas canais que estão Ativo (Active) no Airtable podem receber postagens. Se um arquivo de canal não tiver uma linha correspondente em Canais, informe isso e pule-o.

2. Identifique o tipo de postagem e a campanha

Determine o que é o conteúdo: lançamento de funcionalidade, notícia, clipe de podcast ou vídeo, avaliação de cliente, fotos de evento, insight de dados ou texto, promoção de artigo, ou outra coisa. Leia references/post-types.md para saber como cada tipo se torna postagens, quais canais são adequados e até onde espalhá-lo.

Dê ao lote um rótulo de Campanha (Campaign) no formato YYYY-MM <Tipo> <Rótulo>, por exemplo 2026-11 Podcast Ep 12 ou 2026-11 Funcionalidade CSV export. Coloque a entrada bruta em Fonte (Source) (link, nome de arquivo, episódio ou uma nota de uma linha).

Faça uma pergunta apenas quando a resposta alterar as postagens, como "quais canais?" quando a estratégia não tornar óbvio, ou "isso está sob embargo até uma data?". Caso contrário, decida e diga o que decidiu.

3. Olhe para o calendário

Liste o que já está planejado para o período que você está prestes a preencher (padrão: próximas 4 semanas, mais longo para clipes de podcast):

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

Para cada canal alvo, calcule:

  • Lacunas de cadência. Postagens por semana em relação ao alvo do arquivo de canal. Conte todos os status, exceto Rejeitado (Rejected) e Falhou (Failed).
  • Colisões. Dias que já têm uma postagem naquele canal. O padrão é no máximo uma postagem por dia por canal, a menos que o arquivo de canal diga o contrário.
  • Mix de tópicos. Muito de um tipo na mesma semana (três postagens de notícias, duas promoções seguidas). Empurre a nova postagem para uma semana mais leve.
  • Duplicatas. A mesma mensagem já agendada ou publicada recentemente. O comando create executa uma verificação de similaridade. Você pode executá-lo sozinho com check-duplicates.

4. Escreva as postagens

Escreva uma postagem por canal por data. Cada uma segue o arquivo daquele canal: voz, comprimento, formato, hashtags, chamada para ação. Regras que se aplicam em todos os lugares:

  • Use apenas fatos que estão na fonte ou nos arquivos de estratégia. Não invente números, citações, nomes de clientes ou resultados.
  • Não cole o mesmo texto entre canais. O perfil de um fundador e a página da empresa dizem coisas diferentes sobre a mesma funcionalidade.
  • Canais de funcionários e cofundadores são escritos na voz daquela pessoa e precisam de sua aprovação. Defina Proprietário (Owner) para o aprovador nomeado no arquivo de canal.
  • ConteúdoDaPostagem (PostContent) contém o texto final com quebras de linha reais. Emoji e Unicode são permitidos. Hashtags vão inline, geralmente no final, conforme o arquivo de canal.
  • LinkedIn e X mostram **texto** como asteriscos literais. Use **negrito** apenas para canais onde um humano cola em um editor que suporta Markdown, como Substack. Siga o arquivo de canal se ele disser o contrário.
  • Limites de comprimento: X divide qualquer coisa com mais de 280 caracteres em uma thread, Threads mais de 500, Bluesky mais de 300. Escreva para caber, a menos que o arquivo de canal peça threads.
  • Siga as regras de escrita em strategy.md. Se não houver nenhuma, escreva frases diretas e simples, e evite palavras de enchimento, hype e frases feitas.

5. Escolha as datas

Agendado para (Scheduled for) é apenas uma data, YYYY-MM-DD. A hora vem do Horário da postagem (Post time) e Fuso horário (Timezone) do canal, portanto não coloque horários na postagem.

  • Preencha as lacunas de cadência primeiro, depois espalhe o restante. Postagens promocionais para um item vão ao longo de 2 a 3 semanas, não todas no mesmo dia.
  • Notícias saem no mesmo dia ou no próximo, ou não saem.
  • Clipes de podcast vão aproximadamente um ou dois por canal por semana ao longo de cerca de 3 meses.
  • Misture tipos ao longo de uma semana: educação, engajamento, produto, prova social.
  • Nunca use uma data no passado. Use hoje apenas se o usuário solicitar e souber que a execução diária já pode ter ocorrido.
  • Se uma semana estiver cheia, mova a postagem para a próxima semana e informe no relatório.

6. Hospede a mídia

O Airtable ingere apenas URLs públicos. Caminhos locais e links file:// são ignorados silenciosamente. Imagens e vídeo em um lote de criação podem ser caminhos locais. O script faz upload deles para catbox.moe primeiro e passa a URL pública para o Airtable, que copia o arquivo para seu próprio armazenamento. Uploads no Catbox são públicos e não podem ser excluídos, portanto não o use para nada confidencial. Peça ao usuário um host diferente nesse caso. Detalhes estão em references/airtable.md.

Para postagens de texto e dados que precisam de um visual (Instagram, TikTok, ou um arquivo de canal que solicite um), crie uma imagem simples. Siga references/visuals.md.

7. Crie os registros

Escreva o lote como uma lista JSON usando os nomes de campos de Postagens:

[
  {
    "Name": "Funcionalidade - Exportar CSV",
    "Status": "Para aprovar",
    "Scheduled for": "2026-11-12",
    "Channel": "Brightloop LinkedIn",
    "PostContent": "Agora você pode exportar qualquer relatório para CSV.\n\nUm clique, canto superior direito.",
    "Media": ["/tmp/csv-export.png"],
    "Source": "Nota de lançamento 2026-11-10",
    "Campaign": "2026-11 Funcionalidade Exportar CSV",
    "Owner": "[email protected]"
  }
]

Escolha o status assim:

SituaçãoStatus
Pronto para o proprietário revisar (padrão)Para aprovar (To approve)
Instagram, TikTok, YouTube ou Pinterest sem mídia aindaPrecisa de mídia (Needs media)
O usuário quer ir e voltar no texto primeiroRascunho (Draft)
O usuário aprova explicitamente em nome de seus próprios canais (veja abaixo)Aprovado (Approved)

Execute primeiro uma simulação, mostre ao usuário o plano, depois crie:

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

O create valida nomes de campos, status, datas e nomes de canais, rebaixa postagens sem mídia para plataformas somente de imagem para Needs media, e se recusa a escrever se encontrar duplicatas prováveis. Corrija o lote, ou passe --allow-duplicates se o usuário confirmar que quer a repetição. Ele escreve em lotes de 10. Planos mantidos em um CSV com colunas Date, Channel, Content Type, Post Text, Hashtags, Image Suggestion podem ser inseridos diretamente com --csv.

8. Relate de volta

Finalize com uma tabela, uma linha por registro criado, ordenada por data:

DataCanalStatusNomeLinha de abertura

Abaixo dela, liste em frases simples: canais que você pulou e por quê, postagens que você empurrou para uma semana posterior, postagens em Needs media e o que elas precisam, e qualquer coisa que o proprietário deve verificar (afirmações, nomes, links).

Outras solicitações

  • "Adicione a imagem a estas postagens." Execute python3 scripts/airtable_calendar.py attach <record_id> <arquivo ou URL>. Uma postagem em Needs media é movida automaticamente para To approve.
  • "Mova esta postagem", "rejeite aquela". Execute update <record_id> --set "Scheduled for=2026-11-20" ou --set Status=Rejected. Se a postagem já estiver Agendada (Scheduled), execute python3 scripts/publish_approved.py --sync depois para que a cópia do Upload-Post também mude.
  • "O que está saindo esta semana?" Execute list --from today --to +7 e resuma por canal e dia.
  • Alterações na estratégia ou voz. Edite os arquivos markdown, não o Airtable. O skill semanal social-calendar-review propõe essas edições.

Aprovação em nome do usuário

Apenas quando o usuário disser explicitamente ("aprove os meus", "estes podem sair direto"), e apenas para canais onde ele é o Proprietário (Owner). Nunca aprove postagens no perfil de um funcionário ou cofundador, mesmo que solicitado de passagem. Direcione o usuário para essa pessoa. Defina esses registros como Aprovados (Approved), seja na criação ou com update <record_id> --set Status=Approved, e liste-os separadamente no relatório.

Passagem para publicação

Quando o usuário solicitar agendar postagens aprovadas ("agende tudo que está aprovado", "publique estes"):

  1. Execute python3 scripts/publish_approved.py --sync --reconcile --mode schedule --dry-run e mostre o que ele enviaria: canal, data e hora, tipo de mídia, primeira linha do texto.
  2. Após o usuário confirmar, execute sem --dry-run. O Upload-Post mantém a programação e as postagens se tornam Agendadas (Scheduled).
  3. Se o horário de alguma postagem aprovada já passou, mencione e ofereça --mode now.

O usuário também pode ter uma rotina ou cron executando o script, caso em que as postagens aprovadas são agendadas sem você. Leia references/publishing.md para reagendamento, cancelamento, reconciliação e o mapeamento completo de campos. Prefira o script a fazer as chamadas do Upload-Post você mesmo, porque o script não custa tokens por postagem.

Nunca publique ou agende nada que o usuário não tenha solicitado nesta conversa. Escrever registros com To approve é o fim normal deste skill.

Individual skills in this repo

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

Habilidades Relacionadas