Graphify: como descobrir quem depende da função antes de refatorar no Claude Code

grafo de dependências gerado pelo Graphify no Claude Code
Resposta rápida

O Graphify é uma CLI e uma skill open source (Apache 2.0) que transforma o repositório num grafo de conhecimento consultável pelo assistente, com parsing local via tree-sitter e sem chave de API para a parte estrutural. Antes de refatorar, ele responde a pergunta que grep e LSP não respondem: quem depende da função que você vai mexer, chamador do chamador do chamador. Você instala com uv tool install graphifyy, registra a skill com graphify install, constrói o grafo com /graphify . e consulta com graphify query, graphify path e graphify explain

Refatorar sem saber quem chama a função é apostar que ninguém do outro lado do repo vai gritar

E geralmente alguém grita 😀

O Graphify é uma CLI e uma skill open source (licença Apache 2.0) que transforma o teu repositório num grafo de conhecimento consultável pelos assistentes de IA

O parsing acontece no próprio dispositivo, com tree-sitter, AST determinística, sem telemetria e sem upload do código

Pra extração estrutural não precisa nem de conta nem de chave de API

E por que isso importa antes de uma refatoração?

Porque grep e LSP respondem UM salto: quem chama essa função aqui

A pergunta real que tu tem na cabeça é outra, "o que quebra se eu mudar isso", e essa é chamador do chamador do chamador

É multi-salto, e é exatamente o buraco que um grafo de código preenche

Bora ver na prática?

Formação Claude Code
Formação Recomendada

Formação Claude Code

Domine Claude Code do absoluto zero até o avançado

  • 120 aulas
  • 4 projetos
  • 9h 45min

O que você precisa antes de começar:

A lista é curtinha, se liga:

  • Claude Code instalado, que é a plataforma padrão da skill (ela suporta 17 assistentes, incluindo Cursor, Copilot, Codex, Gemini CLI e Aider)
  • uv, que é o instalador recomendado do pacote
  • o repositório que tu vai refatorar em disco, claro

Sobre cobertura de linguagem: o parser lê 36 linguagens de código, além de Markdown, SQL e outros formatos

Então não é ferramenta de uma stack só

Tome cuidado com a maturidade! O projeto ainda está na série 0.x

A versão mais recente publicada é a v0.9.47, de 19 de agosto de 2026, e antes dela vieram a v0.9.46 em 17/08, a v0.9.45 em 16/08 e a v0.9.44 em 15/08, tudo no mesmo mês

Isso é ótimo sinal de projeto vivo, mas significa que comando e comportamento podem mudar debaixo do teu pé

Passo a passo: mapear as dependências da função que você vai mexer

  1. Instale o pacote com o uv
uv tool install graphifyy

Repara no nome: o pacote tem dois "y" no fim

O binário que fica instalado se chama graphify, com um "y" só

O erro comum deste passo: tentar uv tool install graphify e não achar o pacote, aí tu acha que a ferramenta sumiu do mundo kkk

  1. Registre a skill no assistente
graphify install

Esse comando detecta o Claude Code e registra a skill /graphify

O erro comum deste passo: achar que instalar o pacote já habilita a skill

Não habilita! São dois momentos separados, um instala a ferramenta e o outro pluga ela no assistente

  1. Construa o grafo do projeto

Agora dentro da sessão do assistente, não no terminal:

/graphify .

Ele mapeia o projeto e escreve o resultado na pasta graphify-out/

São três arquivos de saída:

Arquivo O que é
graphify-out/graph.html grafo interativo pra abrir no navegador
graphify-out/GRAPH_REPORT.md relatório de arquitetura em texto
graphify-out/graph.json o grafo legível por máquina
  1. Pergunte quem depende da função
graphify query "quem depende dessa função?"

O query percorre o grafo em largura e devolve o subgrafo relevante, com os caminhos explícitos e citações no formato arquivo:linha

É isso que tu quer antes de mexer: o caminho, não só o nome do arquivo

Se tu já sabe qual cadeia quer seguir e não quer contexto amplo, existe a opção --dfs pra seguir uma linha específica

A mesma consulta roda dentro do chat pela skill, o exemplo oficial é assim:

