Domínio 3 — Claude Code Configuration & Workflows · Lição 1 de 6

CLAUDE.md: hierarquia, @import e rules com paths

Objetivos de aprendizagem

Por que CLAUDE.md existe

O Claude Code lê automaticamente arquivos CLAUDE.md no início da sessão e os injeta no contexto como "memória" persistente do projeto: convenções de código, comandos de build e teste, arquitetura, o que não tocar. Diferente de um prompt digitado, o conteúdo de CLAUDE.md é sempre carregado — por isso ele deve conter apenas o que vale para (quase) toda interação. Instruções raramente usadas gastam tokens em todas as sessões; a prova cobra saber quando mover conteúdo para mecanismos sob demanda (skills, lição 3) ou condicionais (.claude/rules/ com paths:, nesta lição).

A hierarquia de três níveis

NívelLocalEscopoCompartilhado via git?
Usuário~/.claude/CLAUDE.mdTodas as sessões daquele usuário, em qualquer projetoNão — fica na home do desenvolvedor
ProjetoCLAUDE.md na raiz do repositório (ou .claude/CLAUDE.md)Todos que trabalham no repositórioSim — versionado com o código
SubdiretórioCLAUDE.md dentro de um subdiretórioCarregado quando o Claude trabalha com arquivos daquela árvoreSim (se versionado)
flowchart TD
    U["~/.claude/CLAUDE.md
(usuário — pessoal, fora do git)"] --> S["Contexto da sessão"] P["CLAUDE.md na raiz do projeto
(ou .claude/CLAUDE.md — versionado)"] --> S D["packages/api/CLAUDE.md
(subdiretório — carregado ao tocar nessa árvore)"] --> S R[".claude/rules/*.md com paths: [globs]
(condicional por arquivo editado)"] --> S

Os níveis são combinados, não mutuamente exclusivos: instruções de usuário, de projeto e de subdiretório entram juntas no contexto. Quanto mais específico o nível, mais próximo do trabalho atual ele está — instruções de subdiretório detalham (e na prática refinam) as do projeto para aquela área do código.

O diagnóstico clássico: "não funciona para o colega novo"

Cenário recorrente na prova: você adicionou uma instrução ("sempre rode npm run lint após editar") e o Claude Code obedece na sua máquina. Um colega novo clona o repositório e a instrução é ignorada. Causa mais provável: a instrução está em ~/.claude/CLAUDE.md (nível de usuário), que não é versionado e portanto não chega a ninguém via git clone/git pull. A correção é mover a instrução para o CLAUDE.md do projeto (raiz ou .claude/CLAUDE.md), que viaja com o repositório.

Regra de bolso: padrões do time → nível de projeto (versionado). Preferências pessoais (estilo de resposta, atalhos seus) → nível de usuário. Convenções específicas de um pacote num monorepo → CLAUDE.md do subdiretório ou regra com paths:.

Diagnóstico com /memory

O comando /memory mostra quais arquivos de memória estão carregados na sessão atual e permite editá-los. É a primeira ferramenta de diagnóstico quando o comportamento varia entre sessões ou entre máquinas: se o arquivo esperado não aparece na lista, ele não está sendo carregado (caminho errado, nível errado, arquivo não clonado). Na prova, "usar /memory para verificar o que está carregado" é a resposta proporcional antes de reescrever instruções ou suspeitar do modelo.

Modularização com @import

Um CLAUDE.md monolítico de centenas de linhas é difícil de manter e mistura assuntos. A sintaxe @caminho/arquivo.md importa o conteúdo de outro arquivo para a memória, permitindo compor a memória a partir de arquivos focados — inclusive reaproveitando documentos que já existem no repositório:

# CLAUDE.md (raiz do projeto)

## Visão geral
Monorepo com apps/web (Next.js) e packages/api (Fastify).

## Padrões compartilhados
@docs/padroes-de-codigo.md
@docs/convencoes-de-teste.md

## Específico do pacote api
Ver packages/api/CLAUDE.md, que importa apenas os padrões
relevantes àquele pacote (ex.: @../../docs/padroes-http.md).

O padrão cobrado no exame: em um monorepo, cada pacote mantém um CLAUDE.md enxuto que importa seletivamente os arquivos de padrões relevantes àquele pacote, com base no conhecimento de domínio dos mantenedores — em vez de todo pacote carregar todos os padrões do repositório.

.claude/rules/ e regras condicionais com paths

A alternativa ao CLAUDE.md monolítico é o diretório .claude/rules/: arquivos Markdown focados por tópico (testing.md, api-conventions.md, deployment.md). Um arquivo de regra pode ter frontmatter YAML com o campo paths: contendo globs — a regra só é carregada quando o Claude edita arquivos que casam com o padrão, reduzindo contexto irrelevante e uso de tokens:

---
paths:
  - "**/*.test.tsx"
  - "**/*.test.ts"
---
# Convenções de teste

- Use React Testing Library; nunca teste detalhes de implementação.
- Todo teste novo deve cobrir o caso de erro além do caminho feliz.
- Rode `npm run test -- --changed` antes de finalizar.
---
paths:
  - "terraform/**/*"
---
# Convenções de infraestrutura

- Nunca aplique mudanças; apenas gere o plano (`terraform plan`).
- Todo recurso precisa de tags `team` e `cost-center`.

paths: vs CLAUDE.md de subdiretório — quando cada um vence

Um CLAUDE.md de subdiretório é preso ao diretório: cobre packages/api/ e pronto. Ele funciona bem quando a convenção coincide com uma árvore de pastas. Mas quando a convenção se aplica a arquivos espalhados pelo repositório — o caso típico são testes colocalizados (Button.test.tsx ao lado de Button.tsx, em dezenas de pastas) — você precisaria de um CLAUDE.md em cada pasta. A regra com glob (**/*.test.tsx) cobre todos eles com um único arquivo, independentemente da localização. Este é um distrator recorrente na prova: a resposta certa para "testes espalhados pelo codebase" é .claude/rules/ com paths:, não múltiplos CLAUDE.md.

SituaçãoMecanismo certo
Convenção universal do time (vale sempre)CLAUDE.md do projeto
Convenção de uma área que coincide com uma pastaCLAUDE.md do subdiretório ou regra com paths: ["packages/api/**/*"]
Convenção por tipo de arquivo, espalhado (testes, migrações).claude/rules/ com glob por extensão/sufixo
Workflow invocado sob demandaSkill ou slash command (lição 3)

Atenção: regras com paths: são carregadas quando os arquivos editados casam com o glob. Não confunda com "aplicadas a todo o repositório o tempo todo" — o benefício é justamente carregar a convenção só quando relevante, economizando tokens.

Pegadinhas da prova

Resumo em 5 linhas

  1. Hierarquia: ~/.claude/CLAUDE.md (usuário, pessoal), CLAUDE.md raiz ou .claude/CLAUDE.md (projeto, versionado), CLAUDE.md de subdiretório (área específica) — os níveis se combinam.
  2. Instrução que "não funciona para o colega novo" quase sempre está no nível de usuário, que não viaja pelo git; mova para o nível de projeto.
  3. @import (@caminho/arquivo.md) modulariza a memória e permite que cada pacote importe só os padrões relevantes.
  4. .claude/rules/*.md com frontmatter paths: [globs] carrega convenções só ao editar arquivos que casam — ideal para tipos de arquivo espalhados (ex.: **/*.test.tsx).
  5. /memory lista os arquivos de memória carregados — primeira ferramenta para diagnosticar comportamento inconsistente entre sessões e máquinas.

Documentação oficial

Questões de fixação

1. Um desenvolvedor adiciona "sempre use conventional commits" e o Claude Code obedece na máquina dele. Um colega que acabou de clonar o repositório relata que a instrução é ignorada. Qual é a causa mais provável?

2. Os arquivos de teste do repositório ficam ao lado do código que testam (Button.test.tsx junto de Button.tsx), em dezenas de diretórios. Você quer que as convenções de teste sejam aplicadas automaticamente sempre que o Claude editar qualquer arquivo de teste. Qual é a abordagem mais sustentável?

3. Num monorepo, o CLAUDE.md raiz passou de 600 linhas misturando padrões HTTP, convenções de React e regras de deploy. Cada pacote usa só uma parte disso. Qual refatoração o exame considera a melhor prática?

4. O Claude Code segue as convenções do time na segunda-feira, mas numa nova sessão na terça parece "esquecê-las". Qual é o primeiro passo de diagnóstico proporcional?