O subcomando ctx graph oferece ferramentas para análise estática e navegação estrutural do fluxo do código. Ele constrói um grafo de símbolos, chamadas e imports a partir das árvores de sintaxe das linguagens suportadas e armazena os dados em um banco de dados SQLite local.
Diferente do grep tradicional, o ctx graph entende a semântica do código, permitindo responder a perguntas como "quem chama este método?", "o que esta função invoca?", ou "quais rotas HTTP batem neste handler?".
O pipeline do ctx graph é dividido em cinco etapas fundamentais:
[Código Fonte] ──> Extractor (Tree-Sitter) ──> Framework Router ──> SQLite Store ──> Query & Ranking ──> Token Budget
- Scanner & Extractor: O scanner descobre os arquivos no projeto (respeitando as regras de
.gitignore). Cada arquivo é analisado usando Tree-Sitter para extrair declarações de símbolos (classes, métodos, funções, etc.), chamadas (call sites), eimportsde módulos. - Framework Routing: Detecta definições de rotas HTTP para frameworks conhecidos e injeta símbolos sintéticos do tipo
route::METODO /pathvinculados às suas respectivas funções handler. - Persistência: As informações extraídas são limpas de forma idempotente por arquivo (
clear_file+ insert) e salvas em SQLite em~/.cache/context_engine/graph.db. Não há file watcher — re-indexe comctx graph indexapós mudanças. - Ranking: Resultados de
callers/callees/tracesão ordenados por score heurístico (src/pipelines/graph/query.rs::score_node): boost se termos da--queryaparecem no nome/qualified,log₂do número de call sites (centralidade), e peso leve porkind(function/method > struct > variable). Não usa BM25 nem PageRank do pipelinemap. - Token Budget: Com
--max-tokens, os nós já ranqueados são incluídos em ordem até estourar o limite (estimativa 1 token ≈ 4 chars) — corte linear, não binary search.
Indexa os diretórios especificados (re-indexação idempotente por arquivo; varre todos os arquivos elegíveis a cada execução).
ctx graph index --dirs src- Extensões Suportadas (8 linguagens):
.rs,.go,.java,.ts,.tsx,.js,.jsx,.mjs,.cjs,.py,.rb,.rake,.groovy,.gradle.
Encontra todos os chamadores (callers) diretos de um símbolo específico.
ctx graph callers handle_requestEncontra todas as chamadas (callees) feitas por um símbolo específico.
ctx graph callees execute_pipelineMostra a cadeia e fluxo completo de chamadas ligadas a um símbolo até uma determinada profundidade.
ctx graph trace handle_request --depth 3Realiza uma análise de impacto transitiva. Retorna os chamadores indiretos e tudo o que pode ser impactado pela alteração do símbolo fornecido.
ctx graph impact migrate_dbDetalha as propriedades e o local exato onde um símbolo está definido no grafo.
# Busca por nome do símbolo (ex.: rota sintética ou handler)
ctx graph node "GET /users/:id"Uma das funcionalidades mais poderosas do ctx graph é o suporte nativo a rotas de frameworks. Ele detecta os caminhos declarados de URLs HTTP e injeta-os no grafo conectando o endpoint sintético à action/função controladora real.
- Ruby on Rails (
config/routes.rb):- Mapeia chamadas do DSL como
resources :users,resource,get '/login', to: 'session#new', além de namespaces. - Conecta automaticamente
route::GET /users/:idà actionUsersController#show.
- Mapeia chamadas do DSL como
- Grails (
UrlMappings.groovy):- Mapeia blocos
"/path"(controller: 'x', action: 'y')e recursos dinâmicos. - Normaliza parâmetros de variáveis (ex:
$id→:id).
- Mapeia blocos
- NestJS (Classes
*.ts):- Analisa os decorators
@Controller('prefix')e os decorators de verbo@Get(':id'),@Post(),@Patch(), etc. - Injeta a rota mapeando o handler qualificado como
ClassName::method.
- Analisa os decorators
- Resultados Ranqueados: O CodeGraph retorna listas cruas de callers/callees. O
ctx graphordena por relevância heurística à--query(termos no nome + popularidade por sites + kind). - Deduplicação Inteligente de Call Sites: Se um método é chamado 10 vezes pelo mesmo chamador, o
ctx graphagrupa os call sites em uma única entrada reduzida, economizando tokens preciosos. - Token Budget Integration:
--max-tokenscorta o output nos símbolos top-ranked já ordenados (corte linear). - 100% Local e Rápido: Construído em Rust com SQLite e Tree-Sitter; indexação paralela via
rayon.