Como pedir refatoração ao Claude Code sem receber o arquivo inteiro reescrito

Refatoração no Claude Code sai do controle quando o pedido não tem fronteira: você nomeia uma função e volta o arquivo todo reescrito. O caminho é fechar o escopo em três camadas. Antes: mapear com o subagente Explore (somente leitura) e pedir o plano dizendo explicitamente pra não codar até você confirmar, com o plan mode ligado no Shift+Tab. Durante: Esc interrompe em qualquer fase preservando o contexto. Depois: Esc duas vezes ou /rewind desfaz. Quando avisar não basta, a trava é configuração: permissions.deny com Edit(caminho) e a flag --disallowedTools
Você pediu pra ajustar UMA função e voltou um diff com o arquivo inteiro reescrito, import trocado, helper novo que ninguém pediu e aquele bônus generoso: "aproveitei e melhorei mais umas coisinhas" 😅
Fala aí, beleza? Se essa cena te é familiar, a boa notícia é que o problema quase nunca é o modelo
É o pedido sem fronteira
Refatorar é a tarefa mais fácil de escapar do controle, porque "melhora esse código aqui" é um convite aberto: não diz onde começa, não diz onde termina e não diz o que NÃO pode ser tocado
Então bora fechar esse escopo em três momentos: antes de qualquer edição, durante a execução e depois que o estrago já aconteceu
O que você precisa antes de pedir a refatoração
Nada de PC da Nasa aqui, é bem simples:
- Claude Code instalado e rodando dentro do projeto que você quer mexer
- O alvo identificado: qual arquivo, qual função, qual trecho
- Uma forma de VERIFICAR o resultado (um teste que roda, uma saída esperada, um comportamento na tela)
- Controle de versão ativo no projeto
Esse último item não é frescura de purista
O Claude Code faz checkpoint automático do estado do código antes de cada prompt seu, mas o checkpointing cobre apenas as edições feitas pelo Claude: não cobre o que VOCÊ editou na mão nem o que rodou via comandos bash
A recomendação oficial é justamente combinar checkpointing com controle de versão, então mantenha o git aí do lado
Passo a passo: pedir refatoração com escopo fechado
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. Mapear antes de editar
Antes de pedir mudança, peça leitura
O subagente Explore é rápido e SOMENTE LEITURA, otimizado pra buscar e analisar base de código, e aceita nível de profundidade: quick, medium e very thorough
Como ele não escreve nada, dá pra soltar sem medo:
Use o subagente Explore, profundidade medium:
mapeie quem chama a função calcularFrete em src/services/frete.ts
quero a lista de arquivos e linhas que dependem dela
não edite nada
Detalhe que vale saber: Explore e Plan são os únicos subagentes que omitem o CLAUDE.md e o git status
Ou seja, as suas regras de projeto não chegam neles, o mapeamento é só reconhecimento de terreno
Erro comum deste passo: pular direto pro "refatora isso aí" sem saber quem depende do trecho, e aí a IA "conserta" os chamadores também, porque ninguém disse que eles estavam fora
2. Nomear o alvo com nome e sobrenome
A documentação é bem direta nisso: instruções mais específicas elevam a taxa de acerto, principalmente na PRIMEIRA tentativa, e reduzem correção depois
O que conta como específico? Referenciar arquivos específicos, citar restrições e apontar padrões de exemplo
Instrução vaga gera correção de rota, e correção de rota é onde o diff engorda
Refatore APENAS a função calcularFrete em src/services/frete.ts
objetivo: extrair a regra de faixa de peso pra uma função separada no mesmo arquivo
siga o padrão de src/services/desconto.ts
assinatura pública de calcularFrete não muda
Erro comum deste passo: escrever "refatore o serviço de frete"
"O serviço" é um bairro inteiro, não um endereço
3. Declarar o intocável dentro do próprio pedido
Escopo não é só dizer o que fazer, é dizer o que fica de fora
Essa parte a maioria não escreve, e é justamente a que segura o scope creep:
Não altere:
- nenhum outro arquivo além de src/services/frete.ts
- os testes existentes
- nomes de funções exportadas
se achar que algo fora disso precisa mudar, me avise em vez de mudar
Repare no final: pedir pra AVISAR em vez de agir sozinho
É o mesmo espírito de pedir os estados da tela em vez de aceitar só o caso feliz: o que não é dito, é decidido pela IA do jeito dela
Erro comum deste passo: achar que isso é uma trava
Não é, é um acordo em texto
Trava de verdade tem seção própria mais abaixo
4. Peça o plano antes do código
Esse é o passo que mais muda o resultado
A orientação da própria documentação é pedir um plano antes de escrever código e dizer EXPLICITAMENTE pra não codar até você confirmar que o plano está bom
E tem o modo dedicado pra isso: aperte Shift+Tab até a barra de status mostrar ⏸ plan mode on
Se preferir já começar a sessão assim:
claude --permission-mode plan
Pra sair, você aprova o plano ou aperta Shift+Tab de novo
E quando NÃO usar? A documentação também é clara: plan mode serve quando existe incerteza sobre a abordagem, quando a mudança altera múltiplos arquivos ou quando o código é desconhecido
Pra escopo pequeno e claro (corrigir um typo, adicionar um log, renomear uma variável) é pedir direto e pronto
Cerimônia demais em tarefa de 10 segundos só queima contexto
Erro comum deste passo: pedir o plano e não dizer pra esperar confirmação
Aí ele te mostra o plano e já sai executando, todo feliz, enquanto você ainda estava lendo o item 2 haha
5. Fatie em partes verificáveis
Uma refatoração inteira de uma vez é um diff que ninguém revisa de verdade
O Claude Code funciona melhor quando tem um alvo claro pra iterar, tipo um teste ou uma saída esperada: ele altera, avalia o resultado e melhora incrementalmente até passar
Então amarre cada fatia num critério:
Parte 1 de 3: extraia só a validação de CEP pra uma função privada
não mude comportamento
rode npm test -- frete e me mostre o resultado antes de seguir
Erro comum deste passo: fatiar sem alvo de verificação
Sem teste ou saída esperada, "parte 1 concluída" é opinião
6. Interrompa no segundo em que o diff começa a crescer
Essa é a tecla mais subutilizada do Claude Code: Esc
Ela interrompe em QUALQUER fase (raciocinando, chamando ferramenta, editando arquivo) e preserva o contexto, permitindo redirecionar ou ampliar as instruções
Viu ele abrindo um terceiro arquivo que você não citou? Esc
Não precisa deixar terminar pra depois reclamar do resultado, se liga nisso
Erro comum deste passo: esperar a execução acabar por educação
Quanto mais tarde você para, maior o diff pra desfazer
7. Desfaça sem drama
Se já passou do ponto, tem volta: aperte Esc duas vezes ou use /rewind
O menu te oferece restaurar a conversa (mantendo o código), restaurar o código (mantendo a conversa), resumir a partir daqui, resumir até aqui, ou cancelar
Essa separação entre conversa e código é ouro: dá pra jogar o código fora e MANTER o entendimento que vocês construíram, ou o contrário
Dois limites pra ter na cabeça: são guardados snapshots dos 100 checkpoints mais recentes da sessão, e a cobertura alcança só o que o Claude editou
Por isso o git continua sendo o plano A
Erro comum deste passo: tratar o checkpointing como backup do projeto
Ele é rede de segurança da sessão, não substituto de versionamento
Barreiras duras: quando avisar não basta
Tem arquivo que não pode ser tocado nem por acidente: migration, arquivo gerado, config de produção, aquele legado que segura o prédio
Pra esses, frase no prompt não serve
O que serve é configuração
As regras de permissão seguem o formato Tool ou Tool(especificador), e a avaliação é nesta ordem: deny primeiro, depois ask, depois allow
Detalhe importantíssimo: a primeira regra que casa decide o resultado, independentemente de ser mais ou menos específica
Então dá pra negar edição em caminho específico no settings.json:
{
"permissions": {
"deny": ["Edit(caminho/ou/padrao)"]
}
}
Se você quer algo mais bruto e temporário, a CLI aceita desabilitar ferramenta na sessão inteira:
claude --disallowedTools "Edit"
Bom pra sessão de leitura e análise, onde você quer conversa e diagnóstico sem NENHUMA escrita
E existe ainda a camada dos padrões de exclusão de arquivos: os caminhos que casam ficam fora da descoberta e da busca, têm leitura negada e têm Edit e Write bloqueados ali
É o nível mais forte: o arquivo simplesmente não existe pro Claude
Tome cuidado com um efeito colateral: se você exclui um arquivo que o código realmente precisa entender, ele vai refatorar às cegas em volta
Barreira dura é ótima pro que não pode mudar, não pro que ele precisa LER
Transformar a regra em hábito: CLAUDE.md e memória
Repetir "não mexa em outros arquivos" em todo prompt cansa, e você vai esquecer justo no dia em que importava
O lugar disso é o CLAUDE.md
Ele é lido no começo de cada conversa e serve exatamente pra regra persistente do tipo "sempre faça X", além de comandos de build, convenções e layout do projeto
A descoberta é hierárquica, subindo a árvore de diretórios, então dá pra ter regra geral lá em cima e regra específica dentro do módulo sensível
Um exemplo de regra de escopo pra colar no seu:
## Refatoração
- Só altere os arquivos citados no pedido
- Se outro arquivo precisar mudar, pergunte antes em vez de editar
- Apresente o plano e aguarde confirmação antes de codar
- Nenhuma melhoria fora do que foi pedido
E aqui vai a parte que muita gente ignora: a recomendação é manter cada arquivo abaixo de 200 linhas
Porque arquivo longo consome mais contexto e pode PIORAR a aderência às instruções
Ou seja, CLAUDE.md gigante não te dá mais obediência, te dá menos
Vale lembrar também que são dois sistemas complementares: o CLAUDE.md, escrito por você, e a auto memory, que é a nota que o próprio Claude escreve a partir das suas correções e preferências
Os dois são carregados no início de cada conversa
O que aprendi na prática brigando com o escopo
Eu gravei um vídeo justamente sobre isso, porque o incômodo era diário: peço uma mudança e a IA mexe em vários arquivos, complica mais do que precisava, altera coisa que não estava no pedido e ainda entrega sem testar
Quando fui listar, deu pra fechar em quatro comportamentos: suposição silenciosa (ela interpreta do jeito dela, não confirma e não mostra os tradeoffs), over engineering, scope creep (você pede uma coisa e ela mexe no arquivo inteiro) e entrega sem verificação
Repara que hoje já virou rotina a gente precisar pedir explicitamente pra IA PERGUNTAR quando tiver dúvida, em vez de sair executando
Isso diz muito sobre o padrão que a gente aceitou
No vídeo eu testo um arquivo de regras nesse sentido, instalado só naquele projeto e não global, porque eu queria avaliar antes de espalhar pra tudo
Detalhe que me pegou: só valeu depois que reiniciei a sessão, na conversa que já estava em andamento não mudou nada
O teste foi num projeto meu de gestão de produtos, um CRUD simples de itens, com um pedido bem específico: adicionar um botão de exportar CSV na tabela de produtos, exportando apenas os produtos visíveis (os filtrados)
Como a tarefa era simples, não veio nenhuma pergunta: foi direto pra execução, mostrando etapa por etapa o que estava alterando
No fim veio um relatório do que mudou, e a própria IA verificou que as colunas exportadas batiam com as colunas visíveis da tabela
Cliquei no botão, abri o CSV dentro do VS Code e o arquivo saiu com exatamente os produtos que eu queria, nas 5 colunas da tabela (nome, categoria, preço, estoque, status)
Sendo honesto: foi demonstração simples e não provocou nenhuma pergunta
Pra ver o comportamento de questionar, o caminho seria um pedido vago do tipo "adicione um sistema de autenticação neste projeto", que é onde a suposição silenciosa aparece de verdade
O contraste que ficou na minha cabeça é esse: sem regra de escopo, muitas linhas alteradas, vários arquivos mexidos, zero pergunta e um diff impossível de revisar
Com regra de escopo, menos linhas, menos arquivos, algumas perguntas pra tirar dúvida e um diff limpo, só com o que eu pedi
Na minha experiência isso economiza token e chega no resultado mais rápido, com menos idas e vindas
No vídeo tu vê o pedido do CSV rodando do zero, o relatório final e o arquivo aberto no VS Code pra conferir se saiu o que eu pedi mesmo
Quando o contexto é o culpado, não o pedido
Tem um cenário onde você faz tudo certo e mesmo assim o negócio começa a reescrever demais: a sessão está longa
Contexto entupido de tentativa antiga, arquivo que você nem discute mais e decisão que já foi revertida deixa a IA misturando assunto
Aí a ferramenta certa não é um prompt melhor, é limpeza
/compactresume as mensagens antigas da conversa preservando o contexto importante, e precisa de pelo menos duas trocas anteriores, senão ele devolve a mensagem de que não há o que compactar/clearreseta a conversa pra contexto vazio, e a conversa anterior continua em disco, podendo ser retomada pelo session ID
O critério é simples: se o histórico ainda importa pro que você está fazendo, /compact
Se você vai começar OUTRA tarefa, /clear
Continuar uma refatoração nova em cima do lixo da anterior é pedir pra ele "lembrar" de decisões que você já jogou fora
E sim, conversa mais enxuta é menos token gasto por rodada, o que ajuda quem está de olho no consumo
Se esse é o seu caso e você está avaliando baixar ou cancelar o plano do Claude, vale entender o que muda na hora antes de mexer
Conclusão
Escopo é uma instrução, não uma esperança 🙂
O resumo da ópera: mapeie antes com o Explore (somente leitura), nomeie arquivo e função no pedido, escreva o que é intocável, peça o plano dizendo pra não codar até você confirmar, fatie em partes com verificação, aperte Esc no primeiro sinal de diff crescendo e use Esc duas vezes ou /rewind quando passar do ponto
Pro que não pode mudar de jeito nenhum, a resposta é configuração: permissions.deny com Edit(caminho/ou/padrao) e --disallowedTools na sessão
Próximo passo, bem concreto: abra o CLAUDE.md do seu projeto agora, escreva as quatro linhas da regra de escopo e faça o próximo pedido em plan mode, lendo o plano ANTES de deixar qualquer edição acontecer
Faz o teste e me conta como foi
até o próximo post!
Perguntas frequentes
Como impedir que o Claude Code edite arquivos fora do escopo pedido?
Dá pra negar a edição de caminhos específicos no settings.json, com "permissions": { "deny": ["Edit(caminho/ou/padrao)"] }. Também existe a flag --disallowedTools na CLI, que aceita valores como "Edit" pra desabilitar a ferramenta na sessão inteira. A avaliação segue a ordem deny, depois ask, depois allow, e a primeira regra que casa decide o resultado.
Como desfazer uma refatoração que o Claude Code fez errado?
Aperte Esc duas vezes ou use o comando /rewind. Ele abre um menu com opções de restaurar a conversa mantendo o código, restaurar o código mantendo a conversa, resumir a partir dali, resumir até ali, ou cancelar. Isso funciona por causa do checkpoint automático que o Claude Code faz antes de cada prompt seu.
Dá pra bloquear a edição de um arquivo inteiro no Claude Code?
Sim, com um bloco permissions.deny no settings.json usando Edit(caminho/ou/padrao). Também dá pra usar padrões de exclusão de arquivos, que tiram o caminho da descoberta e da busca e bloqueiam Edit e Write nele. São dois mecanismos parecidos, mas o de exclusão vai além e nega até a leitura.
Qual a diferença entre CLAUDE.md e a memória automática do Claude Code?
CLAUDE.md é escrito por você: regras de projeto, convenções, comandos de build, esse tipo de coisa. A auto memory é escrita pelo próprio Claude, a partir das correções e preferências que aparecem durante o uso. Os dois são carregados no início de cada conversa, então funcionam juntos.
O que é o subagente Explore e quando usar antes de refatorar?
É um agente rápido e SOMENTE LEITURA, otimizado pra buscar e analisar a base de código, com três níveis de profundidade: quick, medium e very thorough. Use ele pra mapear dependências antes de pedir qualquer edição, já que ele não escreve nada. Vale saber que Explore (junto com o Plan) é subagente que omite o CLAUDE.md e o git status, então suas regras de projeto não chegam até ele.
Existe limite pra quantidade de checkpoints salvos numa sessão do Claude Code?
Sim, o checkpointing guarda os 100 checkpoints mais recentes da sessão. Ele cobre só as edições feitas pelo Claude, não as que você fez na mão nem comandos rodados via bash. Por isso a recomendação oficial é combinar checkpointing com controle de versão, e não depender só dele.
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 […]
