polycodegraph
Servidor MCP de grafo de código multilíngue com 18 ferramentas (find_symbol, callers, callees, blast_radius, dataflow_trace) para assistentes de IA — local-first, sem necessidade de chave de API, ~3× menos tokens que Claude+grep com a mesma precisão.
Documentação
polycodegraph
Analise qualquer repositório em um grafo de código consultável. Rastreie um parâmetro de um fetch de frontend por todas as camadas até a consulta SQL. Alimenta Claude Code, Cursor e Windsurf via MCP — para que seu assistente de IA leia contexto focado em vez do codebase inteiro.

Mesmo Claude Sonnet 4.6. Mesmas 10 perguntas sobre dois repositórios reais (o próprio codegraph + FastAPI). Apenas o servidor MCP registrado muda. Reproduza com codegraph bench agent, dados brutos em bench/RESULTS_AGENT_LATEST.md.
Início rápido
pip install polycodegraph # the PyPI distribution name
codegraph init # the CLI binary + Python module + MCP server are all `codegraph` (see footnote ↓)
codegraph build # parse repo → .codegraph/graph.db
codegraph serve # web dashboard at http://127.0.0.1:8765
É isso. Três comandos e você tem um grafo consultável, um dashboard 3D e um servidor MCP com o qual sua IDE pode conversar.
Linguagens + frameworks (hoje)
| Hoje (v0.1.0) | Roadmap | |
|---|---|---|
| Linguagens | Python · TypeScript · JavaScript · TSX / JSX · Go | Java, Rust, C# (v0.3); Ruby, PHP depois |
| Frameworks HTTP | FastAPI · Flask · aiohttp · Express · NestJS | Spring Boot, Django views, ASP.NET, Rails (junto com a linguagem deles) |
| ORMs / DBs | SQLAlchemy · Prisma (parcial) | Django ORM, GORM, Diesel, ActiveRecord (junto com a linguagem deles) |
| Fetch de frontend | fetch · axios · SWR · React Query · apiClient.* genérico | RTK Query, Apollo |
| 24 decorators de frameworks | FastAPI · Flask · aiohttp · Celery · pytest · MCP · Click · Typer · Django · SQLAlchemy · NestJS · … | Anotações Spring, atributos .NET |
Adicionar uma nova linguagem é um único módulo de parser tree-sitter + arquivo de fixture (~3 horas — veja codegraph/parsers/go.py para o template v1). PRs são bem-vindos.
O DIFERENCIAL — um grafo, tudo em cima
polycodegraph tem exatamente uma opinião: construa o grafo certo, e todo recurso interessante surge de graça.
As entradas que alimentam o grafo vão além de imports e arestas de chamada. polycodegraph lê parses tree-sitter para Python, TypeScript, JavaScript e Go; captura os argumentos de cada call-site como texto; reconhece 24 decorators de frameworks para que handlers FastAPI / Flask / Celery / pytest / Click / MCP / Django / SQLAlchemy nunca sejam confundidos com código morto; detecta rotas (@app.get("/x")) e fetches de frontend (fetch, axios, useSWR, useQuery); e costura URLs através da stack (/{id} ↔ ${id} ↔ :id) para rastrear um fetch até seu handler.
As saídas que vêm de graça quando o grafo está certo:

