Repository navigation
Releases: AxiomCodeAI/axiomcodegraph
Release list
v0.2.0
Addition
#1947 HTML and CSS, the sixth language: AxiomCode now indexes the web layer as its own graph. It covers pages, the stylesheets and <style> blocks each page loads, @import, inline style="", and links between pages. It also models the cascade: specificity, layers, !important, and custom properties across files.
Improvements
- impact takes a class, an id, var(--x), a page, a stylesheet, a selector or page.html:LINE.
- path goes from a page to a stylesheet or a class.
- context answers web questions, and impact and changed with no name cover edited pages and stylesheets.
- The web graph links HTML and CSS only. Scripts and handlers are kept as rows.
- The engine runs in parallel like the others: a 4,000-page site indexes in 84 s, down from 202 s, with the same tables.
- Expected results come from an independent oracle (parse5, postcss, css-select). The parser is now 0.2.1. web
#1958, #1959 README: HTML and CSS now have icons and rows in the language maturity table (beta). readme
#1955 README: removed the benchmark and agent-support sections that repeated the top of the page. The change-impact result stays, and the VS Code setting moved into the text. readme
Bugs
#1949 Windows: the query cases now give the same answers as on Linux. The 0.1.11 fixes are ported to 0.2.0:
- repository paths are written with /;
- arguments containing ' or " reach the CLI and MCP intact;
- a rebuild after an edit no longer fails on a lock that didn't lock anything;
- paths on another drive no longer crash index, graph, changed or links. windows
Build and release
#1949 The Windows release gate runs a chosen set of query cases (431 checks) against the installed packages. That takes the job from about 50 minutes to about 19. The nightly build still runs every case. ci
#1947 Every query on HTML and CSS is now checked from the installed tarball on all five platforms. A build fails if an engine is missing its parallel marker. ci
#1956, #1957, #1960 Merged 0.1.11 into 0.2.0 (history only, no change to the code), then promoted integration to dev and cut the 0.2.0 release. release
Contributors
@swapnilpaliwal-sd @sukuna-in-tech @JaredHLZhang @suyashpaliwal26 @Whua689 @claude
v0.1.11
Bugs
- #1948 test-impact: on Windows, --tests and test-impact missed tests that reach a change through a file path: a script a test runs by its path, vitest/jest setupFiles and globalSetup, and a module-level call reached through an import. Paths are now written with / on Windows. test-impact
- #1948 python: on Windows, a module loaded through importlib (SourceFileLoader(..., os.path.join(...))) and a Django route mounted with include() resolved nothing. The parser wrote file paths with . python
- #1948 csharp: on Windows, a method under an attribute derived from FactAttribute was not treated as a test. csharp
- #1948 impact: on Windows, an absolute file:line under the repository, as a stack trace prints it, was refused as outside the repository. impact
- #1948 cli, mcp: on Windows, an argument containing ' or " reached the command mangled. A context question with an apostrophe lost every argument after it, and a quoted string arrived as \Key. plugin
- #1948 refresh: on Windows, two builds of the same repository could run at once because the build lock didn't lock anything, so a rebuild after an edit could fail and answer from the previous graph. refresh
- #1952 index: on Windows, --library crashed for a repository on a different drive from the user cache (path is on mount 'C:', start on mount 'D:'). index
Build and release
- #1948 ci: the release e2e on Windows ran one case per language, and 0.1.10 passed it while 43 query checks were failing there. It now runs every query case against the installed packages, plus the Windows-only tests. ci
Contributors
v0.1.10
Improvements
- #1938
axiomcode graphis back: it draws the codebase as one interactive page (directories, files, types and methods, with the call edges between them and each edge's tier). It uses the graph the index already built and rebuilds first only when a source file changed, then prints the page's path. It's a page for you, not an MCP tool for the agent (a 1,304-method Python library draws in 0.1 s) graph - #1936 assist receipts: after each turn, the plugin shows under the agent's reply where an AxiomCode answer verifiably led the work. Redirected means the agent left the files it was in and landed the change in one the answer showed first. Helped means a file first seen in an answer was edited and kept, or the tests it picked ran and passed. Useful means it was read, or its tests ran. Every link is checked against the transcript's tool calls and the working-tree diff, never the agent's own text. Unchecked links and turns where no answer led anywhere print nothing.
axiomcode reportrenders the record as an HTML page, andAXIOMCODE_ASSISTS=offturns it off plugin - #1940 impact, path, tests: the places view now opens with what the question resolved to.
path X '*'gives the total reached and the count per hop, and a name that matches N declarations says so instead of reading as one (path main '*'on a tree with 22mains) plugin - #1937 refresh: where the last build took 20 s or more, the graph rebuilds after 7 edits instead of 5, so a typical multi-file change lands first. The end of a turn, a prompt and every query still refresh at once.
AXIOMCODE_REFRESH_BATCHstill overrides it refresh
Bugs
- #1941 typescript: a package passed with
--librarythat keeps its declarations in a build directory staged almost none of them (a root.d.tsre-exporting./dist: 78 → 8,238 methods; declarations only underdist/types: 0 → 218). Calls into such packages now resolve to the library typescript
Contributors
v0.1.9
Highlights
- #1925 engines: every platform ships parallel engines (OpenMP, fixed
-j 8). Linux, macOS (Apple Silicon and Intel), and Windows; output is identical to a serial solve, validated on clean installs. Large solves 2–2.5x faster (a 200 MB Python graph: 31 s → 15 s on Windows) engines - #1886
--library auto: stages the project's dependencies in all five languages (Python venv, node_modules, Java sources jars or a decompiled jar, NuGet decompiled), compiled once into a cache; a dependency change rebuilds the graph library - #1895
axiomcode link: an answer lists the calls it could not resolve, with candidates; an agent links them, and impact, path and tests walk them as[asserted], kept across rebuilds until the line is edited links - #1858 parser: HTML and CSS front end on tree-sitter, with specification and torture suites (parser 0.2.0) parser
- #1819 #1852 a smaller surface:
impact,path,tests,context(pluslink,index) answer as numbered places, each with the code of the function it sits in; the MCP server exposes impact, path, tests, context and link CLI - Test-selection recall up in every language
Performance
- #1925 parallel solve on every platform at
-j 8(above) engines - #1853 python: the parse stage walks the syntax tree once and links with map lookups — 2.6–3.2x faster on large projects (212 s → 67 s on 526k LOC) parser
- #1860 #1863 rules: the profiled hot shapes rewritten in TypeScript, JavaScript, Python and C# — a 1.1M-LOC TypeScript solve 192 s → 99 s serial, 66 s in parallel engine
- #1851 #1850 #1847 impact/path: the facts export stops paying per-row SQL (171 s → 55 s on 8.6k files), runs once per graph however many queries arrive, and three missing lookup indexes no longer make large-repo queries take minutes impact
- #1926 impact: the first query after
indexno longer waits on the background facts export, and warm queries stop repeating per-site work — back to 0.1.8 speeds (a JavaScript first query 1.69 s → 0.50 s) impact - #1831 engines are compiled at build time, not at the first index engines
- #1862 #1864 #1879 refresh: edits are batched where a rebuild is slow; a query mid-edit answers at once refresh
- Real-project index on clean machines, 0.1.8 → 0.1.9: Linux 2–8x faster (Python 37.7 s → 4.6 s), Windows 2–3x (Python 81.6 s → 26.9 s) engines
Improvements
- #1882 #1883 #1884 #1885 #1891 python: library callbacks followed from summaries of the installed library; pytest fixture and parametrize typing; operators and dunders;
getattrf-string dispatch;python -mspawns; src-layout packages and conftest imports; tighter transitive reach python - #1876 #1888 #1893 #1874 typescript: JSX hand-offs, imported holders, list element types, multi-line test registrars, vitest/jest set-up files,
Object.assignfunction objects, overload implementations; tests that never load the change are left out typescript - #1877 #1894 #1780 #1781 #1789 #1791 javascript: imports past a hand-written .d.ts, through vite/webpack aliases and directory imports; Vue
defineComponentand.vuetemplate tags; React context and reduxconnecthandlers; tests that never load the change are left out javascript - #1880 #1898 java: type initializers reached only from what initializes the type; library-run members through constructors; platform receivers are library boundaries; operator arguments prune overloads java
- #1881 #1896 csharp: namespace-relative names,
usingresources, implicitbase(); properties and indexers dispatch through interfaces;using/foreach/collection-initializer calls; a function handed to a parameter is followed; overloads pruned by argument shape — callers F1 0.71 → 0.83 against the compiler csharp - #1817 #1822 #1828 impact, path: handler tables keyed by an event type, message keys and in-process registries join publishers to handlers impact
- #1808 #1810 #1841 #1844 impact: evidence for rows an answer is not sure of; call sites of a name declared nowhere; interface dispatch worded as certain; direct callers and links grep cannot make kept impact
- #1857 index: constants carry numbers and booleans, and a constant answers with its value index
- #1821 #1806 context: follows middleware
next(), names a dispatch point's handlers, starts type entry points at their methods context - #1921 #1912
--jsonanswers with a JSON document from every verb and form, refusals included cli
Bugs
- #1913 engines: the prebuilt engines needed
libgomp.so.1on Linux andvcomp140.dllon Windows, so indexing failed on a clean machine; Linux links libgomp statically and Windows ships the OpenMP runtime beside each engine engines - #1916 windows: the export lock's liveness probe sent Ctrl-C to the exporter, stalling impact/path for minutes; it now asks Windows whether the process runs Windows
- #1918 windows:
--library autostaged nothing (the dependency compile ran a bash script directly) windows - #1911 path, context: an unknown endpoint answered nothing at all through the front door; the refusal is printed to CLI again
- #1920 impact:
--jsonwith no name printed the usage text; it answers for the edits CLI - #1878 python: an import of a module with a
.pyibeside it resolved to the stub, so tests reached nothing in the package python
Build and release
- #1805 engines: Linux binaries are built in manylinux_2_28, so they run on glibc 2.28+ (Ubuntu 22.04, Debian 12, RHEL 9, Amazon Linux 2023) CI
- #1914 #1925 ci: the engine build fails if any engine loads a library a stock machine lacks (
readelf/otool/dumpbinguards), and checks every parallel engine carries its OpenMP runtime - #1927 ci: the engine smoke step ran the
.parallelmarker with the binary on Linux and Windows; it names the binary ci - #1930 ci: the release gate ("e2e on every platform": installed from the tarballs, no Soufflé, every language, every verb) checks 0.1.9's answers and verbs; the nightly runs the same gate
- #1819 #1820 ci: CI runs the query-layer cases for all five languages, four at a time
- #1866 #1867 cli: the Node floor is stated (
engines≥ 22.5), and a Node older than 22.13 is refused up front with a message instead of failing later CLI
Contributors
v0.1.8
Improvements
- #1743 vue: Vue single-file components are indexed. A tag in a .vue template reaches the component it names, a Vue JSX tag reaches the setup or render function of its defineComponent, and the
<script>blocks of .vue, .svelte and .astro files are read javascript - #1744 refresh: an edit to a .vue, .svelte or .astro component marks the graph stale refresh
- #1756 javascript: imports resolve through jsconfig/tsconfig
pathsaliases, and through$lib,~and@when the project config only extends the one a framework generates (SvelteKit, Nuxt) javascript - javascript: a function passed as a JSX attribute is registered as handed off to the component javascript
- #1727 javascript: a computed read from a table, with an inline or reassigned default, names every function the table holds javascript
- typescript: a callback parameter takes its type from context, through an optional callback and without a staged lib typescript
- java: saving an entity reaches its JPA lifecycle callbacks and entity listeners java
- csharp: a component registered into a framework pipeline reaches its hooks csharp
- test-impact: a test that runs a script by its path covers what the script reaches test-impact
Bugs
- #1758 routes: an HTTP client request was read as a route registration, including when its argument was a call, an await or a const impact
- impact: rows declared alongside a target were listed as its dependents; they are now listed separately impact
- python: path said a call through a value was independent; it now says unknown python
- javascript: a .vue component was read twice; it is now read once, as its virtual script javascript
- plugin: the pre-search message named words the search wasn't about (including a word after a bare dot) and repeated itself; it now names only what the search is for, once per session plugin
Build and release
- ci: the e2e job on main failed at random on one platform because of an
ls | headpipe; it now picks its fixture with a glob ci
Contributors
v0.1.7
Improvements
- #1293 typescript: a fetch or axios call is linked to the HTTP route it reaches (literal, template, constant or config path; the verb must match), and context lists these remote hops separately — typescript
- #1699 impact, path, context: when the graph has no answer, the lines that write the name are shown, labelled [text], instead of a bare "nothing named X" — cli
- #1584 --in matches by path prefix, and impact answers only for the declarations under it — cli
- #1666 --in picks among the files a partial file:line path matches — cli
- #1729 test-impact: a script-style test counts as a test and gets its own run command — cli
- #1698 impact resolves a private class field (Owner.#name) in JavaScript and TypeScript — javascript, typescript
- #638 javascript: fields belong to their class, computed-key members are named by their key, and class expressions by their binding — javascript
- #695 javascript: memoize/once wrappers keep their fallback, and a declared closure answers per call site — javascript
- #1706 javascript: a wrapper that reassigns its parameter answers with the function it writes — javascript
- #1722 javascript: each link of a chained route registration (.get().post()…) gets its own verb and path — javascript
- #1723 javascript: a call through an object-literal table with a computed key reaches the table's functions — javascript
- #465 javascript: new this.constructor() builds the receiver's own class at each call site — javascript
- #233 typescript: a bare decorator application is a call site — typescript
- #1730 typescript: receivers are typed from a generic signature's T and from Record and index-signature elements — typescript
- #1728 typescript: a method passed by reference registers with the function it is passed to — typescript
- #1726 typescript: calls on members of an unannotated object literal resolve — typescript
Bugs
- #1675 javascript: path said "independent" instead of "unknown" for a callee stored on this, in a module variable, in an options member, or computed by an expression — javascript
- #1708 javascript: path said "independent" for a call through an imported export let that a setter reassigns — javascript
- #1709 javascript: this.x() with no declared x was answered as independent instead of unknown — javascript
- #1602 path, impact: a name no declaration carries was reported as a type — typescript
- #1574 typescript: a global declared in one prope in another — typescript
- #1601 path, impact: a file:line past the end p-level code; it is now refused with the file's
length — cli - #1716 plugin: a corrupt graph.sqlite crashed with a Python traceback; it is now reported, moved aside and rebuilt — plugin
- #1736 test-impact: the by-name fallback offer languages' files as tests; it now offers onlyreal tests in the changed file's language — cli
Build and release
- #1721 the query engine is compiled once per eany tests or agents need it at once, which stopsmemory exhaustion on shared build machines — ci
Contributors
v0.1.6
Improvements
- #1392 #1396 #1414 java: Spring Boot registrations create beans, and impact names who registers each bean and who is injected with it java
- #1391 java: a published Spring application event reaches the listeners whose type fits it java
- #1542 #1384 impact: a caller through an interface or base method counts as a direct caller, and an injection typed by an interface receives the bean impact
- #1537 python: a pytest fixture reaches exactly the tests that receive it python
- #1510 python: a route reaches its view through decorators, include() and as_view(), and carries the path it serves python
- #1383 csharp: a mediator Send or Publish reaches the handler for its request type csharp
- #1109 typescript: the constructor parameters of a decorator-based DI container are injection points, and impact names who receives a provider typescript
- typescript: a published module's classes, method-reference consts, namespaces, object literals and default arrow functions are entry points typescript
- impact: a TypeScript structural type is followed to the sites that never name it impact
- #967 typescript: a function held in an array or table is reached by the call that iterates over or indexes it typescript
- typescript: a callback handed to a library higher-order function is reached from the site that hands it over typescript
- typescript: a || / ?? / && default keeps the callback's call signature typescript
- typescript: calls through middleware parameters typed by an indexed access resolve typescript
- typescript: a merged interface checks its later declaration block first typescript
- #334 typescript: a string literal that is a key of a keyof constraint selects the matching generic overload typescript
- #695 javascript: a call through a memoize or once wrapper returns what that call site's argument returns javascript
- javascript: a const holding a wrapped handler is registered at its route javascript
- impact, test-impact: a request reaches the handler for its path and HTTP verb impact
- #1504 changed, test-impact: a branch is read from its merge-base, and the answer names what it could not analyse changed
- #1570 test-impact: each TypeScript/JavaScript test file gets the command its package runs it with test-impact
- #1504 plugin: C# edits get a graph line, the plugin's instruction to use the graph appears once per session and names the verb, and test-impact runs concrete test classes plugin
- #1595 refresh: a graph built by an older engine or different rules is rebuilt, and the answer says so refresh
- #1606 performance: query rules compile once per machine, never while a query waits performance
- #1600 impact, path: targets can be ./path, an absolute path inside the repo, or file:line:col impact
- #1599 impact, path: a file:line whose partial path matches two files names both and asks which one impact
- #1392 context: when entry points score equally, the tie goes to the file the question names, then to code a reader can follow context
- #1480 graph: draws the existing graph, and every rebuild keeps the languages the index chose graph
- mcp, cli: a list of sites is printed one per line as path:line: code [tag] cli
- skill: a schema guide for each language skill
Bugs
- index: stopping a query or an index partway lost the main graph index
- index: a copied checkout pointed at the original's graph; the link to the live graph is now relative index
- #1389 #1423 #1544 impact, path: a dependent could be listed more than once, and a name mentioned in comments or docs was read as a binding; labels now say why each row is there impact
- impact: a test that only stubs the change was listed as a test to run impact
- impact, test-impact: a call inside a mock stub was treated as the route by which a test reaches the change impact
- #1426 changed, impact: a lambda was named by a placeholder and matched every other lambda; lambdas are now named by where they are, and file:line accepts a field or type line changed
- #1649 javascript: path said "independent" when one side calls through a value; it now says "unknown" javascript
- #1598 javascript: anonymous functions on the same line were nested under the wrong parent javascript
- javascript: a class field initializer covered the whole class instead of its field javascript
- javascript: values that shared only a string or typedef identity were merged, which made answers too wide javascript
- typescript: a call through a type annotation the parser cannot read was resolved by guessing; it now stays unresolved typescript
- #1401 java: a var in an enhanced for loop, a try-with-resources resource or a lambda parameter had no type java
- #1445 csharp: a field, const, property or enum member was not attributed to the type that declares it csharp
- python: field line numbers started at 0 instead of 1 python
- plugin: a cached query-rules binary built for another machine could be run plugin
- plugin: the Read hook showed edges that the text being read does not contain plugin
Build and release
- #1657 the engine cache is keyed on CPU flags, and a cached engine that crashes with SIGILL is discarded CI
- engine test suites run faster, with test cases running concurrently and an engine cache that now hits CI
- parser 0.1.2 is carried into 0.1.5 and 0.1.6, along with the 0.1.4 fixes CI
Contributors
v0.1.4
Improvements
- #1382 #1455 #1493 #1494 #1571 context: the answer addresses the question that was asked context
- #1594 #1595 refresh: a query answers at once from the last graph and marks rows that may be stale, instead of waiting for a rebuild refresh
- #1555 index: in a repository with several languages, each language's graph can be queried as soon as it is built, without waiting for the rest performance
- query: a stale graph says so even with refresh turned off, and "nothing named X" names the edit that added X query
- #1507 plugin: when a count is 0 the answer says why, and an edit is followed by a single line naming its tests plugin
- #1453 plugin: hooks find the graph from the file a tool touched, not only from the working directory plugin
- #1567 mcp: unknown arguments are refused, and answers name MCP parameters instead of CLI flags mcp
- #1560 csharp: methods the framework calls are entry points, from one table keyed on base type and callback csharp
- #847 typescript: a package's public API is taken from package.json, and an arrow function under
asis bound to its name typescript - #1612 javascript: a JSX tag reaches the component inside memo() or forwardRef(), or behind a lazy() loader javascript
- #1592 typescript: a JSX tag reaches the component inside a nested or default-exported wrapper, or behind a short (concise-body) loader typescript
- javascript: a function assigned to exports.x, obj.x or an object-literal key is named after that property javascript
Bugs
- #1446 #1486 impact, path: a framework entry point the graph doesn't model was reported as local; it is now reported as 'not checked' impact
- #1388 next, path: the answer said "local" or "independent" before all of it had been read impact
- impact: file:line with a dotted file name (user.controller.js:7) did not find the declaration on that line impact
- impact: an
export *was listed even when it didn't re-export the target's module impact - multi-language: --in and --from refused a path without checking every language's graph cli
- #1399 #1402 java: a member was sometimes attributed to the wrong enclosing declaration java
- #1545 java: build output (target/, Javadoc, Dokka) was indexed as JavaScript; a source package named
buildis still parsed, and only Gradle's output is skipped java - #1640 windows: a query command exited with 0 beforews
- windows: the launcher looked for its package in the following path written with backslashes windows
Build and release
- #1593 the engine's Soufflé program is generated once, and the hash of that file is used as the engine id CI
- the parser is now at 0.1.2, covering the parser changes in #1592, #1616, #1621 and #1625 CI
Contributors
@swapnilpaliwal-sd, @JaredHLZhang, @suyashpaliwal26, @Whua689
v0.1.3
Improvements
- index: in a repository with several languages, every language gets a graph, and queries search each of the indexes
- #1565 refresh: the graph reliably refreshes after an edit, honors .gitignore, and survives a query that runs during a rebuild refresh
- #1576 performance: queries are faster, and a first build under MCP reports its progress instead of blocking performance
- #1558 skill: the plugin names the MCP tool before the shell command, so agents use the tool they were approved for plugin
- #1379 python: a script with a Python shebang and no .py extension is indexed python
- #1466 javascript: a JSX element is an edge to the component it renders JavaScript
- #1541 #1577 typescript: a JSX tag is a call to its component, including through a wrapper, a lazy loader, or a prop typescript
Bugs
- csharp: impact on an interface method found no callers or implementations csharp
- #1564 python: impact and path missed framework links, such as a signal and its receiver, a task and its producer, or a test and its fixture python
- #1374 python: a line added right after a method's docstring was counted as a change to the class, not the method python
- #1563 java: a var local was treated as an external class named var java
- #1378 changed: a new method was listed twice, and a new class appeared under a synthetic member name changed
- cli: --lang and --language help now lists csharp cli
Build and release
- #1372 the README lists what installing needs on each platform docs
- #1581 the parser has its own version number (0.1.1) and changes it only when the parser changes CI
Contributors
v0.1.2
Improvements
- #1360 targets: one spelling works in every language.
util.square,src.util.squareandsrc/util#squareall name the same declaration inimpact,pathandcontext; spellings that worked before still work, and a name that fits two declarations lists both instead of guessingcli - #1352 cli:
axiomcode --versionprints the installed versioncli
Bugs
- #1363 windows:
impact,test-impactandchanged --impactcrashed for every user without admin rights (WinError 1314)windows - #1332 windows: a
git.exe,python.exeorpy.exein the working directory was run instead of the real one, which could hang the CLIwindows - #1369 windows:
axiomcode path '*' …received the directory's file names instead of*windows - #1364 windows:
impactcould not find its query binaries in plugin installs, a console window opened on every background refresh, hooks crashed on files on another drive, WSL's bash could be picked instead of Git Bash, and library paths with spaces were splitwindows - #1359 macOS: on Apple Silicon Macs whose
python3is an Intel build (such as Anaconda),impactfailed unless Soufflé was installedmacos - #1361 javascript:
impacton a class imported withrequirerefused it as "declared as more than one kind"javascript
Build and release
- #1366 every release is tested on all five platforms (Linux x64/arm64, macOS arm64/x64, Windows x64) with every CLI verb before it is tagged
ci - #1350 engines are built once per release, and the exact build that passed the tests is the one published
ci - #1365 releases and tags are published by axiomcode-bot
ci