Projeto novo com Claude Code: o que decidir antes da primeira linha de código?

Claude Code projeto do zero é menos sobre digitar prompt e mais sobre entregar um esqueleto decidido. Antes da primeira linha, quem decide stack, estrutura de pastas, convenções de branch e o que entra no repositório continua sendo você. O caminho curto: rode claude, dê /init pra gerar o CLAUDE.md a partir da análise do repositório, revise o arquivo com as suas convenções e peça o commit dele. Depois disso o agente escreve em cima de regra escrita, não de achismo, e você para de corrigir a mesma coisa toda sessão 🙂
O Claude Code escreve rápido em cima do esqueleto que você entregar
Esqueleto indefinido vira retrabalho, e o retrabalho não aparece no primeiro prompt, aparece na terceira sessão, quando você percebe que cada arquivo saiu com um padrão diferente
Este post é sobre as decisões que continuam sendo suas em um projeto novo: linguagem, framework, estrutura de pastas, convenção de branch, limites de segurança, o que vai versionado e o que fica na sua máquina
E, principalmente, sobre COMO registrar essas decisões num lugar que o agente lê antes de escrever a primeira linha
O que você precisa ter em mãos antes de começar
Três coisas, e nenhuma delas é prompt:
- um repositório git já iniciado (o histórico é a sua rede de segurança, falo disso lá no passo 10)
- o Claude Code instalado e funcionando no terminal
- as decisões mínimas de produto já tomadas: linguagem, framework e gerenciador de pacotes
Repare que a escolha da stack é SUA, e continua sendo sua depois que o agente entra em cena
O trabalho daqui pra frente é pegar essa escolha e transformar em contexto que o agente lê toda sessão
O fluxo inicial recomendado na documentação é curtinho: iniciar com o comando claude, gerar o guia do projeto com /init e pedir ao Claude que faça commit do CLAUDE.md gerado no repositório
Bora abrir isso passo a passo?
Passo a passo: preparar o terreno antes da primeira linha de código
Domine o Claude Code do básico ao avançado
Você vai aprender a criar sistemas completos com Claude Code, sem precisar ser programador. Inscreva-se para ter acesso a um desconto de lançamento e bônus especiais!
1. Rode claude e depois /init
O /init faz o Claude Code analisar o codebase e gerar um arquivo CLAUDE.md com os comandos de build, as instruções de teste e as convenções que ele descobre
cd meu-projeto
claude
Dentro da sessão:
/init
Existe também um fluxo interativo em várias fases, habilitado pela variável de ambiente CLAUDE_CODE_NEW_INIT=1, no qual o /init pergunta quais artefatos configurar (CLAUDE.md, skills e hooks) e explora o codebase com subagentes antes de apresentar as propostas
O erro comum deste passo: rodar o /init numa pasta vazia esperando convenções prontas
Ele analisa o repositório, então repositório sem nada dentro devolve pouco, e o trabalho de escrever a convenção volta pro seu colo (o que é bom, veja o passo 3)
Outro detalhe que evita susto: se já existir um CLAUDE.md, o /init sugere melhorias em vez de sobrescrever o arquivo
2. Decida o escopo do contexto: usuário ou projeto?
Os arquivos CLAUDE.md são lidos no início de cada sessão e vivem em escopos diferentes
- escopo de usuário: ~/.claude/CLAUDE.md
- escopo de projeto: CLAUDE.md ou .claude/CLAUDE.md
A ordem de carga vai do mais amplo pro mais específico: usuário primeiro, projeto depois
Na prática isso quer dizer que a instrução do projeto entra no contexto DEPOIS da sua instrução pessoal
O erro comum deste passo: jogar preferência sua (tema, jeito de responder, atalho pessoal) dentro do arquivo do projeto e versionar aquilo pro time inteiro engolir
Gosto pessoal vai pro escopo de usuário, regra do projeto vai pro escopo de projeto, e pronto
Se quiser conferir a mecânica completa, a documentação de memória do Claude Code é a referência
3. Escreva no CLAUDE.md o que é decisão SUA
Aqui é o coração do post
O conteúdo recomendado inclui comandos bash, estilo de código, etiqueta de repositório (nomenclatura de branch, preferência entre merge e rebase) e setup do ambiente de desenvolvimento, mantendo o arquivo conciso e legível por humanos, sem formato obrigatório
Dá pra declarar políticas de segurança que o Claude Code referencia, como exigir statements parametrizados em consultas ao banco, autenticação em endpoints de API e proibição de segredos hardcoded na configuração
E dá pra customizar o comportamento de compactação, com instrução pra preservar informação crítica como a lista completa de arquivos modificados e os comandos de teste
Um esqueleto de arquivo fica mais ou menos assim:
# API de pedidos
## Comandos
- instalar: npm ci
- rodar em dev: npm run dev
- testar: npm test
- lint: npm run lint
## Estilo de código
- TypeScript com tipos explícitos nas fronteiras de módulo
- nada de default export
## Etiqueta de repositório
- branch: feat/nome-curto, fix/nome-curto
- rebase na branch de trabalho, merge commit só na main
## Setup de ambiente
- Node na versão do .nvmrc
- variáveis em .env.local, nunca commitadas
## Segurança
- toda consulta ao banco usa statement parametrizado
- todo endpoint de API exige autenticação
- nenhum segredo hardcoded na configuração
## Compactação
- ao compactar, preserve a lista completa de arquivos modificados e os comandos de teste
O erro comum deste passo: escrever o arquivo como se fosse documentação institucional
O objetivo é ser conciso e legível por humano, não é encher linguiça pra parecer completo
4. Estrutura de pastas e CLAUDE.md hierárquico
Em codebases grandes e monorepos dá pra usar arquivos CLAUDE.md em níveis diferentes (raiz, pacotes, componentes), e o Claude sobe a árvore de diretórios pra descobrir esses arquivos
O detalhe que muda o seu planejamento: os arquivos acima do diretório de trabalho são carregados por inteiro no lançamento da sessão, e os que estão em subdiretórios carregam sob demanda, quando o Claude lê arquivos daquelas pastas
Ou seja: a regra específica de um pacote MORA no pacote, e só entra no contexto quando ele for mexer ali
O erro comum deste passo: quebrar o arquivo em imports @path achando que economiza contexto
Não economiza
Dividir o conteúdo em imports ajuda a organizar, mas os arquivos importados carregam no lançamento da sessão do mesmo jeito
5. Regra condicional por caminho, com frontmatter
Dá pra escopar regra por caminho usando frontmatter YAML com o campo paths
---
paths: "src/api/**/*.ts"
---
Todo handler novo valida a entrada antes de tocar no banco
Nenhum handler devolve stack trace na resposta
Essa regra condicional só vale quando o Claude trabalha com arquivos que casam com o padrão
O erro comum deste passo: esquecer o campo paths e achar que a regra está "escondida" até ser relevante
Regra sem o campo paths carrega incondicionalmente, sempre
6. Decida o que entra no repositório
Aqui é decisão de time, não de ferramenta
- .claude/settings.json: o que é versionado e compartilhado com o time
- .claude/settings.local.json: o que não entra no controle de versão
- ~/.claude/settings.json: escopo global, lido em toda sessão, independentemente do projeto aberto
Detalhe bom: o Claude Code adiciona o settings.local.json ao gitignore global quando salva uma configuração nesse arquivo
O erro comum deste passo: colocar permissão frouxa da SUA máquina no arquivo versionado e distribuir isso pro time inteiro sem querer
7. Permissões: entenda a ordem de avaliação antes de liberar geral
A ordem é esta: hook PreToolUse, regras de negação, regras de permissão, regras de pergunta, checagem do modo de permissão, callback canUseTool e hook PostToolUse
Duas consequências práticas que valem ouro num projeto novo:
- deny é avaliado antes de allow, e regra de negação bloqueia mesmo em bypassPermissions
- regras de allow pré-aprovam ferramentas pra SESSÃO INTEIRA, não só pro turno atual
Então a lista de negação é o seu guardrail de verdade
É ela que continua valendo no dia em que alguém do time decidir rodar tudo no modo mais solto
O erro comum deste passo: aprovar algo "só dessa vez" achando que a permissão morre no turno seguinte
8. Automatize a convenção com um hook, em vez de repetir no prompt
Um hook PostToolUse com matcher Write|Edit pode rodar lint ou formatação depois que o Claude escreve ou edita um arquivo, configurado na chave hooks do settings.json
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{ "type": "command", "command": "npm run lint -- --fix" }
]
}
]
}
}
O Claude Code observa os arquivos de configuração e recarrega quando eles mudam, então edição na maioria das chaves vale na sessão em curso sem reiniciar, hooks incluídos
O erro comum deste passo: tratar PostToolUse como guarda de portão
Ele não desfaz nada, porque a ferramenta já executou
Se a intenção é BLOQUEAR, o lugar é antes, na camada de permissão
9. Opcional no começo: subagentes e skills
Subagentes de projeto ficam em .claude/agents/ e são específicos do projeto e compartilháveis com o time, enquanto os de usuário ficam em ~/.claude/agents/ e valem em todos os projetos
Cada subagente é um Markdown com frontmatter YAML, e a descoberta acontece subindo a partir do diretório de trabalho atual, varrendo todo .claude/agents/ entre ele e a raiz do repositório
Skills seguem a mesma lógica de escopo: ~/.claude/skills/ pra pessoal e .claude/skills/ pra projeto, cada uma sendo um diretório com um SKILL.md, onde o campo description determina quando o Claude aciona aquilo
Skills de projeto carregam do diretório onde a sessão começou e de cada diretório pai até a raiz do repositório, e mudança em skill é detectada dentro da sessão em curso, sem reiniciar
É justamente por causa desse escopo e desse description que uma skill copiada de outro projeto às vezes simplesmente não dispara na sua máquina
O erro comum deste passo: montar seis subagentes no dia 1, antes de existir código
Deixe pra criar quando a dor aparecer
10. Defina a política de trabalho: plan mode e ritmo de commit
O Shift+Tab alterna o modo de permissão da sessão, e dá pra pressionar até a barra de status mostrar o plan mode ativo
Planejar antes rende mais quando existe incerteza sobre a abordagem, quando a mudança altera vários arquivos ou quando o código a modificar não é familiar
Do outro lado da segurança está o git: pedir ao agente que faça commit do progresso com mensagens descritivas e escreva resumos do avanço é a melhor forma de obter bom comportamento, e commitar a cada unidade significativa de trabalho dá histórico recuperável e evita perda de trabalho
Se você ainda está decidindo quanto poder dar ao agente no Git, essa conversa merece acontecer ANTES da primeira feature
O erro comum deste passo: deixar o agente rodar três horas sem um único commit e depois tentar separar o que prestou do que não prestou
O que aprendi montando um projeto do zero com o Claude Code
O que mais me pegou gravando o tutorial: a primeira decisão não é o código, é ONDE a ferramenta vai rodar
Muita gente trava na linha de comando, e por isso eu costumo indicar a integração com o editor pra quem está começando
Depois vem a escolha da forma de login, que acontece antes de qualquer prompt, e eu fico na mais simples pra mim
Outra coisa que virou hábito: eu abro o terminal já DENTRO da pasta onde o projeto vai nascer
Parece bobo, mas escolher o diretório é passo anterior ao primeiro prompt, e a ferramenta ainda pede permissão explícita pra trabalhar naquela pasta, valendo tanto pra projeto novo quanto pra projeto que já existe
Já me ferrei com setup também: numa instalação no Windows o binário não ficou acessível no terminal por falta de permissão, e eu tive que ajustar a variável de ambiente na mão antes de conseguir usar
Tome cuidado com isso, porque nessa hora não é o modelo que está errando, é o ambiente 😅
No primeiro teste eu pedi uma calculadora de IMC com HTML, CSS e JavaScript, pedindo interface bonita, e a ferramenta montou os arquivos do zero na pasta vazia
Abri no navegador, conferi funcionando, e só então segui
E aqui está a parte que conversa com o post inteiro: aquele pedido funcionou de primeira porque era pequeno e o padrão não importava
Projeto de verdade não é assim
Quanto mais precisas as instruções, menos correções são necessárias: referenciar arquivos específicos, mencionar restrições e apontar padrões de exemplo reduz o retrabalho
É exatamente isso que o CLAUDE.md faz por você em toda sessão, sem você redigitar
Sobre autonomia, testei os modos e a diferença é gritante
No modo que pede confirmação antes de editar, o desenvolvimento fica pausado o tempo todo, com uma pergunta a cada ação
Nos modos mais soltos ele anda sozinho, e dá pra acompanhar o raciocínio ao longo das etapas pra entender como ele planejou cada funcionalidade
Não existe modo certo universal: cada pessoa precisa testar pra descobrir a qual se adapta melhor
Minha recomendação pra trabalho em equipe ou dentro de empresa é ficar nos modos mais pausados, sem romance
Ah, e a própria ferramenta avisa que pode errar antes de começar a trabalhar, o que já diz muito sobre revisar o que sai
No vídeo abaixo eu mostro esse fluxo inteiro na tela, do setup até o projeto rodando:
O que o agente resolve sozinho e o que continua sendo decisão sua
Com esqueleto pronto e convenção escrita, o agente vai muito bem
Sem isso, ele inventa um padrão por arquivo, e você vira revisor em tempo integral
| O agente resolve bem (com esqueleto e convenção escritos) | Continua sendo decisão sua (trave antes) |
|---|---|
| Implementar feature seguindo o padrão que já existe no repositório | Escolher linguagem, framework e gerenciador de pacotes |
| Refatorar código existente respeitando o estilo declarado | Desenhar a estrutura de pastas e onde cada regra hierárquica mora |
| Escrever testes usando os comandos que estão no CLAUDE.md | Definir os limites de segurança e as regras de negação |
| Commitar por unidade significativa de trabalho, com mensagem descritiva | Definir o que é versionado e o que fica fora do controle de versão |
| Trabalhar em sessões paralelas isoladas por git worktree | Definir etiqueta de repositório: nome de branch, merge ou rebase |
Sobre a última linha da coluna da esquerda: git worktrees permitem checar múltiplos branches do mesmo repositório em diretórios separados, cada um com arquivos isolados e compartilhando o mesmo histórico
Isso viabiliza rodar várias sessões do Claude em partes diferentes do projeto ao mesmo tempo
Massa, né? Só que repare no pré requisito escondido: sessão paralela só não vira bagunça se a convenção já estiver escrita e valendo pros dois lados 😀
Conclusão
Meia hora decidindo e escrevendo o CLAUDE.md evita horas corrigindo padrão inventado depois
A ferramenta escreve o código, mas stack, estrutura, convenção de branch, limite de segurança e o que entra no repositório continuam sendo escolha sua, e ela só obedece o que estiver escrito
O próximo passo é bem concreto:
- rode claude na pasta do projeto
- dê /init pra gerar o CLAUDE.md a partir da análise do repositório
- revise o arquivo gerado colocando as SUAS convenções (comandos, estilo, etiqueta de repositório, setup, segurança)
- peça o commit do CLAUDE.md no repositório
Só depois disso você pede a primeira feature
Se quiser aprofundar nas recomendações da própria Anthropic, o material de boas práticas de engenharia com Claude Code é uma boa leitura de fim de semana
Até o próximo post!
Perguntas frequentes
Preciso commitar o CLAUDE.md gerado pelo /init no repositório?
Sim, esse é o fluxo inicial recomendado: rodar o comando claude, gerar o guia com /init e pedir ao Claude que faça commit do CLAUDE.md no repositório. Assim o time inteiro herda o mesmo contexto desde a primeira sessão.
Dá pra rodar o /init num repositório vazio, sem nenhuma linha de código ainda?
Dá, mas o retorno é pequeno, porque o /init analisa o codebase existente pra descobrir comandos e convenções. Repositório vazio devolve pouco, e nesse caso o trabalho de escrever a convenção manualmente no CLAUDE.md volta pro seu colo.
Qual a diferença entre .claude/settings.json e .claude/settings.local.json num projeto novo?
O settings.json guarda o que é versionado e compartilhado com o time, enquanto o settings.local.json fica de fora do controle de versão. Quando uma configuração é salva nesse arquivo local, o Claude Code já adiciona ele ao gitignore global automaticamente.
Dividir o CLAUDE.md em imports @path economiza contexto no projeto novo?
Não economiza. Dividir o conteúdo em imports ajuda a organizar o arquivo, mas os arquivos importados carregam no lançamento da sessão do mesmo jeito. Quem muda o jogo é a hierarquia: regra de subdiretório carrega sob demanda, quando o Claude lê arquivos daquela pasta.
Um hook PostToolUse consegue desfazer uma edição que o Claude Code fez errado?
Não, porque o PostToolUse roda depois que a ferramenta já executou a ação. Ele serve pra disparar lint ou formatação após um Write ou Edit, não pra reverter o que já foi escrito. Se a intenção é bloquear, o lugar certo é a camada de permissão.
Aprovar uma ferramenta no Claude Code vale só pro turno atual?
Não. Regras de allow nas configurações de permissão pré-aprovam a ferramenta pra sessão inteira, não só pro turno seguinte. Por isso a lista de negação é o guardrail que importa num projeto novo: deny é avaliado antes de allow e bloqueia mesmo em bypassPermissions.
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Blog | Mais populares
As diferenças de var, let e const
Como fazer redirecionamento com PHP
Neste artigo você vai aprender a como fazer redirecionamento com PHP, utilizaremos abordagens fáceis de entender e de aplicar Fala programador(a), beleza? Bora aprender mais […]
Checklist de segurança n8n VPS pública: guia essencial para proteger sua instalação
Checklist de segurança n8n VPS pública: guia essencial para proteger sua instalação A popularidade da automação de processos com o n8n está em alta, principalmente […]