/graphify query "how does a request reach the cache?"
  1. Feche a ponta a ponta e entenda o nó isolado

Quando tu quer saber COMO duas partes do sistema se conectam, o comando é o path, que acha o caminho mais curto entre dois nós e mostra salto a salto

Exemplo oficial pela skill:

/graphify path "ApiGateway" "RedisClient"

Os extremos são casados por label, então tu passa o nome da coisa

E pra entender um nó sozinho tem o graphify explain, que diz em linguagem natural o que aquele nó é, onde ele vive, o que chama ele e o que ele chama

  1. Atualize o retrato depois de mexer no código

O grafo é uma foto do momento, e refatoração é justamente mudar o que está na foto

A flag --update re-escaneia só o que mudou, e ainda tem modo watch e git hook pra automatizar isso

O erro comum deste passo (e é o mais traiçoeiro): consultar grafo velho depois de já ter mexido no código, e decidir a próxima mudança olhando pra um mapa que não existe mais

  1. Opcional: pluga o servidor MCP

Existe um servidor MCP que expõe o grafo como ferramentas nativas do assistente, são 10 ferramentas entre consultas estruturais, rastreio de caminhos e explicação de nós

Pra registrar manualmente no Claude Code, tu adiciona a entrada no .mcp.json na raiz do projeto apontando pro comando python -m graphify.serve graphify-out/graph.json

Como ler o resultado para dimensionar o estrago da refatoração

Ter o subgrafo na tela é metade do trabalho

A outra metade é ler ele com três perguntas na cabeça, antes de pedir qualquer coisa pro assistente

Raio de impacto: quantos saltos acima existe gente chamando isso?

Se o query devolve dois chamadores diretos e para por aí, tu tem uma mudança local

Se ele sobe três, quatro níveis e vai parar em módulos que tu nem lembrava que existiam, o pedido de refatoração muda de tamanho

Esse é o momento de decidir se vale fatiar a mudança, e é MUITO parecido com a régua de saber se vale delegar a tarefa antes de escrever o prompt

Caminho crítico: como as duas pontas se conectam de fato

O path te dá a cadeia salto a salto entre duas partes do sistema

Serve pra confirmar (ou destruir) aquela tua suposição de "ah, isso aqui só é usado pelo módulo X"

É o tipo de conferência que economiza uma tarde inteira quando o assunto é refatorar um projeto legado, onde a suposição costuma estar errada

Confiança da evidência: o rótulo de procedência da aresta

Essa parte é a que eu acho mais massa

Toda aresta do grafo carrega de onde ela veio:

  • EXTRACTED: veio direto da AST, é o chão firme
  • INFERRED: um modelo ligou os pontos
  • AMBIGUOUS: existe evidência, mas não deu pra resolver

E quais casos caem em AMBIGUOUS? Dynamic dispatch, reflection e imports montados por string

Ou seja: em vez de chutar uma ligação que ficaria bonita no desenho, a ferramenta marca que ali tem dúvida

Isso é honestidade de ferramenta, e é o que te diz ONDE olhar com olho humano

Vale saber também que a parte estrutural não chama modelo nenhum, mas os passos semânticos mais ricos (nomeação de comunidades, modo profundo) e a leitura de arquivos não-código usam modelo, rodando pela sessão do assistente ou por um backend configurado (que pode ser local, tipo Ollama, pra CI headless)

O que continua sendo trabalho humano de conferência

Aqui mora o limite da festa

O grafo mostra quem chama quem

Ele NÃO mostra o que a função faz com o estado compartilhado lá dentro

E dependência invisível é exatamente isso: nenhuma aresta aponta pra ela

No vídeo eu mostro esse efeito com o caso mais clássico do Python, a variável global usada dentro de uma função

A variável começa com 10 no escopo maior, a função recebe 20 como argumento e a soma imprime 30

Até aí tudo certo, ninguém se machucou

Aí eu reatribuo a variável pra 15 lá dentro, e a impressão seguinte vira 35

Quando o arquivo termina de rodar e eu imprimo a variável de novo, ela vale 15

O valor global mudou permanentemente

valor = 10

def somar(numero):
    global valor
    print(valor + numero)
    valor = 15
    print(valor + numero)