Código morto ciente de decorators, classificação de papéis (HANDLER / SERVICE / COMPONENT / REPO), raio de impacto, ciclos, detecção de funções sem teste, um rastreio cross-stack de ponta a ponta com anotações de renomeação, um dashboard 3D em modo foco, um modal de ciclo de vida no Learn Mode, embeddings locais para busca semântica + híbrida, um servidor MCP com 18 ferramentas e um CI de revisão de PR que faz diff do grafo da branch contra main.
Um único arquivo SQLite. Sem daemon. Sem rede. Viaja com sua branch git.
Como funciona
┌─────────────────────────────────────────────────────┐
│ tree-sitter parsing │
│ (Python, TS/JS, TSX, JSX, Go) │
└─────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ Cross-file resolution (R1, R2, R3) │
│ ✓ per-name imports ✓ relative imports │
│ ✓ constructor calls ✓ decorators │
│ ✓ self.X.Y chains ✓ fresh instances │
└─────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ SQLite graph (nodes + edges) │
│ DF0: call-site arguments │
│ DF1: routes (FastAPI, Flask, aiohttp) │
│ DF2: fetches (fetch, axios, SWR, useQuery) │
│ DF3: URL stitching (/{id} ↔ ${id} ↔ :id) │
│ DF4: end-to-end trace (fetch→handler→service→DB) │
└─────────────────────────────────────────────────────┘
↙ ↓ ↘
CLI tools Web dashboard MCP server
(graph, roles, (3D focus view, (18 tools for
cycles, dead architecture, Claude Code,
code, untested) learn mode) Cursor, etc.)
O que você pode fazer
| Screenshot | Caso de uso |
|---|---|
![]() | Visualização 3D em foco — Escolha qualquer função, rastreie sua árvore de chamadas downstream real, expanda ou recolha ancestrais e descendentes inline. Mostrado: build_dashboard_payload com seus 15 callees diretos — find_dead_code, find_cycles, build_hld, find_hotspots, compute_metrics e o restante da stack de análise. |
![]() | Mapa de arquitetura — Handlers agrupados por papel (HANDLER, SERVICE, COMPONENT, REPO), componentes de infraestrutura (DB, cache, fila) e suas conexões de relance. Clique em um handler → Learn Mode abre um modal de ciclo de vida da requisição: TCP → TLS → HTTP → query → resposta. |
![]() | Rastreio cross-stack DF4 — Clique em qualquer handler na visualização de Arquitetura e o Learn Mode anima o ciclo de vida completo da requisição: DNS → TCP → TLS → HTTP → middleware → handler → service → SQL → 200 OK. O parâmetro user_id é destacado em cada salto com anotações de renomeação (userId → user_id → id). Uma consulta ao grafo, sem mergulhar em logs. |
![]() | Ferramentas MCP que seu assistente de IA chama diretamente — Uma resposta real de find_symbol("get_user") do servidor MCP do polycodegraph. Três resultados em ~50 tokens, classificados por papel como HANDLER vs SERVICE, sem necessidade de leitura de arquivos. Coloque isso junto com o grep do Claude Code e o assistente para de despejar arquivos inteiros na janela de contexto — veja o benchmark abaixo. |
Benchmark — mesmo Claude, variando o grafo MCP
Quatro configurações. Mesmo Claude Sonnet 4.6. Mesmas 10 perguntas em dois codebases reais (o próprio polycodegraph + FastAPI). Todas as quatro configurações incluem as ferramentas nativas de grep + leitura de arquivos do Claude — o que todo dev recebe pronto no Claude Code ou Cursor. A única coisa que muda é se um grafo MCP também está registrado junto.
codegraph-self
| Configuração | Corretas | Tokens de entrada | Custo (USD) | Latência média (s) |
|---|---|---|---|---|
claude+grep (sem grafo MCP) | 5 / 5 | 264,756 | $0.92 | 102 |
+ code-review-graph MCP | 2 / 5 | 118,674 | $0.39 | 56 |
+ graphify MCP | 3 / 5 | 99,233 | $0.31 | 83 |
+ polycodegraph MCP | 4 / 5 | 43,705 | $0.18 | 22 |
fastapi
| Configuração | Corretas | Tokens de entrada | Custo (USD) | Latência média (s) |
|---|---|---|---|---|
claude+grep (sem grafo MCP) | 3 / 5 | 71,833 | $0.25 | 54 |
+ code-review-graph MCP | 1 / 5 | 84,082 | $0.29 | 42 |
+ graphify MCP | 2 / 5 | 55,287 | $0.19 | 46 |
+ polycodegraph MCP | 3 / 5 | 46,347 | $0.19 | 18 |
A leitura honesta nos dois repositórios:
claude+grepsozinho é o mais correto (8/10) — Claude consegue responder à maioria das perguntas sobre o codebase com grep e leitura de arquivos inteiros. Mas paga o preço: 336k tokens, $1.17, 78s de latência média.+ polycodegraphiguala isso dentro de uma pergunta (7/10) com custo 3× menor e latência 4× menor (90k tokens, $0.37, 20s). Porque polycodegraph retorna subgrafos pequenos e focados (~20-50 tokens por chamada) em vez de despejar arquivos inteiros via grep no contexto do Claude.- Os outros grafos MCP são estritamente piores do que apenas usar grep. code-review-graph: 3/10 a $0.68. graphify: 5/10 a $0.50. Eles adicionam overhead de ferramentas sem compensar em corretude.
Reproduza: codegraph bench agent --only claude+grep,claude+grep+polycodegraph,claude+grep+code-review-graph,claude+grep+graphify. JSONL bruto por execução em bench/agent_raw_latest.jsonl. Metodologia completa em bench/README.md.
Instalação e uso
Via PyPI
pip install polycodegraph
codegraph init
codegraph build
Registre como servidor MCP
codegraph init escreve um .mcp.json no nível do projeto no repositório — Claude Code e Cursor detectam isso automaticamente assim que você abre o projeto. Para outros clientes, você precisa adicionar o servidor à configuração global manualmente por enquanto (v0.2 fará isso por você).
// Claude Code (global) → ~/.claude.json
// Cursor (global) → ~/.cursor/mcp.json (or .cursor/mcp.json per workspace)
// Windsurf → ~/.windsurf/mcp.json
// OpenAI Codex CLI → ~/.codex/mcp.json
// GitHub Copilot CLI → ~/.config/copilot/mcp.json
// Zed → ~/.config/zed/settings.json under "context_servers"
// Continue → ~/.continue/config.json under "experimental.modelContextProtocolServers"
{
"mcpServers": {
"codegraph": {
"command": "codegraph",
"args": ["mcp", "serve"]
}
}
}
O mesmo trecho JSON de cinco linhas funciona para todos os clientes — apenas o caminho do arquivo muda.
Depois, faça perguntas ao seu assistente como:
"Quais nós HANDLER não têm cobertura de teste?" "Mostre-me todos os chamadores de
UserService.logincom seus argumentos." "RastreieGET /api/users/{id}do fetch de frontend até o banco de dados." "Qual é o raio de impacto de mudar esta função?"
Todas as 18 ferramentas retornam subgrafos pequenos e focados — sem inundar a janela de contexto.
Opcional: embeddings locais
pip install 'polycodegraph[embed]'
codegraph embed # chunks the repo, embeds with nomic-ai/CodeRankEmbed
Desbloqueia as ferramentas MCP semantic_search e hybrid_search. Download do modelo de ~140 MB, roda localmente, sem chaves de API.
Demonstração ao vivo
Uma fixture pequena de FastAPI + SQLAlchemy + React está em examples/cross-stack-demo/. Rode polycodegraph nela para ver DF0, DF1, DF1.5, DF2, DF3 e DF4 todos ativados:
codegraph build --no-incremental --root examples/cross-stack-demo
codegraph dataflow trace "GET /api/users/{user_id}"
Veja o README da demo para a saída esperada.
Limitações (lista honesta)
O que polycodegraph ainda não faz. Listado aqui para que as afirmações do benchmark e do README permaneçam limpas.
- Inferência de tipos (Mypy / Pyright). DF0 captura o texto dos argumentos, não os tipos. Roadmap v0.3.
- Identidade de valor de argumento entre saltos. DF4 emite saltos ordenados com anotações de renomeação; a propagação completa de valor único do corpo do fetch → parâmetro de rota → argumento de service → coluna do banco é adiada (v0.3).
- Docstrings são armazenadas em cada nó, mas ainda não são consumidas pela análise. Embeddings as usam como texto de corpo alternativo; código morto, classificação de papéis e dataflow as ignoram. Roadmap v0.3.
- Mineração de histórico Git (semântica de mensagens de commit, sinais de autor / frequência de alteração). Não implementado. Git é usado apenas para o SHA do HEAD atual e o diff de revisão de PR. Roadmap v0.4.
- Paridade de resolver por linguagem (v0.1.2). Python entrega as correções completas R1/R2/R3. Padrões R2 do TypeScript (aliases de caminho, binding de instância nova, arestas de chamada de decorator) são adiados.
- Símbolos CLI do Typer não são marcados como HANDLER (v0.1.x). DF1.5 só classifica decorators de frameworks HTTP.
- Visualização de async / await (v0.4). DF4 percorre apenas o grafo de chamadas síncrono.
- Renderização de ramos de caminho de erro (v0.4). Learn Mode mostra o caminho feliz.
- Middleware de autenticação como fase distinta (v0.4). Hoje a autenticação aparece como um nó CALL comum.
- Destaque simultâneo de múltiplos parâmetros (v0.4). Apenas seleção de parâmetro único.
- Rastreios entre processos (v0.4). Ainda não é possível vincular múltiplos arquivos
.codegraph/graph.db.
Roadmap
| Versão | Status | O que tem / o que está planejado |
|---|---|---|
| 0.1.0 | Disponível no PyPI hoje | Parsing (Python, TS/JS, Go), rastreio DF0–DF4, dashboard 3D + Arquitetura + Learn Mode, código morto ciente de decorators, ciclos, classificação de papéis, embeddings locais (busca semântica + híbrida), 18 ferramentas MCP, CI de revisão de PR, modo workspace entre repositórios. |
| 0.1.2 | Planejado | Padrões de resolver R2 do TypeScript (aliases de caminho, binding de instância nova, arestas de decorator); classificação HANDLER de CLI para Typer / Click. |
| 0.3 | Planejado | Inferência de tipos (Mypy/Pyright); propagação completa de fluxo de argumento de valor único; dicas de análise guiadas por docstrings; destaque de múltiplos parâmetros; mais linguagens (Rust, Java, C#). |
| 0.2 | Planejado | Renomear binário CLI codegraph → polycodegraph (manter codegraph como alias obsoleto por um release); codegraph init escreve na configuração MCP global de todos os clientes detectados (Claude Code / Cursor / Windsurf / Codex / Copilot / Zed / Continue), não apenas no .mcp.json no nível do projeto. |
| 0.4 | Planejado | Visualização de async / await; ramos de caminho de erro; fase de middleware de autenticação; rastreios entre processos; semântica de histórico git. |
Sobre o auto-grafo: de 451 achados de código morto a 0
Rodamos polycodegraph no próprio código-fonte como alvo de regressão. Os achados de código morto caíram de 451 → 24+ → 15 → 0 conforme o resolver foi endurecido, a detecção de pontos de entrada ciente de decorators foi implementada e métodos intencionais de API pública foram marcados com # pragma: codegraph-public-api.
Estatísticas atuais do auto-grafo:
- 3,320 nós (arquivos, classes, funções, imports)
- 7,557 arestas (5,245 CALLS, 1,357 DEFINED_IN, 886 IMPORTS, 28 INHERITS, 12 ROUTE, 27 FETCH_CALL, 1 READS_FROM, 1 WRITES_TO)
- 3 ciclos, todos documentados e aceitos (redesenho do dashboard, auto-recursão do parser, falso positivo do resolver MCP serve/run)
- 0 achados de código morto (com isenções de pragma para métodos de API pública)
- 637 testes passando (537 pytest Python + 100 testes Node)
Onde se encaixa
| polycodegraph | GitNexus | code-review-graph | better-code-review-graph | JudiniLabs / mcp-code-graph | RepoMapper | Graphify | |
|---|---|---|---|---|---|---|---|
| Local-first, SQLite único, sem daemon | ✅ | ✅ | ✅ | ✅ | parcial | ✅ | varia |
| Nativo MCP (stdio) | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ |
| Rastreamento ponta a ponta entre stacks (fetch → SQL) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Código morto ciente de decoradores (24 frameworks) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Classificação de papéis (HANDLER/SERVICE/...) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Captura de texto de fluxo de dados em nível de argumento (DF0) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Rastreador de fluxo em modo foco 3D | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | parcial |
| Embeddings locais (sem chave de API) | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ |
| Open source, MIT | ✅ | ❌ (PolyForm NC) | ✅ | ✅ | ✅ | ✅ | varia |
A diferença não é um algoritmo de grafo mais sofisticado — é que o polycodegraph trata rastrear este argumento através da stack como uma operação de primeira classe, não um grep complementar. Ferramentas de recuperação baseadas em embeddings (code-review-graph, Cursor, Cody) lidam bem com prosa / docstrings; a arquitetura correta é grafo + embeddings no mesmo loop MCP, e a v0.1.0 entrega ambos.
Referência completa de funcionalidades (16 capacidades)
| Capacidade | O que faz | Exemplo |
|---|---|---|
| Parsing | tree-sitter percorre Python / TypeScript / JavaScript / TSX / JSX / Go na granularidade de função/método/classe. | codegraph build |
| Armazenamento SQLite único | Todos os dados do grafo em .codegraph/graph.db. Sem daemon, sem servidor de banco, sem rede. | git commit .codegraph/ |
| Resolução entre arquivos | Imports por nome, imports relativos, construtores no mesmo arquivo, arestas de chamada de decorador, cadeias self.X.Y, métodos de instância recém-criada. | from pkg import a, b, c → 3 arestas separadas |
| Argumentos de call-site DF0 | Captura o texto de cada argumento no momento do parsing (sem inferência de tipo). Alimenta tooltips de assinatura e rótulos de aresta. | func(user_id=42) → o rótulo da aresta mostra user_id=42 |
| Código morto ciente de decoradores | 24 decoradores de frameworks reconhecidos (Typer, FastAPI, Click, Celery, pytest, MCP, Flask, Django, SQLAlchemy, etc.). Handlers registrados por frameworks nunca são sinalizados. | @app.get("/x") → handler não é código morto |
| Ciclos de chamada/import | Detecta componentes fortemente conectados, reporta com qualnames completos. | a.b → c.d → a.b |
| Pontos críticos, não testados, métricas | Detecção de alto fan-in, listagem de funções não testadas, métricas agregadas do grafo. | codegraph analyze |
| Classificação de papéis DF1.5 | Funções marcadas como HANDLER / SERVICE / COMPONENT / REPO a partir de padrões de frameworks. Ciente de FastAPI / Flask / Express / NestJS. | def login() → HANDLER |
| Arestas ROUTE DF1 | FastAPI, Flask (expansão multi-método), aiohttp. Nós sintéticos route::METHOD::/path. | @app.get("/users/{id}") → aresta para route::GET::/users/{id} |
| DF1 SQLAlchemy READS_FROM / WRITES_TO | session.query, Model.query.filter, session.add, session.execute(select|insert|update|delete(Model)). | session.query(User) → aresta para a classe User |
| Extração DF2 FETCH_CALL | fetch, axios.get/post/..., useSWR, useQuery, apiClient.get/post genérico. Captura método, URL, formato das chaves do corpo. | fetch("/api/users/{id}") → nó de URL com metadados |
| Costura de URLs DF3 | Normalização de placeholders (/{id} ↔ ${id} ↔ :id); bônus de sobreposição de chaves do corpo; um-para-muitos tolerado. | GET /users/{id} ↔ fetch("/users/${id}") |
| Rastreamento ponta a ponta DF4 | CLI + ferramenta MCP. Percorre o grafo de chamadas + arestas DF1/DF2, emite saltos ordenados com mapeamento de fluxo de argumentos por salto. | O rastreamento mostra user_id (fetch) → user_id (param) → user (local) → id (coluna do banco) |
| Dashboard em modo foco 3D | Escolha qualquer função, expanda/recolha ancestrais/descendentes inline, assinaturas ao passar o mouse, rótulos de aresta mostram argumentos do call-site. | Clique em UserService.get_by_id, expanda 5 níveis |
| Visão de arquitetura + Modo Aprender | Detecta infraestrutura (framework, ORM, cache, fila, clientes HTTP). Clique no handler → ciclo de vida animado TCP → TLS → HTTP → query → resposta. | Clique em @app.post("/users") |
| Embeddings locais | codegraph embed divide o repositório em chunks, gera embeddings com nomic-ai/CodeRankEmbed (Apache 2.0, ~140 MB), habilita semantic_search e hybrid_search. | codegraph embed |
| Servidor MCP (18 ferramentas) | Todas as consultas do grafo expostas via stdio MCP — funciona com Claude Code, Cursor, Windsurf prontamente. | codegraph mcp serve |
| CI de revisão de PR | codegraph review --format markdown --fail-on high faz diff do grafo entre o branch e a baseline. | cp .github/ci-templates/pr-review.workflow.yml .github/workflows/ |
Subcomandos da CLI
# Graph building
codegraph init # interactive setup: detect languages, configure ignore globs, register MCP
codegraph build # parse repo with tree-sitter, write/update .codegraph/graph.db
codegraph status # graph freshness, last build time, drift indicators
# Analysis
codegraph analyze # whole-project audit: dead code, cycles, untested, hotspots, metrics
codegraph query callers <symbol> # reverse-BFS: who calls this?
codegraph query callees <symbol> # forward traversal: what does this call?
codegraph query subgraph <symbol>
codegraph query deadcode
codegraph query untested
codegraph query cycles
codegraph query hotspots
codegraph query metrics
# Visualization
codegraph serve # web dashboard at http://127.0.0.1:8765
codegraph viz # Mermaid / interactive HTML / SVG
codegraph explore # static subgraph explorer pages (good for sharing)
codegraph dataflow trace "<M> <path>" # walk DF1→DF4 to trace endpoint frontend→DB
# PR review + baselines
codegraph review # graph-diff current branch vs baseline; CSV or Markdown
codegraph baseline save # snapshot current graph as the local baseline
codegraph baseline status
codegraph baseline push # optional S3 remote
codegraph hook install # pre-push git hook running codegraph review
codegraph hook uninstall
# MCP + embeddings
codegraph mcp serve # MCP stdio server: 18 tools for Claude Code / Cursor / Windsurf
codegraph embed # chunk + embed (nomic-ai/CodeRankEmbed); enables semantic + hybrid search
# Cross-repo workspace mode
codegraph workspace init # ~/.codegraph/workspace.yml
codegraph workspace add <path>
codegraph workspace remove <path>
codegraph workspace list
codegraph workspace status
codegraph workspace sync [--only <name>]
Ferramentas MCP (18 no total)
| Ferramenta | Entrada | Saída | Caso de uso |
|---|---|---|---|
find_symbol(query, role=None) | Nome do símbolo ou correspondência parcial; filtro de papel opcional. | Símbolos correspondentes + localização + papel. | "Encontre todos os HANDLERs chamados login." |
callers(qualname) | Qualname da função. | Chamadores com texto do argumento em cada call-site. | "Quem chama UserService.get_by_id?" |
callees(qualname) | Qualname da função. | Funções que esta chama com texto do argumento. | "O que o handler de login chama?" |
blast_radius(qualname) | Qualname da função. | Fecho transitivo de todas as funções alcançáveis. | "Se eu mudar este utilitário, o que quebra?" |
subgraph(qualname, depth=2) | Símbolo + profundidade opcional. | Subgrafo induzido (ancestrais + descendentes). | "Mostre-me o contexto ao redor desta função." |
dead_code(role=None) | Filtro de papel opcional. | Funções/classes não referenciadas. Ciente de decoradores. | "Há código morto na camada SERVICE?" |
cycles(qualname=None) | Filtro de símbolo opcional. | SCCs com qualnames e contagem de membros. | "Há ciclos de import?" |
untested(role=None) | Filtro de papel opcional. | Funções sem chamadas de teste. | "Quais HANDLERs têm cobertura zero?" |
hotspots(top_n=10) | Limite opcional. | Funções ordenadas por fan-in. | "Quais são os gargalos?" |
metrics() | Nenhum. | Contagens de nós/arestas, densidade, fan-in/out, ciclos. | "Quão complexo é este codebase?" |
semantic_search(query, k=5) | String de consulta + máximo de resultados. | Trechos classificados por similaridade de cosseno. Requer codegraph embed. | "Encontre a lógica de redefinição de senha." |
hybrid_search(query, k=5, role=None, focus_qualname=None) | Consulta + papel opcional + ponto focal de reclassificação. | Trechos classificados por 0,6 · cosseno + 0,4 · distância no grafo. | "Encontre lógica de autenticação perto do handler de login." |
dataflow_routes() | Nenhum. | Rotas detectadas: handler, método, caminho, framework. | "Quais endpoints o app expõe?" |
dataflow_fetches(handler_qualname=None) | Filtro de handler opcional. | Fetches do frontend: chamador, método, URL, chaves do corpo. | "Quais handlers são chamados do frontend?" |
dataflow_trace(method_path) | Rota (ex.: "GET /api/users/{id}"). | Saltos ordenados: rota → handler → service → repo → SQL com fluxo de argumentos por salto. | "Rastreie user_id do frontend ao banco de dados." |
workspace_state() | Nenhum. | Por repositório: branch, contagem de alterações não commitadas, último commit, presença no grafo. | "Qual é o estado de cada repositório em que estou trabalhando?" |
workspace_diff_since(ref="main") | Ref opcional. | Arquivos alterados por repositório desde o ref. | "O que toquei esta semana em todos os meus repositórios?" |
workspace_blast_radius(symbol, depth=None) | Símbolo + profundidade opcional. | Raio de impacto por repositório unido no workspace. | "Se eu renomear esta função, o que quebra em todos os meus projetos?" |
Mergulho profundo na arquitetura (estágios do resolvedor R1/R2/R3 + implementação DF0–DF4)
Estágios do resolvedor
R1 (Emissão de arestas no parsing):
- Imports por nome:
from x import a, b, c→ 3 arestas IMPORTS separadas - Imports relativos:
from ..sibling import func→ caminho resolvido - Chamadas de construtor no mesmo arquivo:
MyClass()→ aresta CALLS para__init__
R2 (Vinculação entre arquivos):
- Segue alvos de import através de fronteiras de arquivos
- Reconhece atribuições diretas (
x = imported_func) - Detecta pilhas de decoradores e classifica funções por framework
R3 (Refinamento):
- Arestas de chamada de decorador:
@my_decoratoraplicado adef func()→ aresta CALLS para o decorador - Cadeias
self.X.Y:self.service.get_user()→ arestas CALLS através da cadeia de propriedades - Vinculação de instância recém-criada:
MyClass().method()→ aresta CALLS para ambos__init__emethod - Atribuições condicionais de
self.Xrastreadas a partir de__init__
Camadas de fluxo de dados
DF0 — Argumentos de call-site — captura de texto no momento do parsing, sem inferência de tipos. Alimenta tooltips de assinatura + rótulos de aresta.
DF1 — Rotas HTTP — FastAPI / Flask / aiohttp. Nós sintéticos route::METHOD::/path.
DF1.5 — Classificação de papéis — HANDLER (decorado por rota), SERVICE (chamado por HANDLERs), COMPONENT (utilitário), REPO (acesso a banco).
DF2 — Fetches do frontend — fetch, axios.*, useSWR, useQuery, apiClient.* genérico. Captura método, URL, formato das chaves do corpo.
DF3 — Costura de URLs — normalização de placeholders, bônus de sobreposição de chaves do corpo, um-para-muitos tolerado.
DF4 — Rastreamento ponta a ponta — percorre o grafo de chamadas + arestas entre camadas DF1/DF2, emite saltos ordenados com mapeamento de fluxo de argumentos por salto. Normalização Snake_case ↔ camelCase ↔ PascalCase para que user_id = userId = UserId. Anotações de renomeação: (was userId) quando o nome local difere.
Payload HLD
serialize_hld() expõe três camadas — Infraestrutura (framework / ORM / cache / fila / clientes HTTP), Aplicação (nós HANDLER / SERVICE / COMPONENT / REPO), Dados (handler-para-rota, handler-para-FETCH_CALL, repo-para-SQLAlchemy com cadeias de saltos DF4). O Modo Aprender lê isso para animar ciclos de vida de requisições.
CI de revisão de PR (dogfood)
O polycodegraph inclui seu próprio fluxo de revisão de PR como template. Uma vez ativado, cada PR executa o polycodegraph sobre si mesmo, publica o diff e falha em descobertas de alta severidade.
Ativar:
gh auth refresh -h github.com -s workflow
cp .github/ci-templates/pr-review.workflow.yml .github/workflows/pr-review.yml
git add .github/workflows/pr-review.yml
git commit -m "ci: activate codegraph PR review"
git push
O que faz: constrói um grafo de baseline a partir de origin/main, constrói um grafo de head a partir do PR, executa codegraph review --format markdown --fail-on high, publica o resultado como um comentário fixo no PR.
Dry-run local:
./scripts/test-pr-review-locally.sh
Desenvolvimento
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
ruff check . # lint
mypy --strict codegraph # type-check
pytest -q # 537 Python tests
node --test tests/*.js # 100 Node tests
./scripts/test-pr-review-locally.sh # dry-run the PR review workflow
As verificações de CI estão definidas em .github/workflows/ci.yml. Novo no repositório? Comece por docs/GETTING_STARTED.md. Para convenções de commit e processo de PR, veja CONTRIBUTING.md.
Uma nota sobre os nomes
Este projeto é instalado a partir do PyPI como polycodegraph porque o nome simples codegraph já estava ocupado quando a v0.1.0 foi lançada. Todo o resto — o pacote Python que você importa, o binário da CLI que você executa e a chave do servidor MCP que você registra — é codegraph, o nome original do projeto. Planejamos unificar em polycodegraph em todos os lugares na v0.2 (renomeação da CLI com um alias codegraph por uma release). Por enquanto: dois nomes, uma ferramenta.
Agradecimentos
O polycodegraph se apoia em tree-sitter (parsing), vasturiano/3d-force-graph (renderização 3D), networkx (algoritmos de grafo), pydantic (schema tipado), typer (CLI), rich (saída de console), nomic-ai/CodeRankEmbed (embeddings), e o Model Context Protocol Python SDK.
Licença
MIT © mochan
Suporte comercial, implantações e forks com licença personalizada disponíveis — contato smochan07@gmail.com. O polycodegraph em si é e permanece MIT; a linha de contato existe para equipes que desejam suporte empresarial ou acordos de licença específicos por cima.
Pull requests são bem-vindos. Veja CONTRIBUTING.md para configuração local, verificações de CI, convenções de commit e o Contributor License Agreement com um clique que você será solicitado a assinar no seu primeiro PR.



