Skip to content

v0.14.0

Latest

Choose a tag to compare

@github-actions github-actions released this 10 Nov 02:16
· 46 commits to main since this release
e2b70b3

Install

Quick install (no repo needed)

# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/ix-infrastructure/Ix/main/scripts/install/install.sh | bash

# Windows (PowerShell)
irm https://raw.githubusercontent.com/ix-infrastructure/Ix/main/scripts/install/install.ps1 | iex

# Homebrew
brew tap ix-infrastructure/ix https://github.com/ix-infrastructure/Ix
brew install ix
ix docker start

Docker image

docker pull ghcr.io/ix-infrastructure/ix-memory-layer:latest

Highlights

  • Better answers for ambiguous and missing targets. When a name matches several symbols, lookups now answer for the top candidate and say which one was chosen, listing the others (spread across files and named by container) for --pick. A name that is not a code symbol but appears in source files is answered with those files. A name found nowhere gets bounded "did you mean" suggestions.
  • More call and inheritance edges. Receiver types are inferred for Python, Java, Scala, TypeScript and Go, so method calls through typed receivers resolve to the right method. Python package imports resolve, and inheritance is recorded for generic, namespaced and dotted base classes in TypeScript, JavaScript and Python.
  • Resolution no longer depends on batch boundaries. A persisted symbol table lets incremental runs resolve cross-file edges the same way a fresh map does, and dependent files are re-resolved when the names they use change.
  • ix context for issues. Issue entities are ranked by definition, with bounded companion files, evidence tiers, ranked callers and a "used in" line for each named symbol. --max-tokens is charged against the text actually printed.
  • New commands. ix verify compares the graph with a fresh parse. ix overrides lists a method's overrides and implementations. ix install is a menu over the skill installer. ix note and ix session work against the local backend.
  • Paging and limits. --offset paging for callers, callees, imports, imported-by, contains, inventory and text; --limit for ix smells and the ix_impact MCP tool; long lines in ix text snippets are capped; symbol reads are capped with a next= cursor.
  • Faster on the agent path. Only the command being run is loaded, and ix map no longer recomputes the system map on every edit: region readers refresh it lazily and report when it is stale.
  • Safer ingest. Transient 5xx and 429 bulk commits are retried with Retry-After, oversized files are reported (including in JSON and llm output), bulk requests are bounded by op count, nodes the extractor no longer emits are removed, and ix ingest of an outside path never widens what ix read can open.
  • Safer defaults. The local token is opt-in and is never sent to a non-local endpoint; ArangoDB is no longer published on the host; the standalone compose caps ArangoDB's caches; workspaces are never deleted automatically, and pinned workspace ids are honoured.

Changes that can affect scripts and agent plugins

  • Exit codes for graph lookups. Each outcome has its own code: 0 results, 1 a real error, 2 ambiguous target (with --strict), 3 target found nowhere, 4 workspace not mapped. The json and llm formats carry the matching error slug. Set IX_LEGACY_EXIT_CODES=1 to collapse 2, 3 and 4 back to 1. Lookups also accept --all and several targets in one call.
  • Ambiguous and text-only targets now exit 0. An ambiguous name is answered for its top candidate with an ambiguous_target notice; a name found only in source text is answered with those files. Pass --strict or set IX_STRICT_TARGETS=1 to get exit 2 and 3 instead.
  • Several --format json outputs gained fields (for example offset, path, lineStart and lineEnd in ix impact rows, status.graphHealth, mapStale). No fields were removed.

Upgrade notes

  • The first ix map after upgrading re-parses every file once, because the extractor changed to tree-sitter/1.30. Later runs are incremental again. The graph will usually gain symbols and edges.
  • Use it with backend 1.0.35. ix docker start pulls the current backend image. This release also works with backend 1.0.34.

