Skip to content

Releases: phuongddx/jarvis

v0.9.1 — fix: jarvis index no longer crashes natively in the tree-sitter syntax baseline

Choose a tag to compare

@phuongddx phuongddx released this 11 Sep 07:17
v0.9.1
673e1f9

jarvis index was dying with SIGSEGV/SIGBUS before publishing anything: the tree-sitter 0.26.0 runtime corrupts the heap during the syntax-baseline walk. This patch pins the runtime to 0.25.2; every grammar pin is unchanged.

Install

Claude Code plugin:

/plugin marketplace add jarvis-intelligence/jarvis-index
/plugin install jarvis@jarvis

Standalone (uv / uvx):

uvx --from 'jarvis-mcp>=0.9.1' jarvis-server

Fixed

  • Native crash in the syntax baseline (jarvis-index#14). The tree-sitter 0.26.0 binding refactor corrupts memory non-deterministically during the declaration walk — crash sites move between runs (attribute read, GC pass, point construction), and the trigger is allocation-layout dependent: a single added print line in the walk loop makes the same input survive, which is exactly why 0.9.0's wheel-build test gates never caught it. Measured at 12 runs per cell: 8/12 and 11/12 native crashes under 0.26.0 (either grammar version), 0/12 under 0.25.2 with identical grammars — the runtime is the broken side, not the grammar pairing. The exact C-level mechanism is documented as unconfirmed in the issue; the fix doesn't depend on it. A subprocess-isolated regression test now walks a synthetic 300-definition module in five fresh interpreters and fails on any nonzero child exit, so a broken runtime can never ship silently again.
  • Side effect of the crash, now moot with the fix but worth knowing: a natively-crashed indexRepo child left the registry row stuck at outcome: indexing with a 0-byte log (tracked in #14 as a separate, still-open bug).

Upgrade

Anyone on 0.9.0 should upgrade — the crash makes indexing any Python-sized repo a coin flip. Existing indexes are unaffected; only new index runs were at risk.

See CHANGELOG.md.

v0.9.0 — agents can build their own index (indexRepo)

Choose a tag to compare

@phuongddx phuongddx released this 10 Sep 16:33
v0.9.0
8bac804

An AI agent pointed at an unindexed repo can now index it itself: the tenth MCP tool, indexRepo, spawns jarvis index as a detached child and reports progress through getIndexStatus until the poll loop terminates — in every failure mode, not just success.

Install

Claude Code plugin:

/plugin marketplace add jarvis-intelligence/jarvis-index
/plugin install jarvis@jarvis

Standalone (uv / uvx):

uvx --from 'jarvis-mcp>=0.9.0' jarvis-server

What changed

  • indexRepo (new tool). Takes a local git repo path, runs pre-flight checks, writes an on-disk launch record before spawning, then detaches. The child's stdout is DEVNULL — one inherited write would corrupt the live JSON-RPC session. semantic defaults to false so an agent call can never implicitly download a ~2 GB embedding model; pass semantic: true to opt in.
  • getIndexStatus now reports an indexing block (starting / running / failed-at-startup / abandoned) whose derivation reaps exited children for their true exit code, correlates attempts by timestamp (a stale failed row can no longer end a fresh run's poll loop), and ages out vanished launches. Every observation is terminal or progressing — callers' poll loops always exit.
  • Concurrency is now arbitrated. A per-slug flock build lock covers whole index runs and jarvis forget's entire teardown; a second writer (CLI, watch, or MCP) gets a clean "another index is already running" instead of racing registry rows and artifacts. The lock file itself is never unlinked — that is the classic detached-inode flock footgun.
  • Fixed: same-basename overwrite. Two repos named app at different paths both derived slug app; the second index silently overwrote the first's. A collision is now rejected naming both paths; a genuinely moved repo re-paths its row.
  • Fixed: missing-index errors are agent-actionable. IndexNotFoundError payloads carry recoveryTool: "indexRepo" with or without a registry row — the row-less case is exactly what an agent hits first.
  • New --no-semantic CLI flag mirrors the tool default (tri-state, per-run, not persisted).

Upgrade

Nothing required. Existing installs keep working; uv tool upgrade jarvis-mcp picks this up when convenient. The searchCode/navigation tool contracts are unchanged; getIndexStatus responses gain an optional indexing key.

See CHANGELOG.md.

v0.8.1 — repo moved to phuongddx/jarvis

Choose a tag to compare

@phuongddx phuongddx released this 10 Sep 04:19
v0.8.1
a9c0636

No code changes — jarvis moved to its maintainer's account, and its distribution identity follows.

Install (unchanged)

Claude Code plugin:

/plugin marketplace add jarvis-intelligence/jarvis-index
/plugin install jarvis@jarvis

Standalone (uv / uvx):

uvx --from 'jarvis-mcp>=0.8.1' jarvis-server

What changed

  • Repository: jarvis-intelligence/jarvisphuongddx/jarvis. The old URL 301-redirects — existing clones, links, and badges keep working. Nothing about the PyPI package (jarvis-mcp), install commands, or setup.sh changes.
  • MCP Registry listing: now io.github.phuongddx/jarvis (the registry derives its namespace from the publishing workflow's GitHub identity, so the repo move forces the rename). The previous io.github.jarvis-intelligence/jarvis listing is superseded and will be removed.
  • Everything else stays put: binary downloads, the Claude Code plugin, and setup.sh continue to ship from jarvis-intelligence/jarvis-index.

Upgrade

Nothing required. Existing 0.8.0 installs keep working; uv tool upgrade jarvis-mcp picks this up when convenient.

See CHANGELOG.md.

v0.8.0 — build-free tree-sitter syntax baseline

Choose a tag to compare

@phuongddx phuongddx released this 10 Sep 01:38
v0.8.0
cf68f70

Build-free declaration navigation is now the baseline: Tree-sitter indexes tracked source files even when SCIP tooling is missing or a project cannot build.

Install

Claude Code plugin:

/plugin marketplace add jarvis-intelligence/jarvis-index
/plugin install jarvis@jarvis

Standalone (uv / uvx):

uvx --from 'jarvis-mcp>=0.8.0' jarvis-server

Upgrade and CLI migration

Upgrade the CLI, then reindex existing repositories to publish syntax coverage:

uv tool upgrade jarvis-mcp
jarvis reindex <slug>

The old --search-only, --fallback-search-only, and --no-fallback-search-only flags are removed. Use --no-scip to skip SCIP enrichment, or --scip to re-enable it, on index, reindex, or watch. The choice persists per repository. JARVIS_FALLBACK_SEARCH_ONLY is no longer used. Tree-sitter syntax and Zoekt search are always the required baseline.

What changed

  • Offline syntax navigation. Curated, pinned grammar packages install with the base package. Seventeen parser selections across sixteen grammar distributions cover Python, JavaScript, TypeScript/TSX, Java, Kotlin, Swift, Go, Ruby, Rust, C, C++, C#, PHP, Scala, Bash, and SQL. No grammar download happens at index time.
  • Honest per-file navigation. documentSymbols and goToDefinition prefer usable SCIP coverage and otherwise return syntax declarations. Results identify their provider and position encoding. Syntax identifiers round-trip to definitions; they do not pretend to provide semantic reference resolution.
  • Explicit capability reporting. getIndexStatus reports published provider coverage and snapshot generation. References and call/type hierarchies remain SCIP-only, with actionable capability errors when enrichment is unavailable.
  • Immutable publication. Every run gets a fresh generation filename, including same-commit reindexes, and publishes through one atomic pointer. Unchanged syntax facts can be reused by file hash and grammar identity.
  • Shared, byte-safe parsing. Optional semantic indexing reuses captured parse trees and handles Unicode byte spans correctly. A chunk-capture failure discards that run's semantic work, warns once, and leaves the required syntax/search baseline publishable.

Compiled wheels support CPython 3.12–3.14 on macOS and Linux, arm64 and x86-64. SCIP enrichment still has its language-specific toolchain requirements; Tree-sitter does not replace cross-file semantic analysis.

See CHANGELOG.md.

v0.7.2 — fix compiled-wheel publish pipeline (for real)

Choose a tag to compare

@phuongddx phuongddx released this 08 Sep 14:45
v0.7.2
8e1060c

No functional changes — v0.7.1's own publish run also failed the compiled-wheel build, for two further reasons that first fix missed. Same code as v0.7.0/v0.7.1, ships for real this time.

Install

Claude Code plugin:

/plugin marketplace add jarvis-intelligence/jarvis-index
/plugin install jarvis@jarvis

Standalone (uv / uvx):

uvx --from jarvis-mcp jarvis-server

Fixed

  • One more interactive_input test was missed by v0.7.1's exclusion. test_cmd_index_semantic_include_runs_on_declined_repo_without_clearing_bit also calls the real-input()-under-a-forced-TTY path v0.7.1 excluded seven other tests for, but its name didn't match the grep pattern the first pass used to find them. Now marked and excluded the same way.
  • A real Cython compilation bug in jarvis.symbols._matches, exposed for the first time by this release's compiled-wheel test run. Its name_map parameter is annotated dict[str, list[Candidate]], but the lookup used name_map.get(key, ()) — an empty tuple default where the annotation promises list values. Pure Python's duck typing never noticed (an empty tuple and an empty list iterate identically), so this shipped unnoticed in every previous release. Cython's compiled code enforces the annotated value type on dict.get()'s default argument, raising TypeError: Expected list, got tuple on every call that missed the fast-path symbol bucket — breaking resolve() for any unknown or dotted-suffix query. Fixed by defaulting to [], matching the parameter's own declared type.

v0.7.0's actual content — sym: symbol search, honest searchCode totals, hardened zoekt-webserver lifecycle — is unchanged. See its own notes: https://github.com/jarvis-intelligence/jarvis/releases/tag/v0.7.0

Platforms: macOS (arm64/x86_64) and Linux (x86_64/aarch64), Python 3.12–3.14.

See CHANGELOG.md.

v0.7.1 — fix compiled-wheel publish pipeline

Choose a tag to compare

@phuongddx phuongddx released this 08 Sep 14:33
v0.7.1
119d7be

No functional changes — v0.7.0's first publish run never reached PyPI, so this release ships the same code with a fixed compiled-wheel build.

Install

Claude Code plugin:

/plugin marketplace add jarvis-intelligence/jarvis-index
/plugin install jarvis@jarvis

Standalone (uv / uvx):

uvx --from jarvis-mcp jarvis-server

Fixed

  • publish-pypi.yml's compiled-wheel matrix failed on every platform, before any upload happened. Seven tests that script answers to the semantic-index install prompt via builtins.input monkeypatching don't get a real, monkeypatch-honoring stdin inside cibuildwheel's isolated test subprocess, so the replacement lost the race to pytest's own capture-mode stdin guard — an unrelated-to-compilation environment mismatch, not a code bug (the regular unit CI already runs these tests successfully on macOS and Linux on every push). fail-fast: true then cancelled the rest of the build matrix before any wheel was built. These seven tests are now marked and excluded from the cibuildwheel test-command specifically, the same treatment test_setup_sh.py already gets there for its own unrelated environment mismatch — no coverage is lost, the regular unit gate still runs all seven on every push.

v0.7.0's actual content — sym: symbol search, honest searchCode totals, hardened zoekt-webserver lifecycle — is unchanged. See its own notes: https://github.com/jarvis-intelligence/jarvis/releases/tag/v0.7.0

Platforms: macOS (arm64/x86_64) and Linux (x86_64/aarch64), Python 3.12–3.14.

See CHANGELOG.md.

v0.7.0 — zoekt sym: search, honest search totals, hardened lifecycle

Choose a tag to compare

@phuongddx phuongddx released this 08 Sep 14:19
v0.7.0
9469268

zoekt's sym: symbol search works for the first time, searchCode reports real match totals instead of a fabricated one, and the embedded zoekt-webserver gets an identity-checked health probe.

Install

Claude Code plugin:

/plugin marketplace add jarvis-intelligence/jarvis-index
/plugin install jarvis@jarvis

Standalone (uv / uvx):

uvx --from jarvis-mcp jarvis-server

To activate sym: symbol search on an existing install

sh setup.sh
jarvis reindex <slug>

zoekt only extracts symbols when universal-ctags is on PATH at index time; existing shards built without it stay symbol-less until reindexed.

What changed

  • sym: symbol search revived. jarvis never installed universal-ctags, so zoekt's symbol-definition ranking and sym: queries silently returned nothing for every language. setup.sh now installs it and symlinks the real ctags binary (what Homebrew/apt actually name it) as universal-ctags (the exact name zoekt looks up). Surfaced as capabilities.search.ctagsInstalled in getIndexStatus.
  • searchCode's response shape changes (breaking). total (always just len(hits), never a real total) is replaced by totalMatches and fileCount sourced from zoekt's own match statistics, truncated, and indexedAt.
  • Unbounded searchCode/semanticSearch payloads, fixed. zoekt's JSON API applies no result caps when a request omits Opts — a broad query could stream every match zoekt found into one response. Requests now cap display counts, and a single oversized match line (minified/generated files) is capped at 2000 characters.
  • zoekt-webserver health check now checks identity, not just "something answered". It requires zoekt's own GET /healthz (a real canary search, 200 only once shards are loaded) instead of accepting any HTTP response under 500 from whatever holds the port. Spawn failures now surface the child's stderr, JARVIS_ZOEKT_PORT overrides the hardcoded 6070, and a spawn race between two jarvis processes now has the loser adopt the winner instead of erroring.
  • semanticSearch's lexical signal revived for natural-language queries. zoekt's implicit-AND query semantics meant a six-word NL query typically matched nothing; NL-shaped queries now OR-expand through the existing symbol tokenizer, while code-shaped queries (identifiers, sym:/lang: syntax) pass through unchanged.

Platforms: macOS (arm64/x86_64) and Linux (x86_64/aarch64), Python 3.12–3.14.

See CHANGELOG.md.

v0.6.2 — fix scip-swift install (404 for every user)

Choose a tag to compare

@phuongddx phuongddx released this 08 Aug 05:38
v0.6.2
7a79fc8

Patch release: Swift indexing was unreachable through the installer for every user. No change to any MCP tool signature or response shape.

Fixed

  • setup.sh --only scip-swift 404'd on every macOS arm64 host. The Swift indexer's repo moved off the personal phuongddx owner to the jarvis-intelligence org, and GitHub serves no redirect for the old path — so the pinned download URL returned 404 instead of forwarding, and the install failed on every run. SCIP_SWIFT_REPO now points at jarvis-intelligence/scip-swift.

    Repointing alone was not enough: the move also dropped every tag and release asset, so scip-swift v0.1.2 has been republished from the same source (the binary still reports 0.1.2).

  • Two regression guards. A test asserts SCIP_SWIFT_REPO's owner never drifts back — the drift assertion ZOEKT_RELEASE_REPO and SCIP_RELEASE_REPO already had and this one never did — and setup-smoke.yml now runs --only scip-swift on both runners. Previously the scip-swift download path had zero CI coverage, which is why the breakage shipped silently.

If Swift indexing failed for you: re-run setup.sh (or setup.sh --only scip-swift), then jarvis index /path/to/repo.

Install

Claude Code plugin:

/plugin marketplace add jarvis-intelligence/jarvis-index
/plugin install jarvis@jarvis

Standalone (uv / uvx):

uvx --from jarvis-mcp jarvis-server

Platforms: macOS (arm64/x86_64) and Linux (x86_64/aarch64), Python 3.12–3.14. scip-swift itself is macOS arm64 only.

See CHANGELOG.md.

v0.6.1 — publishing identity moves to jarvis-intelligence

Choose a tag to compare

@phuongddx phuongddx released this 07 Aug 07:51
v0.6.1
97bdcaf

No functional changes — this release moves jarvis's publishing identity to the jarvis-intelligence org after the repo transfer.

What changed

  • MCP Registry: the server is now io.github.jarvis-intelligence/jarvis. The old io.github.phuongddx/jarvis entry stays frozen at 0.6.0 — registry-aware clients should switch to the new name.
  • PyPI trusted publisher re-anchored to the org (no environment — unavailable on private repos under free-plan orgs).
  • PyPI project URLs now point at the canonical public repo, jarvis-intelligence/jarvis-index.

Install

Claude Code plugin:

/plugin marketplace add jarvis-intelligence/jarvis-index
/plugin install jarvis@jarvis

Standalone (uv / uvx):

uvx --from jarvis-mcp jarvis-server

Platforms: macOS (arm64/x86_64) and Linux (x86_64/aarch64), Python 3.12–3.14.

See CHANGELOG.md.

v0.6.0 — typeHierarchy works; compiled wheels

Choose a tag to compare

@phuongddx phuongddx released this 07 Aug 04:20
v0.6.0
cf73ccc

typeHierarchy returns real super/subtypes for the first time, and releases now ship Cython-compiled wheels.

To activate typeHierarchy on an existing install

curl -fsSL https://raw.githubusercontent.com/jarvis-intelligence/jarvis-index/main/setup.sh | sh
jarvis reindex <slug>

Upstream scip expt-convert (through v0.9.0) never populates global_symbols.relationships (scip#464); the fix (scip#465) is unmerged upstream, so setup.sh now installs a build of the public fork carrying it, published to jarvis-index releases. The install is version-gated: existing upstream v0.9.0 binaries are replaced automatically on the next setup.sh run. Indexes built with an unpatched scip keep returning the explicit error until reindexed.

Install

Claude Code plugin:

/plugin marketplace add jarvis-intelligence/jarvis-index
/plugin install jarvis@jarvis

Standalone (uv / uvx):

uvx --from jarvis-mcp jarvis-server

What changed

  • Compiled wheels, no sdist. The PyPI wheel is no longer readable source: every module ships as a native .so (cp312–cp314 × linux x86_64/aarch64 × macOS arm64/x86_64). Wheels ≤ 0.5.1 remain readable on PyPI. musl/Alpine and Windows are not installable targets; tracebacks now show compiled frames.
  • Fork-built scip distribution via build-scip.yml + SCIP_COMMIT pin, mirroring the zoekt pattern. Exit ramp documented: when upstream merges the fix, setup.sh repoints at upstream releases.

Platforms: macOS (arm64/x86_64) and Linux (x86_64/aarch64), Python 3.12–3.14.

See CHANGELOG.md.