Releases: jsilvanus/gitsema
Release list
v0.97.0
Minor Changes
- e7fefea: Add superadmin-controlled model allow-lists and bring-your-own-key (BYOK) support. Operators can now restrict which embedding profiles or narrator/guide model configs are usable, server-wide or per-org, via
gitsema admin models list|allow|deny|reset --kind <embedding|narrator|guide> [--org <name>]. Independently,narrate/explain/guide(CLI, HTTP, and MCP) accept request-scoped BYOK credentials (--byok-http-url/--byok-api-key/--byok-model/--byok-max-tokens/--byok-temperatureand equivalent HTTP/MCP fields) that bypass the allow-list entirely and are never persisted. - 0cd2676: Phase 143: closed a grab-bag of small HTTP/CLI flag-parity gaps across
src/server/routes/analysis.ts.POST /analysis/merge-auditgainedbase(merge-base override);POST /analysis/merge-previewgainedtop/iterations/edgeThreshold/enhancedKeywordsN/useEnhancedLabels;POST /analysis/branch-summarygainedenhancedLabels/enhancedKeywordsN(slicesnearestConcepts[].topKeywordsin the JSON response);POST /analysis/clustersgainediterations/edgeThreshold/enhancedKeywordsN;POST /analysis/security-scangainedhighConfidenceOnly;POST /analysis/impactgainedchunks/level/lens(structural/hybridnow makes it a thinblast-radiusalias, closing a prior silent divergence from the CLI's default);POST /analysis/semantic-diffgainedhybrid/bm25Weight(also fixing a pre-existing CLI bug wherediff's--hybrid/--bm25-weightflags were declared but never wired to anything);POST /analysis/semantic-blamegainedlevel(file/symbol). - d0c8389: The HTTP API's
clusters,change-points,author,impact,semantic-diff,semantic-blame,triage, andworkflowanalysis routes now accept the samemodel/textModel/codeModelembedding overrides already available as--model/--text-model/--code-modelon their CLI equivalents, via a new shared request-scoped resolver. - 418779b: Add an identity/authorization audit log: sensitive actions (grant create/revoke, token create/revoke, login success/failure, org membership changes, repo org moves) recorded on the HTTP auth/orgs routes and queryable via
gitsema audit log [--org] [--repo] [--limit]. Completes the Multi-Tenant Auth Track (Phases 122-125). - 887c2dc:
POST /analysis/author(HTTP API) now supports the fullgitsema authorCLI flag surface:since,detail,includeCommits,hybrid, andbm25Weightare wired through to the same author-attribution logic the CLI uses, pluschunks/level/vssare accepted for flag-surface parity (no-op, matching the CLI's own behavior for these three). Breaking change: the response shape is now{ authors, commits? }instead of a bare array, to carryincludeCommitsresults. - 18c9518:
gitsema code-searchnow isolates its chunk and symbol candidate pools by default, returning them as separate, independently-ranked result lists instead of one shared-cutoff merged ranking — the default--level symbolwas combining both pools on every call, which could let a file whose best evidence was chunk-framed get crowded out by symbol-framed matches (or vice versa) purely from embedding-framing bias. Pass--merge-levelsto opt back into the previous single merged list. The MCPcode_searchtool and Guide'scode_searchtool adopt the same per-level separation, returning aresults_by_levelobject (keyed byfile/chunk/symbol) instead of a flatresultsarray when multiple levels are active — a breaking response-shape change for existing callers, both of which gained amerge_levelsparameter to opt back into the flat shape. - 4be4523:
gitsema searchnow returns distinct, independently-ranked result lists per search level (file/chunk/symbol/module) by default whenever two or more of--chunks/--level symbol/--level moduleare active at once — e.g.--chunks --level symbol, or a per-model saved-level mismatch — instead of merging every level into one shared-cutoff ranked list where a weaker level's matches could be crowded out entirely. Text output renders one labeled section per level;--out jsonemits aresultsByLevelobject keyed by level. Pass--merge-levelsto opt back into the previous single merged list. A single active level (the common case) is unaffected. - 83b3de6: Add
gitsema index doctor --fix: automatically backfills missing FTS5 content and garbage-collects orphan embeddings when those issues are detected, then re-reports index health — no need to runindex backfill-fts/index gcseparately. - c8a6bd9:
POST /evolution/filenow acceptslevel(file/symbolper-symbol centroid evolution),branch,model/textModel/codeModeloverrides, andalerts(top-N largest semantic jumps with author/commit), matching the CLI'sfile-evolutionflag surface.POST /evolution/conceptgainsbranchand model overrides, matchingevolution/concept-evolution.POST /graph/hotspotsgainsweightStructural, matching CLI's--weight-structural. Branch filtering is now threaded through the corecomputeEvolution()/computeConceptEvolution()functions rather than being CLI-only. - 37c9866: The
graphcommand family (callers,callees,neighbors,path,relate,similar,unused,cycles,deps,co-change,blast-radius) is now exposed over HTTP (POST /api/v1/graph/*) and MCP (graph_path,graph_relate,graph_similar,graph_unused,cycles,deps,co_change,blast_radiustools;callers/calleesgained HTTP routes and reuse the existingcall_graphMCP tool), matching the CLI's existing flag surface.graph buildremains CLI-only — it's a mutating, truncate-and-rebuild index-maintenance operation, not a query, consistent withindex vacuum/gc/rebuild-fts/etc. - e21c719:
POST /api/v1/guide/chat(HTTP API) now accepts alens: 'semantic'|'structural'|'hybrid'field, mirroring CLIgitsema guide --lens— understructural/hybridit biases the guide agent's tool choice towardcall_graph/blast_radius/hotspots, identically to the CLI. Remote multi-turn/session support (an HTTP equivalent of CLIguide --interactive) remains a deferred, unresolved design question — seedocs/feature-ideas.md. - d2aa439: Add identity & credentials core for
gitsema tools serve: user accounts with password login (gitsema auth login/logout/whoami) and long-lived API keys (gitsema auth token create/list/revoke), backed by newusers/sessions/api_keystables. The server's auth middleware now resolves these alongside the existingGITSEMA_SERVE_KEY/per-repo token mechanisms. - fff805d: LSP
textDocument/hovernow enriches its semantic matches with optional Temporal (last touch/change frequency), Risk & quality (debt/hotspot/security), and Structure (caller/callee counts) sections when their data is available. AddedtextDocument/codeLenswith per-symbol "Called N× · debt X.XX" annotations, and an opt-ingitsema tools lsp --diagnosticsflag that pushestextDocument/publishDiagnosticsnotifications for high-debt/high-hotspot-risk files on a background timer (not supported together with--remote). - fff805d: Added remote delegation for the MCP and LSP servers:
gitsema tools mcp --remote <url>andgitsema tools lsp --remote <url>(with--remote-key/--remote-timeout, orGITSEMA_REMOTE/GITSEMA_REMOTE_KEY) now proxy every data-access call to a runninggitsema tools serveinstance via a new genericPOST /api/v1/protocol/:operationroute, with a startup health check that fails fast if the remote is unreachable. - fff805d: Added a WebSocket transport for both protocol servers:
gitsema tools mcp --websocket <bind-address>andgitsema tools lsp --websocket <bind-address>(e.g.--websocket 0.0.0.0:4242) listen on fixed/mcp//lsppaths, with--key <token>requiring a matchingAuthorization: Bearer <token>header. Unlike--remotedelegation, WebSocket supports server push, so--diagnosticsnow works together with--websocket. gitsema does not terminate TLS — put a reverse proxy in front forwss://. - fff805d: LSP
textDocument/definitionandtextDocument/referencesnow resolve structurally first when the knowledge graph (gitsema graph build) is built, returning exact matches instead of approximate semantic/text results (fallback results are now taggedtags: ['fallback']). Added three new LSP methods backed by the same graph:textDocument/prepareCallHierarchy,callHierarchy/incomingCalls, andcallHierarchy/outgoingCalls, advertised via a newcallHierarchyProvider: truecapability. - fff805d: Added
gitsema tools mcp --http <bind-address>(e.g.--http 0.0.0.0:4242) — a proper MCP Streamable HTTP transport using the SDK's ownStreamableHTTPServerTransport, listening on a fixed/mcppath with stateful sessions tracked via theMcp-Session-Idheader.--key <token>requires a matchingAuthorization: Bearer <token>header, same convention as--websocket. Unlike the non-standard--websockettransport (kept only for forward compatibility), Streamable HTTP is MCP's actual recommended network transport and should be preferred by clients/harnesses that need a network-reachable MCP server. - 8bb2b62: Add multi-profile embedding serving: a
gitsema tools servedeployment can now offer several named embedding profiles (provider/model pairs) at once viaGITSEMA_EMBEDDING_PROFILES/theembeddingProfilesconfig key. Repos are pinned to a profile forever at first index (gitsema remote-index --profile <name>), andgitsema repos info <repo-id>shows the pinned profile. Servers with no profiles configured behave exactly as before. - a6ce2aa:
POST /narrateandPOST /explainnow accept anevidenceOnlyfield, letting HTTP callers explicitly request the same safe-by-default evidence-only mode as the CLI'snarrate/explain(omitted = evidence-only, no LLM call) — both responses also gain a structuredevidencea...
v0.96.0
Minor Changes
-
b91836b: Knowledge-graph Phases 110–111: fusion + lens coverage.
gitsema hotspots— rank files by architectural risk = co-change (temporal) × call-coupling (structural) × churn. Available as a CLI command, MCP tool, andPOST /api/v1/graph/hotspotsHTTP route, with a--lens semantic|structural|hybridtoggle (default hybrid) that selects which signals drive the score.- Cascade query planner — a four-stage
FTS filter → vector expand → graph traversal → merge/rerankpipeline powers the hybrid lens for query-driven fusion, surfacing structurally-adjacent code that pure semantic search misses while leaving semantic-lens output byte-for-byte unchanged. - Structural enrichment —
code-review,triage,explain, andguidegain--lens: under a structural/hybrid lens they surface grounded call-graph and co-change context (e.g. "called by N callers", "co-changes with file X 80% of the time"). Theguideagent also gainscall_graph,blast_radius, andhotspotstools. - Lens coverage sweep — every command where more than one lens is meaningful now exposes the shared
--lensoption with consistent defaults (existing commands → semantic, graph-native → structural, fusion → hybrid) and per-hit lens labels across text/JSON output.
-
b91836b: Make the agent skill self-serve for tools, and expose it over MCP.
- The generated skill (
skill/gitsema-ai-assistant.md) now documents both how to use each tool (description + parameters) and how to read its result, joined per tool — previously it carried only result interpretation. - New
get_skillMCP tool returns the skill document, so MCP clients can fetch gitsema's operating playbook (usage + interpretation for every tool) at the start of a session instead of having it only embedded in the guide's own prompt.
- The generated skill (
-
ce84122: Add
gitsema index start --graphto extract raw structural references (imports, calls,extends/implements) from TS/TSX/JS/Python blobs into a newstructural_refstable (schema v25), laying the groundwork for the upcoming knowledge-graph traversal commands. -
5efa2e4: Add
gitsema graph build, which resolvesstructural_refs/symbols/blob_commitsinto a structural knowledge graph (graph_nodes+ typededges: contains, defines, imports, calls, extends, implements, references, co_change) using confidence-tier resolution for ambiguous references. New CLI commandsgitsema co-change <path>,gitsema deps <identifier>, andgitsema graph cycles/gitsema cyclesread from the resulting graph (schema v26). -
7c540bd: Add graph traversal primitives over the Phase 107 structural graph:
gitsema graph callers <symbol>/gitsema graph callees <symbol>(transitivecallstraversal, default and max depth 3),gitsema graph neighbors <node>(typed neighborhood, any edge kinds, configurable direction/depth), andgitsema graph path <a> <b>(shortest typed path between two nodes). New MCP toolscall_graphandgraph_neighborsexpose the same traversals. -
7c540bd: Add a cross-cutting
--lens semantic|structural|hybridtoggle (plus--weight-structural <n>) and four new structural/semantic fusion commands:gitsema blast-radius <symbol>("what changes if I touch this" — structural dependents and/or semantically similar blobs),gitsema relate <symbol>(callers/callees plus semantically similar blobs, both lenses),gitsema similar <symbol>(same call/import shape and/or semantic similarity), andgitsema unused(symbols/files with no inbound calls/imports edges).gitsema impact <path> --lens structural|hybridnow reusesblast-radiusfor true structural impact analysis. -
5037791: Symbols now carry stable, path-free identities:
code-searchand the LSPdocumentSymbolresults show fully-qualified names with normalized signatures (e.g.Auth.validateToken(token:string)) for TypeScript, TSX, JavaScript, and Python. Thesymbolstable gains nullablequalified_name,signature,signature_hash, andparent_qualified_namecolumns (schema v24); older rows remain unaffected until re-indexed.
Patch Changes
- 6c3b0cc: Add comprehensive tool parity and flag coherence documentation in
docs/parity.md. This canonical reference tracks tool availability across all interfaces (CLI, REPL, Guide, MCP, HTTP, and planned CLI Interactive/Web UI/MCP HTTP) and documents flag implementation consistency. Includes maintenance guidelines to keep tables in sync with code changes. Updated CLAUDE.md to include parity.md in canonical documentation and added requirement to update parity tables when tools/interfaces/flags change.
v0.95.0
Minor Changes
- 7b52757: Added a generic
--narrateflag (LLM summary via the active narrator model, requiresGITSEMA_LLM_URL) tofirst-seen,branch-summary,merge-audit,merge-preview,dead-concepts,debt,doc-gap,security-scan,blame/semantic-blame,triage,impact,ownership,experts,author,contributor-profile,bisect,refactor-candidates,cherry-pick-suggest, andheatmap. Also expandedgitsema guide's tool coverage tobisect,refactor-candidates,cherry-pick-suggest,heatmap,map,file-diff,lifecycle,cluster-change-points,cross-repo-similarity, andpr-report, and addedgitsema setupas a guided onboarding wizard (alias ofgitsema quickstart) with a storage-backend selection step (sqlite/postgres/qdrant) and an optional narrator/guide model setup step.
Patch Changes
- a765b31: Make non-SQLite storage backends fail loudly instead of silently returning
wrong results. The Postgres and Qdrant vector backends now reject search
options they cannot honor (allowedHashescandidate filtering used by
boolean/negative-example search; negative-example search on Qdrant) with a
clear error,gitsema index --fileerrors on non-sqlite backends instead of
writing to an index the backend never reads, and indexing warns when
module-level (directory-centroid) embeddings are skipped on a non-sqlite
backend. - 17b5d13: Fix
multi_repo_searchreturning the wrong repository's results and leaking
database connections. Each repo's index is now made the active session for its
search (so results come from that repo, not the caller's working directory),
the connection is closed afterwards, and the process-global search result cache
key now includes the active database path so searches against different indexes
in one process no longer collide. - f75c278: Fix a command-injection vulnerability in
gitsema narrate/explain(and the
POST /api/v1/narrateand/explainHTTP routes): the--range/since/until
inputs were interpolated into a shellgit loginvocation. The narrator now
spawns git without a shell and validates--rangeagainst a revision allowlist,
closing both the CLI and HTTP injection vectors. - edbe0d3: Ensure secret/PII redaction is always applied before any narrator prompt is
sent to an LLM. Previously the per-result--narratehelpers (search,
evolution, clusters, diff, security findings, etc.) sent prompts unredacted;
redaction now happens at the shared call site so every narration path is
covered. - 7b52757: Fixed test isolation so the test suite no longer creates a stray
.gitsema/index.dbin the repo root, which could intermittently cause unrelated guide-tool tests to fail. - 9f00e17: Internal hardening and de-duplication: Postgres and Qdrant vector backends now
share one re-ranking implementation; the narrator providers share their
redaction/disabled-mode prologue; Postgres and Qdrant connections are probed
once on first use so a bad URL fails with a clear, config-pointing error
instead of an opaque connection error at first query.
v0.94.0
Minor Changes
- bf88b00: Add CLI-based AI tool backends (e.g. Claude Code, Codex CLI, GitHub Copilot CLI) as narrator/guide model providers, alongside the existing HTTP-based ones. Configure with
gitsema models add <name> --narrator|--guide --provider cli --cli-command <tool> [--cli-args "<args>"] [--use-mcp] --activate;guide --use-mcpexposes gitsema's own MCP server to the CLI tool's agent loop, and multi-turn-i/--interactivesessions are kept coherent via the tool's session-resume mechanism. - 26c56df:
gitsema guidenow wires the full ~36-capability gitsema toolset (history, branch/merge, ownership, quality, diff/blame, clustering, and workflow analyses, not just the original 5) into its agentic tool-calling loop, with a dynamic system prompt built from a new per-tool interpretation registry. The same registry also drives thenarrate/explainnarrators and a generated "Interpreting gitsema tool results" section in the gitsema-ai-assistant skill (pnpm gen:skill), which now ships with the npm package. Documented Ollama setup fornarrate/explain/guide. - 4dd1f73: Add
--provider ollamatogitsema models add <name> --narrator|--guide, which defaults--http-urltohttp://localhost:11434and sends the correctmodelfield to Ollama's chat API (fixing a bug where the narrator/guide HTTP path sent a hardcodedmodel: "default", which Ollama rejects).gitsema models add [name]now also accepts an optional model name for embedding, narrator, and guide configs: when omitted with--provider ollama, gitsema lists the models available on your local Ollama server. - 18397fa:
gitsema tools servenow persists cloned repos and their indexes underGITSEMA_DATA_DIR(default~/.gitsema/data) by default, reusing them on subsequent/api/v1/remote/indexrequests (fetch + incremental reindex instead of a fresh clone). The response includes arepoIdthat can be passed to search, evolution, analysis, watch, projections, narrate, explain, and guide routes to query that repo's persisted index. SSH agent forwarding lets the server re-index private repos without per-request credentials. Usepersist: falsefor the legacy ephemeral behavior, and manage persisted repos withgitsema repos list-persistedandgitsema repos remove <repoId> [--purge]. - 954d67c: Add a Postgres + pgvector storage backend (
storage.backend=postgres,storage.metadata.url=postgres://...) as an alternative to SQLite for search, history, evolution, and other read-path commands. Keyword search defaults totsvector/ts_rank_cd, with ParadeDBpg_searchBM25 available as an opt-in (storage.fts.backend=pg_search).gitsema indexdoes not yet write to this backend — that's planned for a follow-up phase. - 30f9da4: Add a Qdrant storage backend (
storage.backend=qdrant,storage.vectors.url=http://...+ a Postgres companion viastorage.metadata.url), and makegitsema indexwrite to the Postgres and Qdrant backends (previously read-only). Addgitsema storage migrate --to <backend> [options]to copy an existing index into another backend (sqlite/postgres/qdrant), and extendgitsema doctor/gitsema statusto report backend/scope/location and cross-store row counts for postgres/qdrant profiles. - a186de7: Introduce a pluggable storage seam (Phase 101): the
MetadataStore,
VectorStore, andFtsStoreasync interfaces with a SQLite-backed adapter that
preserves today's behavior, plusstorage.*config keys and a
project | user | namedindex-scoping model. No new backend yet — this is the
groundwork for the Postgres + pgvector and Qdrant backends.
Patch Changes
- 30f9da4: Refresh docs/PLAN.md table of contents to cover Phases 99-104 and fix drifted line-number references.
v0.93.0
Minor Changes
- 72076ef: New LLM narrator, explainer, and agentic guide (schema v22).
gitsema narrateandgitsema explain <topic>return raw commit evidence by default (no network calls) and generate LLM prose with--narrateonce a narrator model is configured viagitsema models add <name> --narrator --http-url <url> --activate.gitsema guide [question]answers questions about your repository with a real tool-calling agent loop (repo stats, recent commits, narrate/explain evidence, semantic search), supports multi-turn--interactivemode, and redacts secrets from every payload sent to the LLM. Also exposed as MCP tools (narrate_repo,explain_issue_or_error) and HTTP routes (/api/v1/narrate,/explain,/guide/chat). - 37872be: Adopt changesets for versioning, changelog generation, and npm publishing. Releases are now driven by the changesets "Version Packages" PR on
main(published to npm via OIDC trusted publishing) instead of manually pushedv*tags. Contributors add a changeset file (pnpm exec changeset) with each user-facing change; CHANGELOG.md is generated from these entries.
Entries below are generated by changesets starting from v0.93.0. For earlier release history (v0.2.0 – v0.92.1, tagged manually), see the GitHub Releases and the phase log in docs/PLAN.md.