Skip to content

Promote apps/integration-0.1.9 into 0.1.9 - #1823

Merged
swapnilpaliwal-sd merged 12 commits into
0.1.9from
apps/integration-0.1.9
Sep 30, 2026
Merged

swapnilpaliwal-sd merged 12 commits into
0.1.9from
apps/integration-0.1.9

Conversation

@swapnilpaliwal-sd

Copy link
Copy Markdown
Contributor

swapnilpaliwal-sd and others added 12 commits September 30, 2026 00:29
…ts source

A monorepo imports a sibling package by its name, and that package's main /
types / exports name build output that is not in the source tree. tsc then
resolved nothing, or a dist file no program walks, so every call, type and
const across the package boundary was matched by name only. The package-entry
rows already map a dist target back to the source it is built from; import
resolution now uses the same mapping (subpaths and patterns included) for any
bare specifier whose package.json lives under the walked tree, in the
TypeScript and JavaScript front ends. A package tsc resolves inside
node_modules is left alone.

impact: asked of an interface method, the implementations the engine
dispatches to are listed under "must change with it". Without an override
table they had no row at all, and one only surfaced through a wrong by-name
edge that the resolved import removed. The hook's SQL summary gets the same
leg and now drops shape-only pairs as the rules do.

Tests: new TypeScript case 85-workspace-package-import (scoped package with
exports, subpath, pattern, unscoped deep import, a field-typed receiver, and a
third-party control); the three JavaScript alias cases fold into
70-bare-specifier-to-project-source with a workspace-package table row; the
dispatch-base CLI case checks the base side.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
…hers of that type [by key]

A service publishes an event by its type string, often through a constant
(publish(TOPICS.CREATED, doc)); another holds a handler table keyed by the
same string ({ [TOPICS.CREATED]: onCreated }, { 'doc.created'(e) {} },
{"doc.created": on_created}) that a consumer dispatches by the message's
type. Nothing joined the two ends.

- ax_registration: table entries are registrations (kind table); string
  constants resolve to their value; a key written as a dotted literal or
  through a constant is a write, never the table's own key position or the
  constant's declaration.
- impact.dl: impact of a publisher lists each handler of its type [by key];
  tests that publish the type reach the handler. Only production writers
  count against the key cap, and a handler writing its own type is no writer.
- path and the SQL port's key join read the same writes.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
…join-across-services

impact, path: a handler table keyed by an event type joins the publishers of that type [by key]
…same-named field on its line

What was wrong
- `const meta: EventMeta = { eventId: options.eventId ?? … }` stopped listing its function
  under `impact EventMeta.eventId`. The per-line rule that drops a name match on a line where
  the engine bound a field access (to this field or to another field of that name) drops every
  ref of that name on the line. Refs carry no column, and TypeScript stored the literal key
  `eventId` as a plain UNKNOWN identifier, so the key went with the bound `options.eventId`
  read of PublishOptions.eventId. field_access has no row for an object literal key, so
  nothing else reported the write.

The change
- axiomcode-index: a TypeScript expression in the OBJECT_PROPERTY_KEY role is stored with
  entity kind OBJECT_PROPERTY_KEY instead of UNKNOWN.
- dl/impact.dl: fref keeps a ref of that kind past fa_line. A bound access on another line,
  and the bound access itself, are still not this field's readers.
- IMPACT_VERSION 56.

tests/cases/typescript/object-key-beside-a-bound-access: red before, green after, with two
controls (a line that only reads the other type's field stays out; the bound read stays the
other field's resolved reader). tests/run.py --lang typescript: 204 of 204.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
…nd-access

impact: a TypeScript object-literal key survives the bound-field-access line rule
…s with their code

An agent was offered 8 MCP tools with 69 parameters and ~10,000 characters of descriptions, and the CLI 10-37 flags
per verb; in practice agents asked two questions with no options, and after every located answer read the file.

The offering is now four questions and a setup verb, the same on the CLI and over MCP, with no options:
- find "<question>" / find(question): where the code for a task lives (context underneath); a name the task writes
  that the code calls and nothing declares is listed with its call sites
- impact <name> / impact(name): callers, what a change reaches, the tests; with no name, the same for the
  declarations the uncommitted edits changed
- path <A> <B> / path(start, end): the call chain
- tests / tests(): the tests the uncommitted edits reach, and the command that runs exactly those
- index: build the graph (--lang, --src, --library)

Each answer is numbered places, each with the enclosing function's code (whole when short, else its header and a
window around the lines that matter), one block per function, at most 10, word-match filler and module-scope rows
dropped (ax_blocks.py). The shape applies at the front doors (the installed command, the MCP server) when no flag is
passed; the dispatcher called directly, AXIOMCODE_RAW, or any flag gives the verb's own answer, so hooks, suites and
scripts are unchanged. Old verbs and flags still work and are no longer advertised.

Help, SKILL.md, AGENTS.md, the Cursor rule, the Gemini copy, README and the hooks' hints teach only the four.
MCP answers drop any clause that names an option the tools refuse; code blocks are never touched.

CI: engine (<lang>) runs tests/run.py --lang <lang> after the engine suite (every case must pass; a pending case
that passes fails until its mark is removed), and the python leg runs tests/front_door.py, which checks the shape
through the installed command and MCP and that direct calls and flags keep the old answers.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
A small surface: find, impact, path and tests, answered with their code; CI runs the query cases
…ackage-import-to-source

parser: a bare import of a package the repository declares binds to its source
…s four at a time

The query-case step made engine (typescript) a 28-minute job (19 of them the cases, one after another). Each case
indexes its own directory and shares nothing but the compiled rules, so the first case runs alone (it compiles and
caches them) and the rest run N at a time; each case's output is printed as one block, in case order.
TypeScript locally: 175 s -> 41 s with --jobs 6, the same 204/204 checks and the same case order and outcomes.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
typescript/evidence-for-uncertain-rows indexed five languages, so the typescript leg compiled the java, csharp,
python and javascript engines it has no cache for: 964 s of the leg's 19-minute query-case step, where the median
case takes 4 s. The case is now one per language (ts 9 checks, js 1, python 1, java 2, csharp 1), each indexed in
the leg whose engine is already built; the 14 checks are unchanged.

Co-authored-by: axiomcode-bot[bot] <334110751+axiomcode-bot[bot]@users.noreply.github.com>
tests/run.py --jobs N; CI runs the query cases four at a time
@swapnilpaliwal-sd
swapnilpaliwal-sd merged commit b62cb79 into 0.1.9 Sep 30, 2026
12 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