🎯O que você ganha aqui
Sair sabendo escrever skill que dispara sozinha, sub-agent que o Claude principal delega na hora certa, e entender as features exclusivas do Claude Code (injeção dinâmica, allowed-tools) que NÃO existem no Codex.
Conteúdo detalhado
📦 Anatomia de uma skill
Skill no Claude Code é uma pasta em .claude/skills/<nome>/ com estrutura convencionada. O coração é SKILL.md, mas tem mais peças com função clara.
Estrutura completa
.claude/skills/minha-skill/ ├── SKILL.md ← obrigatório (frontmatter + body) ├── scripts/ ← scripts auxiliares chamáveis │ ├── check.sh │ └── format.py ├── references/ ← docs profundas (lazy-load) │ ├── api-spec.md │ └── examples.md └── assets/ ← imagens, binários, templates └── template.html
SKILL.md completo (exemplo real)
--- name: revisar-pr description: Use quando o usuário pedir pra revisar uma PR ou diff. Triggers: "revisa PR", "review pull request", "olha o diff". allowed-tools: Bash(git diff:*), Bash(gh pr:*), Read, Grep, Glob disable-model-invocation: false --- # Revisar PR ## Passo a passo 1. Identifica a PR (número via $ARGUMENTS ou \`gh pr list\`) 2. Lê diff completo com \`gh pr diff <numero>\` 3. Para cada arquivo mudado, verifica: - Bugs de correção (não estilo) - Edge cases não tratados - Vulnerabilidades comuns 4. Consulta \`references/security-checklist.md\` se tocar em auth 5. Retorna findings categorizados por severity (high/med/low) ## Referências - Checklist completo: \`references/security-checklist.md\` - Padrões do repo: \`references/repo-conventions.md\`
✓ Skill bem feita
- • Body curto e direto (passo-a-passo)
- • Detalhes em
references/(lazy) - •
allowed-toolsrestrito ao necessário - • description com triggers do mundo real
- • Scripts pra ações determinísticas
✗ Anti-pattern
- • Body de 200KB com TUDO inline
- • description só repetindo o nome
- • Sem allowed-tools (pode tudo)
- • Scripts no body em vez de
scripts/ - • Misturar várias responsabilidades
Conceitos-chave
name + description min
Passo-a-passo, < 5KB
Carregado on-demand
Ações sem LLM
🎯 Description — a arte do gatilho
A maior causa de "skill não funciona" é description ruim. Não é bug — é match semântico falhando. Claude lê descriptions de todas skills e escolhe a melhor pro contexto atual. Sua description compete por atenção.
✗ Description ruim
description: Skill de revisão
→ Vaga. Não diz quando usar. Não tem gatilho. Skill morre invisível.
✓ Description boa
description: Use quando o usuário pedir pra revisar PR/diff. Triggers: "revisa PR #123", "review da branch", "olha o diff", "code review".
→ Diz quando. Lista triggers reais. Match acerta.
Receita pra description de qualidade
💡Teste empírico
Depois de escrever, abre Claude Code e simula 5 prompts reais que deveriam ativar a skill. Se ativa em 4/5, ok. Se ativa em 2/5, description está fraca. Itera.
Conceitos-chave
Claude lê e decide
Padrão de gatilho
Frases do usuário
5 prompts reais
👤 Sub-agents auto-invocáveis
Sub-agent é uma persona especializada com system prompt próprio, tool surface restrita e contexto isolado. Claude principal lê a description e DELEGA — sozinho, sem você pedir nominal. É a feature que mais diferencia Claude do Codex.
Exemplo — .claude/agents/code-reviewer.md
--- name: code-reviewer description: Use proactively when the user finishes implementing a feature or before merging a PR. Specializes in catching correctness bugs. tools: Read, Grep, Glob, Bash(git diff:*) model: claude-opus-4-6 --- You are a senior code reviewer focused on correctness. ## Your role - Read the diff carefully - Flag correctness bugs (NOT style — linter handles that) - Check edge cases (null, empty, off-by-one, race conditions) - Note security risks (SQLi, XSS, path traversal, auth bypass) ## Output format A numbered list of findings: 1. **[severity]** file:line — what's wrong, why, suggested fix Be terse. No fluff.
Isolamento de contexto
Sub-agent abre janela própria — não polui contexto do principal. Devolve só o resultado.
Paralelismo
Claude pode disparar vários sub-agents em paralelo (Task tool). Útil pra research em ângulos múltiplos.
Modelo dedicado
Cada sub-agent pode usar modelo diferente. Haiku pra busca, Opus pra análise. Economia + qualidade.
Description com "proactively" — o segredo
A palavra "proactively" na description é um sinal forte pro Claude principal: "use isto SEM o usuário pedir, quando o contexto bater". Sem ela, o sub-agent quase nunca dispara sozinho.
description: Use proactively when... // dispara sozinho description: Use when the user explicitly asks... // só sob pedido
Conceitos-chave
Por description
Mecanismo de delega
tools: [a, b, c]
Palavra-chave
🔌 MCP servers — declaração e uso
MCP server expõe ferramentas externas ao Claude. Declarado em .mcp.json (projeto, vai pro git) ou ~/.claude.json (global). Cada tool exposta vira mcp__servidor__nome-tool.
.mcp.json (projeto)
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" }
},
"postgres": {
"command": "uvx",
"args": ["mcp-server-postgres", "--db-url", "${DATABASE_URL}"]
},
"linear": {
"type": "http",
"url": "https://mcp.linear.app/sse",
"headers": { "Authorization": "Bearer ${LINEAR_TOKEN}" }
}
}
}
Allowlist em settings.json
{
"enabledMcpjsonServers": ["github", "postgres"], // só estes ativam
"permissions": {
"allow": [
"mcp__github", // libera tudo do server
"mcp__postgres__query" // libera tool específica
]
}
}
📦 stdio transport
Server roda como processo filho via stdin/stdout. Mais comum pra MCP local.
Exemplo: npm/uvx que sobe processo, Claude conversa via pipe.
🌐 HTTP/SSE transport
Server roda como service remoto. Claude conecta via HTTP com Server-Sent Events.
Exemplo: Linear, Slack, serviços SaaS com endpoint MCP oficial.
Conceitos-chave
Projeto, vai pro git
Global
Dois transports
mcp__server__tool
🎨 Injeção dinâmica (backtick-bang) — exclusiva do Claude
Sintaxe específica do Claude Code: dentro de SKILL.md ou commands, código entre crase-bang (`!comando`) é executado pelo shell ANTES da skill chegar no LLM. O resultado entra direto no prompt — sem tool call adicional.
Exemplo prático
--- name: branch-status description: Mostra contexto da branch atual antes de propor próxima ação --- # Status da branch Branch atual: `!git branch --show-current` Último commit: `!git log -1 --oneline` Diff vs main: `!git diff main...HEAD --stat` Com base no acima, sugira o próximo passo.
Quando você invoca /branch-status, Claude já recebe um SKILL.md preenchido com os outputs reais. Não precisa pedir "rode git status" — já está lá.
✓ Bons usos
- • Snapshot do estado (git, versão, ENV)
- • Listar arquivos/branches relevantes
- • Pegar último log/erro
- • Injetar timestamp/data
- • Resultado de comando idempotente
✗ Cuidado
- • Comandos destrutivos (rm, drop)
- • Input do usuário interpolado direto (injection)
- • Comandos lentos (segura skill por segundos)
- • Output gigante (estoura contexto)
- • Side effects que mudam estado
⚠️Cuidado portabilidade
Backtick-bang NÃO existe no Codex. Skill que depende disso vai falhar lá. Polyskill reescreve como prosa de fallback ("rode git status e analise o resultado") quando compila pro Codex — mas perde a injeção real.
Conceitos-chave
Roda antes do prompt
Já vem no contexto
Só Claude tem
Prosa de fallback
🚦 disable-model-invocation e allowed-tools
Dois campos do frontmatter que dão controle fino sobre quando e como a skill roda. Essencial pra skills perigosas ou focadas.
🔒 disable-model-invocation
disable-model-invocation: true
Impede auto-trigger. Só roda quando você invoca explicitamente (/nome-skill).
Quando usar: skills destrutivas (drop, deploy, push), skills que custam (chamam API paga), skills que SÓ você invoca consciente.
🛡️ allowed-tools
allowed-tools: Read, Grep, Bash(git:*)
Restringe quais ferramentas a skill pode usar. Princípio do menor privilégio.
Quando usar: skill de leitura nunca deveria escrever, skill de análise nunca deveria abrir terminal. Restringe.
💡Combo de segurança
Pra skill perigosa: disable-model-invocation: true + allowed-tools ultra-restrito + descrição com aviso explícito. Garantia tripla.
Conceitos-chave
disable-model-invoke
allowed-tools
Mínimo necessário
model: haiku
🛍️ Plugins e marketplace
Plugin é um pacote distribuível: agrupa skills + agents + commands + hooks em um único bundle versionado. É como você consome trabalho dos outros (claude-mem, context-mode, superpowers, etc.) e publica o seu.
plugin.json — manifesto
{
"name": "meu-plugin",
"version": "1.2.0",
"description": "Conjunto de skills pra refatorar TypeScript",
"author": "@meu-handle",
"skills": ["./skills/ts-refactor", "./skills/ts-test-gen"],
"agents": ["./agents/ts-reviewer.md"],
"commands": ["./commands/refactor.md"],
"hooks": [{ "event": "PostToolUse", "matcher": "Edit", "command": "./scripts/format.sh" }]
}
Namespace
Skills do plugin viram plugin:skill-name pra evitar colisão.
Marketplace
Index de plugins (marketplace.json). Instala via /plugins.
Versionamento
npm-style semver. Atualiza via marketplace.
🦜Polyskill como plugin
Polyskill se distribui como plugin. Você instala uma vez, ganha o CLI + a meta-skill que dirige o CLI por linguagem natural. Plugin é a forma moderna de distribuir.
Conceitos-chave
Manifesto do bundle
Index público
Namespace
Versionamento
🎯Resumo do módulo
Próxima trilha:
T3 — Anatomia do Codex (AGENTS.md, .codex/, .agents/, openai.yaml)