Domínio 2 — Tool Design & MCP Integration · Lição 6 de 6

Built-in tools: Read, Write, Edit, Bash, Grep e Glob

Objetivos de aprendizagem

Qual ferramenta para qual pergunta

FerramentaResponde aExemplo
Grep"Onde este conteúdo aparece?" — padrões dentro dos arquivosAchar callers de calculateTax, mensagens de erro, imports
Glob"Quais arquivos têm este nome/caminho?" — padrões de path**/*.test.tsx, src/**/config*.json
ReadConteúdo completo (ou trecho) de um arquivo conhecidoLer um módulo para seguir seus imports
WriteCriar arquivo ou sobrescrever por inteiroGravar a versão nova completa
EditModificação pontual por correspondência de texto únicaTrocar uma linha específica
BashComandos de shell (build, testes, git)npm test, git diff

Mnemônico da prova: Grep = conteúdo, Glob = caminho. "Encontrar todos os arquivos de teste" é Glob; "encontrar onde a função é chamada" é Grep.

Edit exige match único — e o fallback Read + Write

Edit substitui um trecho localizado por correspondência exata de texto. Se o texto-âncora aparece 0 vezes (âncora errada/desatualizada) ou mais de 1 vez (âncora ambígua), a edição falha — de propósito, para não alterar o lugar errado. Estratégias, em ordem:

  1. Ampliar a âncora com linhas vizinhas até ficar única.
  2. Quando não dá para tornar a âncora única de forma confiável: Read do arquivo inteiro + Write do conteúdo completo modificado — o fallback determinístico cobrado no exame.

O mesmo contrato aparece na text editor tool da API (str_replace: erro se 0 ou >1 ocorrências). Handler de referência:

from pathlib import Path

def str_replace(path: str, old_str: str, new_str: str) -> dict:
    """Contrato do Edit/str_replace: exatamente 1 ocorrencia, senao erro."""
    text = Path(path).read_text(encoding="utf-8")
    count = text.count(old_str)
    if count == 0:
        return {
            "is_error": True,
            "content": "Nenhuma ocorrencia da ancora. Releia o arquivo (Read) "
                       "e use uma ancora atualizada, ou caia para Read + Write.",
        }
    if count > 1:
        return {
            "is_error": True,
            "content": f"{count} ocorrencias da ancora (ambigua). Amplie a ancora "
                       "com linhas vizinhas ou use Read + Write do arquivo inteiro.",
        }
    Path(path).write_text(text.replace(old_str, new_str, 1), encoding="utf-8")
    return {"is_error": False, "content": "Edicao aplicada com sucesso."}

# Fallback deterministico quando a ancora nao pode ser tornada unica:
def read_write_fallback(path: str, transform) -> None:
    original = Path(path).read_text(encoding="utf-8")
    Path(path).write_text(transform(original), encoding="utf-8")

Exploração incremental do codebase

Ler todos os arquivos de antemão estoura o contexto e dilui a atenção. O fluxo eficiente é incremental:

flowchart TD
    A[Grep: localizar pontos de entrada\nex.: nome da função, mensagem de erro] --> B[Read: abrir só os arquivos com hit]
    B --> C[Seguir imports relevantes com Read]
    C --> D{Entendimento suficiente?}
    D -- não --> A
    D -- sim --> E[Editar com Edit\nou Read + Write]
  
  1. Grep pelo sintoma (nome de função, mensagem de erro, import) para achar pontos de entrada.
  2. Read apenas nos arquivos com hit; siga os imports que importam para o fluxo.
  3. Repita Grep→Read conforme novas pistas surgem — nunca "ler tudo primeiro".

Rastreando wrappers: quando um módulo re-exporta funções (barrel files, wrappers), primeiro identifique todos os nomes exportados (Grep por export no módulo), depois faça Grep de cada nome no codebase — buscar só o nome original perde os call sites que usam o nome re-exportado.

Evite usar Bash com find/grep/cat para o que as ferramentas dedicadas fazem: Grep/Glob/Read são otimizadas, seguras para paralelizar e integradas ao sistema de permissões do Claude Code.

Pegadinhas da prova

Resumo em 5 linhas

  1. Grep busca conteúdo dentro dos arquivos; Glob casa padrões de caminho/nome (**/*.test.tsx).
  2. Read/Write operam no arquivo inteiro; Edit faz modificação pontual e exige âncora com exatamente 1 ocorrência.
  3. Edit falhou por 0 ou >1 matches? Amplie a âncora; se não der, fallback Read + Write do conteúdo completo.
  4. Explore incrementalmente: Grep nos pontos de entrada → Read nos hits → seguir imports; nunca ler o codebase inteiro de antemão.
  5. Para wrappers/re-exports: primeiro enumere os nomes exportados, depois Grep de cada nome no codebase.

Documentação oficial

Questões de fixação

1. Você precisa encontrar todos os lugares do codebase que chamam parseInvoice(). Qual ferramenta?

2. Edit falhou porque o texto-âncora aparece 3 vezes no arquivo e não há como torná-lo único de forma confiável. Qual é o fallback correto?

3. Ao investigar um bug num codebase desconhecido de 800 arquivos a partir de uma mensagem de erro, qual é a primeira ação recomendada?

4. A função validateCpf é re-exportada por um barrel file como validators.cpf. Buscar validateCpf com Grep encontra só 2 usos, mas você suspeita que há mais. Qual abordagem encontra todos os call sites?