Blog Publisher — Skill 41
SkillWeb & browsingSkill compositora que pega texto/assunto e gera post de blog HTML completo no repo configurado em ~/.dev-team-kit/blog-config.json, com imagens (via skill 17 fal.ai ou skill 42 Playwright screenshot), commit+push automático, retorna URL pública via GitHub Pages. Trigger em: "post no blog", "publicar post", "escrever post", "blog post", "publish blog", "gera post", "criar post", "novo post no meu blog".
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 Blog Publisher — Skill 41 skill
What this skill tells your AI
The instructions your AI receives, as published by felvieira/claude-skills-fv in skills/41-blog-publisher/SKILL.md and read by ahel’s review.
Compositora AUTORAL. Recebe input (link/texto/assunto), pesquisa contexto adicional, produz post 100% original em PT-BR por default, publica no GitHub Pages, retorna URL.
Princípio fundador — AUTORAL, NÃO ADAPTAÇÃO
Esta skill nunca copia, traduz nem se apresenta como adaptação de uma fonte. O post soa como se o dono do blog tivesse escrito do zero. Fluxo:
- Lê a fonte completa (insumo de pesquisa, não texto a creditar)
- Identifica os pontos centrais
- Pesquisa 3+ fontes externas relacionadas
- Escreve com voz própria, adicionando o que a fonte não cobriu
- PT-BR por default; outro idioma só se pedido explicitamente
Para regras detalhadas de abstração de fonte, consulte docs/skill-guides/blog-publisher.md.
Anti-padrão: creditar a fonte, copiar verbatim, ou deixar qualquer pista de adaptação.
Governança Global
Segue GLOBAL.md, policies/anti-ai-writing.md, policies/handoffs.md e policies/tool-safety.md. Composta sobre skills 13, 17, 26 e 42.
Quando Usar
- Usuário pede "publica post sobre X" ou "escreve blog post de Y"
- Usuário fornece URL e diz "cria post baseado nisso"
- Usuário cola texto e diz "vira post"
Quando Não Usar
- Para escrever só o texto sem publicar — usar skill 13 diretamente
- Para postar no Medium/Dev.to/LinkedIn — esta skill publica apenas no repo blog próprio
- Para editar post existente — usar Edit tool no arquivo HTML
Entradas Esperadas
- Texto livre, URL ou assunto (curto ou longo)
- (opcional) idioma alvo (pt-BR / en), tom (técnico / storytelling), URLs para screenshot
Saídas Esperadas
{blog_repo_path}/posts/YYYY-MM-DD-{slug}.htmlcom HTML válido- 1+ imagens em
{blog_repo_path}/assets/images/ - Commit + push no repo blog
index.htmleREADME.mdatualizados viaupdate-index.mjs- URL pública retornada ao usuário
Protocolo (ordem fixa)
1. Capturar input e classificar
Identificar: tipo de input (texto vs assunto curto), idioma, tom, se há URL navegável para screenshot, e slug (kebab-case, max 50 chars, sem acentos).
Se config ~/.dev-team-kit/blog-config.json não existe, pausar e instruir o usuário a rodar scripts/init-blog-repo.mjs. Ver detalhes em docs/skill-guides/blog-publisher.md.
2. Escrever o post (corpo HTML)
Para assunto curto: invocar skill 13 para voz/tom, escrever seguindo estrutura hook → contexto → ponto principal → exemplo → CTA, aplicar policies/anti-ai-writing.md.
Para texto pronto: converter para HTML semântico, aplicar policy anti-ai-writing como sweep (não reescrever).
Em ambos os casos: zero atribuição de fonte, zero "Fonte original", zero "segundo {autor da fonte}".
Gate obrigatório antes de salvar: rodar a ## Checklist de estilo para output publicado de policies/anti-ai-writing.md no corpo do post — sem em dash, sem ponto-e-vírgula, sem asteriscos soltos no texto corrido, variação de comprimento/estrutura de frase e parágrafo, sem headings genéricos ("Key Takeaways", "Final Thoughts"), sem transição conversacional falsa. Grep literal na lista de palavras banidas da policy → cada match encontrado é reescrito naquele trecho (não substituído por sinônimo da mesma lista) → grep de novo até zero matches antes de considerar o post pronto.
Salvar em {blog_repo_path}/.tmp-body-{slug}.html.
3. Imagens
- URL/dashboard navegável: Skill 42 (screenshots Playwright)
- Texto/abstrato: Skill 17 com
gpt-image-1-mini(default text-to-image) - Cover obrigatória (1500×750), salva em
assets/images/{slug}-cover.{png|jpg} - Posts >1000 palavras: mínimo 2-3 imagens inline distribuídas nas seções
Para matriz completa de modelos e custos, ver docs/skill-guides/blog-publisher.md.
3.5. Bloco LinkedIn (OBRIGATÓRIO)
Gerar dois textos antes de invocar o scaffold:
--share-hook: 1-2 frases com tom de mistério/curiosidade, sem entregar a resposta--linkedin: texto pronto para colar, com hook + aprendizados + CTA + 3-5 hashtags
Ambos em PT-BR (ou língua do post). Aplicar anti-ai-writing, incluindo a checklist de output publicado (sem em dash, sem markdown/asteriscos, variação estrutural). Exceção deliberada: hashtags no bloco LinkedIn são convenção da plataforma, não um AI-tell — a regra "sem hashtags" da checklist vale para o corpo do post e copy de landing/app, não para social copy nativo de plataforma que usa hashtag por design. Ver exemplos em docs/skill-guides/blog-publisher.md.
4. Scaffold
cd {blog_repo_path} && node scripts/new-post.mjs \
--slug={slug} \
--title="{title}" \
--lang={lang} \
--excerpt="{excerpt}" \
--cover=assets/images/{slug}-cover.png \
--share-hook="{hook}" \
--linkedin="{texto linkedin}" \
--body=.tmp-body-{slug}.html
5. Cleanup, commit e push
cd {blog_repo_path} && rm .tmp-body-{slug}.html
git add -A && git commit -m "post: {title}" && git push origin main
Aguardar ~30s antes de retornar URL.
6. Retornar URL
Post publicado: {pages_url}/posts/YYYY-MM-DD-{slug}.html
Index: {pages_url}/
Anti-padrões
| Anti-padrão | Por que evitar |
|---|---|
| Reescrever texto pronto sem permissão | User passou texto = quer publicar aquele texto |
| Gerar 10+ imagens | Distrai leitor e gera custo desnecessário |
| Postar sem cover image | OG sharing fica feio sem cover |
| Hardcode de paths absolutos no HTML | Quebra Pages. Sempre paths relativos |
| Commit sem rodar update-index.mjs | README e index.html ficam desatualizados |
| Creditar a fonte / footer "Fonte original" | Quebra o princípio AUTORAL |
| Publicar sem bloco LinkedIn | Perde o gancho de distribuição |
Integração com Pipeline
- Skill 13 — voz e CTAs para assunto curto
- Skill 17 — fal.ai para cover e inline images
- Skill 26 — prompt da imagem
- Skill 42 — screenshots Playwright para URLs reais
- Policy anti-ai-writing.md — 29 padrões + checklist de estilo pra output publicado, gate obrigatório antes de finalizar
Evidência de Conclusão
-
posts/YYYY-MM-DD-{slug}.htmlexiste e é HTML válido - Cover image em
assets/images/{slug}-cover.*existe -
grep -iE "fonte original|adaptaç" {post}retorna vazio - Bloco LinkedIn presente (
.share-blockcom hook e texto copiável) -
index.htmleREADME.mdlistam o post novo -
git statuslimpo após commit+push - URL pública retorna HTTP 200
Handoff
Após retornar URL, sugerir: compartilhar no LinkedIn (passar a URL), importar para Medium via medium.com/p/import, cross-postar para Dev.to/Hashnode.
Signals
- GitHub stars
- 23
- Forks
- 6
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
blog-publisher- Source
- github.com/felvieira/claude-skills-fv