Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
f5ee3de
chore: remove dead exports and un-export internal constant
carlos-alm Mar 17, 2026
f236b55
Merge remote-tracking branch 'origin/main' into worktree-titan-recon
carlos-alm Mar 17, 2026
17cdcb0
refactor: extract shared findNodes utility from cfg and dataflow feat…
carlos-alm Mar 17, 2026
a09740d
fix: replace empty catch blocks in db connection and migrations
carlos-alm Mar 17, 2026
b691fcc
fix: replace empty catch blocks in domain analysis layer
carlos-alm Mar 17, 2026
dadb383
fix: replace empty catch blocks in parser.js
carlos-alm Mar 17, 2026
22d94f4
fix: replace empty catch blocks in features layer
carlos-alm Mar 17, 2026
3b36534
refactor: decompose extractSymbolsWalk into per-category handlers
carlos-alm Mar 17, 2026
e1d7ee0
refactor: decompose extractPythonSymbols into per-category handlers
carlos-alm Mar 17, 2026
3a656bb
refactor: decompose extractJavaSymbols into per-category handlers
carlos-alm Mar 17, 2026
bf5b986
refactor: decompose remaining language extractors
carlos-alm Mar 17, 2026
eafdf19
refactor: decompose AST analysis visitors and engine into focused hel…
carlos-alm Mar 17, 2026
46a95ae
refactor: decompose domain builder stages into focused helpers
carlos-alm Mar 17, 2026
0a3fbc7
refactor: decompose domain analysis functions into focused helpers
carlos-alm Mar 17, 2026
b2f89f1
refactor: decompose buildComplexityMetrics
carlos-alm Mar 17, 2026
cb82258
refactor: decompose buildStructure into traversal, cohesion, and clas…
carlos-alm Mar 17, 2026
54b0067
refactor: decompose buildCFGData and buildDataflowEdges
carlos-alm Mar 17, 2026
7030e7f
refactor: decompose sequenceData into BFS and message construction
carlos-alm Mar 17, 2026
b4d8a0d
refactor: decompose explain() into section renderers
carlos-alm Mar 17, 2026
ae805d5
refactor: decompose stats() into section printers
carlos-alm Mar 17, 2026
3aa2e4b
fix: address quality issues in features (boundaries, communities, tri…
carlos-alm Mar 17, 2026
246fc21
fix: split data fetching from formatting in presentation queries
carlos-alm Mar 17, 2026
3d60159
fix: extract subcommand dispatch in check, triage CLI and MCP server
carlos-alm Mar 17, 2026
fc721f3
fix: move startMCPServer JSDoc to correct function location
carlos-alm Mar 17, 2026
22ae887
fix: reorder imports in MCP server for lint compliance
carlos-alm Mar 17, 2026
e6e712d
Merge remote-tracking branch 'origin/main' into fix/review-493
carlos-alm Mar 17, 2026
a21840f
chore: release v3.2.0
carlos-alm Mar 17, 2026
6a838be
Merge branch 'main' into release/3.2.0
carlos-alm Mar 17, 2026
155dcc7
merge main into release/3.2.0
carlos-alm Mar 17, 2026
d4f9490
fix: add missing changelog entries for #498 and #493, restore libc fi…
carlos-alm Mar 17, 2026
66f6d16
Merge branch 'release/3.2.0' of https://github.com/optave/codegraph i…
carlos-alm Mar 17, 2026
fe45c55
feat: add type inference for all typed languages (WASM + native)
carlos-alm Mar 18, 2026
de21be4
Merge branch 'main' into feat/type-inference-all-langs
carlos-alm Mar 18, 2026
9cdb931
fix: check parameter name not type name for self/cls filter in Python…
carlos-alm Mar 18, 2026
1c96146
refactor: remove redundant variable typeMap extraction in walk path (…
carlos-alm Mar 18, 2026
9192b41
feat: add .pyi, .phtml, .rake, .gemspec extensions; condense comparis…
carlos-alm Mar 18, 2026
1597daf
Merge remote-tracking branch 'origin/main' into fix/type-inference-re…
carlos-alm Mar 18, 2026
9094589
feat: add GitNexus to comparison table, fix license and roadmap
carlos-alm Mar 18, 2026
3ff783a
fix: supplement receiver edges for older native binaries
carlos-alm Mar 18, 2026
e34aff6
fix: correct misleading WASM engine test comment (#502)
carlos-alm Mar 18, 2026
f940fda
fix: add recursion depth guard to extractTypeMapWalk (#502)
carlos-alm Mar 18, 2026
d8cd057
fix: remove dead methodCandidates guard in resolveByMethodOrGlobal (#…
carlos-alm Mar 18, 2026
5304622
fix: handle Go multi-name var declarations in type map (#502)
carlos-alm Mar 18, 2026
eeb6cf8
fix: replace regex typeMap backfill with WASM-based AST extraction (#…
carlos-alm Mar 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 36 additions & 46 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,39 +76,24 @@ No config files, no Docker, no JVM, no API keys, no accounts. Point your agent a

### Feature comparison

<sub>Comparison last verified: March 2026. Full analysis: <a href="generated/competitive/COMPETITIVE_ANALYSIS.md">COMPETITIVE_ANALYSIS.md</a></sub>

| Capability | codegraph | [joern](https://github.com/joernio/joern) | [narsil-mcp](https://github.com/postrv/narsil-mcp) | [code-graph-rag](https://github.com/vitali87/code-graph-rag) | [cpg](https://github.com/Fraunhofer-AISEC/cpg) | [GitNexus](https://github.com/abhigyanpatwari/GitNexus) | [CodeMCP](https://github.com/SimplyLiz/CodeMCP) | [axon](https://github.com/harshkedia177/axon) |
|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| MCP / AI agent support | **Yes** | — | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** |
| Batch querying | **Yes** | — | — | — | — | — | — | — |
| Composite audit command | **Yes** | — | — | — | — | — | — | — |
| Function-level analysis | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** |
| Multi-language | **11** | **14** | **32** | **11** | **~10** | **12** | **12** | **3** |
| Semantic search | **Yes** | — | **Yes** | **Yes** | — | **Yes** | — | **Yes** |
| Hybrid BM25 + semantic | **Yes** | — | — | — | — | **Yes** | — | **Yes** |
| CODEOWNERS integration | **Yes** | — | — | — | — | — | — | — |
| Architecture boundary rules | **Yes** | — | — | — | — | — | — | — |
| CI validation predicates | **Yes** | — | — | — | — | — | — | — |
| Graph snapshots | **Yes** | — | — | — | — | — | — | — |
| Git diff impact | **Yes** | — | — | — | — | **Yes** | **Yes** | **Yes** |
| Branch structural diff | **Yes** | — | — | — | — | — | — | **Yes** |
| Git co-change analysis | **Yes** | — | — | — | — | — | — | **Yes** |
| Watch mode | **Yes** | — | **Yes** | **Yes** | — | — | **Yes** | **Yes** |
| Dead code / role classification | **Yes** | — | **Yes** | — | — | — | **Yes** | **Yes** |
| Cycle detection | **Yes** | — | — | — | — | — | — | — |
| Incremental rebuilds | **O(changed)** | — | O(n) Merkle | — | — | — | Go only | **Yes** |
| Zero config | **Yes** | — | **Yes** | — | — | **Yes** | — | **Yes** |
| Embeddable JS library (`npm install`) | **Yes** | — | — | — | — | — | — | — |
| LLM-optional (works without API keys) | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** |
| Dataflow analysis | **Yes** | **Yes** | — | — | **Yes** | — | — | — |
| Control flow graph (CFG) | **Yes** | **Yes** | — | — | **Yes** | — | — | — |
| AST node querying | **Yes** | **Yes** | — | — | **Yes** | — | — | — |
| Expanded node/edge types | **Yes** | **Yes** | — | — | **Yes** | — | — | — |
| GraphML / Neo4j export | **Yes** | **Yes** | — | — | — | — | — | — |
| Interactive graph viewer | **Yes** | — | — | — | — | — | — | — |
| Commercial use allowed | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | No | Paid | **Yes** |
| Open source | **Yes** | Yes | Yes | Yes | Yes | No | No | Yes |
<sub>Comparison last verified: March 2026. Claims verified against each repo's README/docs. Full analysis: <a href="generated/competitive/COMPETITIVE_ANALYSIS.md">COMPETITIVE_ANALYSIS.md</a></sub>

| Capability | codegraph | [joern](https://github.com/joernio/joern) | [narsil-mcp](https://github.com/postrv/narsil-mcp) | [cpg](https://github.com/Fraunhofer-AISEC/cpg) | [axon](https://github.com/harshkedia177/axon) | [GitNexus](https://github.com/abhigyanpatwari/GitNexus) |
|---|:---:|:---:|:---:|:---:|:---:|:---:|
| Languages | **11** | ~12 | **32** | ~10 | 3 | 13 |
| MCP server | **Yes** | — | **Yes** | **Yes** | **Yes** | **Yes** |
| Dataflow + CFG + AST querying | **Yes** | **Yes** | **Yes**¹ | **Yes** | — | — |
| Hybrid search (BM25 + semantic) | **Yes** | — | — | — | **Yes** | **Yes** |
| Git-aware (diff impact, co-change, branch diff) | **All 3** | — | — | — | **All 3** | — |
| Dead code / role classification | **Yes** | — | **Yes** | — | **Yes** | — |
| Incremental rebuilds | **O(changed)** | — | O(n) | — | **Yes** | Commit-level⁴ |
| Architecture rules + CI gate | **Yes** | — | — | — | — | — |
| Security scanning (SAST / vuln detection) | Intentionally out of scope² | **Yes** | **Yes** | **Yes** | — | — |
| Zero config, `npm install` | **Yes** | — | **Yes** | — | **Yes** | **Yes** |
| Graph export (GraphML / Neo4j / DOT) | **Yes** | **Yes** | — | — | — | — |
| Open source + commercial use | **Yes** (Apache-2.0) | **Yes** (Apache-2.0) | **Yes** (MIT/Apache-2.0) | **Yes** (Apache-2.0) | Source-available³ | Non-commercial⁵ |

<sup>¹ narsil-mcp added CFG and dataflow in recent versions. ² Codegraph focuses on structural understanding, not vulnerability detection — use dedicated SAST tools (Semgrep, CodeQL, Snyk) for that. ³ axon claims MIT in pyproject.toml but has no LICENSE file in the repo. ⁴ GitNexus skips re-index if the git commit hasn't changed, but re-processes the entire repo when it does — no per-file incremental parsing. ⁵ GitNexus uses the PolyForm Noncommercial 1.0.0 license.</sup>

### What makes codegraph different

Expand Down Expand Up @@ -490,16 +475,16 @@ codegraph registry remove <name> # Unregister
|---|---|---|:---:|:---:|
| ![JavaScript](https://img.shields.io/badge/-JavaScript-F7DF1E?style=flat-square&logo=javascript&logoColor=black) | `.js`, `.jsx`, `.mjs`, `.cjs` | functions, classes, methods, imports, exports, call sites, constants, dataflow | ✅ | ✅ |
| ![TypeScript](https://img.shields.io/badge/-TypeScript-3178C6?style=flat-square&logo=typescript&logoColor=white) | `.ts`, `.tsx` | functions, classes, interfaces, type aliases, methods, imports, exports, call sites, dataflow | ✅ | ✅ |
| ![Python](https://img.shields.io/badge/-Python-3776AB?style=flat-square&logo=python&logoColor=white) | `.py` | functions, classes, methods, imports, decorators, constants, call sites, dataflow | ✅ | ✅ |
| ![Python](https://img.shields.io/badge/-Python-3776AB?style=flat-square&logo=python&logoColor=white) | `.py`, `.pyi` | functions, classes, methods, imports, decorators, constants, call sites, dataflow | ✅ | ✅ |
| ![Go](https://img.shields.io/badge/-Go-00ADD8?style=flat-square&logo=go&logoColor=white) | `.go` | functions, methods, structs, interfaces, constants, imports, call sites, dataflow | ✅ | ✅ |
| ![Rust](https://img.shields.io/badge/-Rust-000000?style=flat-square&logo=rust&logoColor=white) | `.rs` | functions, methods, structs, enums, traits, constants, `use` imports, call sites, dataflow | ✅ | ✅ |
| ![Java](https://img.shields.io/badge/-Java-ED8B00?style=flat-square&logo=openjdk&logoColor=white) | `.java` | classes, methods, constructors, interfaces, enums, imports, call sites, dataflow | ✅ | ✅ |
| ![C#](https://img.shields.io/badge/-C%23-512BD4?style=flat-square&logo=dotnet&logoColor=white) | `.cs` | classes, structs, records, interfaces, enums, methods, constructors, properties, using directives, call sites, dataflow | ✅ | ✅ |
| ![PHP](https://img.shields.io/badge/-PHP-777BB4?style=flat-square&logo=php&logoColor=white) | `.php` | functions, classes, interfaces, traits, enums, methods, namespace use, call sites, dataflow | ✅ | ✅ |
| ![Ruby](https://img.shields.io/badge/-Ruby-CC342D?style=flat-square&logo=ruby&logoColor=white) | `.rb` | classes, modules, methods, singleton methods, require/require_relative, include/extend, dataflow | | ✅ |
| ![Terraform](https://img.shields.io/badge/-Terraform-844FBA?style=flat-square&logo=terraform&logoColor=white) | `.tf`, `.hcl` | resource, data, variable, module, output blocks | | ✅ |
| ![PHP](https://img.shields.io/badge/-PHP-777BB4?style=flat-square&logo=php&logoColor=white) | `.php`, `.phtml` | functions, classes, interfaces, traits, enums, methods, namespace use, call sites, dataflow | ✅ | ✅ |
| ![Ruby](https://img.shields.io/badge/-Ruby-CC342D?style=flat-square&logo=ruby&logoColor=white) | `.rb`, `.rake`, `.gemspec` | classes, modules, methods, singleton methods, require/require_relative, include/extend, dataflow | N/A⁴ | ✅ |
| ![Terraform](https://img.shields.io/badge/-Terraform-844FBA?style=flat-square&logo=terraform&logoColor=white) | `.tf`, `.hcl` | resource, data, variable, module, output blocks | N/A⁴ | ✅ |

> **Type Inference** extracts a per-file type map from annotations (`const x: Router`, `MyType x`, `x: MyType`) and `new` expressions, enabling the edge resolver to connect `x.method()` → `Type.method()`. **Parity** = WASM and native Rust engines produce identical output.
> **Type Inference** extracts a per-file type map from annotations (`const x: Router`, `MyType x`, `x: MyType`) and `new` expressions, enabling the edge resolver to connect `x.method()` → `Type.method()`. **Parity** = WASM and native Rust engines produce identical output. ⁴ Ruby and HCL are dynamically typed / declarative — type inference does not apply.

## ⚙️ How It Works

Expand Down Expand Up @@ -768,7 +753,7 @@ const { results: fused } = await multiSearchData(

## ⚠️ Limitations

- **No full type inference** — parses `.d.ts` interfaces but doesn't use TypeScript's type checker for overload resolution
- **No TypeScript type-checker integration** — type inference resolves annotations, `new` expressions, and assignment chains, but does not invoke `tsc` for overload resolution or complex generics
- **Dynamic calls are best-effort** — complex computed property access and `eval` patterns are not resolved
- **Python imports** — resolves relative imports but doesn't follow `sys.path` or virtual environment packages
- **Dataflow analysis** — intraprocedural (single-function scope), not interprocedural
Expand All @@ -778,13 +763,18 @@ const { results: fused } = await multiSearchData(
See **[ROADMAP.md](docs/roadmap/ROADMAP.md)** for the full development roadmap and **[STABILITY.md](STABILITY.md)** for the stability policy and versioning guarantees. Current plan:

1. ~~**Rust Core**~~ — **Complete** (v1.3.0) — native tree-sitter parsing via napi-rs, parallel multi-core parsing, incremental re-parsing, import resolution & cycle detection in Rust
2. ~~**Foundation Hardening**~~ — **Complete** (v1.4.0) — parser registry, 12-tool MCP server with multi-repo support, test coverage 62%→75%, `apiKeyCommand` secret resolution, global repo registry
3. ~~**Deep Analysis**~~ — **Complete** (v3.0.0) — dataflow analysis (flows_to, returns, mutates), intraprocedural CFG for all 11 languages, stored AST nodes, expanded node/edge types (parameter, property, constant, contains, parameter_of, receiver), GraphML/GraphSON/Neo4j CSV export, interactive HTML viewer, CLI consolidation, stable JSON schema
4. ~~**Architectural Refactoring**~~ — **Complete** (v3.1.5) — unified AST analysis, composable MCP, domain errors, builder pipeline, embedder subsystem, graph model, qualified names, presentation layer, InMemoryRepository, domain directory grouping, CLI composability
5. **Natural Language Queries** — `codegraph ask` command, conversational sessions
6. **Expanded Language Support** — 8 new languages (12 → 20)
7. **GitHub Integration & CI** — reusable GitHub Action, PR review, SARIF output
8. **TypeScript Migration** — gradual migration from JS to TypeScript
2. ~~**Foundation Hardening**~~ — **Complete** (v1.5.0) — parser registry, complete MCP, test coverage, enhanced config, multi-repo MCP
3. ~~**Analysis Expansion**~~ — **Complete** (v2.7.0) — complexity metrics, community detection, flow tracing, co-change, manifesto, boundary rules, check, triage, audit, batch, hybrid search
4. ~~**Deep Analysis & Graph Enrichment**~~ — **Complete** (v3.0.0) — dataflow analysis, intraprocedural CFG, AST node storage, expanded node/edge types, interactive viewer, exports command
5. ~~**Architectural Refactoring**~~ — **Complete** (v3.1.5) — unified AST analysis, composable MCP, domain errors, builder pipeline, graph model, qualified names, presentation layer, CLI composability
6. **Native Analysis Acceleration** — move JS-only build phases to Rust, sub-100ms 1-file rebuilds
7. **TypeScript Migration** — project setup, core type definitions, leaf → core → orchestration migration
8. **Runtime & Extensibility** — event-driven pipeline, plugin system, query caching, pagination
9. **Intelligent Embeddings** — LLM-generated descriptions, enhanced embeddings, module summaries
10. **Natural Language Queries** — `codegraph ask` command, conversational sessions
11. **Expanded Language Support** — 8 new languages (11 → 19)
12. **GitHub Integration & CI** — reusable GitHub Action, LLM-enhanced PR review, SARIF output
13. **Visualization & Advanced** — web UI, dead code detection, monorepo, agentic search

## 🤝 Contributing

Expand Down
14 changes: 9 additions & 5 deletions crates/codegraph-core/src/extractors/go.rs
Original file line number Diff line number Diff line change
Expand Up @@ -344,11 +344,15 @@ fn extract_go_type_map_depth(node: &Node, source: &[u8], symbols: &mut FileSymbo
"var_spec" => {
if let Some(type_node) = node.child_by_field_name("type") {
if let Some(type_name) = extract_go_type_name(&type_node, source) {
if let Some(name_node) = node.child_by_field_name("name") {
symbols.type_map.push(TypeMapEntry {
name: node_text(&name_node, source).to_string(),
type_name: type_name.to_string(),
});
for i in 0..node.child_count() {
if let Some(child) = node.child(i) {
if child.kind() == "identifier" {
symbols.type_map.push(TypeMapEntry {
name: node_text(&child, source).to_string(),
type_name: type_name.to_string(),
});
}
}
}
}
}
Expand Down
1 change: 1 addition & 0 deletions crates/codegraph-core/src/import_resolution.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ fn resolve_import_path_inner(
".jsx",
".mjs",
".py",
".pyi",
"/index.ts",
"/index.tsx",
"/index.js",
Expand Down
6 changes: 3 additions & 3 deletions crates/codegraph-core/src/parser_registry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,14 @@ impl LanguageKind {
}
match ext {
"js" | "jsx" | "mjs" | "cjs" => Some(Self::JavaScript),
"py" => Some(Self::Python),
"py" | "pyi" => Some(Self::Python),
"tf" | "hcl" => Some(Self::Hcl),
"go" => Some(Self::Go),
"rs" => Some(Self::Rust),
"java" => Some(Self::Java),
"cs" => Some(Self::CSharp),
"rb" => Some(Self::Ruby),
"php" => Some(Self::Php),
"rb" | "rake" | "gemspec" => Some(Self::Ruby),
"php" | "phtml" => Some(Self::Php),
_ => None,
}
}
Expand Down
6 changes: 3 additions & 3 deletions docs/roadmap/BACKLOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,14 @@ Each item has a short title, description, category, expected benefit, and four a

### Tier 0 — Promote before Phase 4-5 (highest immediate impact)

These two items directly improve agent experience and graph accuracy today, without requiring Rust porting or TypeScript migration. They should be implemented before any Phase 4+ roadmap work begins.
Both items are now **DONE**. These directly improved agent experience and graph accuracy without requiring Rust porting or TypeScript migration.

**Rationale:** Item #83 enriches the *passively-injected* context that agents actually see via hooks — the single highest-leverage surface for reducing blind edits. Item #71 closes the biggest accuracy gap in the graph for TypeScript and Java, where missing type-aware resolution causes hallucinated "no callers" results.
**Rationale:** Item #83 enriches the *passively-injected* context that agents actually see via hooks — the single highest-leverage surface for reducing blind edits. Item #71 closed the biggest accuracy gap in the graph for TypeScript and Java, where missing type-aware resolution caused hallucinated "no callers" results.

| ID | Title | Description | Category | Benefit | Zero-dep | Foundation-aligned | Problem-fit (1-5) | Breaking | Depends on |
|----|-------|-------------|----------|---------|----------|-------------------|-------------------|----------|------------|
| 83 | ~~Hook-optimized `codegraph brief` command~~ | New `codegraph brief <file>` command designed for Claude Code hook context injection. Returns a compact, token-efficient summary per file: each symbol with its role and caller count (e.g. `buildGraph [core, 12 callers]`), blast radius count on importers (`Imported by: src/cli.js (+8 transitive)`), and overall file risk tier. Current `deps --json` output used by `enrich-context.sh` is shallow — just file-level imports/importedBy and symbol names with no role or blast radius info. The `brief` command would include: **(a)** symbol roles in the output — knowing a file defines `core` vs `leaf` symbols changes editing caution; **(b)** per-symbol transitive caller counts — makes blast radius visible without a separate `fn-impact` call; **(c)** file-level risk tier (high/medium/low based on max fan-in and role composition). Output optimized for `additionalContext` injection — single compact block, not verbose JSON. Also add `--brief` flag to `deps` as an alias. | Embeddability | The `enrich-context.sh` hook is the only codegraph context agents actually see (they ignore CLAUDE.md instructions to run commands manually). Making that passively-injected context richer — with roles, caller counts, and risk tiers — directly reduces blind edits to high-impact code. Currently the hook shows `Defines: function buildGraph` but not that it's a core symbol with 12 transitive callers | ✓ | ✓ | 4 | No | — | **DONE** — `codegraph brief <file>` command with symbol roles, caller counts, and risk tiers. CLI command, MCP tool, and presentation layer. ([#480](https://github.com/optave/codegraph/pull/480)) |
| 71 | Basic type inference for typed languages | Extract type annotations from TypeScript and Java AST nodes (variable declarations, function parameters, return types, generics) to resolve method calls through typed references. Currently `const x: Router = express.Router(); x.get(...)` produces no edge because `x.get` can't be resolved without knowing `x` is a `Router`. Tree-sitter already parses type annotations — we just don't use them for resolution. Start with declared types (no flow inference), which covers the majority of TS/Java code. | Resolution | Dramatically improves call graph completeness for TypeScript and Java — the two languages where developers annotate types explicitly and expect tooling to use them. Directly prevents hallucinated "no callers" results for methods called through typed variables | ✓ | ✓ | 5 | No | — |
| 71 | ~~Basic type inference for typed languages~~ | Extract type annotations from TypeScript and Java AST nodes (variable declarations, function parameters, return types, generics) to resolve method calls through typed references. Currently `const x: Router = express.Router(); x.get(...)` produces no edge because `x.get` can't be resolved without knowing `x` is a `Router`. Tree-sitter already parses type annotations — we just don't use them for resolution. Start with declared types (no flow inference), which covers the majority of TS/Java code. | Resolution | Dramatically improves call graph completeness for TypeScript and Java — the two languages where developers annotate types explicitly and expect tooling to use them. Directly prevents hallucinated "no callers" results for methods called through typed variables | ✓ | ✓ | 5 | No | — | **DONE** — Type inference for all typed languages (TS, Java, Go, Rust, C#, PHP, Python). WASM + native engines. ([#501](https://github.com/optave/codegraph/pull/501)) |

### Tier 1 — Zero-dep + Foundation-aligned (build these first)

Expand Down
Loading
Loading