repo2graph

Quando um agente busca em um codebase, ele ou despeja arquivos inteiros no contexto ou perde o código completamente porque adivinhou palavras diferentes. O repo2graph constrói o grafo de chamadas real e o usa para decidir o que retornar — então você obtém o código-fonte real, dentro de um orçamento fixo de tokens, com os chamadores e chamados já anexados.

Documentação

repo2graph

Grafos de código baseados em AST e GraphRAG sem dependências para agentes de IA e humanos

English · 简体中文 · 日本語 · Français · Español · Deutsch

Glama MCP server score PyPI version Python versions License: MIT CI status MCP Compatible GitHub stars

repo2graph building a map of a repository, then answering a question about it, in a terminal

O que é · Início rápido · Configuração MCP · Benchmarks · Arquitetura · Documentação · Contribuindo


⚡ O que é repo2graph?

Quando um agente de codificação de IA pesquisa um código com grep ou correspondência simples de palavras-chave, ele ou despeja arquivos inteiros correspondentes no contexto — queimando o orçamento de tokens e perdendo a estrutura — ou perde a implementação completamente porque usou palavras diferentes da consulta de pesquisa.

repo2graph analisa o código-fonte com tree-sitter em um grafo de relações reais de código — CALLS, IMPORTS, INHERITS, DEFINES, CO_CHANGE — e serve esse grafo a agentes através do Model Context Protocol, ou o empacota em um contexto markdown com orçamento limitado para qualquer LLM. Cada bloco retornado carrega uma âncora exata [cite: path:start-end], então as respostas são rastreáveis de volta ao código-fonte em vez de parafraseadas a partir de uma suposição.

flowchart LR
    A[your code] --> B[tree-sitter<br/>reads the code]
    B --> C[graph<br/>dots + arrows]
    C --> D[graph.html<br/>the picture]
    C --> E[chunks.jsonl<br/>pieces for an AI]
    C -->|MCP stdio| F[Claude / Cursor /<br/>any MCP client]

Sem configuração de projeto, sem servidor de linguagem, sem etapa de build — aponte para uma pasta e funciona.

Interactive code graph of a project mapped by repo2graph

Canvas interativo, com zoomControles de filtro e inspeção
Zoomed into the map: named functions, files and libraries joined by arrowsSide panel with search box, node kinds and relationship kinds

graph.html é um arquivo autônomo — sem servidor, sem internet, arraste para mover, role para dar zoom, clique em um nó para inspecionar seu código e vizinhos.

🚀 Início rápido (em menos de 30 segundos)

Requer Python 3.10+. Execute via uv, sem etapa de instalação:

uvx repo2graph build . -o .r2g && open .r2g/human/graph.html

Ou instale corretamente:

pip install repo2graph
repo2graph build /path/to/project -o .r2g --git-history 200
repo2graph query "how does routing match a path" -o .r2g

A terminal running repo2graph build on a repository; a JSON summary appears counting files, functions, classes, CALLS, IMPORTS and CO_CHANGE edges, nodes, edges and chunks

Uma passada sobre este repositório — 185 arquivos — leva cerca de dois segundos e não precisa de arquivo de configuração, servidor de linguagem ou chave de API. Pergunte algo, e a resposta volta como código-fonte que você pode verificar, não um resumo em que você precisa confiar:

A terminal running repo2graph rag with a question; a repo map scrolls past and then cited code blocks appear, each headed with a cite marker naming the file and line range, listing the callers and callees of the function shown

🔌 Configuração do cliente MCP

repo2graph-mcp é um servidor MCP stdio. Ele constrói seu próprio índice na primeira chamada se um não existir ainda — nada para executar antecipadamente.

Claude Code

claude mcp add repo2graph -- uvx --from "repo2graph[mcp]" repo2graph-mcp /path/to/project

Claude Desktop (claude_desktop_config.json) e Cursor (.cursor/mcp.json) — mesmo bloco:

{
  "mcpServers": {
    "repo2graph": {
      "command": "uvx",
      "args": ["--from", "repo2graph[mcp]", "repo2graph-mcp", "/path/to/project"]
    }
  }
}

Qualquer outro cliente MCP baseado em stdio (Windsurf, Zed, clientes genéricos) aceita o mesmo par command/args — veja docs/mcp.md para locais de arquivos de configuração por plataforma e cliente.

An MCP repo_neighbours call on one function id; the reply lists its defining class, its inner function, the two callers and the two callees, each with a file and line number

Esse é o salto que o grep não consegue fazer: um símbolo de entrada, e seu definidor, seus chamadores e seus chamados voltam com arquivo e linha — a relação, não uma correspondência de texto que por acaso contém o nome.

✨ Principais recursos

Grafo determinístico, não apenas busca por embeddingsChamadores, chamados, importações e hierarquias de classes resolvidos a partir do AST real — não um palpite de vizinho mais próximo.
Recuperação híbridaBM25 + expansão de vizinhos do grafo por padrão; fusão densa de vetores opcional (repo2graph embed) com zero dependências extras necessárias.
Limites rígidos de tokens, aplicados duas vezesO orçamento de pack_context() limita o markdown inteiro renderizado, não apenas o texto do chunk — e o servidor MCP limita e re-mede antes de retornar.
15 linguagens, tratamento completoPython, JS/TS/TSX, Go, Rust, Java, Ruby, C, C++, C#, PHP, Kotlin, Swift, Scala, Bash recebem funções/classes/chamadas. Todo o resto ainda aparece como arquivos no mapa.
Pronto para CIPublicado como GitHub Action — comprometa um grafo atualizado ao lado do seu código a cada push.
Local por padrãobuild, query, rag e o servidor MCP fazem zero chamadas de rede. A única exceção opcional (rag --answer) imprime o provedor + hostname antes de enviar qualquer coisa.
Exportação para ferramentas de grafo reaisgraph.graphml (yEd, Gephi, NetworkX) e graph.cypher (Neo4j, Memgraph) saem de cada build, sem etapa extra.

🆚 Como se compara

Várias ferramentas constroem um grafo a partir de um código. O que as separa é o que volta quando você faz uma pergunta — uma imagem, um subgrafo ou o próprio código.

repo2graphGraphifyCode Graph (Obsidian)grep / RAG por embeddings
O que uma consulta retornao código-fonte, empacotado — cada bloco encabeçado por [cite: path:start-end]um subgrafo escopado, um caminho ou uma explicação de conceito para percorreruma imagem de força direcionada para lerlinhas correspondentes, ou chunks de vizinho mais próximo
Como os resultados são classificadossementes BM25, depois expansão de grafo k-hop; fusão densa opcionaltravessia de grafo (explicitamente não um índice vetorial)n/a — é uma visualizaçãoapenas lexical, ou apenas vetores
Orçamento de tokenslimite rígido no pacote inteiro, re-medido antes de retornar (teto de 12k via MCP)não é uma camada de empacotamenton/ageralmente ilimitado
Arestas do histórico do gitCO_CHANGE, de --git-history
Executa sem assistente, sem modelo, sem contasim — CLI, MCP ou GitHub Actiona passagem de código é local; a passagem de docs/mídia usa um modeloprecisa do Obsidian desktop 1.7.2+varia
Corpuscódigo em 15 linguagens analisadas, todos os outros arquivos como textocódigo em ~40 linguagens, além de docs, PDFs, imagens, vídeoTS/TSX/JS/Python analisados, apenas importações para mais 8qualquer coisa

Use Graphify quando o grafo em si é o produto: detecção de comunidades, caminho mais curto entre dois conceitos, e seus PDFs e documentos de design no mesmo grafo que o código. Use o plugin Obsidian quando um humano quiser ler o grafo ao lado de suas notas. Use repo2graph quando um agente precisar de código-fonte citado dentro de um orçamento fixo de tokens, quando tiver que rodar em CI sem modelo e sem conta, ou quando "quais arquivos mudam juntos com frequência" fizer parte da resposta.

Versão mais longa, com os trade-offs que cada escolha implica: docs/comparison.md.

🛠️ Ferramentas MCP expostas

FerramentaArgumentosO que retorna
repo_mapnenhumLinguagens, arquivos centrais e principais pontos de entrada. Estável entre chamadas — leia isso primeiro.
repo_searchquery, k opcional (padrão 8, máx. 50), hops (padrão 1, máx. 4), budget_tokens (padrão 6000, máx. 12000)Chunks de semente mais vizinhos do grafo, cada bloco encabeçado por [cite: path:start-end].
repo_neighboursnode_id, hops opcional (máx. 4), limit (padrão 20, máx. 50)Um salto no grafo a partir de um id de símbolo/arquivo/dir: chamadores, chamados, classes base, arquivo definidor.

Segredos são excluídos incondicionalmente em toda chamada de ferramenta — nenhuma flag desativa isso. Contrato completo, incluindo as duas ferramentas de diagnóstico (repo_cache_stats, repo_build_status) adicionadas para implantações de servidor de longa duração: docs/mcp.md.

