/aprovar-post — Pipeline de aprovação e publicação automática
SkillCloud & infraApproves and publishes a post from the queue — flips the blog from draft to published, copies the carousel PNGs to the site's public folder, commits and pushes (Netlify/Vercel deploys), waits for the deploy, and posts the carousel to Instagram + Facebook via the Meta Graph API. Use when the user say
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the /aprovar-post — Pipeline de aprovação e publicação automática skill
What this skill tells your AI
The instructions your AI receives, as published by mazzeoia/mazyos in .claude/skills/aprovar-post/SKILL.md and read by ahel’s review.
Faz a ponte entre o conteúdo aprovado (blog + carrossel + legendas, criado por /publicar-tema)
e a publicação real no feed (site + Instagram + Facebook).
Quando NÃO usar
- Conteúdo ainda não foi criado → use
/publicar-temaprimeiro - Usuário ainda está revisando → não rodar até ele dizer "aprovado" / "pode postar"
- Site não está deployado / Meta API não configurada → seguir setup abaixo
Pré-requisitos (uma vez só)
.envna raiz com:META_PAGE_ACCESS_TOKEN— token de longa duração da Página FBMETA_PAGE_ID— ID da Página FBMETA_IG_USER_ID— ID da conta Insta BusinessSITE_URL— ex:https://exemplo.com.br
- Site com deploy automático a partir do
maindo GitHub (Netlify, Vercel, etc.) - Conta Insta Business conectada à Página FB
- Página FB com permissões corretas no Meta App
- Scripts
scripts/postar-instagram.jsescripts/postar-facebook.jsconfigurados
Se algo disso faltar: parar e apontar pro guia de setup (criar marketing/automacao-meta-setup.md se ainda não existir).
Argumento
/aprovar-post <slug> — onde <slug> é o nome do arquivo do blog sem .md.
Exemplo: /aprovar-post como-conservar-produto
Se o usuário não passou slug, listar os blogs em draft (arquivos com draft: true) e perguntar qual.
Workflow
Passo 1 — Localizar arquivos
- Blog:
site/.../blog/<slug>.md(caminho depende do stack — Astro, Hugo, etc.) - Carrossel: procurar
marketing/conteudo/<slug>-*(a pasta tem sufixo de data) - Validar que existem PNGs em
<pasta-carrossel>/instagram/slide-XX.png(2 a 10) - Validar que existem
legenda.mdelegenda-linkedin.md
Se faltar qualquer um, parar e relatar.
Passo 2 — Mostrar resumo + pedir confirmação final
Mostrar pro usuário:
- Título do blog
- Quantos slides do carrossel
- Primeiras 200 chars da legenda
- URL final que vai ser publicada
Perguntar: "Confirma publicação? (sim/não)". Só seguir se ele disser sim.
Passo 3 — Flipar draft pra false
Editar o frontmatter do blog: draft: true → draft: false.
Passo 4 — Copiar PNGs pro public folder do site
- Origem:
marketing/conteudo/<slug>-<data>/instagram/slide-*.png - Destino:
site/.../public/img/posts/<slug>/slide-*.png - Criar pasta de destino se não existir
- Sobrescrever se já existir (caso seja re-publicação)
Passo 5 — Commit + push
git add site/<caminho>/blog/<slug>.md site/<caminho>/public/img/posts/<slug>/
git commit -m "publicar: <título do blog>"
git push origin main
Esperar push terminar com sucesso.
Passo 6 — Aguardar deploy
Deploy automático (Netlify/Vercel) leva ~1-2 min. Validar que o post está no ar:
curl -sf -o /dev/null -w "%{http_code}" "$SITE_URL/blog/$slug/"
Aguardar HTTP 200 (com timeout de 5 min). Também checar que pelo menos slide-01.png está acessível:
curl -sf -o /dev/null -w "%{http_code}" "$SITE_URL/img/posts/$slug/slide-01.png"
Sem isso, a Meta API vai falhar — ela busca a imagem por URL pública.
Passo 7 — Postar no Instagram
node --env-file=.env scripts/postar-instagram.js marketing/conteudo/<slug>-<data>
Capturar o post id retornado. Se falhar, não seguir pra Facebook — relatar e parar.
Passo 8 — Postar no Facebook
node --env-file=.env scripts/postar-facebook.js marketing/conteudo/<slug>-<data>
Capturar o post id retornado.
Passo 9 — LinkedIn
LinkedIn é manual por enquanto (API de empresa precisa de aprovação demorada). Mostrar pro usuário:
LinkedIn: cole esse texto manualmente em https://linkedin.com/in/<seu-perfil>:
<conteúdo de legenda-linkedin.md>
Passo 10 — Resumo
Mostrar:
✓ Post publicado: <título>
Site: <SITE_URL>/blog/<slug>/
Instagram: <link do post>
Facebook: <link do post>
LinkedIn: pendente — texto pronto em legenda-linkedin.md (postar manual)
Tratamento de erro
- Push falhou: rollback do
draft: false(restauradraft: true), relata e para - Deploy não subiu em 5 min: relata, pergunta se quer continuar mesmo assim ou abortar
- Insta API falhou: para e relata. Site já está no ar, blog publicado — só o post no feed que não foi
- FB falhou mas Insta OK: relata, sugere tentar de novo só o FB depois
Princípios
- Confirmação humana antes de qualquer coisa irreversível. Nunca pular o passo 2.
- Idempotente onde possível. Re-rodar com mesmo slug deve detectar publicação prévia (blog não-draft, PNGs já no public/) e perguntar se é pra re-postar ou só atualizar.
- Falha cedo, falha alto. Qualquer pré-requisito faltando = abortar e explicar o que falta.
- Logar tudo. Cada passo imprime o que está fazendo e o resultado.
Signals
- GitHub stars
- 234
- Forks
- 136
- Last commit
- May 2026
Advanced
- Catalog kind
- skill
- Gateway key
aprovar-post- Source
- github.com/mazzeoia/mazyos