Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
23 changes: 23 additions & 0 deletions .claude/skills/agent-eval/corpus.json
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,29 @@
"question": "When a job finishes video encoding, how does staxrip decide which muxer runs and how does the muxer command line get built and executed? Trace from job processing to the mkvmerge invocation."
}
],
"Elixir": [
{
"name": "plug",
"repo": "https://github.com/elixir-plug/plug",
"size": "Small",
"files": "~80",
"question": "How does an incoming request travel through a Plug.Builder pipeline? Trace the path from Plug.Conn through the builder's compiled plug chain to an individual plug's call/2, and explain how halting works."
},
{
"name": "phoenix",
"repo": "https://github.com/phoenixframework/phoenix",
"size": "Medium",
"files": "~210",
"question": "How does an incoming HTTP request reach a controller action in Phoenix? Trace the path from the Endpoint through the Router's dispatch and pipelines into the controller, and show where the response is rendered."
},
{
"name": "firezone",
"repo": "https://github.com/firezone/firezone",
"size": "Large",
"files": "~2110",
"question": "How does an API request to list clients flow through the system? Trace the path from the router's route definition through the controller action into the Portal context and down to the Ecto query that loads them."
}
],
"Erlang": [
{
"name": "cowboy",
Expand Down
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ and adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### New Features

- CodeGraph now indexes **Elixir** (`.ex`, `.exs`). Modules, functions, macros, guards, protocols and their implementations, structs, module attributes and typespecs all become part of the graph, with `@doc` and `@spec` carried through so a function's documentation and types come back with it. Multi-clause functions are grouped into one symbol per arity instead of one per clause, and `alias` — including `alias Foo.{Bar, Baz}` and `alias Foo, as: Bar` — is expanded, so a call written `Repo.insert(...)` links to the real `MyApp.Repo` across files.
- Elixir projects get their framework conventions traced too: **Phoenix** routes become searchable symbols linked to the controller action they dispatch to (nested `scope` paths and aliases, `resources`, `forward` and `live` included), **Plug** pipeline entries link to the function or plug that actually runs, and **Ecto** schema fields and associations are extracted — so "how does this request reach the database" traces end to end without opening the router.
- Elixir modules generated from Protocol Buffers are read as the declarations they are. A generated message's fields, an enum's values and a service's RPCs become symbols — fields keeping their wire tag, and each RPC linked to the request and response messages it names — instead of being mistaken for calls to a function named `field` or `rpc`. On a project that happened to define its own `field`, every generated field in the repo had been showing up as a caller of it.

## [1.6.0] - 2026-08-26

Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ Every language below gets the same treatment — full structural extraction and
<img src="https://raw.githubusercontent.com/colbymchenry/codegraph/main/assets/languages/cobol.svg?v=1" width="104" height="104" alt="COBOL" />
<img src="https://raw.githubusercontent.com/colbymchenry/codegraph/main/assets/languages/vbnet.svg?v=1" width="104" height="104" alt="Visual Basic .NET" />
<img src="https://raw.githubusercontent.com/colbymchenry/codegraph/main/assets/languages/erlang.svg?v=1" width="104" height="104" alt="Erlang" />
<img src="https://raw.githubusercontent.com/colbymchenry/codegraph/main/assets/languages/elixir.svg?v=1" width="104" height="104" alt="Elixir" />
<img src="https://raw.githubusercontent.com/colbymchenry/codegraph/main/assets/languages/solidity.svg?v=1" width="104" height="104" alt="Solidity" />
<img src="https://raw.githubusercontent.com/colbymchenry/codegraph/main/assets/languages/terraform.svg?v=1" width="104" height="104" alt="Terraform / OpenTofu" />
<img src="https://raw.githubusercontent.com/colbymchenry/codegraph/main/assets/languages/nix.svg?v=1" width="104" height="104" alt="Nix" />
Expand Down Expand Up @@ -278,7 +279,7 @@ CodeGraph's parsing engine is a **native Rust kernel**: 20 languages — TypeScr
| **Full-Text Search** | Find code by name instantly across your entire codebase, powered by FTS5 |
| **Impact Analysis** | Trace callers, callees, and the full impact radius of any symbol before making changes |
| **Always Fresh** | File watcher uses native OS events (FSEvents/inotify/ReadDirectoryChangesW) with debounced auto-sync — the graph stays current as you code, zero config |
| **20+ Languages** | TypeScript, JavaScript, ArkTS, Python, Go, Rust, Java, C#, VB.NET, PHP, Ruby, C, C++, CUDA, Objective-C, Metal, Swift, Kotlin, Scala, Dart, Lua, Luau, R, Nix, Erlang, CFML, COBOL, Solidity, Terraform/OpenTofu, Svelte, Vue, Astro, Liquid, Pascal/Delphi |
| **20+ Languages** | TypeScript, JavaScript, ArkTS, Python, Go, Rust, Java, C#, VB.NET, PHP, Ruby, C, C++, CUDA, Objective-C, Metal, Swift, Kotlin, Scala, Dart, Lua, Luau, R, Nix, Erlang, Elixir, CFML, COBOL, Solidity, Terraform/OpenTofu, Svelte, Vue, Astro, Liquid, Pascal/Delphi |
| **Framework-aware Routes** | Recognizes web-framework routing files and links URL patterns to their handlers across 17 frameworks |
| **Mixed iOS / React Native / Expo** | Closes cross-language flows that static parsing misses: Swift ↔ ObjC bridging, React Native legacy bridge + TurboModules + Fabric view components, native → JS event emitters, Expo Modules |
| **100% Local** | No data leaves your machine. No API keys. No external services. SQLite database only |
Expand Down Expand Up @@ -822,6 +823,7 @@ is written):
| COBOL | `.cbl`, `.cob`, `.cpy` | Full support (programs, sections/paragraphs with PERFORM/GO TO call edges, CALL 'literal' cross-program calls, COPY copybook imports — including standalone `.cpy` files — DATA DIVISION records/fields/88-levels, EXEC CICS LINK/XCTL and EXEC SQL INCLUDE targets; fixed and free format) |
| Visual Basic .NET | `.vb` | Full support (classes, Modules, interfaces, structures, enums, properties, events, `Declare` P/Invoke, `Handles`/`WithEvents`, `Inherits`/`Implements` edges, call edges through VB's call/index paren ambiguity, `As New` instantiation, interpolated strings, LINQ, Unicode identifiers) |
| Erlang | `.erl`, `.hrl`, `.escript`, `.app.src`, `.app` | Full support (functions with multi-clause/multi-arity grouping, `-spec` signatures, records with fields, `-type`/`-opaque` aliases, `-define` macros, `-include`/`-include_lib`/`-import` edges, local and `mod:fn` remote call edges, `fun name/arity` references, `spawn`/`apply`/`proc_lib`/`timer`/`rpc` MFA-argument call edges, `gen_server:call/cast(?MODULE)` → own `handle_call`/`handle_cast` links, `-behaviour` links, `-export`-based visibility) |
| Elixir | `.ex`, `.exs` | Full support (modules — including nested ones — with `@moduledoc`, public/private functions with `@doc` and `@spec` signatures, multi-clause grouping by arity, macros, guards, operator definitions, `defdelegate` targets, `defstruct`/`defexception` fields, `@type`/`@opaque` aliases, module attributes as constants, protocols and their `defimpl` implementations, `@behaviour` links, `alias`/`import`/`require`/`use` edges with `alias`/`as:`/`{A, B}` expansion so remote calls resolve to the real module, `&fun/1` capture references, `%Struct{}` instantiation; Ecto schema fields and association edges; Phoenix routes — nested `scope` paths and aliases, `resources` expansion, `forward`, `live` — linked to their controller actions, and `plug` pipeline entries linked to the function or plug that runs) |
| Solidity | `.sol` | Full support (contracts, libraries, interfaces, structs, enums, modifiers, events, errors, state variables, `import`/`using` directives, `emit`/`revert` calls) |
| Terraform / OpenTofu | `.tf`, `.tfvars`, `.tofu` | Full support (resources, data sources, modules, variables, outputs, providers incl. aliases, `locals`; `var.`/`local.`/`module.`/resource references with Terraform's per-directory scoping enforced; module calls bridged across the boundary — inputs to the child module's variables, `module.M.out` to the child's output, `source` to the module's files; cloudposse/atmos `remote-state` cross-component wiring when the component is statically named; `provider = aws.east` selections resolved up the module tree; `moved`/`import`/`removed`/`check` block references; `.tfvars` assignments linked to the variables they set) |
| Nix | `.nix` | Full support (functions with simple/destructured/curried params, `let`/attrset bindings, `inherit`, `import ./path` file edges — `./dir` resolving through `default.nix` — plus NixOS module `imports = [ ./x.nix ]` lists and `callPackage ./pkg.nix` file edges; call edges; module-system option wiring — a config write like `launchd.user.agents.x = { ... }` links to the module declaring `options.launchd.user.agents`, so option flows trace across modules) |
Expand Down
Loading