📐 Arquitetura e economia de tokens

  • Nós: repo, dir, file, symbol (função/método/classe/struct/trait/interface/tipo), module (dependência externa), external (um alvo de chamada não resolvido).
  • Arestas: CONTAINS, DEFINES, IMPORTS, CALLS (carrega count + confidence), CALLS_EXTERNAL, INHERITS, CO_CHANGE (de --git-history, requer 3+ co-edições).
  • A resolução de chamadas é baseada em nome, não em tipo — um trade-off deliberado que mantém repo2graph agnóstico de linguagem e sem configuração. Chamadas ambíguas se ramificam para até 5 arestas candidatas em confidence = 1/n; filtre para confidence == 1.0 quando precisar de certeza em vez de recall.
  • Dois modelos de orçamento, de propósito: o budget_chars de Index.retrieve() limita apenas o texto dos próprios chunks (uma superfície de compatibilidade reversa); o budget_chars de Index.pack_context() limita o markdown inteiro renderizado — cabeçalhos de citação, separadores, tudo. Novo código de recuperação deve ser construído sobre pack_context().
  • Chunking: aproximadamente um chunk por função/classe, cortado em ~4000 caracteres com 8 linhas de sobreposição para que nada se perca em uma emenda; o cabeçalho de cada chunk nomeia seus chamadores e chamados, que é o que torna a recuperação expandida por grafo melhor do que a busca de texto top-k simples.

Divisão completa de cada tipo de nó/aresta e o esquema de chunk: docs/reference.md. O pipeline, a API Python e onde o grafo adivinha (e por quê): TECHNICAL.md.

📊 Veja em repositórios reais

Não é uma demonstração de brinquedo — cinco repositórios públicos reais e grandes, cada um indexado em um commit fixado, com o grafo gerado comprometido e o comando exato de reprodução registrado. Cada número é medido, de benchmarks/results.json, não estimado.

RepositórioLinguagem(ns)EscopoNósArestas
KubernetesGoescopado (controllers, scheduler, API server)14.19783.525
TensorFlowC++ / Pythonescopado (fronteira Python/C++)20.64196.013
DjangoPythonrepositório completo54.544228.461
VS CodeTypeScriptescopado (src/vs/)113.115431.453
Linux kernelCescopado (escala extrema)136.182257.655

Veja examples/README.md para o índice completo e comandos de reprodução, docs/benchmarks.md para metodologia, e docs/limitations.md para o que rodar contra cinco repositórios reais realmente revelou (taxas de erro de análise em C/C++ pesado de macros, ambiguidade de nomes de chamadas, limites de resolução entre linguagens).

📖 Referência de CLI e servidor

ComandoFaz
repo2graph build <path> -o .r2g [--git-history N]Analisa um repositório local em um grafo + chunks.
repo2graph github <owner/repo> -o <dir>Busca, constrói e limpa — sem necessidade de clone local.
repo2graph query "<question>" -o .r2gBusca lexical + expansão de grafo de um salto.
repo2graph rag "<question>" -o .r2g [--vectors] [--answer]Pacote GraphRAG com orçamento limitado; --answer o envia para um LLM (opt-in, rede).
repo2graph embed -o .r2g [--verify-rag]Calcula/verifica vetores densos para busca híbrida.
repo2graph map -o .r2g [--viz-nodes N]Regenera graph.html com um limite de nós diferente.
repo2graph stats -o .r2gContagens de nós/arestas/funções para um índice existente.
repo2graph-mcp <path> [--no-auto-build] [--async-build]Servidor MCP stdio sobre .r2g.

Variáveis de ambiente (apenas lidas por rag --answer, nesta ordem de precedência): GEMINI_API_KEYOPENAI_API_KEYANTHROPIC_API_KEYOLLAMA_HOST. --model substitui o padrão de melhor esforço do provedor. Nenhum outro comando faz chamada de rede ou lê essas variáveis. Tabelas completas de flags e contabilidade de orçamento: docs/cli.md.

🔐 Segurança

build, query, rag, e o servidor MCP não fazem chamadas de rede. rag --answer é a única exceção opcional — ele envia o pacote montado para um provedor de LLM e imprime o provedor + hostname antes de fazer isso. O servidor MCP exclui arquivos com formato de credencial incondicionalmente, sem nenhuma flag para desativar isso. Detalhes: SECURITY.md.

🤝 Contribuindo & comunidade

git clone https://github.com/Srinivasan-78/repo2graph
cd repo2graph
python3 -m venv .venv && .venv/bin/pip install -e ".[dev]"
make lint test   # or: ruff check . && pytest
  • .github/CONTRIBUTING.md — configuração completa de desenvolvimento local, estilo de código e o processo de lançamento do registry/Glama.
  • docs/BACKLOG.md — trabalho deliberadamente adiado e o porquê; a coisa mais próxima de um roadmap, além de uma seção de "boas primeiras issues".
  • AGENTS.md — as convenções não óbvias deste código (encoding do Windows, fatiamento de texto, os dois modelos de orçamento) antes de editar repo2graph/.
  • CODE_OF_CONDUCT.md — Contributor Covenant v2.1.
  • Encontrou um bug ou tem uma ideia de funcionalidade? Abra uma issue.

Licença

MIT. Veja LICENSE.


Achou o repo2graph útil? Dê uma estrela no repositório — é a maneira mais fácil de ajudar outras pessoas a encontrá-lo.