Skills de IA com Vibecoding e Terminal · Capítulo 8 de 12 · 33 min
Projeto 2: Skill Multi-arquivo com Dicionários e Validadores
Construa uma skill complexa (content-voice-guard) com múltiplos validadores, dicionários de dados e lazy loading.
Este capítulo faz parte do curso gratuito Skills de IA com Vibecoding e Terminal.
A primeira skill é simples por desenho: um script, um template, um fluxo. Skills reais de produção têm mais camadas. Elas carregam dicionários, cruzam dados, produzem saída em múltiplos formatos e precisam funcionar offline. Este módulo constrói uma dessas skills: content-voice-guard, uma ferramenta real que a Brasil GEO usa antes de publicar qualquer conteúdo em canais públicos (LinkedIn, newsletter, artigo, ebook).
O que a skill faz: recebe um texto ou arquivo em Markdown, verifica acentuação completa em PT-BR usando dicionário de 300+ palavras, detecta clichês proibidos (lista curada), valida presença de credenciais de referência quando o autor é mencionado, e flagga domínios inválidos. Retorna relatório com linhas problemáticas e sugestões de correção.
content-voice-guard/
|-- SKILL.md
|-- scripts/
| |-- voice_guard.py # Orquestrador principal
| |-- accent_checker.py # Validador de acentos
| |-- cliche_checker.py # Validador de cliches
| `-- credential_checker.py # Validador de credenciais
|-- dicionarios/
| |-- acentos_pt_br.json # 300+ palavras -> versao correta
| |-- cliches_proibidos.json # Lista de proibidos
| |-- credenciais.json # Credenciais canonicas por pessoa
| `-- dominios_validos.json # Whitelist de dominios
|-- templates/
| `-- report.md
|-- references/
| `-- editorial-guide.md # Guia completo (opcional)
`-- tests/
|-- fixtures/ # Textos de teste
`-- test_voice_guard.pyO padrão arquitetural importa. O SKILL.md menciona apenas voice_guard.py como entrypoint. Os validadores individuais (accent_checker, cliche_checker, credential_checker) são módulos Python que voice_guard.py importa internamente. O agente não precisa ler cada validator -- ele orquestra tudo via um único comando. Isso mantém a janela de contexto enxuta.
Os dicionários em JSON são o coração da skill. São dados puros, sem lógica. Isso tem duas virtudes: a) qualquer pessoa com editor de texto pode atualizar o dicionário sem mexer em código, e b) outras skills podem reutilizar os mesmos JSONs (uma skill de newsletter e outra de LinkedIn podem compartilhar o mesmo cliches_proibidos.json).
# dicionarios/acentos_pt_br.json (extrato de exemplo)
{
"entradas": {
"nao": "nao -> não",
"voce": "voce -> você",
"publicacao": "publicacao -> publicação",
"informacao": "informacao -> informação",
"relatorio": "relatorio -> relatório"
},
"exceptions_regex": [
"^[A-Z]{2,4}$", # Siglas em caixa alta (AI, GEO, CMO)
"^https?://", # URLs nunca sao corrigidas
"\\bfrom\\s+[a-zA-Z_.]+\\s+import\\b" # Imports Python
],
"skip_contexts": [
"code_block", # Blocos ``` nao sao validados
"inline_code", # `codigo` nao e validado
"url", # slugs, href, src
"jsx_attribute" # prop={"texto"}
]
}
# Comentario: o campo `entradas` faz a correcao direta.
# `exceptions_regex` impede falsos positivos (AI != AI).
# `skip_contexts` diz para nunca corrigir dentro desses blocos.# scripts/voice_guard.py (excerto essencial)
from pathlib import Path
import json, sys, argparse
from accent_checker import check_accents
from cliche_checker import check_cliches
from credential_checker import check_credentials
BASE = Path(__file__).parent.parent
DICT_DIR = BASE / "dicionarios"
def load_dict(name: str) -> dict:
return json.loads((DICT_DIR / name).read_text(encoding="utf-8"))
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--file", required=True)
parser.add_argument("--strict", action="store_true",
help="warnings tambem bloqueiam")
args = parser.parse_args()
text = Path(args.file).read_text(encoding="utf-8")
accents = check_accents(text, load_dict("acentos_pt_br.json"))
cliches = check_cliches(text, load_dict("cliches_proibidos.json"))
creds = check_credentials(text, load_dict("credenciais.json"))
issues = accents + cliches + creds
blocking = [i for i in issues if i["severity"] == "error"]
warnings = [i for i in issues if i["severity"] == "warning"]
print(json.dumps({
"file": args.file,
"total_issues": len(issues),
"blocking": len(blocking),
"warnings": len(warnings),
"issues": issues,
}, indent=2, ensure_ascii=False))
return 1 if blocking or (args.strict and warnings) else 0
if __name__ == "__main__":
sys.exit(main())Lazy loading de referências grandes. Se a skill tem uma referência pesada -- um guia editorial de 40 páginas, um schema SQL complexo, documentação de API -- você coloca em references/ e a menciona no SKILL.md como opcional. O agente lê apenas se a tarefa demandar aquele nível de detalhe. Isso mantém a skill leve no caso comum e completa no caso excepcional.
Exemplo concreto: o SKILL.md de content-voice-guard menciona 'para dúvidas sobre cliches ambíguos, consulte references/editorial-guide.md'. Em 90% das execuções, o agente nunca abre esse arquivo. Em 10%, ele abre e resolve casos limítrofes sem intervenção humana.
Versionamento de dicionários. Cada dicionário JSON deve ter um campo _meta com version, updated_at e source. Quando você atualizar a lista de clichês proibidos em abril de 2026, o campo vira {"version": "2.4", "updated_at": "2026-04-15", "source": "retrospectiva trimestral"}. O agente pode inclusive cruzar a versão do dicionário com a data do texto -- 'este texto de fevereiro usa cliches que só foram banidos em abril, warning e não error'.
Teste suas skills com fixtures. Não basta ter a skill funcionando no caso feliz. Crie textos de teste em tests/fixtures/ que simulam os erros que você quer detectar -- texto com 'nao' em vez de 'não', texto com clichê 'vamos explorar', texto mencionando Alexandre sem credencial de referência. O teste automatizado em test_voice_guard.py valida que cada issue esperado é realmente detectado. Sem fixtures, uma mudança sutil de regex pode regredir validações em silêncio.
Aplicação direta em mídia paga: a skill variacoes-anuncio. Ela gera variações de título e descrição para anúncios de pesquisa e de redes sociais e, a cada arquivo que escreve, roda um verificador de marca. A novidade é onde mora a verificação: num hook declarado no próprio frontmatter da skill. Instrução no SKILL.md é orientação que o modelo pode esquecer numa conversa longa; hook é código que roda sempre, com resultado que o agente é obrigado a ler.
---
name: variacoes-anuncio
description: Gera variações de títulos e descrições de anúncios (Google Ads, Meta, LinkedIn) dentro dos limites de caracteres e das regras de marca. Use quando pedirem variações, novos títulos, headlines ou textos de anúncio.
allowed-tools: Read Write
hooks:
PostToolUse:
- matcher: "Write|Edit"
hooks:
- type: command
command: "python3 ${CLAUDE_PROJECT_DIR}/.agents/skills/variacoes-anuncio/scripts/checar_marca.py"
---
# Variações de anúncio
1. Leia references/marca.json: termos proibidos, promessas vetadas,
limites de caracteres por plataforma e tom de voz.
2. Gere 15 títulos e 4 descrições por grupo de anúncios, em PT-BR.
3. Salve em anuncios/<campanha>-<data>.csv (plataforma, tipo, texto, caracteres).
4. Se o verificador apontar problema, corrija só as linhas citadas
e salve de novo. Não entregue com aviso pendente.
# scripts/checar_marca.py lê o JSON do hook na entrada padrão,
# abre o arquivo de tool_input.file_path, confere limites e termos
# e sai com código 2 listando as linhas fora da regra: no PostToolUse
# o Claude Code mostra essa saída ao agente, que corrige em seguida.Variações de anúncio com checagem automática de marca
Pré-requisito: a bancada do capítulo "Terminal e Claude Code: o Setup que Vai Servir para os Próximos Anos" e o padrão de dicionário em JSON deste capítulo.
Passo 1: Escreva references/marca.json com três listas: termos proibidos, promessas vetadas e limites por plataforma.
No anúncio responsivo de pesquisa do Google Ads, título tem até 30 caracteres e descrição até 90. Coloque os limites das outras redes conforme o padrão do time.
Deu certo quando: O JSON abre sem erro (python -m json.tool references/marca.json).
Erro comum: Lista de proibidos só com palavras exatas: inclua variações como "garantido", "garantia" e "100%".
Passo 2: Peça ao agente o scripts/checar_marca.py e teste fora do agente com um CSV de exemplo.
O script lê o caminho do arquivo no JSON que o hook envia, confere cada linha e sai com código 2 quando há violação, escrevendo o motivo na saída de erro.
Deu certo quando: Com um título de 34 caracteres no CSV, o script imprime a linha e o motivo e termina com código 2.
Erro comum: Sair com código 1: no PostToolUse, só o código 2 faz o agente ver a mensagem.
Passo 3: Declare o hook no frontmatter e chame a skill pedindo variações para uma campanha real.
Deu certo quando: Ao salvar o CSV, aparece o retorno do verificador e o agente reescreve as linhas citadas sem você pedir.
Erro comum: O hook de skill continua ativo pelo resto da sessão. Se ele atrapalhar outra tarefa, use once: true ou abra sessão nova.
Passo 4: Leve a mesma regra para o Codex com .codex/hooks.json.
O Codex não lê hooks do frontmatter da skill; ele carrega hooks de ~/.codex/hooks.json ou do .codex/ do projeto, com os eventos PostToolUse e PreToolUse e o mesmo código 2. A diferença está na entrada: no Codex a gravação chega como apply_patch, com o caminho dentro de tool_input.command, e o script precisa ler os dois formatos.
Deu certo quando: O Codex mostra o retorno do verificador depois de gravar o CSV.
Erro comum: Hook de projeto no Codex só carrega quando a pasta .codex/ do projeto é marcada como confiável.
No fim você tem: Variações que já saem dentro do limite de caracteres e sem termo vetado, com revisão humana concentrada em estratégia e não em contagem de letras.
Você construiu uma skill multi-arquivo com orquestrador, validadores modulares, dicionários versionados e suite de testes. Este padrão escala: a mesma arquitetura serve para skills de compliance fiscal, validação de contrato, checagem de brand voice e dezenas de outros domínios.
Seu caderno neste capítulo
Abrir o caderno completoSelecione um trecho do capítulo para destacar ou anotar. Nos vídeos e áudios, use Anotar este momento. No teclado, selecione com Shift e as setas e use Alt+Shift+D para destacar ou Alt+Shift+N para anotar.
Salvo neste navegador. Entre na sua conta para levar o caderno a outros aparelhos.
Entre na sua conta para compartilhar o que aprendeu e convidar alguém para estudar com você.
Conexões deste capítulo
Veja o que estudar antes e para onde seguir depois, explore os conceitos e compare abordagens em outros cursos. Sugestões marcadas como “sugerido pelo grafo” vêm dos assuntos em comum, não do índice do curso.
Estude antes
- CursoClaude Code CLI: Programação com IA
- Marketing no VS Code: JSON-LD e CSV de campanhassugerido pelo grafoApresenta o conceito “JSON”, usado em “Projeto 2: Skill Multi-arquivo com Dicionários e Validadores”.
- CursoSetup Completo: do zero ao Claude Codesugerido pelo grafo5 capítulos de “Skills de IA com Vibecoding e Terminal” usam conceitos apresentados em “Setup Completo: do zero ao Claude Code”.
- CursoVibecoding para SEOsugerido pelo grafo3 capítulos de “Skills de IA com Vibecoding e Terminal” usam conceitos apresentados em “Vibecoding para SEO”.
Depois, siga para
- CursoFrontends com Vibecodingsugerido pelo grafo9 capítulos de “Frontends com Vibecoding” usam conceitos apresentados em “Skills de IA com Vibecoding e Terminal”.
- CursoPrompt Engineering para Executivossugerido pelo grafo3 capítulos de “Prompt Engineering para Executivos” usam conceitos apresentados em “Skills de IA com Vibecoding e Terminal”.
- CursoRLM 2027sugerido pelo grafo2 capítulos de “RLM 2027” usam conceitos apresentados em “Skills de IA com Vibecoding e Terminal”.
Conceitos deste capítulo
O mesmo assunto em outros cursos
- Agentes de IA Autônomos: Do Conceito à ProduçãoClaude Agent SDKExaminar conexões de Claude Agent SDK
- Frontends com VibecodingConfigurar ambiente, skills e o contêiner de contextoExaminar conexões de Configurar ambiente, skills e o contêiner de contexto
- Vibecoding para SEOSetup do Ambiente: Claude Code + Cursor em 15 MinutosExaminar conexões de Setup do Ambiente: Claude Code + Cursor em 15 Minutos
- Setup de Vibecoding no MacSkills, plugins e barra de status — deixar o Claude Code com a sua caraExaminar conexões de Skills, plugins e barra de status — deixar o Claude Code com a sua cara
Voltar ao capítulo anterior: Projeto 1: Sua Primeira Skill Funcional
Leve uma ideia para a prática
Escolha uma atividade no painel e volte a este curso quando quiser.
Atividades e evolução ficam reunidas no painel da sua conta.
Capítulos vizinhos em Skills de IA com Vibecoding e Terminal
- 06Anatomia de uma Skill: Divulgação Progressiva em Três Níveis
- 07Projeto 1: Sua Primeira Skill Funcional
- 08Projeto 2: Skill Multi-arquivo com Dicionários e Validadores
- 09Model Context Protocol: o USB-C da IA
- 10Orquestração Persistente: OpenClaw e Agentes que Vivem 24/7