polycodegraph
Servidor MCP de grafo de código multilingüe con 18 herramientas (find_symbol, callers, callees, blast_radius, dataflow_trace) para asistentes de IA — local primero, sin necesidad de clave API, ~3× menos tokens que Claude+grep con la misma precisión.
Documentación
polycodegraph
Analiza cualquier repositorio y conviértelo en un grafo de código consultable. Traza un parámetro desde un fetch del frontend a través de cada capa hasta la consulta SQL. Potencia Claude Code, Cursor y Windsurf mediante MCP, para que tu asistente de IA lea contexto enfocado en lugar de todo el código base.

Mismo Claude Sonnet 4.6. Mismas 10 preguntas sobre dos repos reales (el propio codegraph + FastAPI). Solo cambia el servidor MCP registrado. Reproduce con codegraph bench agent, datos crudos en bench/RESULTS_AGENT_LATEST.md.
Inicio 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
Eso es todo. Tres comandos y tienes un grafo consultable, un panel 3D y un servidor MCP con el que tu IDE puede hablar.
Idiomas + frameworks (hoy)
| Hoy (v0.1.0) | Hoja de ruta | |
|---|---|---|
| Idiomas | Python · TypeScript · JavaScript · TSX / JSX · Go | Java, Rust, C# (v0.3); Ruby, PHP más adelante |
| Frameworks HTTP | FastAPI · Flask · aiohttp · Express · NestJS | Spring Boot, vistas Django, ASP.NET, Rails (junto con su idioma) |
| ORMs / BD | SQLAlchemy · Prisma (parcial) | Django ORM, GORM, Diesel, ActiveRecord (junto con su idioma) |
| Fetch de frontend | fetch · axios · SWR · React Query · apiClient.* genérico | RTK Query, Apollo |
| 24 decoradores de frameworks | FastAPI · Flask · aiohttp · Celery · pytest · MCP · Click · Typer · Django · SQLAlchemy · NestJS · … | Anotaciones Spring, atributos .NET |
Añadir un nuevo idioma es un único módulo de parser tree-sitter + archivo de fixture (~3 horas — ver codegraph/parsers/go.py para la plantilla v1). Pull requests bienvenidos.
El MOAT — un grafo, todo encima
polycodegraph tiene exactamente una opinión: construye el grafo correcto, y todas las funciones interesantes salen gratis.
Las entradas que alimentan el grafo van más allá de imports y aristas de llamadas. polycodegraph lee parses de tree-sitter para Python, TypeScript, JavaScript y Go; captura los argumentos de cada call-site como texto; reconoce 24 decoradores de frameworks para que los handlers de FastAPI / Flask / Celery / pytest / Click / MCP / Django / SQLAlchemy nunca se confundan con código muerto; detecta rutas (@app.get("/x")) y fetches de frontend (fetch, axios, useSWR, useQuery); y une URLs a través de la pila (/{id} ↔ ${id} ↔ :id) para poder trazar un fetch hasta su handler.
Las salidas que salen gratis una vez que el grafo está bien:

