Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
193 commits
Select commit Hold shift + click to select a range
f115f5d
engine: resolve reads of module-level consts through their import bin…
swapnilpaliwal-sd Sep 30, 2026
699d90e
impact: a callback or dependency given to one instance reaches caller…
swapnilpaliwal-sd Sep 30, 2026
0548acd
context/impact: lockfiles and manifest package lists are never text l…
swapnilpaliwal-sd Sep 30, 2026
5e2290d
context/impact: manifest package lists are never text leads, in any m…
swapnilpaliwal-sd Sep 30, 2026
b6375b3
TypeScript: each key of a module-level const object literal is a decl…
swapnilpaliwal-sd Sep 30, 2026
0f207ca
impact: a const table's key spelled like a class answers as the key
swapnilpaliwal-sd Sep 30, 2026
d0cb0d7
TypeScript: a key read in a parameter's decorator is read by its method
swapnilpaliwal-sd Sep 30, 2026
982dd5c
TypeScript: a key read in a parameter's default is read by its method
swapnilpaliwal-sd Sep 30, 2026
673ccc5
TypeScript suite: a const table's key is scored under its module, as …
swapnilpaliwal-sd Sep 30, 2026
47bcadc
TypeScript: one owner for a const table's keys after the index-side d…
swapnilpaliwal-sd Sep 30, 2026
a627e1d
changed: charge an edit inside a multi-line field initializer to that…
swapnilpaliwal-sd Sep 30, 2026
d2afa19
changed: a const object's data key edit is its initializer; a table's…
swapnilpaliwal-sd Sep 30, 2026
49e1512
impact: a call on a package's value is not a by-name caller of a proj…
swapnilpaliwal-sd Sep 30, 2026
3c09f9c
Merge pull request #1829 from AxiomCodeAI/apps/typescript/const-objec…
swapnilpaliwal-sd Sep 30, 2026
c17d28e
Merge pull request #1825 from AxiomCodeAI/apps/javascript/context-tex…
swapnilpaliwal-sd Sep 30, 2026
96085c5
Merge pull request #1839 from AxiomCodeAI/apps/typescript/multiline-c…
swapnilpaliwal-sd Sep 30, 2026
a1c01a9
Merge apps/integration-0.1.9; IMPACT_VERSION 62 carries this PR's fac…
swapnilpaliwal-sd Sep 30, 2026
d6dcbfa
Merge remote-tracking branch 'origin/0.1.9' into HEAD
swapnilpaliwal-sd Sep 30, 2026
37c13aa
Merge apps/integration-0.1.9; goldens regenerated from the merged engine
swapnilpaliwal-sd Sep 30, 2026
4eca851
Merge apps/integration-0.1.9
swapnilpaliwal-sd Sep 30, 2026
4933404
Merge pull request #1836 from AxiomCodeAI/apps/typescript/imported-co…
swapnilpaliwal-sd Sep 30, 2026
f47d7f1
Merge pull request #1840 from AxiomCodeAI/apps/javascript/by-name-row…
swapnilpaliwal-sd Sep 30, 2026
4330a3f
Merge apps/integration-0.1.9; the export manifest keeps both field_ac…
swapnilpaliwal-sd Sep 30, 2026
20e123f
Merge apps/integration-0.1.9
swapnilpaliwal-sd Sep 30, 2026
69620fb
Merge pull request #1837 from AxiomCodeAI/apps/javascript/per-instanc…
swapnilpaliwal-sd Sep 30, 2026
c1dbec4
impact: word interface dispatch as certain, and say when the answer i…
swapnilpaliwal-sd Sep 30, 2026
5c2d691
Merge branch 'apps/integration-0.1.9' into fix/impact-trustworthy-output
swapnilpaliwal-sd Sep 30, 2026
ca3a86d
impact: keep internal oracle figures out of the answer
swapnilpaliwal-sd Sep 30, 2026
fbb0ef6
Merge branch 'fix/impact-trustworthy-output' of https://github.com/Ax…
swapnilpaliwal-sd Sep 30, 2026
37ece4c
impact: word the complete line without the by-name label
swapnilpaliwal-sd Sep 30, 2026
6369393
Merge pull request #1841 from AxiomCodeAI/fix/impact-trustworthy-output
swapnilpaliwal-sd Oct 1, 2026
7ce9d88
Aid grep instead of replacing it: a grep note says only what grep can…
swapnilpaliwal-sd Oct 1, 2026
c8754cb
grep aid: name who enters a declaration nothing in the code calls; te…
swapnilpaliwal-sd Oct 1, 2026
ad9da59
Merge pull request #1842 from AxiomCodeAI/apps/feed/grep-aid
swapnilpaliwal-sd Oct 1, 2026
1568508
grep aid: off, false and 0 all switch it off
swapnilpaliwal-sd Oct 1, 2026
f119e79
Merge pull request #1843 from AxiomCodeAI/apps/feed/grep-aid
swapnilpaliwal-sd Oct 1, 2026
061bf35
impact: keep the direct callers and every link grep cannot make, each…
swapnilpaliwal-sd Oct 1, 2026
5f91567
Merge pull request #1844 from AxiomCodeAI/apps/feed/grep-aid-direct
swapnilpaliwal-sd Oct 1, 2026
9f127c5
test-impact: a helper beside the tests is the route, not a test; far …
swapnilpaliwal-sd Oct 1, 2026
8dfdb4d
changed: a declaration longer or gone in the base than in the graph's…
swapnilpaliwal-sd Oct 1, 2026
0df85ac
Merge pull request #1845 from AxiomCodeAI/apps/javascript/test-impact…
swapnilpaliwal-sd Oct 2, 2026
fc6c771
Merge pull request #1846 from AxiomCodeAI/apps/java/changed-maps-hunk…
swapnilpaliwal-sd Oct 2, 2026
8ba21f1
The MCP surface is impact, path and tests: search is the agent's own
swapnilpaliwal-sd Oct 3, 2026
966ed85
perf(python): read the parsed tree through a one-pass plain-JS mirror
swapnilpaliwal-sd Oct 3, 2026
67034be
Merge apps/integration-0.1.9: their find removal wins; find leaves th…
swapnilpaliwal-sd Oct 3, 2026
f4242c3
perf(java,csharp): read parsed trees through the shared one-pass mirror
swapnilpaliwal-sd Oct 4, 2026
7671600
perf(typescript,build): verify CSV rows at append; reuse closure-pass…
swapnilpaliwal-sd Oct 4, 2026
5925beb
Merge pull request #1852 from AxiomCodeAI/chore/surface-path-impact-only
swapnilpaliwal-sd Oct 5, 2026
d515f5d
Merge pull request #1853 from AxiomCodeAI/perf/parser-one-walk
swapnilpaliwal-sd Oct 6, 2026
e6fb608
Only the supported surface is dispatched: find, graph, diff and insta…
swapnilpaliwal-sd Oct 6, 2026
679d357
perf(python): the parse stage runs on a pool of worker threads, byte-…
swapnilpaliwal-sd Oct 6, 2026
941a913
parse pool: the thread machinery moves to parse-pool-core, for every …
swapnilpaliwal-sd Oct 6, 2026
f86f0e0
path: the methods behind a [by name] caller are counted, with named n…
swapnilpaliwal-sd Oct 6, 2026
e1b6d44
surface: a bound: line survives to the front door
swapnilpaliwal-sd Oct 6, 2026
26839a2
perf(csharp): the parse stage runs on a pool of worker threads, byte-…
swapnilpaliwal-sd Oct 6, 2026
6939e24
perf(java): the parse stage runs on a pool of worker threads, byte-id…
swapnilpaliwal-sd Oct 6, 2026
d9b7bbb
perf(typescript): the parse stage runs on a pool of worker threads, b…
swapnilpaliwal-sd Oct 6, 2026
be91d28
perf(javascript): the parse stage runs on a pool of worker threads, b…
swapnilpaliwal-sd Oct 6, 2026
7ed366d
Merge remote-tracking branches 'origin/pp/java-parse-pool' and 'origi…
swapnilpaliwal-sd Oct 6, 2026
1111bec
Merge remote-tracking branch 'origin/pp/js-parse-pool' into HEAD
swapnilpaliwal-sd Oct 6, 2026
9395005
python: an imported module-level instance types its receiver across t…
swapnilpaliwal-sd Oct 6, 2026
1c41ba2
path: --json says what the prose says — verified and the unresolved c…
swapnilpaliwal-sd Oct 6, 2026
a662d1a
mcp: context is back on the surface — the narrative verb beside find
swapnilpaliwal-sd Oct 6, 2026
8986b77
context: a task in another language names the lexical limit, not a pa…
swapnilpaliwal-sd Oct 6, 2026
f030c39
index: literals carry numbers and booleans, and a constant answers wi…
swapnilpaliwal-sd Oct 6, 2026
b43c6d6
Merge apps/integration-0.1.9: context stays on the surface the trim n…
swapnilpaliwal-sd Oct 7, 2026
95a86dc
surfaces: context is the fifth public verb, with its one option
swapnilpaliwal-sd Oct 7, 2026
a3ab44a
engine: the solve runs in parallel where it is safe — linux-x64 by de…
swapnilpaliwal-sd Oct 7, 2026
a30511e
Merge pull request #1855 from AxiomCodeAI/fix/path-name-matched-callers
swapnilpaliwal-sd Oct 7, 2026
bab23ba
Merge pull request #1856 from AxiomCodeAI/fix/1140-imported-instance-…
swapnilpaliwal-sd Oct 7, 2026
3a10e11
Merge pull request #1857 from AxiomCodeAI/fix/constants-queryable
swapnilpaliwal-sd Oct 7, 2026
243a4b2
java rules: a local-variable use resolves to its declaration once, be…
swapnilpaliwal-sd Oct 7, 2026
e6790bc
Merge remote-tracking branch 'origin/apps/integration-0.1.9' into HEAD
swapnilpaliwal-sd Oct 7, 2026
054187e
parser: an HTML and CSS front end on tree-sitter, with its specificat…
JaredHLZhang Oct 7, 2026
3c6cec8
engine-package test: the stub include dir carries the header the seql…
swapnilpaliwal-sd Oct 7, 2026
c2a566b
engine-package test: pin the solve flavor serial — the probe made pre…
swapnilpaliwal-sd Oct 7, 2026
ddfaf04
Merge pull request #1859 from AxiomCodeAI/fix/engine-package-seqlock-…
swapnilpaliwal-sd Oct 7, 2026
bdc0a0a
Merge branch 'apps/integration-0.1.9' into apps/web-front-end-0.1.9
swapnilpaliwal-sd Oct 7, 2026
1d74f20
Merge pull request #1858 from AxiomCodeAI/apps/web-front-end-0.1.9
swapnilpaliwal-sd Oct 7, 2026
be2bf4a
python rules: the two joins that were two thirds of a large subject's…
swapnilpaliwal-sd Oct 7, 2026
4eab3a8
Merge remote-tracking branch 'origin/apps/integration-0.1.9' into HEAD
swapnilpaliwal-sd Oct 7, 2026
d3e2a48
typescript rules: the three shapes the profile named — 192s to 99s se…
swapnilpaliwal-sd Oct 7, 2026
5f68c70
typescript case: a chained access typed through a parameter's inline …
swapnilpaliwal-sd Oct 8, 2026
7f4ef52
python rules, round two: the attribute prefix hoisted, the diagnostic…
swapnilpaliwal-sd Oct 8, 2026
eb0d952
Merge pull request #1860 from AxiomCodeAI/perf/ts-datalog-rules
swapnilpaliwal-sd Oct 8, 2026
86da814
engine: darwin-arm64 solves in parallel — the residual crash was unfe…
swapnilpaliwal-sd Oct 8, 2026
954c901
bundle: multi-row inserts, and the honest number the quiet box gave
swapnilpaliwal-sd Oct 8, 2026
894a6d0
engine-package test: the stub include dir carries BTree.h's publicati…
swapnilpaliwal-sd Oct 8, 2026
d6bc9b7
darwin-arm64 parallel goes back to opt-in: a harder repro still crash…
swapnilpaliwal-sd Oct 8, 2026
c4c55cf
seqlock-fix-3: a fence before every store that makes a new btree node…
swapnilpaliwal-sd Oct 8, 2026
9df8377
build-engines: the vendored headers carry the fix-3 fences, not just …
swapnilpaliwal-sd Oct 8, 2026
9603b02
build-engines: find the souffle headers instead of assuming the doubl…
swapnilpaliwal-sd Oct 8, 2026
e328b42
parallel solve on every served platform
swapnilpaliwal-sd Oct 8, 2026
9606b3e
overlay: the mingw-compile guards — a Windows clone builds its engine…
swapnilpaliwal-sd Oct 8, 2026
07b133f
refresh: batch edits where a rebuild is slow
swapnilpaliwal-sd Oct 8, 2026
2ac093a
Merge pull request #1862 from AxiomCodeAI/fix/refresh-batch-trigger
swapnilpaliwal-sd Oct 8, 2026
bf2e7fe
csharp rules: the per-tier tally counts each tier once, not once per …
swapnilpaliwal-sd Oct 8, 2026
ee35163
python rules, round three: the pairing key materialized, the leftover…
swapnilpaliwal-sd Oct 8, 2026
3672603
javascript rules: the two cross-product anchors that were half the solve
swapnilpaliwal-sd Oct 8, 2026
ba3e49f
query: answer mid-edit at once, and index the no-caller lookups
swapnilpaliwal-sd Oct 8, 2026
b5d6d73
Merge pull request #1864 from AxiomCodeAI/perf/query-speed
swapnilpaliwal-sd Oct 8, 2026
7328f5b
Merge pull request #1861 from AxiomCodeAI/perf/ts-datalog-rules
swapnilpaliwal-sd Oct 8, 2026
5b1087b
Merge pull request #1863 from AxiomCodeAI/perf/js-cs-datalog-rules
swapnilpaliwal-sd Oct 8, 2026
eb60c9f
engines: node >=22.5.0, the floor the product actually has
swapnilpaliwal-sd Oct 8, 2026
896e395
Merge pull request #1866 from AxiomCodeAI/fix/node-engines-22-5
swapnilpaliwal-sd Oct 8, 2026
85e92fe
mcp: a bare AXIOMCODE_BASH is a program on PATH, not a missing file (…
swapnilpaliwal-sd Oct 8, 2026
981fdf2
mcp: on Windows a bare AXIOMCODE_BASH stays an error, never WSL's bash
swapnilpaliwal-sd Oct 8, 2026
ad2e39d
Merge remote-tracking branch 'origin/apps/integration-0.1.9' into fix…
swapnilpaliwal-sd Oct 8, 2026
2893531
node: the floor is 22.13, said before anything runs (#1865)
swapnilpaliwal-sd Oct 8, 2026
e87b491
README: Node 22.13 is the floor, and a query answers mid-edit at once
swapnilpaliwal-sd Oct 8, 2026
2e3c17c
parser: 0.2.0, and the README names HTML and CSS up front
swapnilpaliwal-sd Oct 8, 2026
e0e8450
Merge pull request #1867 from AxiomCodeAI/fix/1357-bash-name-on-path
swapnilpaliwal-sd Oct 8, 2026
192f73f
Merge branch 'apps/integration-0.1.9' into chore/parser-0.2.0
swapnilpaliwal-sd Oct 8, 2026
c5831e6
Merge pull request #1868 from AxiomCodeAI/chore/parser-0.2.0
swapnilpaliwal-sd Oct 8, 2026
88c0baa
feed: the search runs untouched — the pre-search directive is removed
swapnilpaliwal-sd Oct 8, 2026
034e7b4
seqlock-fix-4: the optimistic descent must not dereference a null child
swapnilpaliwal-sd Oct 8, 2026
029b814
typescript: a test the build tsconfig excludes joins the program it i…
swapnilpaliwal-sd Oct 9, 2026
b115cf2
index: a file named test.ts that registers a test is a test
swapnilpaliwal-sd Oct 9, 2026
74858c4
query --json: one document when no language's graph answers
swapnilpaliwal-sd Oct 9, 2026
d749cf3
feed: no hook annotates a read or a search; the graph answers when asked
swapnilpaliwal-sd Oct 9, 2026
c4528f6
typescript: a JavaScript test of TypeScript source joins the program …
swapnilpaliwal-sd Oct 9, 2026
dd6538e
typescript: the site that creates a Proxy hands over its handler's traps
swapnilpaliwal-sd Oct 9, 2026
a811ccf
Merge pull request #1874 from AxiomCodeAI/fix/ts-test-impact
swapnilpaliwal-sd Oct 9, 2026
6453aa5
typescript: a JSX attribute hands its function to the element, and a …
swapnilpaliwal-sd Oct 9, 2026
b2e7cda
typescript: a call through an imported const runs the function it holds
swapnilpaliwal-sd Oct 9, 2026
5c2130a
typescript: a call on the platform's own objects is no by-name caller…
swapnilpaliwal-sd Oct 9, 2026
92d7cee
fix(parser/js): an import resolves to the code it runs, not a declara…
swapnilpaliwal-sd Oct 9, 2026
21c0f9f
typescript: a list's element is typed through a type variable's const…
swapnilpaliwal-sd Oct 9, 2026
3388587
fix(js): a test file's calls do not decide whether the program's argu…
swapnilpaliwal-sd Oct 9, 2026
408d01f
fix(js): a call of what a project wrapper returned runs what that sit…
swapnilpaliwal-sd Oct 9, 2026
3652330
Merge pull request #1871 from AxiomCodeAI/feed/directive-moves-post
swapnilpaliwal-sd Oct 9, 2026
b690a5d
Merge pull request #1872 from AxiomCodeAI/fix/speculative-fetch-guard
swapnilpaliwal-sd Oct 9, 2026
9d52b70
fix(parser/python): an import of a module shipped with a .pyi beside …
swapnilpaliwal-sd Oct 9, 2026
221e3b6
fix(python): type a test parameter by the fixture the runner hands it
swapnilpaliwal-sd Oct 9, 2026
6bc6ce6
fix(python): a decorator returning update_wrapper(wrapper, f) or cast…
swapnilpaliwal-sd Oct 9, 2026
6aae527
fix(impact): a call under `if __name__ == "__main__":` is not taken b…
swapnilpaliwal-sd Oct 9, 2026
bfb7089
fix(impact): a conjunctive main guard (`cond and __name__ == "__main_…
swapnilpaliwal-sd Oct 9, 2026
cafd6d2
fix(impact): an on-demand protocol member is reached from test code t…
swapnilpaliwal-sd Oct 9, 2026
b0dca3c
fix(python): `obj.x = v` and `del obj.x` are calls to the property's …
swapnilpaliwal-sd Oct 9, 2026
ba6d9ba
fix(python): a local's Optional/union annotation types it, and every …
swapnilpaliwal-sd Oct 9, 2026
78eaedb
fix(impact): a src-layout module is imported by its package name, and…
swapnilpaliwal-sd Oct 9, 2026
80fade8
refresh: batch every 5 edits, not 3, where a rebuild is slow
swapnilpaliwal-sd Oct 9, 2026
9e4379e
csharp: a name written inside a namespace is read from that namespace
swapnilpaliwal-sd Oct 9, 2026
d867f4f
path: a C# source file is an endpoint
swapnilpaliwal-sd Oct 9, 2026
ea42c61
csharp: a using resource is typed by its initializer
swapnilpaliwal-sd Oct 9, 2026
59a1ce9
csharp: a constructor runs its base class's parameterless constructor
swapnilpaliwal-sd Oct 9, 2026
0966ce7
csharp: an unstaged receiver keeps its type name for extension matching
swapnilpaliwal-sd Oct 9, 2026
21917af
csharp: a static member read through its type name types the chain
swapnilpaliwal-sd Oct 9, 2026
c0dab0b
csharp: a constructed generic type is a static receiver
swapnilpaliwal-sd Oct 9, 2026
8061569
impact: a Java type's initializer is run by whoever uses the type
swapnilpaliwal-sd Oct 9, 2026
34b9ebf
parser: a field initializer written after a comment is read
swapnilpaliwal-sd Oct 9, 2026
7422e84
impact: the at-load hop sees a test that reads a static field
swapnilpaliwal-sd Oct 9, 2026
b73381c
impact: the members a library runs on a Java object reach whoever bui…
swapnilpaliwal-sd Oct 9, 2026
299b63b
Merge pull request #1879 from AxiomCodeAI/refresh/batch-5
swapnilpaliwal-sd Oct 9, 2026
5d153ad
fix(parser/python): an import of a module shipped with a .pyi beside …
swapnilpaliwal-sd Oct 9, 2026
cba62f5
Merge origin/fix/parser-py-module-prefers-source into the 0.1.9 impac…
swapnilpaliwal-sd Oct 9, 2026
d08b4a5
Merge origin/fix/js-impact-loop into the 0.1.9 impact-loop batch
swapnilpaliwal-sd Oct 9, 2026
1ec53ab
Merge origin/fix/ts-impact-loop-2 into the 0.1.9 impact-loop batch
swapnilpaliwal-sd Oct 9, 2026
76b4292
Merge origin/fix/java-impact-loop into the 0.1.9 impact-loop batch
swapnilpaliwal-sd Oct 9, 2026
8deef3e
Merge origin/fix/cs-impact-loop into the 0.1.9 impact-loop batch
swapnilpaliwal-sd Oct 9, 2026
6495d8f
Merge local/py-1873 into the 0.1.9 impact-loop batch
swapnilpaliwal-sd Oct 9, 2026
ab1e09b
fix(impact): a test that spawns `python -m pkg` runs pkg/__main__.py
swapnilpaliwal-sd Oct 9, 2026
d202458
fix(python): getattr(self, f"visit_{...}") dispatches to the visit_* …
swapnilpaliwal-sd Oct 9, 2026
ee7d906
fix(python): `with X() as y` types y as X where X.__enter__ returns s…
swapnilpaliwal-sd Oct 9, 2026
b836d07
fix(python): a loop over a mapping's .items()/.values()/.keys() types…
swapnilpaliwal-sd Oct 9, 2026
e4eeb91
fix(python): a parametrize row or a fixture's params= value types the…
swapnilpaliwal-sd Oct 9, 2026
8b6c3ec
fix(python): repr(x), len(x), str(x) and the other one-dunder builtin…
swapnilpaliwal-sd Oct 9, 2026
0646c84
fix(python): a parameter's default value reaches it, as a call-site a…
swapnilpaliwal-sd Oct 9, 2026
857e8f1
fix(parser/python): an import more qualified than a module resolves t…
swapnilpaliwal-sd Oct 9, 2026
32f0b35
feat(python): library callback summaries -- what an installed library…
swapnilpaliwal-sd Oct 9, 2026
9938c30
feat(impact): walk a library calling back into the client, as its own…
swapnilpaliwal-sd Oct 9, 2026
cf5b8bd
feat(path, impact): a library's hand-back is a hop path walks and a d…
swapnilpaliwal-sd Oct 9, 2026
92bf8ed
Merge Python recall fixes (#1883) onto the 0.1.9 batch
swapnilpaliwal-sd Oct 10, 2026
026edf7
Merge Python library callback summaries (#1884) onto the 0.1.9 batch
swapnilpaliwal-sd Oct 10, 2026
48841c5
fix(python): the dispatch cap is off by default for Python; re-freeze…
swapnilpaliwal-sd Oct 10, 2026
9f7d084
fix(python): an operator or a truth test runs its operand's dunder
swapnilpaliwal-sd Oct 10, 2026
a4119ef
fix(python): a library class named through a dotted base, a star re-e…
swapnilpaliwal-sd Oct 10, 2026
0e934b6
fix(impact, path): a library-callback site keeps its name match unles…
swapnilpaliwal-sd Oct 10, 2026
ec6e30d
fix(context): a report whose headline names no code chooses its scope…
swapnilpaliwal-sd Oct 10, 2026
4b50e8e
Merge pull request #1882 from AxiomCodeAI/release/0.1.9-impact-loops
swapnilpaliwal-sd Oct 10, 2026
36cfe80
Merge pull request #1885 from AxiomCodeAI/fix/py-recall-combined
swapnilpaliwal-sd Oct 10, 2026
6ff9a13
docs(skill): explain --library: one entry per dependency, comma-separ…
swapnilpaliwal-sd Oct 10, 2026
a159869
docs(skill): a --library entry is a library IR (the parser's CSV tabl…
swapnilpaliwal-sd Oct 10, 2026
145d8a8
docs(skill): --library wording matches what was checked: `~` after a …
swapnilpaliwal-sd Oct 10, 2026
a9e41b6
feat(index): `--library auto` stages the dependencies the project imp…
swapnilpaliwal-sd Oct 10, 2026
491209c
fix(path): a TypeScript library method is found by its member name; c…
swapnilpaliwal-sd Oct 10, 2026
0e043b3
feat(index): `--library auto` finds a Java project's dependencies thr…
swapnilpaliwal-sd Oct 10, 2026
0a7ec6a
feat(index): `--library auto` compiles a C# project's NuGet packages …
swapnilpaliwal-sd Oct 10, 2026
ccc20b6
feat(index): `--library auto` decompiles a Java dependency that ships…
swapnilpaliwal-sd Oct 10, 2026
c3138c8
feat(refresh): a graph built with --library is stale when a dependenc…
swapnilpaliwal-sd Oct 10, 2026
7ccf339
Merge branch 'apps/integration-0.1.9' into fix/py-recall-3
swapnilpaliwal-sd Oct 10, 2026
bab2b30
feat(refresh): a Java dependency fetched after the build makes a --li…
swapnilpaliwal-sd Oct 10, 2026
473bbb3
Merge pull request #1886 from AxiomCodeAI/fix/py-recall-3
swapnilpaliwal-sd Oct 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,7 @@
*.jpg binary
*.pdf binary
*.sqlite binary

# A torture fixture whose CRLF line endings ARE the trap it sets (a BOM and CRLF in one
# page); normalising it would remove the case the suite asserts.
parser/src/test-data/web/torture/quirks.html -text
44 changes: 41 additions & 3 deletions .github/workflows/build-engines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,9 @@ jobs:
id="$(bash graph/pipeline/run-souffle.sh --language "$lang" --print-engine-id)"
echo "$lang: $id"; printf '%s' "$id" > "gen/$lang.id"
bash graph/pipeline/run-souffle.sh --language "$lang" --emit-program "gen/$lang.dl"
souffle -I graph -g "gen/$lang.cpp" "gen/$lang.dl" 2> "gen/$lang.gen.log" || { cat "gen/$lang.gen.log"; exit 1; }
# -j makes souffle EMIT the parallel loops (without it the C++ has none); whether a
# platform's binary runs them in parallel is decided at compile time below.
souffle -I graph -j 8 -g "gen/$lang.cpp" "gen/$lang.dl" 2> "gen/$lang.gen.log" || { cat "gen/$lang.gen.log"; exit 1; }
awk '/No rules\/facts defined/{skip=2;next} skip>0{skip--;next} {print}' "gen/$lang.gen.log"
done
# the query programs: self-contained (no #include), keyed by dl_program.py itself
Expand All @@ -89,6 +91,33 @@ jobs:
bash .github/scripts/query-smoke.sh expect gen/queries
cp .github/scripts/query-smoke.sh gen/queries/smoke.sh
cp -r /usr/include/souffle gen/souffle
# the seqlock fix (see souffle_overlay in run-souffle.sh): the write-entry RMW
# must be seq_cst or a weakly-ordered CPU lets data stores pass the version-odd
# store and readers validate garbage. Patched here so every platform's binary
# is built from the same fixed headers; the engine id carries +seqlock-fix-4,
# so these headers must carry the SAME patches run-souffle's overlay applies —
# a binary labeled fix-4 but built from lesser headers is the exact mislabeling
# the salt exists to prevent.
# the header layout differs by install (deb: souffle/utility; brew: souffle/souffle/utility),
# so the patched files are FOUND, not assumed — a miss fails the build here, loudly
PU=$(find gen/souffle -name ParallelUtil.h | head -1); [ -n "$PU" ]
sed -i 's/version\.fetch_or(0x1, std::memory_order_acquire)/version.fetch_or(0x1, std::memory_order_seq_cst)/g' "$PU"
grep -q 'fetch_or(0x1, std::memory_order_seq_cst)' "$PU"
! grep -q 'fetch_or(0x1, std::memory_order_acquire)' "$PU"
# fix-3: the publication fences, applied by the same anchored patch the local
# overlay uses (extracted from run-souffle.sh so the two cannot drift)
BT=$(find gen/souffle -name BTree.h | head -1); [ -n "$BT" ]
awk '/^import glob, os, sys$/,/^PYEOF$/' graph/pipeline/run-souffle.sh | sed '$d' > /tmp/fences.py
python3 /tmp/fences.py "$BT"
[ "$(grep -c 'seqlock-fix-3' "$BT")" = "4" ]
# fix-4: the speculative-fetch guards, applied by the same extracted patch
FW=$(find gen/souffle -name ConcurrentFlyweight.h | head -1); [ -n "$FW" ]
RT=$(find gen/souffle -name RecordTableImpl.h | head -1); [ -n "$RT" ]
[ "$(grep -c 'seqlock-fix-4' "$FW")" = "1" ]
[ "$(grep -c 'seqlock-fix-4' "$RT")" = "1" ]
[ "$(grep -c 'seqlock-fix-4' "$BT")" = "1" ]
BD=$(find gen/souffle -name BTreeDelete.h | head -1); [ -n "$BD" ]
[ "$(grep -c 'seqlock-fix-4' "$BD")" = "1" ]
# one key for the whole set; a partial match restores the previous set
echo "key=$(cat gen/*.id gen/queries/*.id | sha256sum | cut -c1-16)" >> "$GITHUB_OUTPUT"
# The compile flags live in THIS file and ENGINE_ID does not cover them, so its
Expand Down Expand Up @@ -135,7 +164,15 @@ jobs:
for lang in $LANGUAGES; do
if cmp -s "gen/$lang.id" "engines/$lang/ENGINE_ID"; then echo "$lang: cached, rules unchanged"; continue; fi
mkdir -p "engines/$lang"
c++ -std=c++17 -O3 -w -static-libstdc++ -static-libgcc -I gen "gen/$lang.cpp" -o "engines/$lang/axiomcode-engine-$lang"
# OpenMP on BOTH architectures: the arm64 crash mode was two weak-ordering
# holes in the vendored headers (write-entry RMW + unfenced node publication),
# both patched above and validated 10/10 under load on linux-arm64 and
# darwin-arm64 (seqlock-fix-3). libgomp links STATICALLY so the binary runs on
# machines with no gcc runtime. The .parallel marker beside the binary is what
# run-souffle.sh reads to pass a real -j at run time.
OMP="-fopenmp -Wl,-Bstatic,-lgomp,-Bdynamic"
c++ -std=c++17 -O3 -w $OMP -static-libstdc++ -static-libgcc -I gen "gen/$lang.cpp" -o "engines/$lang/axiomcode-engine-$lang"
[ -n "$OMP" ] && touch "engines/$lang/axiomcode-engine-$lang.parallel"
cp "gen/$lang.id" "engines/$lang/ENGINE_ID"
done
mkdir -p engines/queries
Expand Down Expand Up @@ -169,8 +206,9 @@ jobs:
fc /b gen\%%L.id engines\%%L\ENGINE_ID >nul 2>&1
if errorlevel 1 (
if not exist engines\%%L mkdir engines\%%L
cl /nologo /std:c++17 /O2 /EHsc /bigobj /w /permissive- /Zc:__cplusplus /D_CRT_SECURE_NO_WARNINGS /DNOMINMAX /DUSE_CUSTOM_GETOPTLONG /I gen gen\%%L.cpp /Fe:engines\%%L\axiomcode-engine-%%L.exe
cl /nologo /std:c++17 /O2 /EHsc /bigobj /w /permissive- /Zc:__cplusplus /D_CRT_SECURE_NO_WARNINGS /DNOMINMAX /DUSE_CUSTOM_GETOPTLONG /openmp /I gen gen\%%L.cpp /Fe:engines\%%L\axiomcode-engine-%%L.exe
if errorlevel 1 exit /b 1
type nul > engines\%%L\axiomcode-engine-%%L.exe.parallel
copy /y gen\%%L.id engines\%%L\ENGINE_ID
) else (
echo %%L: cached, rules unchanged
Expand Down
12 changes: 11 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ permissions:
contents: read

env:
# bin/axiomcode and the parser need Node ≥ 22.5.
# bin/axiomcode and the parser need Node ≥ 22.13 (node:sqlite without a flag).
NODE_VERSION: '22'
SOUFFLE_VERSION: '2.5'
SOUFFLE_SHA512: '6b86e554f6aa5abf8a8b55d8312ae37c0957c5bd6c9edeea89246db9406f645ec5e600b84fe6636b1c163da556f0da6c3d2dad46c1083413f2fcf4f95b9ac62c'
Expand Down Expand Up @@ -371,6 +371,16 @@ jobs:
if: matrix.lang == 'csharp'
run: dotnet build -c Release graph/test/csharp/ground-truth/AxiomCsOracle

# `--library auto` decompiles a dependency that ships no sources jar; the Java query case for it needs Vineflower
- name: fetch the decompiler `--library auto` uses for Java class jars
if: matrix.lang == 'java'
run: mvn -q dependency:get -Dartifact=org.vineflower:vineflower:1.10.1

# `--library auto` compiles a NuGet package by decompiling it; the query case for it needs the decompiler
- name: install the decompiler `--library auto` uses for NuGet packages
if: matrix.lang == 'csharp'
run: dotnet tool install -g ilspycmd --version 8.2.0.7535

- name: cache the Soufflé package
uses: actions/cache@v4
with:
Expand Down
20 changes: 10 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
<a href="https://www.npmjs.com/package/@axiomcode/code-graph"><img alt="npm" src="https://img.shields.io/npm/v/@axiomcode/code-graph?label=npm"></a>
<a href="https://github.com/AxiomCodeAI/axiomcodegraph/actions/workflows/nightly.yml"><img alt="Nightly (dev)" src="https://github.com/AxiomCodeAI/axiomcodegraph/actions/workflows/nightly.yml/badge.svg?branch=dev"></a>
<a href="LICENSE.md"><img alt="License: FSL-1.1-Apache-2.0" src="https://img.shields.io/badge/license-FSL--1.1--Apache--2.0-blue"></a>
<img alt="Node ≥ 22.5" src="https://img.shields.io/badge/node-%E2%89%A5%2022.5-brightgreen">
<img alt="Node ≥ 22.13" src="https://img.shields.io/badge/node-%E2%89%A5%2022.13-brightgreen">
</p>

<p align="center">
Expand Down Expand Up @@ -125,7 +125,7 @@ AxiomCode Graph is two parts. The **engine** (`@axiomcode/code-graph` on npm) pa
graph; it also provides the `axiomcode` command and an MCP server. The **plugin** (`plugins/axiomcode/`) is the
agent-facing frontend: a skill, four MCP tools, and hooks. Install the engine first.

Requirements: **Node ≥ 22.5** and **Python 3** (`python3`, or `python` / `py` on Windows). On Windows, also
Requirements: **Node ≥ 22.13** and **Python 3** (`python3`, or `python` / `py` on Windows). On Windows, also
[Git for Windows](https://git-scm.com/download/win): the CLI runs under its bash. The engine ships as a prebuilt
binary for macOS (Apple Silicon and Intel), Linux (x64 and arm64) and Windows x64, and `npm install` takes the one for
your platform. No Soufflé and no compiler are needed, with one exception:
Expand Down Expand Up @@ -255,8 +255,8 @@ looked up again in the graph before you see it; the `verified:` line is that che

### Support for agents

Every agent below gets the four MCP tools and the skill; the hooks, which add the graph's edges to the agent's
own file reads and searches, run where the last column says so.
Every agent below gets the four MCP tools and the skill; the hooks, which keep the graph current and report what an
edit breaks, run where the last column says so. No hook annotates the agent's own reads and searches.

| Agent | Install | Uninstall | Hooks |
|---|---|---|---|
Expand Down Expand Up @@ -308,12 +308,12 @@ about one change had to read 95 of 43,793 methods, and every true direct caller

## CLI commands

Four questions, each answered as numbered places with the code of the function each one sits in. The MCP server
offers the same four as tools: `find(question)`, `impact(name)`, `path(start, end)` and `tests()`.
Three questions, each answered as numbered places with the code of the function each one sits in. The MCP server
offers the same three as tools: `impact(name)`, `path(start, end)` and `tests()`. Finding where code lives is
left to your own search: bring the name you found to these commands.

| command | what it answers |
|---|---|
| `axiomcode find "<question>"` | where the code for a task lives, when you have it in words and not yet a name |
| `axiomcode impact <name>` | who calls it, what a change to it reaches, and the tests that exercise it |
| `axiomcode impact` | the same for the declarations your uncommitted edits changed; the answer starts with `your edits:` |
| `axiomcode path <A> <B>` | how A reaches B: every hop of the call chain, with the code at each call |
Expand All @@ -334,9 +334,9 @@ command's usage.
The graph stays current on its own. Every file the parser reads is recorded with its hash at build time; after an
edit, a shell command, a finished turn, at session start, and before a query, anything that differs starts one
background rebuild per repository, with the language, `--src` and `--library` of the graph it replaces. Every
command keeps reading the previous graph until the new one is indexed and swapped in. A query waits up to
`AXIOMCODE_FRESH_WAIT` seconds (default 10) for it, then answers from the previous graph with a `graph refresh:` line
naming the files it predates. The MCP server also checks every repository it has answered for once 15 minutes have
command keeps reading the previous graph until the new one is indexed and swapped in. A query answers from the
previous graph at once, with a `graph refresh:` line naming the files it predates and the rows in them marked;
`--fresh` waits for the rebuild instead, and `AXIOMCODE_FRESH_WAIT` (seconds, default 0) lets every query wait that long. The MCP server also checks every repository it has answered for once 15 minutes have
passed since its last update (`AXIOMCODE_REFRESH_INTERVAL`, seconds; 0 turns it off), which catches edits made while
a session sits idle. The graph records when and why it was built in `index_meta` (`refreshed_at`, `refresh_reason`).
`AXIOMCODE_NO_REFRESH=1` turns the rebuilds off, not the check: an answer from a graph older than an edit still
Expand Down
Loading
Loading