somar(20)
print(valor)

O ponto que fica desse exemplo é o seguinte: aquela alteração vaza pro resto da aplicação

Qualquer outra função ou trecho que dependa daquele valor passa a receber outra coisa, e o valor deixa de representar o que representava antes

Agora liga isso na refatoração: nenhuma aresta do grafo denuncia esse efeito

O grafo te entrega o mapa das chamadas, e o mapa está certo

Mas o efeito colateral no estado compartilhado é semântica de execução, não topologia

Por isso a ordem que eu sigo é: as arestas AMBIGUOUS e os pontos de estado compartilhado passam por leitura humana ANTES de aprovar a mudança

O resto tu delega tranquilo

Conclusão

A ordem de trabalho que faz o Graphify valer a pena é essa, e ela é chata de propósito:

  1. constrói o grafo
  2. consulta quem depende da função
  3. confere à mão o que ficou AMBIGUOUS e o que toca estado compartilhado
  4. só então pede a refatoração pro Claude Code

Inverter essa ordem é o mesmo que pedir a mudança e descobrir o raio de impacto pelo stack trace, depois

Próximo passo? Roda /graphify . no repositório que tu está mexendo hoje e abre o GRAPH_REPORT.md antes da próxima mudança grande

E não esquece do --update depois que o código mudar, senão tu volta a consultar um mapa velho…

até o próximo post! 🙂

Perguntas frequentes

Preciso de conta ou chave de API para usar o Graphify?

Não, pelo menos não pro grafo estrutural. O parsing roda no próprio dispositivo com tree-sitter, sem telemetria e sem upload de código, então essa parte funciona sem conta e sem chave de API. Só os passos semânticos mais ricos, como nomeação de comunidades e modo profundo, usam um modelo configurado.

Qual a diferença entre graphify query e graphify path?

O query percorre o grafo em largura e devolve o subgrafo relevante pra uma pergunta aberta, com caminhos explícitos e citações no formato arquivo:linha. Já o path busca o caminho mais curto entre dois nós específicos, casados por label, e mostra a conexão salto a salto. Use query quando quer contexto amplo e path quando já sabe as duas pontas que quer ligar.

O que significam os rótulos EXTRACTED, INFERRED e AMBIGUOUS no grafo?

É o selo de procedência de cada aresta do grafo. EXTRACTED veio direto da AST, INFERRED é uma ligação que um modelo fez, e AMBIGUOUS marca evidência que a ferramenta não conseguiu resolver, como dynamic dispatch, reflection ou imports montados por string. Assim dá pra saber quanto confiar em cada conexão antes de refatorar.

O Graphify funciona só com Claude Code?

Não. A skill suporta 17 assistentes, incluindo Claude Code, Cursor, Copilot, Codex, Gemini CLI e Aider, mas o Claude Code é a plataforma padrão dela. A CLI em si, com comandos como graphify query e graphify explain, roda no terminal independente do assistente.

Como manter o grafo do Graphify atualizado depois de mexer no código?

Use a flag –update, que re-escaneia só o que mudou desde a última build. Também dá pra automatizar isso com o modo watch ou com um git hook, pra não correr o risco de consultar um grafo velho depois de já ter alterado o código.

O Graphify substitui o grep e o LSP?

Não substitui, complementa. Grep e LSP respondem bem perguntas de um salto, tipo quem chama essa função. O Graphify entra quando a pergunta é multi-salto, tipo o que quebra se eu mudar isso, que é chamador do chamador do chamador.




Escrito por | Matheus Battisti

Matheus Battisti
Fundador da Hora de Codar

Programador apaixonado pelo mundo das tecnologias, sempre buscando em aprender e se aprofundar em linguagens, frameworks e o que mais for necessário para executar um bom trabalho. Agora tem uma nova missão que é de passar seu conhecimento adiante para formar novos programadores e especializar mais os que já são.

Subscribe
Notify of
guest

0 Comentários
Oldest
Newest Most Voted

Formações

Formação Vibe Coding

Formação Vibe Coding

Do Prompt ao Produto: Crie Software Real com IA

  • 474 aulas
  • 20 projetos
  • 39h 27min

Blog | Mais populares