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
- Verifique se
AIRTABLE_TOKENeAIRTABLE_BASE_IDestão definidos (ambiente ou um arquivo.envno diretório de trabalho ou raiz do repositório). Executepython3 scripts/airtable_calendar.py channelscomo um teste de fumaça. Se as tabelas ainda não existirem, direcione o usuário parascripts/setup_airtable.pyna raiz do repositório. - Encontre a pasta de estratégia. Use
STRATEGY_DIRse estiver definido. Caso contrário, procure porstrategy.mdno 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 copiartemplates/strategy.mdetemplates/channels/_channel-template.mde 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) eFalhou(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
createexecuta uma verificação de similaridade. Você pode executá-lo sozinho comcheck-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ção | Status |
|---|---|
| Pronto para o proprietário revisar (padrão) | Para aprovar (To approve) |
| Instagram, TikTok, YouTube ou Pinterest sem mídia ainda | Precisa de mídia (Needs media) |
| O usuário quer ir e voltar no texto primeiro | Rascunho (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:
| Data | Canal | Status | Nome | Linha 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 emNeeds mediaé movida automaticamente paraTo approve. - "Mova esta postagem", "rejeite aquela". Execute
update <record_id> --set "Scheduled for=2026-11-20"ou--set Status=Rejected. Se a postagem já estiverAgendada(Scheduled), executepython3 scripts/publish_approved.py --syncdepois para que a cópia do Upload-Post também mude. - "O que está saindo esta semana?" Execute
list --from today --to +7e 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-reviewpropõ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"):
- Execute
python3 scripts/publish_approved.py --sync --reconcile --mode schedule --dry-rune mostre o que ele enviaria: canal, data e hora, tipo de mídia, primeira linha do texto. - Após o usuário confirmar, execute sem
--dry-run. O Upload-Post mantém a programação e as postagens se tornamAgendadas(Scheduled). - 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.