Como pedir ao Claude Code para resolver a tarefa sem instalar biblioteca nova

Pra usar o Claude Code sem instalar biblioteca nova, a restrição precisa existir em três camadas: no prompt (peça primeiro a lista do que já existe no projeto e só depois a solução), no arquivo de memória (CLAUDE.md do projeto, que ele lê no início de cada sessão) e nas permissões (settings.json, com regra deny sobre o comando de instalação, avaliadas na ordem deny, ask, allow, primeira correspondência vence). Ligue o plan mode com Shift+Tab ou /plan pra ver o plano antes de qualquer edição, e use Esc pra interromper assim que ele citar uma dependência nova.
Você pede uma coisa simples, deixa claro que não quer dependência nova, e volta um npm install no meio do diff 😅
Isso não é birra do modelo, é peso de contexto: um "não instale nada" enfiado na última linha de um pedido longo tem pouquíssima força perto de tudo que veio antes
E tem um detalhe que quase ninguém pensa: mesmo que ele obedeça agora, na próxima sessão essa instrução simplesmente não existe mais
Por isso a solução aqui vem em três camadas: COMO escrever a restrição, ONDE fixar ela pra valer em toda sessão, e como travar de verdade quando escrever não basta
Bora montar as três?
O que você precisa antes de começar
- Claude Code rodando em sessão interativa, que é onde o
Escinterrompe o turno em andamento - Saber onde mora o arquivo de memória do projeto:
./CLAUDE.mdou./.claude/CLAUDE.md - Saber onde mora o seu, de usuário:
~/.claude/CLAUDE.md - Acesso ao
settings.json: o~/.claude/settings.jsonvale pra todos os projetos, e o.claude/settings.jsondentro do projeto vale só pra aquele projeto e é compartilhado com o time
Ainda não tem CLAUDE.md nenhum? Roda /init, que ele gera um inicial a partir da estrutura atual do projeto, pra você refinar depois
E se você nem sabe quais arquivos de memória estão ativos aí, o /memory lista e abre esses arquivos (CLAUDE.md, CLAUDE.local.md e outros) nos escopos de usuário e de projeto, sem sair da sessão
Se o seu problema ainda é anterior a tudo isso e o CLI nem sobe direito, dá uma passada nos erros comuns ao instalar o Claude Code antes de continuar
Formação Claude Code
Domine Claude Code do absoluto zero até o avançado
- 116 aulas
- 4 projetos
- 9h 23min
Passo a passo para resolver a tarefa sem instalar biblioteca nova
- Escreva a restrição no começo do prompt, e de um jeito verificável
Restrição negativa solta some no meio do texto
O truque é transformar "não instale nada" em uma AÇÃO que dá pra conferir: primeiro ele lista o que já existe, depois ele resolve dentro dessa lista
Antes de propor qualquer solução, liste as dependências que já existem no manifesto do projeto.
Resolva a tarefa usando apenas o que está nessa lista.
Se achar que precisa de algo fora dela, pare e me explique o porquê, sem instalar.
Tarefa: <descreva aqui>
O erro comum deste passo: jogar o "não instale nada" na última linha de um pedido gigante, no meio de outras cinco condições
- Peça o plano antes do código
O Shift+Tab alterna o plan mode, e o /plan como prefixo vale pra um único prompt
Em plan mode ele lê arquivos e responde sem alterar nada, e as edições ficam bloqueadas até você aprovar o plano (exceto em sessões com bypass de permissões)
Ou seja: é exatamente onde você descobre que ele planejou instalar uma lib ANTES de ele instalar
Se quiser sair sem aprovar nada, Shift+Tab de novo
O erro comum deste passo: aprovar o plano no automático, sem ler a parte em que ele cita as dependências que pretende usar
- Interrompa cedo, com
Esc
A documentação oficial recomenda corrigir o Claude assim que ele sai do trilho, porque ciclo curto de feedback dá resultado melhor do que deixar a resposta seguir errada e refazer depois
Então, na primeira linha do plano que citar biblioteca nova, Esc e reescreve o pedido
O erro comum deste passo: mandar mensagem enquanto ele está trabalhando achando que isso interrompe
Não interrompe, a mensagem entra na FILA
(e se você se arrepender, a seta pra cima na primeira linha do campo de entrada devolve as mensagens enfileiradas pra edição)
- Tire a regra do prompt e bote no CLAUDE.md do projeto
O Claude Code lê os arquivos CLAUDE.md no início de cada sessão, em escopos hierárquicos: política gerenciada da organização, usuário em ~/.claude/CLAUDE.md e projeto em ./CLAUDE.md ou ./.claude/CLAUDE.md
Escreveu uma vez, vale sempre
## Dependências
Não adicionar dependência nova sem aprovação explícita minha.
Resolver a tarefa com o que já está declarado no manifesto do projeto.
Se uma dependência parecer inevitável, propor e esperar resposta antes de instalar.
E se isso for uma manha sua e não uma regra do time? Existe o CLAUDE.local.md na raiz do projeto, pra preferência pessoal que não deve ir pro controle de versão, carregado junto com o CLAUDE.md e tratado da mesma forma
Dá pra manter um arquivo único de instruções e importar de qualquer ponto do CLAUDE.md com a sintaxe @, inclusive apontando pra fora do projeto:
@~/.claude/minhas-instrucoes.md
O erro comum deste passo: encher o CLAUDE.md do que ele já deduz lendo o código
A própria doc é bem direta no que entra e no que fica de fora
| Incluir | Deixar de fora |
|---|---|
| Comandos que o Claude não tem como adivinhar | O que ele deduz lendo o código |
| Regras de estilo que divergem do padrão | Convenções padrão da linguagem |
| Instruções de teste | Documentação de API detalhada |
| Decisões de arquitetura e armadilhas não óbvias | Informação que muda com frequência |
"Não adicionar dependência sem aprovação" é regra que diverge do padrão, então ela merece o arquivo 👍
- Trave de verdade com uma regra
deny
As permissões do Claude Code valem pra Bash, Read, Edit, WebFetch, MCP e demais ferramentas, com regras allow, ask e deny
O deny bloqueia o uso da ferramenta, ponto
A ordem de avaliação é deny, depois ask, depois allow, e a primeira correspondência decide, independentemente de qual regra é mais específica
Sobre o formato: a documentação descreve o padrão de curinga em geral, com exemplo em ls, e o sufixo :* é equivalente a escrever espaço seguido de asterisco
Ou seja, Bash(ls:) casa os mesmos comandos que Bash(ls )
A regra do SEU instalador é você que escreve, seguindo esse mesmo padrão, dentro do settings.json:
{
"permissions": {
"deny": [
"Bash(npm install:*)"
]
}
}
O erro comum deste passo: não sacar o que o espaço faz
Bash(ls ) exige espaço depois de ls, então lsof não casa, enquanto Bash(ls) casaria lsof também
Um caractere muda a mira inteira da regra, se liga nisso
Se você não quer bloqueio seco e sim um pedágio, usa ask: ele pede confirmação mesmo em modos que aprovariam sozinhos, como acceptEdits ou bypassPermissions (e no modo dontAsk uma regra ask nega em vez de perguntar)
Tome cuidado pra não misturar as coisas aqui: permissão negada pelo Claude Code é uma história, e erro de permissão do npm na hora de instalar o próprio CLI é outra completamente diferente
- Camada final pra quem quer garantia: hook PreToolUse
Os hooks PreToolUse rodam ANTES da checagem de modo de permissão, em todos os modos
Um hook que devolve permissionDecision igual a "deny" cancela a chamada da ferramenta e manda o permissionDecisionReason de volta pro Claude, inclusive no modo bypassPermissions e com --dangerously-skip-permissions
Sacou a diferença? A regra de permissão é a porta, o hook é o segurança que fica antes da porta
Tem também o caminho do código de saída: sair com código 2 é erro bloqueante e para a chamada antes das regras de permissão serem avaliadas, e nesse caso o JSON de saída é ignorado
Os detalhes de formato estão na documentação de hooks
"E o sandbox, não resolve isso?"
Ele aplica restrição de sistema operacional ao sistema de arquivos e à rede, mas só pra ferramenta Bash e seus processos filhos: ferramentas em processo, como WebFetch, continuam seguindo as regras de permissão
Então trate o sandbox como reforço, não como substituto das camadas de cima
Recapitulando o que cada camada te dá:
| Camada | Onde vive | Vale por quanto tempo |
|---|---|---|
| Restrição no prompt | a mensagem daquele turno | só aquele turno |
| Plan mode | Shift+Tab ou /plan |
segura a edição até você aprovar |
| CLAUDE.md | ./CLAUDE.md, ./.claude/CLAUDE.md ou ~/.claude/CLAUDE.md |
lido no início de cada sessão |
| CLAUDE.local.md | raiz do projeto | lido no início de cada sessão |
Regra deny ou ask |
settings.json do usuário ou do projeto |
toda chamada de ferramenta |
| Hook PreToolUse | configuração de hooks | antes até da checagem de modo |
E quando ele insiste que a biblioteca é necessária?
Tem hora que a resposta volta batendo o pé
Três cenários que aparecem sempre, com causa e saída
Sintoma: "não dá pra fazer isso sem a lib"
Causa provável: o pedido está vago demais sobre o que JÁ existe no projeto, então ele completa o buraco com a solução mais óbvia do mundo, que é instalar algo
Solução: quebre em dois turnos
Primeiro só o inventário ("liste o que já está declarado no manifesto e o que dá pra reaproveitar pra essa tarefa"), depois a implementação em cima dessa lista
Sintoma: ele concorda com a regra e instala mesmo assim, três mensagens depois
Causa: a restrição existia só no prompt daquele turno
Conversa longa, contexto novo entrando, e aquilo virou detalhe antigo
Solução: sobe a regra pro CLAUDE.md (passo 4) e coloca a regra de permissão por cima (passo 5)
O que está escrito no arquivo ele relê no início de cada sessão, e o que está no deny não depende de ele lembrar de nada
Sintoma: a proposta com dependência é, honestamente, a melhor
Acontece, e negar isso é dogma
Solução: peça os dois caminhos lado a lado, no mesmo plano
Quanto custa escrever à mão (quantos arquivos, o que precisa ser testado) contra o que exatamente a lib resolve
Com o plan mode ligado ele lê e responde sem alterar nada, então você decide com o diff ainda parado 🙂
Pra prevenir tudo isso, o combo é simples: regra escrita uma vez no arquivo, deny no instalador e leitura do plano antes de aprovar
O que mudou aqui depois que a regra saiu do prompt e virou arquivo
Eu testei essa ideia de "instrução em arquivo" num projeto meu de gestão de produtos, um CRUD bem simples de itens, só pra ver o comportamento na prática
Sem esse tipo de instrução, o padrão que eu vejo é sempre o mesmo: a IA assume coisas por conta própria, mexe em arquivo que não precisava, entrega código mais complicado que o necessário e ainda diz que está pronto sem ter testado
O clássico é o escopo escapando: você pede UMA mudança, ela altera outros arquivos, arruma uma coisa e quebra outra
Com o arquivo de instruções ativo, a coisa muda de figura: ela passa a focar em código mínimo, mudando ou adicionando só o que resolve o problema pedido, e define critério de sucesso antes de executar
No teste, o prompt foi adicionar um botão de exportar CSV na tabela de produtos, exportando só os produtos visíveis e filtrados
Tarefa clara, então ela foi direto pra execução, sem perguntar nada
No fim veio um relatório do que foi alterado, incluindo a checagem de que as colunas exportadas batiam com as colunas visíveis da tabela: nome, categoria, preço, estoque e status
Abri o CSV gerado no editor e os produtos eram exatamente os que eu queria 👌
Repara que isso é justamente o tipo de coisa que vale estar no arquivo: quais colunas contam como "certo" nesse projeto é uma armadilha não óbvia, não é algo que ele adivinha lendo o código
Depois eu forcei um segundo teste com um prompt propositalmente vago, pedindo um sistema de autenticação no projeto
Aí ela parou ANTES de codar pra alinhar as escolhas, dizendo que autenticação tem várias formas e cada uma muda bastante o código
E entre as perguntas apareceram escolhas de biblioteca
Ou seja: decisão que muda escopo virou pergunta em vez de suposição, que é exatamente o comportamento que a gente está perseguindo neste post inteiro
Essa etapa de perguntas não é obrigatória, viu? Se o prompt for claro, ela resolve direto, o que poupa tempo e evita pergunta desnecessária
Dois avisos honestos: a demonstração principal foi simples e não exigiu questionamento nenhum, por isso precisei do prompt vago pra provocar as perguntas, e eu deixei aquilo instalado só no projeto de teste, não de forma global, pra manter o ambiente limpo enquanto avaliava
O ganho prático que sobrou pra mim foi economia de tokens e chegar no objetivo mais rápido, com menos idas e vindas
No vídeo acima eu mostro esses dois testes na tela: o pedido do CSV indo direto pra execução, o relatório final com a conferência das colunas, e o prompt vago fazendo a IA parar pra perguntar antes de escrever qualquer linha
Quando segurar a restrição e quando abrir mão dela
Restrição vira dogma rapidinho, e aí atrapalha mais do que ajuda
Onde segurar firme:
- Projeto legado com build frágil: se o build já é aquele castelinho, cada dependência nova é uma chance de derrubar tudo por um motivo que não tem nada a ver com a sua tarefa
- Biblioteca compartilhada: aqui cada dependência sua vira peso pra todo mundo que consome o seu pacote, então o custo não é seu, é do time inteiro
- Exercício de aprendizado: se o objetivo é você entender a lógica, deixar a lib resolver mata o exercício, e aí o
denyno instalador é literalmente a regra do jogo - Ambiente com aprovação de dependência: onde entra pacote novo só com revisão, o agente instalando sozinho só te dá retrabalho depois
Onde abrir mão sem culpa:
- Criptografia: escrever isso à mão é o tipo de economia que sai caríssima
- Parsing de formato complexo: os casos de borda são um poço sem fundo
- Data, hora e fuso horário: já me ferrei uma vez achando que era só somar segundos, não é 😅
A régua que eu uso é essa: a restrição serve pra proteger o projeto, não pra provar ponto
Se a dependência resolve um problema que ninguém quer manter à mão, o certo é aprovar de forma consciente, com o plano na tela, e não deixar acontecer de surpresa
Conclusão
A restrição só vale o que está escrito em algum lugar que o agente REALMENTE lê
No prompt ela dura um turno
No CLAUDE.md ela volta no início de cada sessão
No deny do settings.json e no hook PreToolUse ela deixa de depender de o modelo lembrar de qualquer coisa
Próximo passo, e dá pra fazer hoje: roda /memory, abre o CLAUDE.md do projeto, escreve as três linhas da regra de dependência e testa no próximo pedido com o plan mode ligado
Se ele citar uma lib nova no plano, você vê antes de qualquer arquivo ser tocado, e é esse o jogo todo
até o próximo post! 😀
Perguntas frequentes
Como faço o Claude Code parar de instalar dependência sem eu pedir?
Vai por camadas: escreva a restrição no começo do prompt (não no fim) pedindo pra ele listar o que já existe no manifesto antes de propor solução, fixe essa mesma regra no CLAUDE.md pra ela valer em toda sessão, e trave de verdade com uma regra deny no settings.json, tipo Bash(npm install:*). O deny bloqueia o uso da ferramenta, ponto, e a ordem de avaliação é deny, depois ask, depois allow.
Onde escrevo a regra pra valer em todo projeto, e não só numa sessão?
No CLAUDE.md, porque o Claude Code lê esse arquivo no início de cada sessão, em escopos hierárquicos: usuário em ~/.claude/CLAUDE.md e projeto em ./CLAUDE.md ou ./.claude/CLAUDE.md. Escreveu uma vez ali, vale sempre, diferente de repetir a restrição em todo prompt novo.
Qual a diferença entre CLAUDE.md e CLAUDE.local.md pra essa regra de dependência?
CLAUDE.md é a regra do time, versionada com o projeto. CLAUDE.local.md fica na raiz do projeto e é pra preferência pessoal que não deve ir pro controle de versão, mas é carregado junto com o CLAUDE.md e tratado do mesmo jeito.
O plan mode do Claude Code já impede a instalação de biblioteca nova?
Sozinho não impede, mas te dá o momento certo pra barrar. Em plan mode ele lê arquivos e responde sem alterar nada, com as edições bloqueadas até você aprovar o plano (exceto em sessões com bypass de permissões). É ali que você vê se ele planejou usar uma lib nova antes de qualquer instalação acontecer.
Bash(npm install:*) no settings.json bloqueia só o comando npm install?
O sufixo : equivale a escrever espaço seguido de asterisco, então Bash(npm install:) casa os mesmos comandos que Bash(npm install ). Repare no espaço: Bash(ls ) exige espaço depois de ls e não pega lsof, enquanto Bash(ls*) sem espaço pegaria. Vale o mesmo padrão pra qualquer comando que você queira travar.
O que fazer se o Claude Code já citou uma dependência no meio do plano?
Aperta Esc assim que ver a linha citando a lib, porque a orientação oficial é corrigir cedo, com ciclo curto de feedback, em vez de deixar a resposta seguir errada. Mandar mensagem enquanto ele trabalha não interrompe nada, ela só entra na fila, então o Esc é o jeito certo de parar ali.
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Blog | Mais populares
Bateu o limite de uso do Claude Code? Como retomar a tarefa sem refazer tudo
Bateu o limite de uso do Claude Code? Veja como retomar a tarefa de onde parou com /usage, CLAUDE.md e --continue, sem refazer nada.
Como pagar o Claude Code no Brasil: cartão, dólar, IOF e quanto fica em reais
Claude Code preço Brasil na prática: câmbio, IOF de 3,5% e quanto fica na fatura. Planos Pro e Max convertidos em reais e como pagar com cartão.
Como instalar uma skill no Claude Code: passo a passo
Saiba como instalar skill no Claude Code: use a pasta pessoal para todas as sessões ou a pasta de projeto para versionar. Frontmatter YAML é obrigatório.
