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

CI PyPI Python 3.10+ License: MIT MCP

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.

hero benchmark

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
LinguagensPython · TypeScript · JavaScript · TSX / JSX · GoJava, Rust, C# (v0.3); Ruby, PHP depois
Frameworks HTTPFastAPI · Flask · aiohttp · Express · NestJSSpring Boot, Django views, ASP.NET, Rails (junto com a linguagem deles)
ORMs / DBsSQLAlchemy · Prisma (parcial)Django ORM, GORM, Diesel, ActiveRecord (junto com a linguagem deles)
Fetch de frontendfetch · axios · SWR · React Query · apiClient.* genéricoRTK Query, Apollo
24 decorators de frameworksFastAPI · 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:

MOAT

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

ScreenshotCaso de uso
3d_focusVisualizaçã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.
architecture_viewMapa 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.
DF4 traceRastreio 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.
MCP cardFerramentas 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çãoCorretasTokens de entradaCusto (USD)Latência média (s)
claude+grep (sem grafo MCP)5 / 5264,756$0.92102
+ code-review-graph MCP2 / 5118,674$0.3956
+ graphify MCP3 / 599,233$0.3183
+ polycodegraph MCP4 / 543,705$0.1822

fastapi

ConfiguraçãoCorretasTokens de entradaCusto (USD)Latência média (s)
claude+grep (sem grafo MCP)3 / 571,833$0.2554
+ code-review-graph MCP1 / 584,082$0.2942
+ graphify MCP2 / 555,287$0.1946
+ polycodegraph MCP3 / 546,347$0.1918

A leitura honesta nos dois repositórios:

  • claude+grep sozinho é 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.
  • + polycodegraph iguala 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.login com seus argumentos." "Rastreie GET /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ãoStatusO que tem / o que está planejado
0.1.0Disponível no PyPI hojeParsing (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.2PlanejadoPadrõ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.3PlanejadoInferê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.2PlanejadoRenomear binário CLI codegraphpolycodegraph (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.4PlanejadoVisualizaçã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

polycodegraphGitNexuscode-review-graphbetter-code-review-graphJudiniLabs / mcp-code-graphRepoMapperGraphify
Local-first, SQLite único, sem daemonparcialvaria
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 3Dparcial
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)
CapacidadeO que fazExemplo
Parsingtree-sitter percorre Python / TypeScript / JavaScript / TSX / JSX / Go na granularidade de função/método/classe.codegraph build
Armazenamento SQLite únicoTodos os dados do grafo em .codegraph/graph.db. Sem daemon, sem servidor de banco, sem rede.git commit .codegraph/
Resolução entre arquivosImports 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 DF0Captura 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 decoradores24 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/importDetecta componentes fortemente conectados, reporta com qualnames completos.a.b → c.d → a.b
Pontos críticos, não testados, métricasDetecçã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.5Funçõ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 DF1FastAPI, 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_TOsession.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_CALLfetch, 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 DF3Normalizaçã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 DF4CLI + 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 3DEscolha 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 AprenderDetecta 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 locaiscodegraph 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 PRcodegraph 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)
FerramentaEntradaSaídaCaso 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_decorator aplicado a def 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__ e method
  • Atribuições condicionais de self.X rastreadas 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 frontendfetch, 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.