Releases: phuongddx/jarvis
Release list
v0.9.1 — fix: jarvis index no longer crashes natively in the tree-sitter syntax baseline
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
indexRepochild left the registry row stuck atoutcome: indexingwith 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)
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 repopath, runs pre-flight checks, writes an on-disk launch record before spawning, then detaches. The child's stdout isDEVNULL— one inherited write would corrupt the live JSON-RPC session.semanticdefaults to false so an agent call can never implicitly download a ~2 GB embedding model; passsemantic: trueto opt in.getIndexStatusnow reports anindexingblock (starting/running/failed-at-startup/abandoned) whose derivation reaps exited children for their true exit code, correlates attempts by timestamp (a stalefailedrow 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
flockbuild lock covers whole index runs andjarvis 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
appat different paths both derived slugapp; 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.
IndexNotFoundErrorpayloads carryrecoveryTool: "indexRepo"with or without a registry row — the row-less case is exactly what an agent hits first. - New
--no-semanticCLI 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
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/jarvis→phuongddx/jarvis. The old URL 301-redirects — existing clones, links, and badges keep working. Nothing about the PyPI package (jarvis-mcp), install commands, orsetup.shchanges. - 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 previousio.github.jarvis-intelligence/jarvislisting is superseded and will be removed. - Everything else stays put: binary downloads, the Claude Code plugin, and
setup.shcontinue to ship fromjarvis-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
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.
documentSymbolsandgoToDefinitionprefer 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.
getIndexStatusreports 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)
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_inputtest was missed by v0.7.1's exclusion.test_cmd_index_semantic_include_runs_on_declined_repo_without_clearing_bitalso 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. Itsname_mapparameter is annotateddict[str, list[Candidate]], but the lookup usedname_map.get(key, ())— an empty tuple default where the annotation promiseslistvalues. 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 ondict.get()'s default argument, raisingTypeError: Expected list, got tupleon every call that missed the fast-path symbol bucket — breakingresolve()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
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 viabuiltins.inputmonkeypatching 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: truethen 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 treatmenttest_setup_sh.pyalready 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
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 installeduniversal-ctags, so zoekt's symbol-definition ranking andsym:queries silently returned nothing for every language.setup.shnow installs it and symlinks the realctagsbinary (what Homebrew/apt actually name it) asuniversal-ctags(the exact name zoekt looks up). Surfaced ascapabilities.search.ctagsInstalledingetIndexStatus.searchCode's response shape changes (breaking).total(always justlen(hits), never a real total) is replaced bytotalMatchesandfileCountsourced from zoekt's own match statistics,truncated, andindexedAt.- Unbounded
searchCode/semanticSearchpayloads, fixed. zoekt's JSON API applies no result caps when a request omitsOpts— 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_PORToverrides the hardcoded6070, 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)
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-swift404'd on every macOS arm64 host. The Swift indexer's repo moved off the personalphuongddxowner 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_REPOnow points atjarvis-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 assertionZOEKT_RELEASE_REPOandSCIP_RELEASE_REPOalready had and this one never did — andsetup-smoke.ymlnow runs--only scip-swifton 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
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 oldio.github.phuongddx/jarvisentry 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
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_COMMITpin, 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.