Skill 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".
Scanned 9/20/2026
Install to Claude Code
npx -y skills add felvieira/claude-skills-fv --skill 41-blog-publisher --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of 41 Blog Publisher?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/felvieira-41-blog-publisher)More formats (shields.io, HTML) on the badges page.
---
name: blog-publisher
description: |
Skill 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".
allowed-tools: Read, Write, Edit, Bash, Skill, mcp__plugin_playwright_playwright__browser_navigate, mcp__plugin_playwright_playwright__browser_take_screenshot, mcp__plugin_playwright_playwright__browser_resize
metadata:
argument-hint: "[assunto ou texto do post]"
version: 1.0.0
author: felvieira
compatibility: ">=2.10.2"
requires:
- 17-image-generator
- 42-blog-screenshot
- 13-marketing-copy
- 26-prompt-engineer
---
# Blog Publisher — Skill 41
> **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:
1. Lê a fonte completa (insumo de pesquisa, não texto a creditar)
2. Identifica os pontos centrais
3. Pesquisa 3+ fontes externas relacionadas
4. Escreve com voz própria, adicionando o que a fonte não cobriu
5. 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}.html` com HTML válido
- 1+ imagens em `{blog_repo_path}/assets/images/`
- Commit + push no repo blog
- `index.html` e `README.md` atualizados via `update-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
```bash
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
```bash
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}.html` existe e é HTML válido
- [ ] Cover image em `assets/images/{slug}-cover.*` existe
- [ ] `grep -iE "fonte original|adaptaç" {post}` retorna vazio
- [ ] Bloco LinkedIn presente (`.share-block` com hook e texto copiável)
- [ ] `index.html` e `README.md` listam o post novo
- [ ] `git status` limpo 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.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!