What's Changed

  • chore(brew): update formula for v0.13.0 by @github-actions[bot] in #799
  • chore(deps): Bump sharp from 0.35.4 to 0.35.5 in /docs-site by @dependabot[bot] in #795
  • chore(deps): Bump source-map-js from 1.2.1 to 1.2.2 in /docs-site by @dependabot[bot] in #794
  • chore(deps-dev): Bump source-map-js from 1.2.1 to 1.2.2 in /ix-cli by @dependabot[bot] in #796
  • chore(deps-dev): Bump source-map-js from 1.2.1 to 1.2.2 in /core-ingestion by @dependabot[bot] in #797
  • chore(deps-dev): Bump smol-toml from 1.8.0 to 1.9.0 in /ix-cli by @dependabot[bot] in #798
  • fix(ingest): delete-bearing patches go through bulk; reconcile concurrently (IN-04) by @KageBinary in #808
  • fix(ingest): ix map reports oversized files; --github pages past 100 with a stable patch id (IN-19 part A) by @KageBinary in #811
  • fix(ingest): bound bulk requests by ops; a run remembers a reduced size (IN-05) by @KageBinary in #809
  • fix(security): opt-in local token; ArangoDB no longer published (SEC-02) by @KageBinary in #803
  • fix(mcp): a timed-out tool call aborts its work (CL-14) by @KageBinary in #805
  • perf(client): every client caps requests, bounds reads, retries a read once (CL-15) by @KageBinary in #806
  • fix(config): loud parse errors, no lost registrations, one parse per process (CL-18) by @KageBinary in #807
  • fix(cli): status and doctor stop vouching for what they did not check (CL-17) by @KageBinary in #804
  • feat(ingest): resolution independent of batch boundaries by @KageBinary in #764
  • fix(ingest): resume a bulk commit from committed_patch_ids on a plan-mismatch 409 by @KageBinary in #818
  • fix(diff): ix diff passes the workspace, and --full asks for a real limit by @KageBinary in #819
  • fix(client): never send IX_TOKEN to a non-local endpoint by @KageBinary in #814
  • feat(client): send X-Correlation-Id by @KageBinary in #816
  • test(ingest): make the IN-05 and one-file-batch timing tests reliable on slow runners by @KageBinary in #815
  • feat(map): report files_too_large in JSON and llm output by @KageBinary in #817
  • fix(ingest): lower the learned bulk size only on a 413 that states a size by @KageBinary in #813
  • fix(docker): read-only ix docker commands don't rewrite ~/.ix/backend/.env by @KageBinary in #812
  • perf(ingest): the symbol table writes only what changed by @KageBinary in #820
  • chore(deps-dev): Bump the dev-dependencies group in /ix-cli with 3 updates by @dependabot[bot] in #842
  • chore(deps): Bump @modelcontextprotocol/sdk from 1.31.0 to 1.32.1 in /ix-cli in the production-dependencies group across 1 directory by @dependabot[bot] in #843
  • chore(deps): Bump ix-infrastructure/ix-memory-layer from 1.0.32 to 1.0.34 in /ix-cli/test/e2e by @dependabot[bot] in #846
  • chore(deps): Bump the actions group across 1 directory with 7 updates by @dependabot[bot] in #844
  • fix(docs-site): override postcss-selector-parser to 7.1.6 under postcss-nested by @josephismikhail in #851
  • test(core-ingestion): fit a growth exponent in the parseFile perf test instead of one 4x ratio (QA-08) by @KageBinary in #849
  • refactor(cli): remove dead computeLineDiff and constructor-only client test, skip properly in discovery tests (QA-06C) by @KageBinary in #830
  • test(ix-cli): render the logo once per file in bootstrap-notice tests (QA-06D) by @KageBinary in #832
  • test(search): QA-06A test the real rankScore and add an id tiebreak to searchSort by @KageBinary in #829
  • test(cli): replace source-grep tests with behaviour tests (QA-06B) by @KageBinary in #831
  • fix(cli): target resolution stops guessing silently (CL-19) by @KageBinary in #847
  • feat(cli): --offset paging for callers, callees, imports, imported-by and contains (HR-02A) by @KageBinary in #825
  • fix(cli): cap ix impact leaf llm rows at --limit and add path:lines (CL-20E) by @KageBinary in #827
  • feat(mcp): add limit input to ix_impact (CL-20H) by @KageBinary in #835
  • feat(cli): --offset paging for inventory and text, deterministic ix text order (HR-02B) by @KageBinary in #837
  • fix(cli): cap long lines in ix text snippets (HR-01) by @KageBinary in #822
  • fix(context): charge --max-tokens against the text actually emitted (CL-06) by @KageBinary in #821
  • docs(mcp): using Ix behind headroom or another compressing proxy (HR-05) by @KageBinary in #824
  • fix(mcp): make ix_context structured output cache-stable by omitting generatedAt (HR-04A) by @KageBinary in #823
  • feat(cli): bound ix smells with --limit, count/shown and a non-source orphan filter (CL-20C) by @KageBinary in #828
  • ci(security): REL-07 CI security tooling sweep (gitleaks history scan, harden-runner, compass token scrub) by @KageBinary in #833
  • fix(trace): validate --depth/--cap and label --to steps with their predicate (CL-20G) by @KageBinary in #836
  • refactor(ingest): remove dead commit-path code and cover fsmonitor on untracked discovery (IN-19B) by @KageBinary in #839
  • test(ingest): fill the missing-behaviour matrix (QA-07) by @KageBinary in #848
  • [jarvis] fix(backend): cap ArangoDB's caches in the standalone compose by @KageBinary in #856
  • ci: accept a leading [jarvis] tag in the conventional title check by @KageBinary in #857
  • feat(read): cap symbol reads at READ_LINE_CAP with a next= cursor (CL-20B) by @KageBinary in #826
  • feat(ci): check .mdx files, docs-site route links and anchors in check-links by @Alot1z in #800
  • [jarvis] feat(cli): distinct exit codes, --all and multi-target for graph lookups by @TannerTorrey3 in #853
  • [jarvis] feat(context): evidence tiers, ranked callers, one used-by row by @KageBinary in #852
  • chore(deps-dev): Bump the dev-dependencies group across 1 directory with 2 updates by @dependabot[bot] in #859
  • fix(ingest): ix ingest of an outside path never widens what ix read can open (CL-05) by @KageBinary in #840
  • chore(deps): Bump zod from 4.6.5 to 4.6.7 in /ix-cli in the production-dependencies group across 1 directory by @dependabot[bot] in #861
  • [jarvis] perf(cli): load only the command being run on the agent-facing path by @KageBinary in #858
  • fix(cli): re-anchor stale ix context next rows and flag them stale (CL-20F) by @KageBinary in #834
  • chore(deps): Bump arangodb from 3.12.11 to 3.12.12 by @dependabot[bot] in #864
  • chore(deps): Bump the production-dependencies group in /docs-site with 4 updates by @dependabot[bot] in #865
  • fix(ingest): remove nodes the extractor no longer emits on same-content rebuilds (IN-20) by @KageBinary in #850
  • fix(cli): keep ix context off the read command module by @KageBinary in #874
  • chore(deps): Bump hono from 4.13.7 to 4.13.13 in /ix-cli by @dependabot[bot] in #870
  • chore(deps-dev): Bump the dev-dependencies group across 1 directory with 6 updates by @dependabot[bot] in #866
  • fix(ingest): retry transient 5xx/429 bulk commits with Retry-After, and the CL-17 breaker fixes (IN-19C) by @KageBinary in #845
  • [jarvis] feat(bench): add reproducible with/without-ix agent evaluation by @TannerTorrey3 in #855
  • feat(cli): add ix verify to compare the graph with a re-parse (CL-24A) by @KageBinary in #838
  • [jarvis] feat(ingest): infer Scala, TypeScript and Go receiver types by @TannerTorrey3 in #854
  • chore(deps): Bump ip-address from 10.7.2 to 10.7.4 in /ix-cli by @dependabot[bot] in #873
  • test: make the IN-05 bulk-size tests and resolveEdges scaling check reliable by @KageBinary in #875
  • chore(deps): Bump the actions group across 1 directory with 5 updates by @dependabot[bot] in #867
  • perf(map): take /v1/map off the edit path; region readers refresh lazily (CL-13) by @KageBinary in #841
  • [jarvis] feat(cli): region readers report a stale map in json and llm output by @KageBinary in #880
  • [jarvis] feat(ingest): Java call edges via typed receivers and dispatch callers by @KageBinary in #878
  • [jarvis] feat(cli): locate impact JSON rows and list container dependents by @KageBinary in #876
  • [jarvis] test(cli): keep tests out of the real /.ix and fail the run if they do by @KageBinary in #877
  • [jarvis] chore(deps): bump body-parser to 2.4.0 in ix-cli (CVE-2026-111181) by @KageBinary in #892
  • [jarvis] fix(ci): plugin contract check reads --remap\ as --remap by @KageBinary in #894
  • [jarvis] feat(cli): spread ambiguous candidates across files, name containers by @KageBinary in #890
  • chore(deps): Bump fast-uri from 3.1.8 to 3.1.9 in /ix-cli by @dependabot[bot] in #896
  • chore(deps): Bump fast-uri from 3.1.8 to 3.1.9 in /docs-site by @dependabot[bot] in #895
  • chore(deps): Bump the actions group with 3 updates by @dependabot[bot] in #883
  • feat(ci): crawl the built docs site, not just its sources by @Alot1z in #871
  • [jarvis] perf(context): term-addressable BM25 index, patched on HEAD moves by @KageBinary in #897
  • [jarvis] fix(ingest): resolve Python package imports and method typed receivers by @KageBinary in #889
  • [jarvis] feat(ingest): EXTENDS for Python dotted/generic bases and JS ns.Base by @KageBinary in #891
  • chore(deps): Bump @hono/node-server from 2.1.0 to 2.1.5 in /ix-cli by @dependabot[bot] in #899
  • [jarvis] feat(cli): suggest bounded candidates for unresolved targets by @TannerTorrey3 in #881
  • fix(cli): honour pinned workspace ids and never auto-delete a workspace by @TannerTorrey3 in #879
  • [jarvis] feat(cli): add ix overrides for a method's overrides and implementations by @KageBinary in #893
  • [jarvis] feat(ingest): EXTENDS for TS generic/namespaced heritage and JS ns.Base by @KageBinary in #900
  • [jarvis] feat(cli): smells answers within a wait budget; rank uses /v1/degree by @KageBinary in #898
  • [jarvis] fix(cli): broaden around test selection and remove JSON row caps by @TannerTorrey3 in #885
  • [jarvis] fix(context): bound issue starts and refine source selection by @TannerTorrey3 in #884
  • ci: move macOS runners from macos-14 to macos-15 by @KageBinary in #901
  • [jarvis] feat(context): expand issue rankings with bounded companion files by @TannerTorrey3 in #887
  • [jarvis] fix(context): rank issue entities by definition BM25 by @TannerTorrey3 in #886
  • [jarvis] feat(cli): answer ambiguous and text-only targets instead of erroring by @KageBinary in #910
  • [jarvis] feat(context): lean issue view says where each named symbol is used by @KageBinary in #911
  • docs: remove Kartr from the README and comments by @KageBinary in #918
  • fix(cli): --path is case-insensitive in rank and inventory by @KageBinary in #915
  • feat(cli): ix note and ix session against the local backend without Pro by @TannerTorrey3 in #916
  • feat(cli): ix install, a menu over the skill installer (#612) by @KageBinary in #914
  • feat(ci): reject root-relative links in docs-site front matter by @KageBinary in #913
  • chore(deps): Bump step-security/harden-runner from 2.22.2 to 2.22.3 in the actions group by @dependabot[bot] in #908
  • chore(deps): Bump tree-sitter-powershell from 0.26.4 to 0.26.6 in /core-ingestion in the production-dependencies group by @dependabot[bot] in #904
  • chore(deps): Bump the production-dependencies group across 1 directory with 4 updates by @dependabot[bot] in #909
  • chore(deps): Bump @modelcontextprotocol/sdk from 1.32.1 to 1.32.2 in /ix-cli in the production-dependencies group by @dependabot[bot] in #905
  • chore(deps-dev): Bump @types/node from 26.6.5 to 26.6.6 in /core-ingestion in the dev-dependencies group by @dependabot[bot] in #902
  • chore(deps): Bump arangodb from 3.12.12 to 3.12.13 in /ix-cli/test/e2e by @dependabot[bot] in #906
  • chore(deps-dev): Bump the dev-dependencies group in /ix-cli with 2 updates by @dependabot[bot] in #903
  • fix(ci): green main before the release (Windows EPIPE, plugin-contract fixtures) by @KageBinary in #991

Full Changelog: v0.13.0...v0.14.0