Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
0059eff
release 0.1.8: every package and plugin manifest at 0.1.8 (the parser…
swapnilpaliwal-sd Sep 29, 2026
ff8a324
typescript, javascript: index Vue single-file components
swapnilpaliwal-sd Sep 29, 2026
6e47e96
impact / test-impact: a test that runs a script by its path covers wh…
swapnilpaliwal-sd Sep 29, 2026
3020632
python: type a module loaded by importlib, and pair tuple unpacking e…
swapnilpaliwal-sd Sep 29, 2026
dd8755f
javascript: a function handed over as a JSX attribute is a registered…
swapnilpaliwal-sd Sep 29, 2026
43eebf5
bundle: SCHEMA.md names the JSX_ATTRIBUTE edge kind
swapnilpaliwal-sd Sep 29, 2026
3a54daf
javascript: read the <script> blocks of .vue, .svelte and .astro files
swapnilpaliwal-sd Sep 29, 2026
1ab072a
typescript: a Vue JSX tag reaches the defineComponent setup / render …
swapnilpaliwal-sd Sep 29, 2026
02d2cba
javascript: resolve imports through jsconfig/tsconfig compilerOptions…
swapnilpaliwal-sd Sep 29, 2026
35efc07
impact: a qualified parameter target from changed and test-impact res…
swapnilpaliwal-sd Sep 28, 2026
9da3c0a
routes: a request is not a registration — the path and a handler must…
swapnilpaliwal-sd Sep 29, 2026
5f219b5
routes: keep options-object and base-URL routes; a handler by name mu…
swapnilpaliwal-sd Sep 29, 2026
5ae943e
typescript: type a callback parameter from context through an optiona…
swapnilpaliwal-sd Sep 29, 2026
860f0b6
typescript: read a callback's element off built-in containers only, t…
swapnilpaliwal-sd Sep 29, 2026
33e5952
hooks: the pre-search directive speaks once per session, and only whe…
swapnilpaliwal-sd Sep 29, 2026
c54d579
tests: fastpath.py takes --lang, with a small case per language
swapnilpaliwal-sd Sep 29, 2026
1040faf
Merge dev (the 0.1.7 release) into 0.1.8
swapnilpaliwal-sd Sep 29, 2026
1434a23
Merge pull request #1738 from AxiomCodeAI/loop/ty-vue-sfc
swapnilpaliwal-sd Sep 29, 2026
23be268
Merge pull request #1739 from AxiomCodeAI/loop/to-t2-4
swapnilpaliwal-sd Sep 29, 2026
12fa561
Merge pull request #1740 from AxiomCodeAI/loop/ty-ts-contextual-lambd…
swapnilpaliwal-sd Sep 29, 2026
1fc1c41
Merge pull request #1741 from AxiomCodeAI/loop/ja-js-jsx-attribute-ha…
swapnilpaliwal-sd Sep 29, 2026
bd3bb78
Merge pull request #1742 from AxiomCodeAI/loop/ja-js-sfc-files-not-pa…
swapnilpaliwal-sd Sep 29, 2026
b6ec744
Merge pull request #1747 from AxiomCodeAI/loop/ja-js-false-route-from…
swapnilpaliwal-sd Sep 29, 2026
afacbf4
Merge pull request #1748 from AxiomCodeAI/loop/ty-vue-definecomponent…
swapnilpaliwal-sd Sep 29, 2026
12d1574
Merge pull request #1749 from AxiomCodeAI/loop/ja-js-path-alias-unres…
swapnilpaliwal-sd Sep 29, 2026
db22230
Merge pull request #1753 from AxiomCodeAI/loop/to-p0-presearch-hint-n…
swapnilpaliwal-sd Sep 29, 2026
637532a
Merge pull request #1755 from AxiomCodeAI/port/dev-into-0.1.8
swapnilpaliwal-sd Sep 29, 2026
5ad6f0a
javascript: read a .vue component once, as its virtual script
swapnilpaliwal-sd Sep 29, 2026
40e34a5
mcp, skill: every MCP argument the docs name is one the tool takes, a…
swapnilpaliwal-sd Sep 29, 2026
52dffd9
Merge pull request #1765 from AxiomCodeAI/fix/sfc-vue-double-claim
swapnilpaliwal-sd Sep 29, 2026
ede4ca5
hooks: a lowercase word behind a bare dot is an extension or a direct…
swapnilpaliwal-sd Sep 29, 2026
83c549a
javascript: a computed table read defaulted inline or by reassignment…
swapnilpaliwal-sd Sep 29, 2026
50ed3c4
python: a call through a value makes path answer unknown, not indepen…
swapnilpaliwal-sd Sep 29, 2026
e4afbc8
csharp: a component registered into a framework pipeline reaches its …
swapnilpaliwal-sd Sep 29, 2026
7233454
typescript: a .vue template tag reaches the component it names
swapnilpaliwal-sd Sep 29, 2026
2150e2c
freshness: watch .vue, .svelte and .astro components in the file table
swapnilpaliwal-sd Sep 29, 2026
414f110
Merge pull request #1750 from AxiomCodeAI/loop/ty-is1744
swapnilpaliwal-sd Sep 29, 2026
28a054d
Merge pull request #1754 from AxiomCodeAI/loop/ty-is1743
swapnilpaliwal-sd Sep 29, 2026
406df07
Merge pull request #1762 from AxiomCodeAI/loop/to-p0-presearch-hint-n…
swapnilpaliwal-sd Sep 29, 2026
1d94b4f
Merge pull request #1767 from AxiomCodeAI/loop/ja-is1727
swapnilpaliwal-sd Sep 29, 2026
268de57
Merge pull request #1768 from AxiomCodeAI/apps/python/path-claims-ind…
swapnilpaliwal-sd Sep 29, 2026
fe1f490
Merge pull request #1769 from AxiomCodeAI/apps/csharp/framework-pipel…
swapnilpaliwal-sd Sep 29, 2026
11d2ba4
javascript: resolve $lib, ~ and @ when the config only extends a fram…
swapnilpaliwal-sd Sep 29, 2026
88aa157
impact: rows declared alongside a target are listed apart, never as i…
swapnilpaliwal-sd Sep 29, 2026
e5fe241
routes: a request handing over data built by a call, an await or a co…
swapnilpaliwal-sd Sep 29, 2026
4a1848f
Merge pull request #1773 from AxiomCodeAI/loop/ja-is1756
swapnilpaliwal-sd Sep 29, 2026
ded4acb
Merge pull request #1774 from AxiomCodeAI/loop/ja-is1758
swapnilpaliwal-sd Sep 29, 2026
afa1c1a
Merge pull request #1776 from AxiomCodeAI/apps/csharp/alongside-rows-…
swapnilpaliwal-sd Sep 29, 2026
ac47597
java: saving an entity reaches its JPA lifecycle callbacks and entity…
swapnilpaliwal-sd Sep 29, 2026
545b9e1
Merge pull request #1784 from AxiomCodeAI/apps/java/regress-c54d579c
swapnilpaliwal-sd Sep 29, 2026
cc37651
mcp: the verb dispatcher finds its folder when $0 mixes / and \ (Wind…
swapnilpaliwal-sd Sep 29, 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
2 changes: 1 addition & 1 deletion gemini-extension.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "axiomcode",
"version": "0.1.7",
"version": "0.1.8",
"description": "Ask your repository how its code connects: who calls this, what breaks if I change it, which tests an edit reaches, how A reaches B. Answers come from a resolved call graph and are verified against it; nothing is guessed.",
"contextFileName": "plugins/axiomcode/AGENTS.md",
"mcpServers": {
Expand Down
4 changes: 3 additions & 1 deletion graph/bundle/SCHEMA.md
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,7 @@ THE GRAPH. One row per (site, resolved target). A site with N possible targets h
| `ctor_delegate` | java | `this(…)` / `super(…)` inside a constructor. |
| `anon_new` | java | `new X() { … }` — an anonymous class creation. |
| `event` | java | Synthesised: the publishEvent call site to a listener it runs (tier event_dispatch). Not a written call to that method. |
| `entity_callback` | java | Synthesised: a call that writes an entity (`repository.save(e)`, `em.persist(e)`, `delete(e)`) to a JPA lifecycle callback it runs (tier event_dispatch). Not a written call to that method. |
| `record_accessor` | java | Synthesised: a record pattern `case Pair(var l, var r)` calls each accessor. Not a written call; the site is the pattern expression. |
| `resource_close` | java | Synthesised: a try-with-resources resource `try (var w = open())` is closed when the block exits, so its close() is called. Not a written call; the site is the resource local. |
| `FUNCTION_CALL` | typescript | `f(…)` — a bare callee. |
Expand Down Expand Up @@ -511,6 +512,7 @@ THE GRAPH. One row per (site, resolved target). A site with N possible targets h
| `DYNAMIC_CODE_CALL` | javascript | `eval(…)` / `new Function(…)` — unknowable by construction. |
| `DYNAMIC_IMPORT_CALL` | javascript | `import(…)` — a module load that is also a site. |
| `JSX_ELEMENT` | javascript | `<Component …/>` — the renderer runs the component (a function component, or a class component's constructor and `render`) with the element's attributes as its props. Engine-authored: no written call; the site is the JSX element expression. An intrinsic tag (`<div/>`) is no site. |
| `JSX_ATTRIBUTE` | javascript | `<form onSubmit={submit}>`, `<UserForm action={create}/>` — a function handed over as a JSX attribute, on any tag; always tier callback_registered. Engine-authored: the site is the attribute. |
| `SIMPLE_CALL` | python | `f(…)` — a bare name. |
| `METHOD_CALL` | python | `obj.m(…)`. |
| `CHAINED_CALL` | python | `a.b().c(…)` — the receiver is itself a call. |
Expand Down Expand Up @@ -554,7 +556,7 @@ THE GRAPH. One row per (site, resolved target). A site with N possible targets h
| `fan_capped` | javascript, java, csharp | More targets than --dispatch-cap: the set was refused rather than emitted. JavaScript: callee is NULL. Java and C#: callee is the declared base method the fan would have started from; dispatch-capped-sites.csv carries the refused count. |
| `callback_registered` | javascript, typescript | The site HANDS the callee this function (`xs.forEach(f)`, `p.then(f)`, `emitter.on('x', h)`, `setTimeout(f)`), which may invoke it. Not the site's own callee; a reachability edge, labelled so it is never read as a resolved call. |
| `event_dispatch` | javascript | `x.emit('name')` reaching a handler registered by `x.on('name', h)` on a value x may hold — name-sensitive for literal names, every handler on that value for a computed one. |
| `event_dispatch` | java | A Spring application event: `publishEvent(e)` reaching each listener (`@EventListener`, `@TransactionalEventListener`, `ApplicationListener<E>.onApplicationEvent`) whose declared event type e's static type is, or is a subtype of. Added beside the publishEvent boundary row, never in place of it (call-edge-generation/event_dispatch.dl). |
| `event_dispatch` | java | A Spring application event: `publishEvent(e)` reaching each listener (`@EventListener`, `@TransactionalEventListener`, `ApplicationListener<E>.onApplicationEvent`) whose declared event type e's static type is, or is a subtype of. Added beside the publishEvent boundary row, never in place of it (call-edge-generation/event_dispatch.dl). Also a JPA entity write (`save`, `persist`, `merge`, `delete` on a repository or EntityManager) reaching the `@PrePersist`/`@PreUpdate`/`@PreRemove`-style callbacks of the written entity's type and of the listeners `@EntityListeners` names on it or a superclass (kind entity_callback; call-edge-generation/entity_lifecycle.dl). |
| `intrinsic_terminal` | typescript | The site is a JSX intrinsic element or a dynamic `import()` — a runtime intrinsic, not a function the graph can name. |

**`call_edges.callee_provenance` values**
Expand Down
4 changes: 3 additions & 1 deletion graph/bundle/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -513,7 +513,7 @@ export const VOCAB: readonly VocabSpec[] = [
{ table: 'call_edges', column: 'tier', value: 'fan_capped', languages: ['javascript', 'java', 'csharp'], meaning: 'More targets than --dispatch-cap: the set was refused rather than emitted. JavaScript: callee is NULL. Java and C#: callee is the declared base method the fan would have started from; dispatch-capped-sites.csv carries the refused count.' },
{ table: 'call_edges', column: 'tier', value: 'callback_registered', languages: ['javascript', 'typescript'], meaning: 'The site HANDS the callee this function (`xs.forEach(f)`, `p.then(f)`, `emitter.on(\'x\', h)`, `setTimeout(f)`), which may invoke it. Not the site\'s own callee; a reachability edge, labelled so it is never read as a resolved call.' },
{ table: 'call_edges', column: 'tier', value: 'event_dispatch', languages: S, meaning: '`x.emit(\'name\')` reaching a handler registered by `x.on(\'name\', h)` on a value x may hold — name-sensitive for literal names, every handler on that value for a computed one.' },
{ table: 'call_edges', column: 'tier', value: 'event_dispatch', languages: J, meaning: 'A Spring application event: `publishEvent(e)` reaching each listener (`@EventListener`, `@TransactionalEventListener`, `ApplicationListener<E>.onApplicationEvent`) whose declared event type e\'s static type is, or is a subtype of. Added beside the publishEvent boundary row, never in place of it (call-edge-generation/event_dispatch.dl).' },
{ table: 'call_edges', column: 'tier', value: 'event_dispatch', languages: J, meaning: 'A Spring application event: `publishEvent(e)` reaching each listener (`@EventListener`, `@TransactionalEventListener`, `ApplicationListener<E>.onApplicationEvent`) whose declared event type e\'s static type is, or is a subtype of. Added beside the publishEvent boundary row, never in place of it (call-edge-generation/event_dispatch.dl). Also a JPA entity write (`save`, `persist`, `merge`, `delete` on a repository or EntityManager) reaching the `@PrePersist`/`@PreUpdate`/`@PreRemove`-style callbacks of the written entity\'s type and of the listeners `@EntityListeners` names on it or a superclass (kind entity_callback; call-edge-generation/entity_lifecycle.dl).' },
{ table: 'call_edges', column: 'tier', value: 'intrinsic_terminal', languages: T, meaning: 'The site is a JSX intrinsic element or a dynamic `import()` — a runtime intrinsic, not a function the graph can name.' },

// fields.kind / field_access.access / field_access.tier (#663)
Expand Down Expand Up @@ -615,6 +615,7 @@ export const VOCAB: readonly VocabSpec[] = [
{ table: 'call_edges', column: 'kind', value: 'ctor_delegate', languages: J, meaning: '`this(…)` / `super(…)` inside a constructor.' },
{ table: 'call_edges', column: 'kind', value: 'anon_new', languages: J, meaning: '`new X() { … }` — an anonymous class creation.' },
{ table: 'call_edges', column: 'kind', value: 'event', languages: J, meaning: 'Synthesised: the publishEvent call site to a listener it runs (tier event_dispatch). Not a written call to that method.' },
{ table: 'call_edges', column: 'kind', value: 'entity_callback', languages: J, meaning: 'Synthesised: a call that writes an entity (`repository.save(e)`, `em.persist(e)`, `delete(e)`) to a JPA lifecycle callback it runs (tier event_dispatch). Not a written call to that method.' },
{ table: 'call_edges', column: 'kind', value: 'record_accessor', languages: J, meaning: 'Synthesised: a record pattern `case Pair(var l, var r)` calls each accessor. Not a written call; the site is the pattern expression.' },
{ table: 'call_edges', column: 'kind', value: 'resource_close', languages: J, meaning: 'Synthesised: a try-with-resources resource `try (var w = open())` is closed when the block exits, so its close() is called. Not a written call; the site is the resource local.' },
// — TypeScript (the parser's callKind)
Expand Down Expand Up @@ -645,6 +646,7 @@ export const VOCAB: readonly VocabSpec[] = [
{ table: 'call_edges', column: 'kind', value: 'DYNAMIC_CODE_CALL', languages: S, meaning: '`eval(…)` / `new Function(…)` — unknowable by construction.' },
{ table: 'call_edges', column: 'kind', value: 'DYNAMIC_IMPORT_CALL', languages: S, meaning: '`import(…)` — a module load that is also a site.' },
{ table: 'call_edges', column: 'kind', value: 'JSX_ELEMENT', languages: S, meaning: '`<Component …/>` — the renderer runs the component (a function component, or a class component\'s constructor and `render`) with the element\'s attributes as its props. Engine-authored: no written call; the site is the JSX element expression. An intrinsic tag (`<div/>`) is no site.' },
{ table: 'call_edges', column: 'kind', value: 'JSX_ATTRIBUTE', languages: S, meaning: '`<form onSubmit={submit}>`, `<UserForm action={create}/>` — a function handed over as a JSX attribute, on any tag; always tier callback_registered. Engine-authored: the site is the attribute.' },
// — Python (the parser's callKind, plus engine-authored decorator/metaclass forms)
{ table: 'call_edges', column: 'kind', value: 'SIMPLE_CALL', languages: P, meaning: '`f(…)` — a bare name.' },
{ table: 'call_edges', column: 'kind', value: 'METHOD_CALL', languages: P, meaning: '`obj.m(…)`.' },
Expand Down
48 changes: 48 additions & 0 deletions graph/csharp/engine/framework-behavior/knobs.dl
Original file line number Diff line number Diff line change
Expand Up @@ -338,3 +338,51 @@ cs_framework_save_hook("SaveChangesCanceled"). cs_framework_save_hook("SaveChang
cs_framework_save_hook("ThrowingConcurrencyException"). cs_framework_save_hook("ThrowingConcurrencyExceptionAsync").
cs_framework_callback("SaveChangesInterceptor", n, "orm_hook") :- cs_framework_save_hook(n).
cs_framework_callback("ISaveChangesInterceptor", n, "orm_hook") :- cs_framework_save_hook(n).
// EF Core: a command interceptor runs around every command the context sends.
cs_framework_command_hook("ReaderExecuting"). cs_framework_command_hook("ReaderExecutingAsync").
cs_framework_command_hook("ReaderExecuted"). cs_framework_command_hook("ReaderExecutedAsync").
cs_framework_command_hook("NonQueryExecuting"). cs_framework_command_hook("NonQueryExecutingAsync").
cs_framework_command_hook("NonQueryExecuted"). cs_framework_command_hook("NonQueryExecutedAsync").
cs_framework_command_hook("ScalarExecuting"). cs_framework_command_hook("ScalarExecutingAsync").
cs_framework_command_hook("ScalarExecuted"). cs_framework_command_hook("ScalarExecutedAsync").
cs_framework_command_hook("CommandFailed"). cs_framework_command_hook("CommandFailedAsync").
cs_framework_callback("DbCommandInterceptor", n, "orm_hook") :- cs_framework_command_hook(n).
cs_framework_callback("IDbCommandInterceptor", n, "orm_hook") :- cs_framework_command_hook(n).
// ASP.NET Core: an endpoint filter runs around every endpoint it is added to, and a
// factory-activated middleware around every request.
cs_framework_callback("IEndpointFilter", "InvokeAsync", "framework_hook").
cs_framework_callback("IMiddleware", "InvokeAsync", "framework_hook").

// ── PIPELINE REGISTRATION (pipelines.dl) ───────────────────────────────────
// cs_pipeline_register(Method, ReceiverMember, Form): a call that puts a component into a
// framework pipeline, whose hooks (cs_framework_callback above) the framework then runs.
// ReceiverMember "*" is any receiver; otherwise the receiver must be a member access of
// that name (`options.Interceptors.Add<T>()`: a bare `Add` is every list in the program).
// Form "type" is the call's type argument, `AddEndpointFilter<T>()`; "value" is an
// argument whose type is known, `AddEndpointFilter(new T(..))`,
// `AddInterceptors(sp.GetRequiredService<T>())`.
cs_pipeline_register("AddHostedService", "*", "type").
cs_pipeline_register("AddEndpointFilter", "*", "type").
cs_pipeline_register("AddEndpointFilter", "*", "value").
cs_pipeline_register("UseMiddleware", "*", "type").
cs_pipeline_register("AddInterceptor", "*", "type"). // a gRPC client's builder
cs_pipeline_register("AddInterceptor", "*", "value").
cs_pipeline_register("Add", "Interceptors", "type"). // a gRPC server's options
cs_pipeline_register("Add", "Interceptors", "value").
cs_pipeline_register("AddInterceptors", "*", "value"). // an EF Core context's options
// What a registered component WRAPS, beyond being called: (Method, ReceiverMember, Scope).
// "route": the endpoint it is added to, or every endpoint of the route group it is added
// to (nested groups too). "grpc_host": every rpc of every service the same file maps
// with cs_grpc_map_service, which is where a host both configures AddGrpc and maps.
cs_pipeline_wraps("AddEndpointFilter", "*", "route").
cs_pipeline_wraps("Add", "Interceptors", "grpc_host").
cs_grpc_map_service("MapGrpcService").
// EF Core runs every save interceptor added with AddInterceptors when a context saves:
// the synchronous hooks on SaveChanges, the Async ones on SaveChangesAsync.
cs_ef_interceptor_register("AddInterceptors").
cs_ef_save_call("SaveChanges", "sync").
cs_ef_save_call("SaveChangesAsync", "async").
// the framework bases a DbContext is written against
cs_ef_context_base("DbContext").
cs_ef_context_base("IdentityDbContext").
cs_ef_context_base("IdentityUserContext").
Loading
Loading