Pular para o conteúdo

/aprovar-post

Publica um post já aprovado — artigo Astro em SITE_REPO_PATH e carrossel via Instagram/Facebook — com confirmação humana e idempotência por .publicado.json. Use quando o usuário disser “aprovar post X”, “publicar o post do tema Y”. Slash command — /aprovar-post .

  • Argumento <slug>; se omitido, lista pastas de marketing/conteudo/ e pergunta qual
  • SITE_REPO_PATH/src/content/blog/<slug>.md (frontmatter draft)
  • Pasta marketing/conteudo/<tipo>-<slug>-<AAAA-MM-DD>/ (PNGs em instagram/ + legenda.md)
  • .env: META_PAGE_ACCESS_TOKEN, IG_USER_ID, FB_PAGE_ID, PUBLIC_BASE_URL, SITE_REPO_PATH
  • marketing/conteudo/<tipo>-<slug>-<AAAA-MM-DD>/.publicado.json, se existir
  1. Localizar o artigo em SITE_REPO_PATH/src/content/blog/<slug>.md e a pasta do carrossel correspondente; se <slug> não vier, listar pastas em marketing/conteudo/ e perguntar qual.
  2. Validar que as imagens PNG e legenda.md existem na pasta do carrossel.
  3. Verificar .publicado.json: se existir com o mesmo hash das imagens atuais, parar e perguntar se é para republicar ou só atualizar — nunca publicar de novo em silêncio.
  4. Mostrar ao usuário: título, número de slides, trecho da legenda, URL final do artigo — e pedir confirmação explícita (“sim”).
  5. Só depois do “sim”: mudar draft: false no frontmatter do artigo.
  6. Copiar os PNGs para SITE_REPO_PATH/public/img/blog/<slug>/.
  7. Commit + push no repo do site; se falhar, reverter draft para true e parar.
  8. Fazer GET ao URL do artigo até obter 200, no máximo 5 minutos; se não conseguir, perguntar se continua mesmo assim ou aborta.
  9. Rodar node scripts/publicar-instagram.mjs <dir-com-pngs> <legenda.md>; só rodar publicar-facebook.mjs se a publicação no Instagram tiver sucedido.
  10. Gravar .publicado.json com o hash das imagens e os ids devolvidos, só depois de confirmar sucesso de cada chamada.
  11. Mostrar a legenda pronta para colar manualmente no LinkedIn — a skill nunca publica lá via API.
  12. Resumir ao usuário: link do artigo, id do post no Instagram, id do post no Facebook, status pendente do LinkedIn.
  • draft: false em SITE_REPO_PATH/src/content/blog/<slug>.md
  • PNGs em SITE_REPO_PATH/public/img/blog/<slug>/
  • Commit no repo do site (SITE_REPO_PATH)
  • marketing/conteudo/<tipo>-<slug>-<AAAA-MM-DD>/.publicado.json

Obrigatória antes do Passo 5 (mudar draft) — só resposta “sim” explícita avança; qualquer outra resposta interrompe sem tocar em nada.

  • .env sem META_PAGE_ACCESS_TOKEN, IG_USER_ID, FB_PAGE_ID, PUBLIC_BASE_URL ou SITE_REPO_PATH: parar e dizer exatamente qual variável falta, sem tentar publicar parcialmente.
  • scripts/publicar-instagram.mjs ou publicar-facebook.mjs ausentes: parar e apontar o caminho esperado.
  • Push ao repositório falha: reverter draft para true, não avançar para as redes sociais.
  • Deploy não confirma 200 dentro de 5 min: perguntar antes de publicar nas redes — nunca anunciar uma página que talvez ainda não exista.

O artefato é o post real: GET 200 no URL do artigo, id de post devolvido pela Graph API para Instagram e para Facebook, e .publicado.json gravado com esses ids — nunca “commit feito” ou “workflow verde” isoladamente.