skills/41-blog-publisher/SKILL.md
Skill compositora que pega texto/assunto e gera post de blog HTML completo no repo {blog_repo_path} ({github_user_repo_url}), 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".
npx skillsauth add felvieira/claude-skills-fv 41-blog-publisherInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Compositora AUTORAL. Recebe input (link/texto/assunto) → lê fonte → pesquisa contexto adicional → produz post 100% ORIGINAL e AUTORAL em PT-BR por default → publica no GitHub Pages → retorna URL.
Esta skill nunca copia, traduz, nem se apresenta como adaptação de uma fonte. O post final deve soar como se o autor do blog (o dono do repo) tivesse escrito do zero, com conhecimento próprio. Ela:
O post NÃO PODE revelar que é baseado em outro texto. Aplique:
Critério-mestre: "essa menção é um fato do assunto, ou é um vínculo ao texto-fonte / à pessoa que o escreveu?" — Fato do assunto fica; vínculo à fonte some.
Anti-padrão: creditar a fonte, copiar/traduzir verbatim, ou deixar pistas de que é adaptação. O post é AUTORAL.
Esta skill segue GLOBAL.md, policies/anti-ai-writing.md, policies/handoffs.md e
policies/tool-safety.md. Composta sobre skills 13 (marketing-copy), 17 (image-generator),
26 (prompt-engineer) e 42 (blog-screenshot).
| Input | Ação | |---|---| | URL | WebFetch o conteúdo → extrair pontos centrais → pesquisar contexto adicional → escrever post novo | | Texto colado | Identificar pontos centrais → pesquisar contexto adicional → escrever post novo (não copiar) | | Assunto livre | Pesquisar 3+ fontes do assunto → escrever post com voz própria |
Em qualquer caso, sempre PT-BR por default.
A skill não tem repo hardcoded. Ela lê ~/.dev-team-kit/blog-config.json
(override via env DEVKIT_BLOG_CONFIG). Schema:
{
"github_user": "<user>",
"blog_repo": "blog",
"blog_repo_path": "/abs/path/to/blog/repo",
"pages_url": "https://<user>.github.io/blog"
}
A skill deve pausar e instruir o usuário a rodar o init script:
node /caminho/para/claude-skills-fv/scripts/init-blog-repo.mjs \
--path=/abs/path/to/blog \
--user=<github-username> \
--repo=blog \
--create-github
Esse script:
templates/blog/ do kit{{GITHUB_USER}} e {{BLOG_REPO}} nos arquivosgit init no destino~/.dev-team-kit/blog-config.json--create-github) cria repo no GitHub via gh e habilita PagesApós o script rodar, a skill 41 funciona automaticamente — sem mais perguntas.
Lê o config, deriva todos os paths/URLs dinamicamente:
blog_repo_path → onde escrever os arquivospages_url → URL pública pra retornar ao usergithub_user + blog_repo → preencher placeholders no HTMLEstrutura conhecida do repo destino (criada pelo init script):
blog/
├── index.html ← landing com lista de posts (auto-updated)
├── posts/
│ └── YYYY-MM-DD-slug.html
├── assets/
│ ├── css/post.css ← estilo compartilhado (não modificar)
│ └── images/ ← imagens dos posts
├── TEMPLATE.html ← template com placeholders {{TITLE}}, {{BODY_HTML}}, etc.
└── scripts/
├── new-post.mjs ← scaffolda post a partir do TEMPLATE + corpo
└── update-index.mjs ← regenera index.html e README após cada novo post
Identifica:
Se input é assunto curto:
Skill({ skill: "dev-team-kit-fv:13-marketing-copy" }) pra pegar voz/tompolicies/anti-ai-writing.md (29 padrões) — sem hype, sem "delve into", sem
"comprehensive", sem em-dashes em rajadaSe input é texto pronto:
<h2>, <h3>, <p>, <ul>, <pre>, <code>, <table>, <blockquote>)Em AMBOS os casos, aplicar a REGRA DE ABSTRAÇÃO DE FONTE (ver Princípio fundador): zero footer "Fonte original", zero parágrafo de atribuição, zero "segundo {autor da fonte}". O post sai autoral.
Salvar como arquivo temporário: {blog_repo_path}/.tmp-body-{slug}.html
Post fala sobre URL/site/dashboard navegável?
├── SIM → Skill 42 (blog-screenshot) gera prints reais
└── NÃO → Skill 17 (image-generator) gera via fal.ai
├── default model: flux-2-flash ($0.005/MP ≈ $0.002-0.012/img) — text-to-image
├── 1 cover image obrigatória (1500×750)
└── inline images opcionais conforme o post
Cover image (OBRIGATÓRIA + VISÍVEL):
{blog_repo_path}/assets/images/{slug}-cover.{png|jpg}<meta og:image> pro share social — automático via {{COVER_IMAGE_URL}}; (b) <img> visível no body do post — automático via {{COVER_IMG_TAG}} (inserido logo abaixo do <h1> e meta, antes do <article>)--cover=assets/images/{slug}-cover.jpg pro new-post.mjs. Sem esse arg, o body fica sem cover visível (anti-padrão).Inline images (OBRIGATÓRIAS pra posts >1000 palavras):
{slug}-N-{seção}.jpg (ex: top-1-claude-code-1-claudemd.jpg)<p><img src="../assets/images/{slug}-N-{tema}.jpg" alt="descrição acessível"></p>
<h3> da seção correspondente (não depois)Posts curtos (<1000 palavras): só cover é OK, inline pode pular.
Todo post termina com um bloco que facilita o repost no LinkedIn. São dois textos:
--share-hook: hook curto (1-2 frases) com TOM DE MISTÉRIO/curiosidade sobre o que o post revela — faz a pessoa QUERER ler, sem entregar a resposta. Aparece VISÍVEL na página. Ex: "Todo LLM que você usou já mentiu pra você com confiança. Existe um padrão que resolve isso — e quase ninguém implementa direito."--linkedin: o texto PRONTO pra colar no LinkedIn (o botão copia). Formato: hook de abertura forte + 2-3 linhas (com quebras de linha reais) do que a pessoa vai aprender + 1 linha de CTA + 3-5 hashtags relevantes. NÃO cite fonte/autor. A URL do post é anexada automaticamente pelo script — não precisa incluir.Ambos em PT-BR (ou a língua do post). Tom: profissional mas com a curiosidade misteriosa. Aplicar anti-ai-writing (sem hype vazio).
O template do blog já tem o markup (.share-block + botão copiar + share.js). A skill só fornece os dois textos via args.
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 misterioso de 1-2 frases}" \
--linkedin="{texto pronto pro LinkedIn com hashtags}" \
--body=.tmp-body-{slug}.html
Se
--share-hook/
O script:
TEMPLATE.html e substitui placeholdersposts/YYYY-MM-DD-{slug}.htmlupdate-index.mjs que regenera index.html + bloco no README.mdcd {blog_repo_path} && rm .tmp-body-{slug}.html
git add -A
git commit -m "post: {title}"
git push origin main
Aguardar GitHub Pages build (~30s) antes de retornar URL.
✅ Post publicado:
{pages_url}/posts/YYYY-MM-DD-{slug}.html
Index atualizado em: {pages_url}/
Source: {github_user_repo_url}/blob/main/posts/YYYY-MM-DD-{slug}.html
| Cenário | Provider | Modelo |
|---|---|---|
| Post sobre URL existente | Skill 42 (Playwright) | screenshot 1400×900 |
| Post sobre código/abstrato (text-to-image) | Skill 17 (fal.ai) | flux-2-flash (default) |
| Editar/refinar imagem existente (com referência) | Skill 17 | gemini-25-flash ($0.039/img) |
| Post premium / hero importante | Skill 17 | gemini-3-pro ($0.15) |
| Tipografia/layout específicos | Skill 17 | gpt-image-1.5 |
Default: flux-2-flash $0.005/MP (≈ $0.002-0.012/img) — modelo mais barato pra
text-to-image, ~4-10x mais barato que as alternativas, realismo decente, ótimo pra
escala. Para editar imagem (refine/inpaint com referência), usar gemini-25-flash.
Segue a regra canônica de geração de imagem do GLOBAL.md.
{blog_repo_path}/posts/YYYY-MM-DD-{slug}.html{blog_repo_path}/assets/images/index.html e README.md atualizados (via update-index.mjs)| Anti-padrão | Por que evitar |
|---|---|
| Reescrever texto pronto sem permissão | User passou texto = quer publicar AQUELE texto, não outra versão |
| Gerar 10+ imagens | Distrai leitor + custo desnecessário. 1 cover + 1-3 inline já dá |
| Forçar tom storytelling em post técnico curto | Vira hype. Manter tom direto. |
| Postar sem cover image | OG sharing fica feio sem cover. Sempre 1 mínimo. |
| Hardcode de paths absolutos no HTML do post | Quebra Pages. Sempre paths relativos (../assets/...) |
| Commit sem rodar update-index.mjs antes | README e index.html ficam desatualizados |
| Esquecer de aplicar anti-ai-writing.md | Vira marketing genérico, perde credibilidade |
| Creditar a fonte / footer "Fonte original" / "segundo {autor}" | Quebra o princípio AUTORAL. O post é do dono do blog. Ver REGRA DE ABSTRAÇÃO DE FONTE. |
| Publicar sem o bloco LinkedIn (--share-hook/--linkedin) | Perde o gancho de distribuição. Todo post deve facilitar o repost. |
posts/YYYY-MM-DD-{slug}.html existe e é HTML válidoassets/images/{slug}-cover.* existegrep -iE "fonte original|adaptaç" {post} retorna vazio.share-block com hook misterioso + texto copiável)index.html lista o post novoREADME.md lista o post novogit status está clean após commit+pushcurl -sI)Após retornar URL ao usuário, sugerir próximos passos opcionais:
medium.com/p/import (URL funciona porque Pages serve text/html)| Racionalização | Realidade | |---|---| | "Gera só texto, imagens depois" | Cover é obrigatória pra OG. Sempre gerar 1. | | "Tom storytelling vende mais" | Sem evidência. Direto+números converte melhor pra dev audience. | | "Pode ignorar anti-ai-writing num post pequeno" | Padrões aparecem mais visíveis em textos curtos, não menos. | | "Skip o update-index, eu commito manual" | Quebra o invariante do repo. Sempre rodar o script. |
skills/17-image-generator/SKILL.md — geração via fal.aiskills/42-blog-screenshot/SKILL.md — screenshots Playwrightskills/13-marketing-copy/SKILL.md — voz e CTAspolicies/anti-ai-writing.md — 29 padrões a evitar{blog_repo_path}/TEMPLATE.html — template base{blog_repo_path}/scripts/new-post.mjs — scaffold{blog_repo_path}/scripts/update-index.mjs — index regeneratortesting
Skill do Product Owner para especificação de features. Use quando precisar definir requisitos de negócio, escrever user stories, critérios de aceitação, priorização de backlog, ou qualquer documento de especificação de produto. Inclui fundamento de negócio para discovery: validação de hipótese, problema vs. necessidade, MVP, modelo de monetização e métricas pirata (AARRR) como input da spec. Trigger em: "nova feature", "especificação", "user story", "requisito", "backlog", "PO", "definir escopo", "critério de aceitação", "MVP", "roadmap", "validação de hipótese", "discovery", "monetização", "pricing", "product-market fit", "métricas AARRR".
tools
Audita o peso de contexto carregado na sessão — CLAUDE.md, agents, MCP descriptions, rules ativas, skills invocadas e histórico acumulado. Estima tokens por componente, reporta headroom disponível e emite alertas de overflow. Distinto do cost-tracker (skill 30) que rastreia tokens gastos em completions runtime. Trigger em: "contexto inchado", "context overflow", "quanto contexto estou usando", "peso do contexto", "context budget", "tokens carregados", "sessao lenta", "respostas degradadas", "headroom de contexto", "custo fixo de contexto", "overhead de rules", "overhead dos agents", "impacto do MCP no contexto", "espaco no context window", "quanto cabe no context window"
development
Coleta e organiza informacao tecnica multi-fonte antes de escrever docs, PRDs, ADRs ou artigos. Busca em: docs oficiais, GitHub (repos + issues), Stack Overflow, papers e blogs de referencia. Ranqueia fontes por autoridade (oficial 40% + recencia 30% + profundidade 20% + comunidade 10%). Output: memory/research/<slug>.md pronto para alimentar skill 10 (documenter), skill 01 (po-feature-spec), skill 26 (prompt-engineer) ou skill 41 (blog-publisher). Trigger em: "pesquisa tecnica", "levanta informacao", "coleta docs", "busca referencias", "preciso de fontes", "research antes de escrever", "levanta o que existe sobre", "benchmark de solucoes", "o que existe sobre X", "quero entender o estado da arte", "compara abordagens", "levanta referencias", "faz um research de", "coleta fontes sobre", "pesquisa sobre", "quero saber o que existe de", "monta um dossie tecnico", "background tecnico", "due diligence tecnica", "levantamento de alternativas".
development
Extrai e codifica os padroes de coding do projeto existente (naming, estrutura de arquivos, error handling, testing style, import style, API design, async patterns) e usa esses padroes como restricao sobre novo codigo. Garante que o agente code "igual ao resto do projeto" em vez de inventar convencoes proprias. Produce um "code style map" salvo em memory/patterns.md que todas as skills de geracao de codigo devem consultar. Trigger em: "segue o padrao do projeto", "coda igual ao resto", "nao reinventa padrao", "detecta padroes do codebase", "code style do projeto", "padrao do projeto", "convencao do projeto", "coda consistente", "mesma convencao", "sem reinventar roda", "padrao de codigo", "patterns do codebase", "pattern enforcement", "conformidade de padrao", "convencoes de naming", "padrao de tratamento de erro", "mesma estrutura do projeto", "detecta as convencoes", "extrai padroes de coding", "como o projeto estrutura".