Skip to content

Release 0.1.10 - #1946

Merged
swapnilpaliwal-sd merged 27 commits into
mainfrom
dev
Oct 13, 2026
Merged

swapnilpaliwal-sd merged 27 commits into
mainfrom
dev

Conversation

@swapnilpaliwal-sd

Copy link
Copy Markdown
Contributor

Features

  • plugin: axiomcode graph draws the codebase as a page again #1938 axiomcode graph is 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
  • plugin: show the user, after each turn, where an AxiomCode answer verifiably helped the agent (#1935) #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 report renders the record as an HTML page, and AXIOMCODE_ASSISTS=off turns it off plugin

Improvements

Bugs

swapnilpaliwal-sd and others added 27 commits October 10, 2026 13:46
…er keeps its own version)

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
…ifiably helped the agent (#1935)

Agents finish a task with and without the graph and rarely credit the answer they acted on. A Stop hook
(hooks/assist.py) now reads the session's transcript at the end of each turn and prints, under the reply,
one line per chain an answer started:

    ◆ AxiomCode this turn
      • Helped: `impact _proxy_to_logger` showed _base.py (first seen there); edited it, read _native.py,
        twisted.py; both picked test files pass

Labels, strongest first: Redirected (the work moved from files left behind to one the answer showed),
Helped (a file first seen in the answer was edited and the edit is kept, or a test verb's picked tests
passed), Useful (it was read, or its picked tests ran). "First seen" means no earlier prompt, tool call,
tool result or hook context named the file.

Nothing comes from the agent's text: its reply is on screen before a Stop hook runs. Every link is read
from tool calls and results and the working-tree diff, and an unchecked link is not printed. A shell line
that batches the query with grep or cat credits only rows shaped like an answer's. A shell edit counts
only for the file the line writes, and a test run is credited once. Turns where nothing came of a query
print nothing.

Chains go to .axiomcode/assists.jsonl, which only the hook writes. A chain prints once, and again only
when it gets stronger. `axiomcode report` renders them as .axiomcode/assists.html.
AXIOMCODE_ASSISTS=off turns it off.

tests/assists.py: 32 checks over synthetic transcripts, a case each rule must credit and a near case it
must not, plus the hook end to end.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
…e files and tests behind each (#1935)

Each chain now reads cause → action → effect with the concrete files edited or read and the picked test files that
passed. The header counts the answers that led the agent's work; answers that led nowhere are never counted or
shown, and a label no chain earned gets no tile in the report.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
…eipt (#1935)

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
…s and from shell edits (#1935)

- A graph note the plugin's own hooks put in front of the agent (the callers an edit reaches, where a task
  lands) is an answer like a tool call's; its hook_success copy no longer marks its files seen first.
- A shell line that edits files and also runs axiomcode keeps its edits, and a helper the script defines and
  calls with a path (def sub(path, ...): ...write_text...) writes that path.
- A row about a name the task already gave is the task's lead, not the answer's (the name asked about is
  exempt: it is on every caller's line); a note credits a file:line, not a file summary.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
… with every action inspectable (#1935)

- The report opens on the outcome (sessions, answers acted on, previously unseen files edited, selected
  tests passing), then the three ways answers showed, featured timelines, every answer expandable to its
  recorded actions by sequence number, and the rules each label is assigned by.
- Receipts and report say what happened: the agent acted on N answers; an answer pointed the agent to a
  file directly, before it had come across it.
- camelCase names a task gives are the task's lead; a runner config under test/ is not a test file; a run
  that exits 0 but reports failures is not a pass.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
…record, and the receipt links it (#1935)

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
…ent with a query are not credited to it (#1935)

The Stop hook hands the receipt back to the agent once (decision "block"), which ends its reply with it, so it is part of
the answer in every client. The second stop checks the reply carries every line and shows it as a message when it
does not. Gemini keeps the message.

A file the agent read in the same message as a query was named before the answer came back; it is no longer credited
to that answer.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
…est run (#1935)

A test line exits 0 when it ends in `| tail` or `; ruff check`, including a run that never started (a missing module,
a collection error, every test deselected), so exit 0 was counted as a pass. A pass now needs the runner's own pass
line with no failure or error beside it, and a test file passes when its latest run does.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
…ests (#1935)

A follow-up turn that asks `tests` again and runs what it picked was credited to the first turn's answer, so the turn
that acted on it printed nothing.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
The terminal shows a Stop hook's hand-back reason as well as the reply, so a receipt handed back to the agent there
was printed twice. In the terminal it is a message under the reply again; headless runs and IDEs, where a hook
message may never reach the user, still have the agent end its reply with it.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
The terminal did not show the Stop hook's message, so the receipt disappeared there.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
…t it went further (#1935)

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
Where the last build took 20 s or more, edits are batched and the Nth one starts the rebuild. Seven lets a typical
multi-file change land before the graph rebuilds. The end of a turn, a prompt, a session start and every query still
refresh at once, so an answer never waits on the batch. AXIOMCODE_REFRESH_BATCH still overrides it (1 = off).

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
It left the dispatcher when the surface was cut to the query verbs. It is back as a public verb, for the user rather
than the agent: one page of directories, files, types and methods with the call edges between them, drawn from the
existing graph (rebuilt first only when a source file changed) and its path printed last. It is not an MCP tool.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
At the front door (MCP, the installed command) impact, path and tests answer as ten
numbered places built from the verb's --json document, and the verb's summary was prose
only, so it never reached that view. `path main '*'` on a tree with 22 functions named
`main` opened at a test script's row 1 and read as one start, with no total and no count
per hop; `impact getCsvHeader` never said it was the union of 27 declarations.

The verbs now write it as data: path a `closure` (label, declarations, methods, files,
tests, by_hop) and, for a chain, `ends`; impact a `declarations` count on each target,
read from the label every resolver already writes it into. ax_grep.head turns those
into the opening lines of both the places view and --grep, with the graph named when
several languages answer. A single declaration, a chain between single declarations
and a document without the fields render exactly as before.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
plugin: the places view opens with what the question resolved to (#1939)
plugin: a slow graph rebuilds after 7 edits instead of 5
plugin: axiomcode graph draws the codebase as a page again
Both sides added a public verb in the same places: `report` here, `graph` on integration. Keep both, in the help
block, the dispatch table, SKILL.md (both copies) and the surfaces audit's PUBLIC / NO_MCP lists.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
… under its build directory

A library root was walked with the project skip list, so dist/, build/ and out/ were
skipped. A package whose root .d.ts re-exports ./dist/... staged only the root files, and
a package whose every declaration sits under dist/types/ was not detected as TypeScript at
all. Every TypeScript call into such a package stayed ambiguous_unknown although it was
passed with --library.

The TypeScript analyzer now takes libraryRoot (as the JavaScript one does), and a library
walk keeps the build-output directories. A library root that no detector calls TypeScript
but whose package.json declares types (types/typings, or a types condition in exports)
is analysed as one. The project under analysis is unchanged: dist/ stays skipped.

Two discovery checks, each with a control: a re-exporting package as library vs as project,
and a dist-only typed package vs an untyped one.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
plugin: show the user, after each turn, where an AxiomCode answer verifiably helped the agent (#1935)
typescript: a dependency staged with --library keeps the declarations under its build directory
… starts it on time

At '0 8 * * *' the last 20 scheduled runs started 5 to 9 hours late (12:30-17:00 UTC):
GitHub queues schedules that fire on the hour behind everyone else's. Cron is UTC only,
so this is 1:31 AM in daylight time and 12:31 AM in standard time.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
nightly: run around 1 AM Pacific, off the hour
@swapnilpaliwal-sd
swapnilpaliwal-sd merged commit afafae2 into main Oct 13, 2026
20 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant