Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
421 commits
Select commit Hold shift + click to select a range
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
610623e
Merge pull request #1838 from AxiomCodeAI/apps/integration-0.1.9
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
2f13a96
index: look up symbols by id and refs and literals by file and line t…
swapnilpaliwal-sd Oct 1, 2026
b43cebe
Merge pull request #1847 from AxiomCodeAI/fix/graph-lookup-indexes
swapnilpaliwal-sd Oct 1, 2026
3b2a584
build: export impact's facts in the background once the graph is quer…
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
8077b7e
Merge remote-tracking branch 'origin/0.1.9' into pr1848
swapnilpaliwal-sd Oct 2, 2026
1cb2b38
Merge pull request #1848 from AxiomCodeAI/fix/graph-lookup-indexes
swapnilpaliwal-sd Oct 2, 2026
f574692
tests: a failing case prints the tail of its output, where a tracebac…
swapnilpaliwal-sd Oct 2, 2026
d65fd56
context: export the graph's facts before reading its edges
swapnilpaliwal-sd Oct 2, 2026
147f4a8
Merge pull request #1849 from AxiomCodeAI/fix/context-crash-after-bg-…
swapnilpaliwal-sd Oct 2, 2026
82a0ab2
impact/path: one facts export per graph, however many queries arrive …
swapnilpaliwal-sd Oct 2, 2026
1205b15
impact: an undeclared name that arrives through an import hints at --…
swapnilpaliwal-sd Oct 3, 2026
e8fc153
Merge pull request #1850 from AxiomCodeAI/perf/single-flight-export
swapnilpaliwal-sd Oct 3, 2026
6dde0de
impact/path: the facts export stops paying per-row SQL — 171 s to 55 …
swapnilpaliwal-sd Oct 3, 2026
0d9913f
Merge pull request #1851 from AxiomCodeAI/perf/site-file-per-graph
swapnilpaliwal-sd Oct 3, 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
3d60d3e
impact: a test whose registrar call opens on an earlier line is a test
swapnilpaliwal-sd Oct 10, 2026
0ad6936
impact: a vitest / jest set-up file runs before the tests it configures
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
25296c2
typescript: Object.assign(fn, members) evaluates to fn, so a call of …
swapnilpaliwal-sd Oct 10, 2026
26b20b4
query: a call that selected an overload signature reaches the overloa…
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
a963360
Merge pull request #1890 from AxiomCodeAI/apps/integration-0.1.9
swapnilpaliwal-sd Oct 10, 2026
c933dd3
fix(impact): two static over-reach sources in Python transitive impact
swapnilpaliwal-sd Oct 10, 2026
65510f0
fix(python-engine): a class-object parameter under a union constructs…
swapnilpaliwal-sd Oct 10, 2026
b9c2707
Merge branch 'apps/integration-0.1.9' into fix/context-sensitive-reach
swapnilpaliwal-sd Oct 10, 2026
345ded8
impact: a JavaScript / TypeScript test that never loads the changed f…
swapnilpaliwal-sd Oct 10, 2026
f0edf90
feat(links): agent-asserted call edges — list unknown sites, link the…
swapnilpaliwal-sd Oct 10, 2026
5a39161
javascript: a test that never loads the change is not selected; a moc…
swapnilpaliwal-sd Oct 10, 2026
17d6faa
Merge origin/apps/integration-0.1.9 into fix/js-impact-f1
swapnilpaliwal-sd Oct 10, 2026
ea07409
feat(links): columns, rejections, candidates, derived edges on a link…
swapnilpaliwal-sd Oct 10, 2026
98a78e9
feat(links): a construction links only to its type; not:<target> reje…
swapnilpaliwal-sd Oct 10, 2026
ac21c00
docs(readme): the axiomcode link row in the CLI table
swapnilpaliwal-sd Oct 10, 2026
517fa3b
fix(csharp): accessors dispatch, implicit statement calls, base overl…
swapnilpaliwal-sd Oct 10, 2026
3407450
Merge remote-tracking branch 'origin/fix/context-sensitive-reach' int…
swapnilpaliwal-sd Oct 10, 2026
6aa8e76
Merge branch 'fix/js-impact-f1' into feat/asserted-edges
swapnilpaliwal-sd Oct 10, 2026
fd88fb6
Merge branch 'feat/asserted-edges' into fix/ts-recall-next
swapnilpaliwal-sd Oct 10, 2026
0b3cabd
Merge branch 'fix/ts-recall-next' into fix/ts-impact-f1
swapnilpaliwal-sd Oct 10, 2026
0dbe14c
fix(java): narrower `at load` hop, platform receivers as boundaries, …
swapnilpaliwal-sd Oct 10, 2026
34d0c5f
chore(bundle): regenerate SCHEMA.md for the C# relations
swapnilpaliwal-sd Oct 10, 2026
a523fd3
Merge pull request #1891 from AxiomCodeAI/fix/context-sensitive-reach
swapnilpaliwal-sd Oct 10, 2026
c3c885b
Merge pull request #1894 from AxiomCodeAI/fix/js-impact-f1
swapnilpaliwal-sd Oct 10, 2026
67e996a
Merge pull request #1895 from AxiomCodeAI/feat/asserted-edges
swapnilpaliwal-sd Oct 10, 2026
b26f444
Merge pull request #1888 from AxiomCodeAI/fix/ts-recall-next
swapnilpaliwal-sd Oct 10, 2026
d859ee3
fix(csharp): follow a function handed to a parameter; type a collecti…
swapnilpaliwal-sd Oct 10, 2026
91fc1aa
Merge pull request #1893 from AxiomCodeAI/fix/ts-impact-f1
swapnilpaliwal-sd Oct 10, 2026
f08880e
Merge branch 'apps/integration-0.1.9' into fix/cs-reach-loop
swapnilpaliwal-sd Oct 10, 2026
1393e3e
fix(csharp): an argument's shape prunes overloads; a library-typed re…
swapnilpaliwal-sd Oct 10, 2026
f137788
fix(csharp): initializer writes, null-conditional reads, enumerator e…
swapnilpaliwal-sd Oct 10, 2026
32c5d04
Merge remote-tracking branch 'origin/apps/integration-0.1.9' into fix…
swapnilpaliwal-sd Oct 10, 2026
26badfb
Merge pull request #1896 from AxiomCodeAI/fix/cs-reach-loop
swapnilpaliwal-sd Oct 10, 2026
630dc8a
Merge pull request #1898 from AxiomCodeAI/fix/java-reach-loop
swapnilpaliwal-sd Oct 10, 2026
b2bf49b
Merge pull request #1903 from AxiomCodeAI/apps/integration-0.1.9
swapnilpaliwal-sd Oct 10, 2026
7a5cc43
Merge pull request #1905 from AxiomCodeAI/0.1.9
swapnilpaliwal-sd Oct 10, 2026
db26884
path, context: a refusal in --json mode keeps its prose (#1911)
swapnilpaliwal-sd Oct 10, 2026
21a3111
build-engines: engines start on a clean machine (#1913)
swapnilpaliwal-sd Oct 10, 2026
1445221
Merge pull request #1912 from AxiomCodeAI/fix/path-json-refusal
swapnilpaliwal-sd Oct 10, 2026
090c5f5
build-engines: the OpenMP note names seqlock-fix-4 as well as fix-3
swapnilpaliwal-sd Oct 10, 2026
4ca52b1
path/impact export lock: a liveness probe that is safe on Windows (#1…
swapnilpaliwal-sd Oct 10, 2026
9a10b66
Merge pull request #1917 from AxiomCodeAI/fix/windows-export-lock
swapnilpaliwal-sd Oct 11, 2026
06dba82
library auto: compile a dependency through bash, which Windows needs …
swapnilpaliwal-sd Oct 11, 2026
df13bef
Merge pull request #1914 from AxiomCodeAI/fix/engine-runtime-deps
swapnilpaliwal-sd Oct 11, 2026
ffa5f98
impact --json answers in every form: with no name, the edits; a refus…
swapnilpaliwal-sd Oct 11, 2026
f78f6f5
Merge pull request #1919 from AxiomCodeAI/fix/windows-library-auto
swapnilpaliwal-sd Oct 11, 2026
f11ec33
tests --json: an answer that selects nothing is a document too (#1920)
swapnilpaliwal-sd Oct 11, 2026
ce3907d
Merge pull request #1921 from AxiomCodeAI/fix/impact-json-edits
swapnilpaliwal-sd Oct 11, 2026
3cdf23c
Ship parallel (OpenMP) engines on macOS and Windows too (#1923)
swapnilpaliwal-sd Oct 11, 2026
21a32d7
impact: answer the first query after index, and a warm one, near 0.1.…
swapnilpaliwal-sd Oct 11, 2026
f46e7c2
Packaged engines always solve at -j 8, with no switch (#1923)
swapnilpaliwal-sd Oct 11, 2026
297f6db
Merge pull request #1925 from AxiomCodeAI/fix/parallel-engines-everyw…
swapnilpaliwal-sd Oct 11, 2026
1ca69d4
Merge pull request #1926 from AxiomCodeAI/fix/impact-latency
swapnilpaliwal-sd Oct 11, 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
183 changes: 175 additions & 8 deletions .github/workflows/build-engines.yml

Large diffs are not rendered by default.

44 changes: 42 additions & 2 deletions .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 @@ -253,7 +253,7 @@ jobs:
needs: [changes]
if: needs.changes.outputs.code == 'true'
runs-on: ubuntu-24.04
timeout-minutes: 45
timeout-minutes: 90
env:
# the engine is compiled for any x86-64 runner, so a cached one can be restored
# on whichever runner this job lands (see the engine cache step below)
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 Expand Up @@ -448,6 +458,36 @@ jobs:
# AXIOM_SUITE_JOBS=1 here would run them one at a time, as they used to.
run: bash .github/scripts/run-suite.sh ${{ matrix.lang }} ${{ matrix.oracle }}

# THE QUERY LAYER'S CASES (tests/run.py): what impact, path, context, changed and test-impact answer on small
# projects written for one behaviour each. Every case must pass, and a case marked pending that now passes fails
# the run until the mark is removed, so a fix for one shape cannot quietly break another's answer. The suite
# calls the verbs directly, so it checks their own answers, not the front-door rendering (tests/front_door.py).
- name: ${{ matrix.lang }} query cases
env:
AXIOM_PARSER: ${{ github.workspace }}/parser/dist/index.js
AXIOM_SOUFFLE_CACHE: ${{ github.workspace }}/.souffle-cache
run: python3 tests/run.py --lang ${{ matrix.lang }} --jobs 4

# the small surface as users and agents get it: find / impact / path / tests through the installed command and
# the MCP server, answered as places with their code, and the direct calls and flags that keep the old answers
- name: the front door answers as places with their code
if: matrix.lang == 'python'
env:
AXIOM_PARSER: ${{ github.workspace }}/parser/dist/index.js
AXIOM_SOUFFLE_CACHE: ${{ github.workspace }}/.souffle-cache
run: python3 tests/front_door.py

# The hooks answer impact from SQL (graph_sql.impact_shaped) and fall back to the rules (dl/impact.dl) only when
# it declines, so the two must list the same rows for the same edit: tests/fastpath.py indexes a small case, asks
# both on each target shape, and runs hooks/changes.py on one edit through each path. Same parser and engine
# cache as the suite above. Not typescript: its case needs the TypeScript engine; javascript has no case.
- name: the hooks' fast path agrees with the rules (${{ matrix.lang }})
if: matrix.lang == 'python' || matrix.lang == 'java' || matrix.lang == 'csharp'
env:
AXIOM_PARSER: ${{ github.workspace }}/parser/dist/index.js
AXIOM_SOUFFLE_CACHE: ${{ github.workspace }}/.souffle-cache
run: python3 tests/fastpath.py --lang ${{ matrix.lang }}

# Saved whether or not the suite passed. The binary does not depend on the verdict:
# run-souffle.sh publishes it only whole and verified (a temp name, then a rename),
# so a red run's engine is as good as a green one's, and the run that most needs the
Expand Down
147 changes: 79 additions & 68 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 @@ -100,7 +100,7 @@ That matters because an agent follows edges several hops deep, and one missed li
<img src="docs/images/impact-graph.png" width="640" alt="axiomcode graph of an open-source TypeScript web framework, 366 files and 8,657 call edges. Source files form the inner ring, test files the outer ring. A change to basicAuth reaches 7 test files through resolved calls (solid blue); the other 130 test files have no chain to it (dashed red). basicAuth calls a shared compare function (green) that 11 other files also reach (gold).">
</p>

*`axiomcode graph` on an open-source TypeScript web framework, asked which tests a change to `basicAuth` can
*The call graph of an open-source TypeScript web framework, drawn as a page and asked which tests a change to `basicAuth` can
affect. Source files form the inner ring and test files the outer one. The solid blue paths are chains of resolved
calls from `basicAuth` to the 7 test files that must run; the dashed red ones mark the other 130, which have no
chain to it and can be skipped. Green is the shared `compare` that `basicAuth` calls, and gold the 11 other files
Expand All @@ -123,9 +123,9 @@ established relationships that could lead to false positives.

AxiomCode Graph is two parts. The **engine** (`@axiomcode/code-graph` on npm) parses a repository and builds its
graph; it also provides the `axiomcode` command and an MCP server. The **plugin** (`plugins/axiomcode/`) is the
agent-facing frontend: a skill, seven MCP tools, and hooks. Install the engine first.
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 @@ -200,56 +200,63 @@ axiomcode path main Ledger.put
axiomcode path main SqlStore.put
```

```
main → Ledger.put: 1 of 1 target(s) reached through resolved calls; nearest at 2 hop(s)
2 call(s):
main src/main.ts:6
→ [known_edge · call @ src/main.ts:9] OrderService.place src/orders/orderService.ts:7
→ [known_edge · call @ src/orders/orderService.ts:8] Ledger.put src/ledger/ledger.ts:4
verified: every printed hop is an edge in the graph and a second, independent traversal finds the same length

main → SqlStore.put: 1 of 1 target(s) reached through resolved calls; nearest at 2 hop(s)
2 call(s):
main src/main.ts:6
→ [known_edge · call @ src/main.ts:9] OrderService.place src/orders/orderService.ts:7
→ [multi_inferred · call @ src/orders/orderService.ts:9] SqlStore.put src/storage/sqlStore.ts:6
verified: every printed hop is an edge in the graph and a second, independent traversal finds the same length
what the hops are:
[known_edge] resolved to one declaration
[multi_inferred] several declarations fit; each is a real candidate
```

The first chain is `known_edge` all the way: each call has exactly one target. The second ends in
`multi_inferred`, because `store.put` can run `SqlStore.put` or `MemoryStore.put`, depending on which store `main`
built; the graph keeps both as candidates instead of picking one.
Every answer is a numbered list of places, each with the code of the function it sits in and the line that matters
marked `→`:

````
1. src/main.ts:9 [resolved · hop 1/2 main → OrderService.place]
```typescript
6 export function main(useSql: boolean): void {
7 const store = useSql ? new SqlStore("orders") : new MemoryStore();
8 const service = new OrderService(new Ledger(), store);
→ 9 service.place("A-1", 42);
10 }
```
2. src/orders/orderService.ts:8 [resolved · hop 2/2 OrderService.place → Ledger.put]
```typescript
7 place(id: string, amount: number): void {
→ 8 this.ledger.put(`order ${id}: ${amount}`);
9 this.store.put(id, amount);
10 }
```
verified: ✓ (2 edge(s) looked up again)
````

The second chain ends the same way, at `src/orders/orderService.ts:9`, tagged `one of a set`: `store.put` can run
`SqlStore.put` or `MemoryStore.put`, depending on which store `main` built, and the graph keeps both as candidates
instead of picking one.

From an agent, ask in plain words. The skill tells the agent to query the graph instead of grepping:

```
````
> What breaks if I change SqlStore.put?

axiomcode_impact("SqlStore.put")
must change with it (1: bound by a contract the engine resolved):
Store.put src/storage/store.ts:2 — it implements this
reads or uses it (3 callable(s): 1 one of a set, 2 alongside):
[one of a set] OrderService.place src/orders/orderService.ts:9 — calls it
...
reaches those through resolved calls: 4 more callable(s) in 3 file(s)
src/main.ts: main → OrderService.place
tests: 1 of 1 test method(s) reach the change
test files: test/orderService.test.ts (1)
verified: 2 printed edge(s) looked up again in the graph, all present
```

The change reaches the entry point and the test through a call that never names `SqlStore`.

Each hop carries the line the call is on, how certain the edge is, and what kind of call it is. Every printed
edge is looked up again in the graph before you see it; the `verified:` line is that check reporting.
impact("SqlStore.put")
1. src/storage/store.ts:2 [must change · it implements this]
```typescript
→ 2 put(key: string, value: number): void;
```
2. src/orders/orderService.ts:9 [one of a set · OrderService.place]
```typescript
7 place(id: string, amount: number): void {
8 this.ledger.put(`order ${id}: ${amount}`);
→ 9 this.store.put(id, amount);
10 }
```
3. src/main.ts:6 [hop 2]
...
4. test/orderService.test.ts:3 [test · one of a set · hop 3]
...
verified: ✓ (3 edge(s) looked up again)
````

The change reaches the entry point and the test through a call that never names `SqlStore`. Every printed edge is
looked up again in the graph before you see it; the `verified:` line is that check reporting.

### Support for agents

Every agent below gets the seven 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 @@ -301,40 +308,44 @@ about one change had to read 95 of 43,793 methods, and every true direct caller

## CLI commands

| command | what it does |
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 path <A> <B>` | the chain of calls from A to B, hop by hop. `'*'` as one end gives the whole closure |
| `axiomcode impact <target>` | everything that has to be looked at again when a declaration changes, each labelled with how certain it is. `--tests` adds the tests that reach it |
| `axiomcode test-impact` | which tests have to run for the current edit, with the chain that reaches each |
| `axiomcode changed` | which declarations an edit changed, and how (signature, type, body, added, removed). `--impact` adds what that reaches |
| `axiomcode context "<task>"` | where a task's words land in the code, when you have a problem statement and not yet a name |
| `axiomcode graph` | the whole graph as one self-contained HTML page, at `.axiomcode/graph/graph.html`, drawn from the existing graph (rebuilt first only when stale, with the flags it was indexed with) |
| `axiomcode index` | build or rebuild the graph explicitly; `--lang`, `--src` and `--library` narrow it |
| `axiomcode mcp` | serve the graph to an agent as MCP tools over stdio |

A target is written the way it appears in the code: `Owner.method`, `method`, `Type`, `Owner.field`, or
`file.py:123`. It is resolved exactly; a miss lists the nearest names. `--range <a>..<b>` compares two commits. The
query commands take `--json`. `axiomcode help <command>` prints one command's usage.
| `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 |
| `axiomcode tests` | the tests your uncommitted edits reach, and a last `run:` line with the command that runs them |
| `axiomcode link <file:line> <target>` | record where a call the graph could not resolve lands (kept in `axiomcode-links.tsv`); impact, path and tests then walk it, labelled `[asserted]`. Alone, lists the links and whether each was applied |
| `axiomcode index` | build the graph explicitly (the first query builds it too); `--lang`, `--src` and `--library` narrow it |

A name is written the way it appears in the code: `Owner.method`, `method`, `Type`, `Owner.field`, or
`file.py:123`. It is resolved exactly; a miss lists the nearest names. `axiomcode help <command>` prints one
command's usage.

> [!NOTE]
> `changed` and `test-impact` compare the working tree with a **baseline**: the last commit (right after an explicit
> `axiomcode index`, the tree it indexed). The background refresh (below) resets it whenever HEAD moves (a commit, a
> merge, a pull, a checkout), so committed edits drop out and nothing accumulates; the two commands wait up to 30 s
> for that. While edits are uncommitted, they read the baseline's own graph, kept in `.axiomcode/base`, so a removed
> method still shows all its callers.
> `impact` with no name and `tests` compare the working tree with a **baseline**: the last commit (right after an
> explicit `axiomcode index`, the tree it indexed). The background refresh (below) resets it whenever HEAD moves (a
> commit, a merge, a pull, a checkout), so committed edits drop out and nothing accumulates. While edits are
> uncommitted, they read the baseline's own graph, kept in `.axiomcode/base`, so a removed method still shows all its
> callers.

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
ends with a `graph refresh: OFF` line naming the files it predates. When a name asked about finds nothing and an
edit since the graph was built writes that name, the line says so, since the declaration may simply be too new
for the graph. The log is `.axiomcode/refresh.log`.
for the graph. A query that does start a rebuild says so on its answer's first line, with the reason. The
hooks and the MCP server's timer never rebuild a graph another axiomcode built (another engine, other rules or another
`IMPACT_VERSION` in its build stamp); a hook says so once per session. The log is `.axiomcode/refresh.log`.

## Graph output

Expand Down
Loading
Loading