Código muerto con conciencia de decoradores, clasificación de roles (HANDLER / SERVICE / COMPONENT / REPO), radio de impacto, ciclos, detección de funciones sin testear, un trace extremo a extremo entre capas con anotaciones de renombrado, un panel 3D con modo de enfoque, un modal de ciclo de vida en Learn Mode, embeddings locales para búsqueda semántica + híbrida, un servidor MCP de 18 herramientas y un CI de revisión de PRs que compara el grafo de la rama contra main.
Un único archivo SQLite. Sin demonio. Sin red. Viaja con tu rama de git.
Cómo 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.)
Lo que puedes hacer
| Captura | Caso de uso |
|---|---|
![]() | Vista 3D de enfoque — Elige cualquier función, traza su árbol de llamadas descendente real, expande o colapsa ancestros y descendientes en línea. Se muestra: build_dashboard_payload con sus 15 llamadas directas — find_dead_code, find_cycles, build_hld, find_hotspots, compute_metrics y el resto de la pila de análisis. |
![]() | Mapa de arquitectura — Handlers agrupados por rol (HANDLER, SERVICE, COMPONENT, REPO), componentes de infraestructura (BD, caché, cola) y sus conexiones de un vistazo. Haz clic en un handler → Learn Mode abre un modal de ciclo de vida de petición: TCP → TLS → HTTP → consulta → respuesta. |
![]() | Trace entre capas DF4 — Haz clic en cualquier handler en la vista de Arquitectura y Learn Mode anima el ciclo de vida completo de la petición: DNS → TCP → TLS → HTTP → middleware → handler → servicio → SQL → 200 OK. El parámetro user_id se resalta en cada salto con anotaciones de renombrado (userId → user_id → id). Una consulta al grafo, sin bucear en logs. |
![]() | Herramientas MCP que tu asistente de IA llama directamente — Una respuesta real de find_symbol("get_user") del servidor MCP de polycodegraph. Tres resultados en ~50 tokens, clasificados por rol como HANDLER vs SERVICE, sin lecturas de archivos. Añádelo junto al grep de Claude Code y el asistente dejará de volcar archivos completos en su ventana de contexto — ver el benchmark abajo. |
Benchmark — mismo Claude, variando el grafo MCP
Cuatro configuraciones. Mismo Claude Sonnet 4.6. Mismas 10 preguntas en dos códigos base reales (el propio polycodegraph + FastAPI). Las cuatro configuraciones incluyen las herramientas nativas de grep y lectura de archivos de Claude — lo que todo desarrollador obtiene por defecto en Claude Code o Cursor. Lo único que cambia es si también se registra además un grafo MCP.
codegraph-self
| Configuración | Correctas | Tokens de entrada | Coste (USD) | Latencia media (s) |
|---|---|---|---|---|
claude+grep (sin 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
| Configuración | Correctas | Tokens de entrada | Coste (USD) | Latencia media (s) |
|---|---|---|---|---|
claude+grep (sin 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 |
La lectura honesta en ambos repos:
claude+grepsolo es el más correcto (8/10) — Claude puede responder a la mayoría de preguntas sobre el código buscando con grep y leyendo archivos completos. Pero paga el precio: 336k tokens, $1.17, latencia media de 78s.+ polycodegraphalcanza eso dentro de una pregunta (7/10) a 3× menos coste y 4× menos latencia (90k tokens, $0.37, 20s). Porque polycodegraph devuelve subgrafos pequeños y enfocados (~20-50 tokens por llamada) en lugar de volcar archivos completos con grep en el contexto de Claude.- Los otros grafos MCP son estrictamente peores que solo usar grep. code-review-graph: 3/10 a $0.68. graphify: 5/10 a $0.50. Añaden sobrecoste de herramientas sin compensar en corrección.
Reproduce: codegraph bench agent --only claude+grep,claude+grep+polycodegraph,claude+grep+code-review-graph,claude+grep+graphify. JSONL crudo por ejecución en bench/agent_raw_latest.jsonl. Metodología completa en bench/README.md.
Instalación y uso
Desde PyPI
pip install polycodegraph
codegraph init
codegraph build
Regístrate como servidor MCP
codegraph init escribe un .mcp.json a nivel de proyecto en el repo — Claude Code y Cursor lo detectan automáticamente en cuanto abres el proyecto. Para otros clientes, de momento necesitas añadir el servidor manualmente a su configuración global (v0.2 lo hará por ti).
// 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"]
}
}
}
El mismo fragmento JSON de cinco líneas funciona para todos los clientes — solo cambia la ruta del archivo.
Luego pregúntale a tu asistente cosas como:
"¿Qué nodos HANDLER no tienen cobertura de tests?" "Muéstrame todos los llamadores de
UserService.logincon sus argumentos." "TrazaGET /api/users/{id}desde el fetch del frontend hasta la base de datos." "¿Cuál es el radio de impacto de cambiar esta función?"
Las 18 herramientas devuelven subgrafos pequeños y enfocados — sin inundar la ventana de contexto.
Opcional: embeddings locales
pip install 'polycodegraph[embed]'
codegraph embed # chunks the repo, embeds with nomic-ai/CodeRankEmbed
Desbloquea las herramientas MCP semantic_search y hybrid_search. Descarga de modelo de ~140 MB, se ejecuta localmente, sin claves de API.
Demo en vivo
Un fixture pequeño de FastAPI + SQLAlchemy + React vive en examples/cross-stack-demo/. Ejecuta polycodegraph sobre él para ver cómo se iluminan DF0, DF1, DF1.5, DF2, DF3 y DF4:
codegraph build --no-incremental --root examples/cross-stack-demo
codegraph dataflow trace "GET /api/users/{user_id}"
Ver el README de la demo para la salida esperada.
Limitaciones (lista honesta)
Lo que polycodegraph todavía no hace. Se listan aquí para que el benchmark y las afirmaciones del README sigan siendo limpias.
- Inferencia de tipos (Mypy / Pyright). DF0 captura el texto de los argumentos, no los tipos. Hoja de ruta v0.3.
- Identidad de valor de argumentos entre saltos. DF4 emite saltos ordenados con anotaciones de renombrado; la propagación completa de un único valor desde el cuerpo del fetch → parámetro de ruta → argumento de servicio → columna de BD se difiere (v0.3).
- Los docstrings se almacenan en cada nodo pero aún no se consumen en el análisis. Los embeddings los usan como texto de respaldo del cuerpo; el código muerto, la clasificación de roles y el flujo de datos los ignoran. Hoja de ruta v0.3.
- Minería de historial de git (semántica de mensajes de commit, señales de autor/frecuencia de modificación). No implementado. Git se usa solo para el SHA actual de HEAD y el diff de revisión de PRs. Hoja de ruta v0.4.
- Paridad de resolvers por idioma (v0.1.2). Python incluye todas las correcciones R1/R2/R3. Los patrones R2 de TypeScript (alias de ruta, binding de instancia nueva, aristas de llamada por decorador) se difieren.
- Los símbolos CLI de Typer no se etiquetan como HANDLER (v0.1.x). DF1.5 solo clasifica decoradores de frameworks HTTP.
- Visualización de async / await (v0.4). DF4 recorre solo el grafo de llamadas síncronas.
- Renderizado de ramas de camino de error (v0.4). Learn Mode muestra el camino feliz.
- Middleware de autenticación como fase distinta (v0.4). Hoy la autenticación aparece como un nodo CALL normal.
- Resaltado simultáneo de múltiples parámetros (v0.4). Solo selección de un parámetro.
- Traces entre procesos (v0.4). Todavía no puede enlazar múltiples archivos
.codegraph/graph.db.
Hoja de ruta
| Versión | Estado | Qué incluye / qué se planea |
|---|---|---|
| 0.1.0 | Publicado en PyPI hoy | Parsing (Python, TS/JS, Go), trazado DF0–DF4, panel 3D + Arquitectura + Learn Mode, código muerto con conciencia de decoradores, ciclos, clasificación de roles, embeddings locales (búsqueda semántica + híbrida), 18 herramientas MCP, CI de revisión de PRs, modo workspace multi-repo. |
| 0.1.2 | Planeado | Patrones de resolver R2 de TypeScript (alias de ruta, binding de instancia nueva, aristas de decorador); clasificación de HANDLER en CLI para Typer / Click. |
| 0.3 | Planeado | Inferencia de tipos (Mypy/Pyright); propagación completa del flujo de un único valor de argumento; pistas de análisis guiadas por docstrings; resaltado multi-parámetro; más idiomas (Rust, Java, C#). |
| 0.2 | Planeado | Renombrar el binario CLI codegraph → polycodegraph (mantener codegraph como alias obsoleto durante un release); codegraph init escribe en la configuración MCP global de cada cliente detectado (Claude Code / Cursor / Windsurf / Codex / Copilot / Zed / Continue), no solo en el .mcp.json a nivel de proyecto. |
| 0.4 | Planeado | Visualización de async / await; ramas de camino de error; fase de middleware de autenticación; traces entre procesos; semántica de historial de git. |
Sobre el auto-grafo: de 451 hallazgos de código muerto a 0
Ejecutamos polycodegraph sobre su propio código fuente como objetivo de regresión. Los hallazgos de código muerto bajaron de 451 → 24+ → 15 → 0 a medida que el resolver se endurecía, la detección de puntos de entrada con conciencia de decoradores aterrizaba y los métodos intencionales de API pública se marcaban con # pragma: codegraph-public-api.
Estadísticas actuales del auto-grafo:
- 3,320 nodos (archivos, clases, funciones, imports)
- 7,557 aristas (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 y aceptados (redibujado del panel, auto-recursión del parser, falso positivo del resolver MCP serve/run)
- 0 hallazgos de código muerto (con exenciones por pragma para métodos de API pública)
- 637 tests pasando (537 pytest de Python + 100 tests de Node)
Dónde encaja
| polycodegraph | GitNexus | code-review-graph | better-code-review-graph | JudiniLabs / mcp-code-graph | RepoMapper | Graphify | |
|---|---|---|---|---|---|---|---|
| Local-first, SQLite único, sin demonio | ✅ | ✅ | ✅ | ✅ | parcial | ✅ | varía |
| Nativo de MCP (stdio) | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ |
| Trazado de extremo a extremo entre stacks (fetch → SQL) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Código muerto consciente de decoradores (24 frameworks) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Clasificación de roles (HANDLER/SERVICE/...) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Captura de texto de flujo de datos a nivel de argumento (DF0) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Rastreador de flujo 3D con modo de enfoque | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | parcial |
| Embeddings locales (sin clave API) | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ |
| Código abierto, MIT | ✅ | ❌ (PolyForm NC) | ✅ | ✅ | ✅ | ✅ | varía |
La diferencia no es un algoritmo de grafo más sofisticado: es que polycodegraph trata trazar este argumento a través del stack como una operación de primera clase, no como un grep posterior. Las herramientas de recuperación basadas en embeddings (code-review-graph, Cursor, Cody) manejan bien prosa/docstrings; la arquitectura correcta es grafo + embeddings en el mismo bucle MCP, y v0.1.0 incluye ambos.
Referencia completa de funciones (16 capacidades)
| Capacidad | Qué hace | Ejemplo |
|---|---|---|
| Análisis sintáctico | tree-sitter recorre Python / TypeScript / JavaScript / TSX / JSX / Go a nivel de función/método/clase. | codegraph build |
| Almacén SQLite único | Todos los datos del grafo en .codegraph/graph.db. Sin demonio, sin servidor de base de datos, sin red. | git commit .codegraph/ |
| Resolución entre archivos | Importaciones por nombre, importaciones relativas, constructores del mismo archivo, aristas de llamada a decorador, cadenas self.X.Y, métodos de instancia nueva. | from pkg import a, b, c → 3 aristas separadas |
| Argumentos de sitio de llamada DF0 | Captura el texto de cada argumento en tiempo de análisis (sin inferencia de tipos). Alimenta tooltips de firmas y etiquetas de aristas. | func(user_id=42) → la etiqueta de la arista muestra user_id=42 |
| Código muerto consciente de decoradores | 24 decoradores de frameworks reconocidos (Typer, FastAPI, Click, Celery, pytest, MCP, Flask, Django, SQLAlchemy, etc.). Los handlers registrados por frameworks nunca se marcan. | @app.get("/x") → handler no es código muerto |
| Ciclos de llamada/importación | Detecta componentes fuertemente conectados, los informa con qualnames completos. | a.b → c.d → a.b |
| Puntos críticos, no probados, métricas | Detección de alto fan-in, listado de funciones no probadas, métricas agregadas del grafo. | codegraph analyze |
| Clasificación de roles DF1.5 | Funciones etiquetadas como HANDLER / SERVICE / COMPONENT / REPO según patrones de frameworks. Compatible con FastAPI / Flask / Express / NestJS. | def login() → HANDLER |
| Aristas ROUTE DF1 | FastAPI, Flask (expansión multi-método), aiohttp. Nodos sintéticos route::METHOD::/path. | @app.get("/users/{id}") → arista a route::GET::/users/{id} |
| READS_FROM / WRITES_TO de DF1 SQLAlchemy | session.query, Model.query.filter, session.add, session.execute(select|insert|update|delete(Model)). | session.query(User) → arista a la clase User |
| Extracción de FETCH_CALL DF2 | fetch, axios.get/post/..., useSWR, useQuery, apiClient.get/post genérico. Captura método, URL, forma de las claves del body. | fetch("/api/users/{id}") → nodo URL con metadatos |
| Unión de URLs DF3 | Normalización de placeholders (/{id} ↔ ${id} ↔ :id); bonificación por solapamiento de claves del body; se tolera uno-a-muchos. | GET /users/{id} ↔ fetch("/users/${id}") |
| Trazado de extremo a extremo DF4 | CLI + herramienta MCP. Recorre el grafo de llamadas + aristas DF1/DF2, emite saltos ordenados con mapeo de flujo de argumentos por salto. | El trazado muestra user_id (fetch) → user_id (param) → user (local) → id (columna de BD) |
| Panel 3D con modo de enfoque | Selecciona cualquier función, expande/colapsa ancestros/descendientes en línea, firmas al pasar el cursor, etiquetas de aristas muestran argumentos del sitio de llamada. | Haz clic en UserService.get_by_id, expande 5 niveles |
| Vista de arquitectura + Modo Aprendizaje | Detecta infraestructura (framework, ORM, caché, cola, clientes HTTP). Haz clic en un handler → ciclo animado TCP → TLS → HTTP → consulta → respuesta. | Haz clic en @app.post("/users") |
| Embeddings locales | codegraph embed divide el repositorio en fragmentos, genera embeddings con nomic-ai/CodeRankEmbed (Apache 2.0, ~140 MB), habilita semantic_search y hybrid_search. | codegraph embed |
| Servidor MCP (18 herramientas) | Todas las consultas del grafo expuestas vía stdio MCP — funciona con Claude Code, Cursor, Windsurf de fábrica. | codegraph mcp serve |
| CI de revisión de PR | codegraph review --format markdown --fail-on high compara el grafo de la rama vs. la línea base. | cp .github/ci-templates/pr-review.workflow.yml .github/workflows/ |
Subcomandos 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>]
Herramientas MCP (18 en total)
| Herramienta | Entrada | Salida | Caso de uso |
|---|---|---|---|
find_symbol(query, role=None) | Nombre de símbolo o coincidencia parcial; filtro de rol opcional. | Símbolos coincidentes + ubicación + rol. | "Encuentra todos los HANDLERs llamados login." |
callers(qualname) | Qualname de función. | Llamadores con texto de argumento en cada sitio de llamada. | "¿Quién llama a UserService.get_by_id?" |
callees(qualname) | Qualname de función. | Funciones que esta llama con texto de argumento. | "¿Qué llama el handler de login?" |
blast_radius(qualname) | Qualname de función. | Cierre transitivo de todas las funciones alcanzables. | "Si cambio esta utilidad, ¿qué se rompe?" |
subgraph(qualname, depth=2) | Símbolo + profundidad opcional. | Subgrafo inducido (ancestros + descendientes). | "Muéstrame el contexto alrededor de esta función." |
dead_code(role=None) | Filtro de rol opcional. | Funciones/clases sin referencias. Consciente de decoradores. | "¿Hay código muerto en la capa SERVICE?" |
cycles(qualname=None) | Filtro de símbolo opcional. | SCCs con qualnames y número de miembros. | "¿Hay ciclos de importación?" |
untested(role=None) | Filtro de rol opcional. | Funciones sin llamadas de prueba. | "¿Qué HANDLERs tienen cobertura cero?" |
hotspots(top_n=10) | Límite opcional. | Funciones ordenadas por fan-in. | "¿Cuáles son los cuellos de botella?" |
metrics() | Ninguna. | Conteos de nodos/aristas, densidad, fan-in/out, ciclos. | "¿Qué tan complejo es este codebase?" |
semantic_search(query, k=5) | Cadena de consulta + máximo de resultados. | Fragmentos ordenados por similitud coseno. Requiere codegraph embed. | "Encuentra la lógica de restablecimiento de contraseña." |
hybrid_search(query, k=5, role=None, focus_qualname=None) | Consulta + rol opcional + punto focal de reordenamiento. | Fragmentos ordenados por 0.6 · coseno + 0.4 · distancia en el grafo. | "Encuentra la lógica de autenticación cerca del handler de login." |
dataflow_routes() | Ninguna. | Rutas detectadas: handler, método, ruta, framework. | "¿Qué endpoints expone la aplicación?" |
dataflow_fetches(handler_qualname=None) | Filtro de handler opcional. | Fetches del frontend: llamador, método, URL, claves del body. | "¿Qué handlers se llaman desde el frontend?" |
dataflow_trace(method_path) | Ruta (p. ej. "GET /api/users/{id}"). | Saltos ordenados: ruta → handler → servicio → repo → SQL con flujo de argumentos por salto. | "Traza user_id desde el frontend hasta la base de datos." |
workspace_state() | Ninguna. | Por repo: rama, cantidad de cambios sin commit, último commit, presencia en el grafo. | "¿Cuál es el estado de cada repo en el que estoy trabajando?" |
workspace_diff_since(ref="main") | Ref opcional. | Archivos cambiados por repo desde el ref. | "¿Qué toqué esta semana en todos mis repos?" |
workspace_blast_radius(symbol, depth=None) | Símbolo + profundidad opcional. | Radio de explosión por repo unido en todo el workspace. | "Si renombro esta función, ¿qué se rompe en todos mis proyectos?" |
Análisis profundo de la arquitectura (etapas del resolvedor R1/R2/R3 + implementación DF0–DF4)
Etapas del resolvedor
R1 (Emisión de aristas en tiempo de análisis):
- Importaciones por nombre:
from x import a, b, c→ 3 aristas IMPORTS separadas - Importaciones relativas:
from ..sibling import func→ ruta resuelta - Llamadas a constructores del mismo archivo:
MyClass()→ arista CALLS a__init__
R2 (Enlace entre archivos):
- Sigue los objetivos de importación a través de los límites de archivo
- Reconoce asignaciones directas (
x = imported_func) - Detecta pilas de decoradores y clasifica funciones por framework
R3 (Refinamiento):
- Aristas de llamada a decorador:
@my_decoratoraplicado adef func()→ arista CALLS al decorador - Cadenas
self.X.Y:self.service.get_user()→ aristas CALLS a través de la cadena de propiedades - Enlace de instancia nueva:
MyClass().method()→ arista CALLS tanto a__init__como amethod - Asignaciones condicionales
self.Xrastreadas desde__init__
Capas de flujo de datos
DF0 — Argumentos de sitio de llamada — captura de texto en tiempo de análisis, sin inferencia de tipos. Alimenta tooltips de firmas + etiquetas de aristas.
DF1 — Rutas HTTP — FastAPI / Flask / aiohttp. Nodos sintéticos route::METHOD::/path.
DF1.5 — Clasificación de roles — HANDLER (decorado con ruta), SERVICE (llamado por HANDLERs), COMPONENT (utilidad), REPO (acceso a BD).
DF2 — Fetches del frontend — fetch, axios.*, useSWR, useQuery, apiClient.* genérico. Captura método, URL, forma de las claves del body.
DF3 — Unión de URLs — normalización de placeholders, bonificación por solapamiento de claves del body, se tolera uno-a-muchos.
DF4 — Trazado de extremo a extremo — recorre el grafo de llamadas + aristas entre capas DF1/DF2, emite saltos ordenados con mapeo de flujo de argumentos por salto. Normalización snake_case ↔ camelCase ↔ PascalCase para que user_id = userId = UserId. Anotaciones de renombrado: (was userId) cuando el nombre local difiere.
Payload de HLD
serialize_hld() expone tres capas — Infraestructura (framework / ORM / caché / cola / clientes HTTP), Aplicación (nodos HANDLER / SERVICE / COMPONENT / REPO), Datos (HANDLER-a-ruta, handler-a-FETCH_CALL, repo-a-SQLAlchemy con cadenas de saltos DF4). El Modo Aprendizaje lee esto para animar los ciclos de vida de las solicitudes.
CI de revisión de PR (dogfood)
polycodegraph incluye su propio flujo de trabajo de revisión de PR como plantilla. Una vez activado, cada PR ejecuta polycodegraph sobre sí mismo, publica el diff y falla en hallazgos de alta severidad.
Activar:
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
Qué hace: construye un grafo de línea base desde origin/main, construye un grafo de cabeza desde el PR, ejecuta codegraph review --format markdown --fail-on high, publica el resultado como comentario fijado en el PR.
Prueba local en seco:
./scripts/test-pr-review-locally.sh
Desarrollo
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
Los chequeos de CI están definidos en .github/workflows/ci.yml. ¿Nuevo en el repo? Empieza con docs/GETTING_STARTED.md. Para convenciones de commits y el proceso de PR, consulta CONTRIBUTING.md.
Nota sobre los nombres
Este proyecto se instala desde PyPI como polycodegraph porque el nombre simple codegraph ya estaba tomado cuando se publicó v0.1.0. Todo lo demás — el paquete de Python que importas, el binario CLI que ejecutas y la clave de servidor MCP que registras — es codegraph, el nombre original del proyecto. Planeamos unificar en polycodegraph en todas partes en v0.2 (renombrado de CLI con un alias codegraph durante una versión). Por ahora: dos nombres, una herramienta.
Agradecimientos
polycodegraph se basa en tree-sitter (análisis sintáctico), vasturiano/3d-force-graph (renderizado 3D), networkx (algoritmos de grafo), pydantic (esquema tipado), typer (CLI), rich (salida de consola), nomic-ai/CodeRankEmbed (embeddings), y el Model Context Protocol Python SDK.
Licencia
MIT © mochan
Soporte comercial, despliegues y forks con licencia personalizada disponibles — contacta smochan07@gmail.com. polycodegraph en sí es y seguirá siendo MIT; la línea de contacto existe para equipos que quieran soporte empresarial o acuerdos de licencia específicos adicionales.
Se aceptan pull requests. Consulta CONTRIBUTING.md para la configuración local, chequeos de CI, convenciones de commits y el Acuerdo de Licencia para Contribuyentes de un clic que se te pedirá firmar en tu primer PR.



