You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
DuckDB VSS load no longer re-downloads on the hot path — load_vss now escalates to the
network-heavy FORCE INSTALLonly when an install fails with the origin-pin conflict, instead
of trying it unconditionally in the fallback chain. A plain INSTALL is a cheap no-op when the
extension is already present, so the common per-connection path no longer hits the network. This
removes a severe Windows slowdown (every connection re-downloading VSS, serialized) that pushed
the Windows CI test job into its 60-minute timeout.
CI
The Windows test job skips the DuckDB-backend tests (vectordbs::duckdb, repos::duckdb, mcp_stdio_tests) — they each open a real DuckDB connection that installs the VSS extension over
the network, which serializes badly on the Windows runner. Bundled-DuckDB compilation (the
reason this OS is in the matrix) and the full mock-based suite still run; the backend behaviors are
covered on ubuntu + macOS. Added a 30-minute step timeout as a hang backstop.
Install semanticastindexer 0.1.7
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/maadgrom/semanticastindexer/releases/download/v0.1.7/semanticastindexer-installer.sh | sh
Structured tracing-based logging facade — All diagnostics now flow through tracing
to stderr (preserving clean stdout for JSON-RPC and CLI data). Logs are leveled (debug, info, warn, error) and filterable via RUST_LOG. New global flags:
-v, --verbose (repeatable; -vv for trace level)
--log-format pretty|json (default pretty; JSON for machine consumption)
--timing — opt-in per-operation timing spans (index/embed/query/sync durations, e.g. INFO sync{rev=HEAD~1}: … in 1.8s). Off by default so routine runs stay quiet; the
end-of-command done … in Ns summary still prints at info regardless.
--silent now maps to a quiet log filter (error level), forces --timing off, and
still suppresses CLI output
Default behavior: info level, pretty format, no per-op timing, stderr. RUST_LOG=semanticastindexer=debug overrides all flags (power-user priority). The mcp
subcommand now keeps stdout clean of diagnostic noise, enabling write-mode (--allow-write)
with strict stdio clients (e.g. Grok).
logging: config block — Set logging level / format / timing defaults project-wide in sai-cfg.yml. It is the lowest-precedence tier (RUST_LOG and the CLI flags override it), and
is read silently before the subscriber is installed so a missing/malformed file falls back to the
built-in defaults without breaking the stdout boundary. Primarily for the MCP server, whose
client launches the binary with a fixed command/env — raise its verbosity without per-client edits. init now renders a documented (commented) logging: block in generated configs.
-V, --version flag — print the binary version (was previously unsupported).
update skips a no-op reinstall — update now checks the latest GitHub release and exits
early ("already the latest release") when the running binary already matches, instead of always
re-running the installer. Falls back to a plain reinstall if the version check fails (offline).
Fixed
MCP --allow-write stdout corruption — Write-mode MCP was broken for strict JSON-RPC
clients (e.g. Grok) because backend diagnostics (e.g. "using existing collection") were printed
to stdout, corrupting the JSON-RPC stream. All such diagnostics now route to stderr via tracing. In-session sai_refresh and sai_sync are now usable with strict-client MCP
integrations.
Git diagnostics leaking to stderr — the dirty-state check (git diff --quiet) inherited the
process stdio, so running outside a git repo (or any git error) leaked raw git text to stderr.
Its output is now silenced; diagnostics come only from the tracing subscriber.
DuckDB VSS extension load: origin conflict & install race — Loading the VSS extension could
hard-fail with "extension 'vss' is already installed but the origin is different" when vss was
already present from the default repo (extensions.duckdb.org) and the fallback tried INSTALL vss FROM community. load_vss now re-downloads from the default repo via FORCE INSTALL vss (no origin conflict) before the community fallback, and serializes the
INSTALL attempts process-wide so parallel connections/tests sharing DuckDB's per-machine
extension cache no longer race (intermittent failures on Windows CI runners).
Install semanticastindexer 0.1.6
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/maadgrom/semanticastindexer/releases/download/v0.1.6/semanticastindexer-installer.sh | sh
Qdrant local-embed mode — embedder: ort/ollama on the qdrant backend now embeds
on-device (via the existing ONNX/Ollama embedder) and upserts raw Vec<f32> points, instead of
requiring Qdrant Cloud server-side inference. This makes the qdrant backend work with self-hosted / OSS Qdrant (which has no inference engine) and lets code models such as jinaai/jina-embeddings-v2-base-code (768-d) run against a local cluster without Cloud billing.
The default embedder: qdrant keeps server-side inference, so existing Qdrant Cloud configs are
unchanged. (#12)
sai-deslop agent skill (.agents/skills/sai-deslop/): when to reach for the sai_ tools
while coding, plus a triage protocol that judges each duplicate/similarity finding (read the
real source → classify real / boilerplate / intentional / fragment → propose a verified fix)
before acting.
dedup-auditor Claude Code subagent (.claude/agents/): runs the repo-wide sai_find_duplicates sweep with that triage protocol in an isolated context and returns a
classified digest instead of a raw cluster dump.
mcp-setup/setup.sh gains --platform <id> / --write to wire any MCP client
(claude-code, claude-desktop, cursor, windsurf, continue, codex, hermes, generic) — the same
multi-client experience as the one-line install.sh, via a shared mcp-setup/lib/mcp-config.sh.
mcp-setup/tests/test_setup.sh (run by make test / make test-setup): asserts artifact
paths, generated config fields, command strings, and install.sh↔lib snippet parity.
Changed
embedder is now backend-scoped: it selects how the qdrant backend embeds (qdrant =
server-side inference, ort/ollama = local), and a config's embedder no longer leaks across
a --backend override — the override re-derives the backend's natural default (qdrant →
server-side, every other backend → ort). (#12)
mcp-setup/setup.sh now generates sai-cfg.yml by copying the canonical mcp-setup/templates/sai-cfg.yml (duckdb + ort + jina-768 + AST + tuned thresholds) and
patching only backend/embedder/collection, instead of emitting its own divergent inline YAML.
The default --embedder is now ort (fully offline), matching the template and the book.
mcp-setup/setup.sh and docs/install.sh now install both the sai and sai-deslop skills
(plus the dedup-auditor subagent); the skill installer is renamed install_agent_skill.
Fixed
sai_prepare_mcp_setup now includes --target-dir in recommended_command (so a copied
command targets the intended project) and a correct, explicitly-derived --features list
(previously a dead variable plus a hardcoded mcp,duckdb,ollama,ast that ignored ort/qdrant).
For prebuilt/release binaries where mcp-setup/setup.sh is not on disk, recommended_command
falls back to the install.sh one-liner and an execute: true call is reported as blocked
rather than running a stale path.
Install semanticastindexer 0.1.5
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/maadgrom/semanticastindexer/releases/download/v0.1.5/semanticastindexer-installer.sh | sh
ort embedder: retry transient HuggingFace model downloads (e.g. HTTP 429) instead of
failing the run, and cache the downloaded model in CI to avoid repeated fetches. (#10)
Documentation
Promote Python AST chunking across the landing page and the book. Python AST support
shipped in 0.1.2, but the static site and several book pages still advertised only
TypeScript/TSX, Rust, and Go. (#11)
The documentation site and book now default to a light theme; dark is still served to
visitors whose browser or OS prefers it. (#11)
Install semanticastindexer 0.1.4
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/maadgrom/semanticastindexer/releases/download/v0.1.4/semanticastindexer-installer.sh | sh
sai_sync MCP tool: reconcile the index with the working tree from an agent — the MCP
analog of the CLI sync (git-changed set → re-chunk/re-embed survivors, drop deleted or
now-excluded paths). Write tool; requires --allow-write, like sai_refresh.
duplicates --since / --staged / --file (+ --json): seed near-duplicate clusters from
the changed-file set, so the CI dedup gate can flag when changed code near-duplicates the
already-indexed code.
Changed
MCP server entry renamed from semantic-code-search / code-search to sai across all
example configs (.mcp.json.example, claude-desktop-config.example.json). The ~/.local/bin convenience wrapper and the ~/.claude/skills/ skill directory are likewise
now named sai, and the installed wrapper is a true passthrough (sai mcp/sai index/… work).
The MCP server now honors backend: / embedder: from sai-cfg.yml. Precedence is --flag > sai-cfg.yml > duckdb/ort (the fully-offline default); previously the server forced
its own duckdb/ollama defaults over the config. MCP example configs are now just ["mcp", "--config", "sai-cfg.yml"] — the redundant --backend/--embedder/--collection
flags were removed.
Config loader: an explicit --config sai-cfg.yml / sai-cfg.yaml that is absent on
disk now falls back to built-in defaults instead of erroring, so the MCP server works
in projects that have not yet run init.
mcp-setup/setup.sh now installs the Claude Code skill into ~/.claude/skills/sai/, matching
the human install.sh (the agent-facing setup path previously installed only the MCP server).
uninstall.sh and the installers now also remove the old code-search-named artifacts
(~/.local/bin/code-search-mcp, ~/.claude/skills/semantic-code-search-mcp/) when
upgrading from a prior release.
Install semanticastindexer 0.1.3
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/maadgrom/semanticastindexer/releases/download/v0.1.3/semanticastindexer-installer.sh | sh
AST chunking for Python (function-only, like TS/TSX/Rust/Go): every def / async def — free functions, class methods, and nested functions — becomes one
symbol-tagged chunk; lambdas are not captured. py joins the smart-default
extension list, so --ext py auto-selects the ast chunker on --features ast
builds.
dedup-gate.yml PR workflow: the repo now dogfoods its own near-duplicate
detection. It builds the PR binary, indexes the base branch into a per-PR Qdrant
Cloud collection (server-side e5-small inference), runs the real sync --since to
advance the index to the PR head, and fails only when the near-duplicate cluster
count in src/ grows. A companion workflow flushes the collection when the PR
closes.
Fixed
Qdrant duplicates / similar: read dense vectors from the nested vector oneof
returned by Qdrant >= 1.16 (the deprecated flat data field is now empty), so
retrieved vectors are no longer length 0. Without this, both commands failed
against current Qdrant Cloud with "Vector dimension error: expected dim: N, got 0".
Install semanticastindexer 0.1.2
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/maadgrom/semanticastindexer/releases/download/v0.1.2/semanticastindexer-installer.sh | sh
init subcommand: generates the standard, fully-commented sai-cfg.yml via a short
interview (backend, embedder, collection, model, optional connection settings and
extra excludes). --yes accepts every default non-interactively; --force
overwrites; --output <path> redirects. vector_dim is auto-filled for recognized
models and asked for otherwise; the generated file is validated before writing.
update subcommand: self-update to the latest GitHub release via the official
release installer (on Windows it prints the PowerShell one-liner instead, since a
running executable cannot replace itself).
Native Windows installer wrapper (install.ps1): same agent-wiring flags as install.sh, PowerShell-style (-Platform, -All, -Write, …), hosted on the
install page alongside the shell installer.
AST chunking for Rust and Go (function-only, like TS/TSX).
Library target (src/lib.rs): the indexing pipeline, config resolution, vector
backends, and similarity core are now reusable from other crates; the binary is a
thin clap wrapper around app::run.
Integration tests (tests/) exercising the public library API: CLI/config
precedence, walk/filter/chunk pipeline, opt-out markers, deterministic point ids.
CI workflow (ci.yml): rustfmt, clippy (-D warnings), tests on Linux/macOS/Windows,
MSRV (1.88) check, and a cargo hack --each-feature matrix.
Hosted install page and one-line installer/uninstaller (GitHub Pages + cargo-dist).
Changed
sai-cfg.yml is the standard config name: it is what init generates and the first
file sought when --config is omitted (then sai-cfg.yaml, then the legacy indexer.yaml, which keeps working). The repo's example config is now sai-cfg.yml,
generated by init --yes.
All CLI commands now route backend access through the dedicated worker thread
(previously MCP-only), so the DuckDB backend's synchronous I/O never blocks the
main Tokio runtime; the worker thread is joined on exit so the DuckDB connection
checkpoints its WAL cleanly. The find_similar/find_duplicates orchestration
is now shared between the CLI and MCP (one code path in search).
mdBook (book/) is now the single documentation source; the legacy docs/*.md
pages were removed and all links repointed at the book.
The example config's chunker comments now describe the function-only
TS/TSX/Rust/Go AST behavior.
Fixed
The installers' "Next steps" now print the bare semanticastindexer command (the
absolute path could be wrong when the install dir was not yet on the current
shell's PATH) and tell you to open a new terminal when needed; absolute paths are
still used where they belong — inside the generated MCP config snippets.
Windows builds with --features all no longer fail to link (LNK2038 runtime-
library mismatch): tokenizers' esaxx_fast feature is dropped, removing the
esaxx-rs C++ object whose hardcoded static CRT conflicted with bundled DuckDB's
dynamic CRT. esaxx only accelerates unigram training, which this project never
does; tokenizer loading/encoding is unaffected.
CLI sync no longer leaves the DuckDB HNSW index dropped when a file fails
mid-batch — it now uses the same always-rebuild refresh path as the MCP sai_refresh tool.
Cargo.tomlrepository URL now points at the actual GitHub repo.
The Makefile no longer passes a nonexistent --language flag to the binary
(it broke make run/make prod; extensions are selected with --ext).
Install semanticastindexer 0.1.1
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/maadgrom/semanticastindexer/releases/download/v0.1.1/semanticastindexer-installer.sh | sh