Trabalhar com o Claude Code como um profissional
Do primeiro CLAUDE.md até criares os teus próprios agentes, skills e hooks. Cada módulo tem explicação, exemplos prontos a copiar, um exercício prático e um teste. No fim, recebes uma nota de 0 a 20.
Fundamentos: como o Claude Code pensa
O Claude Code é um agente: lê ficheiros, corre comandos, edita código e verifica o resultado, em ciclo. Ser eficiente é dar-lhe contexto certo, um objetivo claro e uma forma de se verificar.
O ciclo de ouro: Explorar → Planear → Implementar → Verificar
- Explorar. Pede-lhe para ler os ficheiros relevantes sem escrever código ainda. Ex.: “Lê
src/auth/e explica-me como funciona o login. Não alteres nada.” - Planear. Entra em Plan Mode (Shift+Tab até aparecer “plan mode”). O Claude investiga e propõe um plano, sem tocar em ficheiros. Revês e ajustas.
- Implementar. Aprovas o plano e ele executa. Podes interromper a qualquer momento com Esc.
- Verificar. Testes, build, lint, screenshot. Um agente que se consegue verificar sozinho é muito mais fiável.
Atalhos e comandos que vais usar todos os dias
| Comando / atalho | O que faz |
|---|---|
| Shift+Tab | Alterna modos de permissão: normal → aceitar edições automaticamente → plan mode |
| Esc | Interrompe o Claude (sem perder o contexto) |
Esc Esc ou /rewind | Volta atrás para um ponto anterior da conversa e/ou do código |
@ficheiro | Referencia um ficheiro diretamente no prompt |
! comando | Corre um comando shell e o output entra na conversa |
/init | Analisa o projeto e gera um CLAUDE.md inicial |
/clear | Limpa a conversa (começa do zero) |
/compact | Resume a conversa para libertar contexto |
/model | Troca de modelo (Opus para tarefas difíceis, Sonnet/Haiku para rapidez) |
claude -c / claude -r | Continua a última sessão / escolhe uma sessão para retomar |
claude -p "…" | Modo não-interativo (ótimo para scripts e CI) |
npm test passar e a página /login carregar sem erros na consola.”claude, carrega Shift+Tab até ao plan mode e pede: “Explica-me a arquitetura deste projeto e sugere 3 melhorias. Não alteres nada.”CLAUDE.md: a memória permanente
O CLAUDE.md é carregado automaticamente no início de cada sessão. É o sítio para tudo aquilo que te cansas de repetir: comandos, convenções, armadilhas do projeto.
Onde vive (hierarquia)
👤 Utilizador
~/.claude/CLAUDE.md
Preferências pessoais para todos os projetos.
📁 Projeto
./CLAUDE.md ou ./.claude/CLAUDE.md
Partilhado com a equipa via git.
🗂 Subpasta
./frontend/CLAUDE.md
Carregado só quando o Claude trabalha nessa pasta.
🔗 Imports
@docs/api.md dentro do CLAUDE.md puxa outro ficheiro (até 5 níveis).
Os ficheiros somam-se, não se substituem. Edita-os rapidamente com /memory.
O que inserir (e o que não inserir)
✅ Coloca
Comandos de build/test/lint · estrutura de pastas essencial · convenções de código que não são óbvias · armadilhas (“não mexer em X porque…”) · como fazer commits/PRs · stack e versões.
❌ Evita
Texto de marketing · documentação enorme (usa imports ou links) · coisas que o Claude descobre lendo o código · regras vagas (“escreve bom código”) · segredos e passwords.
Exemplo de um bom CLAUDE.md
CLAUDE.md# Projeto: Loja Online
Next.js 15 (App Router) + TypeScript + Prisma + PostgreSQL.
## Comandos
- `pnpm dev` → servidor local (porta 3000)
- `pnpm test` → testes (Vitest). Corre um ficheiro: `pnpm test path/to/file`
- `pnpm lint --fix` → lint + formatação
- `pnpm db:migrate` → migrações Prisma
## Estrutura
- `app/` rotas e páginas
- `lib/` lógica de negócio (sem React aqui)
- `components/` UI reutilizável
## Convenções
- Usa sempre named exports; nunca default exports.
- Valida inputs de API com Zod em `lib/schemas/`.
- Preços são guardados em cêntimos (inteiros), nunca floats.
## Armadilhas
- NUNCA editar `prisma/migrations/` à mão.
- `lib/legacy-payments.ts` está congelado — perguntar antes de alterar.
## Fluxo
- Depois de alterar código: corre `pnpm lint --fix` e os testes afetados.
- Mensagens de commit em inglês, formato Conventional Commits.
Mais detalhes da API: @docs/api-guide.md
Exemplo de CLAUDE.md pessoal (global)
~/.claude/CLAUDE.md# Preferências pessoais
- Responde em português de Portugal; código e commits em inglês.
- Prefiro soluções simples; não adiciones dependências sem perguntar.
- Antes de dizer que algo está feito, corre os testes e mostra o resultado.
- Uso pnpm, não npm.
/init. Depois abre o ficheiro gerado e corta-o para metade: mantém só comandos, convenções não óbvias e armadilhas. Testa numa sessão nova perguntando “que comandos uso para testar?”.Gestão de contexto e prompts eficientes
A janela de contexto é o recurso mais precioso. Quanto mais cheia, mais lento e menos preciso o Claude fica. Gerir contexto é a competência nº1 de quem trabalha bem com agentes.
Hábitos que fazem a diferença
/clearentre tarefas diferentes. Acabaste a feature A? Limpa antes de começar a B. Contexto antigo distrai./compactem tarefas longas. Podes orientar o resumo:/compact mantém as decisões sobre a API e a lista de ficheiros alterados./contextpara ver o que ocupa espaço (ficheiros de memória, MCP, ferramentas, conversa).- Delega investigação a subagentes. Eles leem 50 ficheiros no contexto deles e devolvem só a conclusão (ver Módulo 6).
- Se o Claude se enganou duas vezes, recomeça.
/clear+ um prompt melhor é quase sempre mais rápido do que corrigir em cima de uma conversa “poluída”.
Prompt fraco vs. prompt forte
😕 Fraco
“Corrige o bug do login.”
💪 Forte
“Os utilizadores com email em maiúsculas não conseguem fazer login (ver @src/auth/login.ts). Escreve primeiro um teste que reproduza o erro, depois corrige a causa. Corre pnpm test auth para confirmar.”
Ingredientes de um prompt forte: o quê · onde (ficheiros com @) · restrições · como verificar. Podes também colar screenshots ou arrastar imagens para o terminal.
SPEC.md e começa uma sessão nova com ele./context e observa a distribuição. Depois corre /compact com uma instrução de foco e volta a correr /context.Settings e permissões: menos interrupções, mais segurança
Os ficheiros settings.json controlam o que o Claude pode fazer sem te perguntar, variáveis de ambiente, hooks e muito mais.
| Ficheiro | Âmbito | Vai para o git? |
|---|---|---|
~/.claude/settings.json | Todos os teus projetos | — |
.claude/settings.json | Projeto (equipa) | Sim |
.claude/settings.local.json | Projeto, só para ti | Não (ignorado automaticamente) |
Permissões allow / deny
.claude/settings.json{
"permissions": {
"allow": [
"Bash(pnpm test:*)",
"Bash(pnpm lint:*)",
"Bash(git status)",
"Bash(git diff:*)"
],
"deny": [
"Read(./.env)",
"Read(./secrets/**)",
"Bash(rm -rf:*)"
]
}
}
deny ganha sempre a allow. Também podes gerir isto interativamente com /permissions, ou escolher “não voltar a perguntar” quando o Claude pede autorização.
--dangerously-skip-permissions desliga todas as confirmações. Usa apenas em ambientes isolados (container/VM sem dados importantes). No dia a dia, uma boa lista allow dá-te 90% da velocidade com segurança..claude/settings.json num projeto e adiciona à allow os comandos de teste e lint que usas. Adiciona Read(./.env) à deny. Confirma com /permissions.Skills: ensina-lhe receitas reutilizáveis
Uma skill é uma pasta com um SKILL.md: instruções (e opcionalmente scripts/ficheiros de apoio) para um tipo de tarefa. O Claude vê só o nome e a descrição; carrega o resto apenas quando precisa — por isso não gasta contexto.
📁 Projeto
.claude/skills/<nome>/SKILL.md
👤 Pessoal
~/.claude/skills/<nome>/SKILL.md
⚡ Invocação
Automática (o Claude decide pela descrição) ou manual com /nome.
Passo a passo: criar a skill “review-pr”
- Cria a pasta:
mkdir -p .claude/skills/review-pr - Cria o ficheiro
SKILL.mdcom frontmatter (nome + descrição) e as instruções. - Abre uma sessão nova e escreve
/review-pr— ou simplesmente “revê as minhas alterações”.
---
name: review-pr
description: Revê as alterações atuais (git diff) à procura de bugs, problemas de segurança e falta de testes. Usa quando o utilizador pedir uma revisão de código.
allowed-tools: Bash(git diff:*), Bash(git log:*), Read, Grep
---
# Revisão de código
1. Corre `git diff main...HEAD` para ver as alterações.
2. Para cada ficheiro alterado, verifica:
- erros de lógica e casos limite
- inputs não validados, segredos no código
- código novo sem testes
3. Responde com uma tabela: ficheiro · linha · gravidade · problema · sugestão.
4. Termina com um veredito: ✅ pronto / ⚠️ pequenas correções / ❌ precisa de trabalho.
Foco extra (se indicado pelo utilizador): $ARGUMENTS
| Campo do frontmatter | Para quê |
|---|---|
name | Nome e comando /nome |
description | O mais importante. É assim que o Claude decide quando usar a skill. Diz o quê e quando. |
allowed-tools | Ferramentas pré-autorizadas enquanto a skill está ativa |
disable-model-invocation: true | Só corre quando tu escreves /nome (bom para deploys e ações com efeitos) |
$ARGUMENTS | No corpo: substituído pelo que escreves depois do comando (/review-pr segurança) |
.claude/commands/*.md continuam a funcionar e comportam-se como skills simples.~/.claude/skills/commit/SKILL.md que analisa o git diff --staged e escreve uma mensagem de commit no teu formato preferido. Marca-a com disable-model-invocation: true e testa com /commit.Subagentes: especialistas com contexto próprio
Um subagente é um “Claude assistente” com o seu próprio prompt de sistema, ferramentas e janela de contexto. O agente principal delega-lhe uma tarefa e recebe apenas o resultado — o teu contexto fica limpo.
Quando usar
Investigar muitos ficheiros · revisão independente · tarefas paralelas · funções repetidas com regras fixas (ex.: “test-runner”).
Quando evitar
Tarefas pequenas que fazes em 2–3 passos: o subagente começa sem contexto e custa mais tokens.
Passo a passo: criar o agente “test-runner”
- Forma fácil: escreve
/agents→ “Create new agent” → o Claude ajuda-te a gerar o ficheiro. - Forma manual: cria
.claude/agents/test-runner.md(projeto) ou~/.claude/agents/test-runner.md(pessoal). - Usa: “Usa o test-runner para verificar as minhas alterações” — ou deixa o Claude delegar sozinho, com base na descrição.
---
name: test-runner
description: Corre os testes, analisa falhas e propõe correções. Usa proativamente depois de alterações de código.
tools: Bash, Read, Grep, Glob
model: sonnet
---
És um especialista em testes.
1. Identifica os testes afetados pelas alterações recentes (`git diff --name-only`).
2. Corre-os com `pnpm test <ficheiros>`.
3. Para cada falha: lê o teste e o código, identifica a causa raiz.
4. Devolve um relatório curto:
- ✅ / ❌ por ficheiro
- causa de cada falha (1 linha)
- correção sugerida (diff mínimo)
Não alteres ficheiros: apenas relata.
| Campo | Para quê |
|---|---|
name | Identificador do agente |
description | Quando o principal deve delegar (“use proactively…” incentiva o uso automático) |
tools | Lista de ferramentas permitidas. Omitido = herda todas. Restringe para segurança e foco. |
model | sonnet, opus, haiku ou inherit. Haiku é ótimo para tarefas simples e rápidas. |
code-explorer só com Read, Grep, Glob e model: haiku, cuja descrição seja “encontra onde algo está implementado no código”. Pergunta: “Onde é que tratamos a autenticação?” e observa a delegação.Hooks: automação garantida
Instruções no CLAUDE.md são sugestões que o Claude normalmente segue. Hooks são comandos shell que correm sempre, em momentos definidos. Se algo tem de acontecer 100% das vezes, é um hook.
| Evento | Quando dispara | Uso típico |
|---|---|---|
PreToolUse | Antes de uma ferramenta correr | Bloquear comandos perigosos ou edições a ficheiros protegidos |
PostToolUse | Depois de uma ferramenta correr | Formatar ficheiros após edição, correr lint |
UserPromptSubmit | Quando envias um prompt | Injetar contexto extra, validar prompts |
Stop | Quando o Claude termina de responder | Correr testes, notificação |
Notification | Quando o Claude precisa da tua atenção | Notificação no desktop |
SessionStart | Início de sessão | Carregar contexto (ex.: issues abertas) |
Exemplo 1 — formatar automaticamente depois de cada edição
.claude/settings.json{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
}
]
}
]
}
}
O hook recebe um JSON no stdin com os detalhes da chamada (ex.: tool_input.file_path). O matcher filtra por nome de ferramenta (aceita regex).
Exemplo 2 — proteger o ficheiro .env
.claude/hooks/protect-env.sh#!/usr/bin/env bash
file=$(jq -r '.tool_input.file_path // empty')
if [[ "$file" == *.env* ]]; then
echo "Bloqueado: não é permitido editar ficheiros .env" >&2
exit 2 # exit 2 = bloqueia a ação; o stderr é enviado ao Claude
fi
exit 0
// em .claude/settings.json
"PreToolUse": [{
"matcher": "Edit|Write",
"hooks": [{ "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-env.sh" }]
}]
0 = tudo bem, continua · 2 = bloqueia e mostra o stderr ao Claude (para ele corrigir) · outro = erro não bloqueante. Usa /hooks para ver os hooks ativos.Notification em ~/.claude/settings.json com notify-send "Claude precisa de ti" (Linux). Assim podes mudar de janela e ser avisado.MCP e Plugins: liga o Claude ao mundo
O MCP (Model Context Protocol) dá ao Claude ferramentas externas: GitHub, Notion, bases de dados, browsers, Figma… Os plugins empacotam skills, agentes, hooks e servidores MCP para instalares de uma vez.
Adicionar um servidor MCP
# Servidor remoto (HTTP)
claude mcp add --transport http notion https://mcp.notion.com/mcp
# Servidor local (stdio) — tudo depois de -- é o comando a correr
claude mcp add playwright -- npx @playwright/mcp@latest
# Partilhar com a equipa (grava em .mcp.json na raiz do projeto)
claude mcp add --scope project --transport http github https://api.githubcopilot.com/mcp/
# Gerir
claude mcp list
claude mcp remove notion
Dentro de uma sessão, /mcp mostra o estado dos servidores e permite autenticar (OAuth).
| Scope | Onde fica | Quem vê |
|---|---|---|
local (padrão) | Config do utilizador, só para este projeto | Só tu, neste projeto |
project | .mcp.json no repositório | Toda a equipa |
user | Config do utilizador | Só tu, em todos os projetos |
/context.Plugins
Escreve /plugin para navegar em marketplaces e instalar pacotes prontos (ex.: um plugin de revisão de código traz skills + agentes + hooks). Ótimo para partilhar o teu setup com a equipa: em vez de copiar 10 ficheiros, publicas um plugin.
Mapa mental final: o que usar quando
| Preciso de… | Usa |
|---|---|
| Regras que valem sempre | CLAUDE.md |
| Uma receita para um tipo de tarefa | Skill |
| Um trabalhador com contexto isolado | Subagente |
| Algo que acontece obrigatoriamente | Hook |
| Acesso a um serviço externo | MCP |
| Partilhar tudo isto num pacote | Plugin |
claude mcp list para veres o que já tens instalado. Remove um servidor que nunca usas e compara o antes/depois com /context.