| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| semlith-v0.3.0-aarch64-apple-darwin.tar.gz | 2026-07-29 | 12.8 MB | |
| semlith-v0.3.0-aarch64-unknown-linux-gnu.tar.gz | 2026-07-29 | 15.5 MB | |
| semlith-v0.3.0-x86_64-pc-windows-msvc.zip | 2026-07-29 | 11.5 MB | |
| semlith-v0.3.0-x86_64-unknown-linux-gnu.tar.gz | 2026-07-29 | 14.1 MB | |
| SHA256SUMS | 2026-07-29 | 444 Bytes | |
| README.md | 2026-07-29 | 2.4 kB | |
| Semlith 0.3.0 source code.tar.gz | 2026-07-29 | 86.2 kB | |
| Semlith 0.3.0 source code.zip | 2026-07-29 | 100.7 kB | |
| Totals: 8 Items | 54.0 MB | 0 | |
Narrows a search to part of a corpus, so one store per repository can answer a question about one subsystem.
Added
--path,--extand--langonsemlith search. Each is repeatable. Repeats union, kinds intersect:--ext rs --ext tomlis "Rust or TOML",--path 'src/**' --ext mdis "Markdown, undersrc".
sh
semlith search "how does retry backoff work" --path 'src/http/**'
semlith search "how does retry backoff work" --lang rust
The filter is applied before either half of the search picks its results. Asking for eight hits inside a subdirectory returns the eight best hits in that subdirectory, not whatever survives filtering the eight best hits in the repository — which for a small subdirectory is usually nothing. Concretely: the vector index is scanned under a turbovec allowlist and the FTS5 query carries the same path predicate, both derived from one id-selection query, so rank fusion never sees a chunk one half was forbidden to return.
Path patterns are SQLite GLOB. A pattern that does not start with / is
anchored as */<pattern> against the stored absolute path, so src/**
works from any working directory; an absolute pattern means exactly itself.
* crosses /, so src/* already reaches the whole subtree. Matching
ignores case, so --ext md finds README.MD.
A filter that selects no indexed file reports that, rather than reporting that the corpus does not match the query.
-
The
semlith_searchMCP tool takes the same filters, as optionalpath,extandlangarrays, which is the point of the release: an agent working on one subsystem can scope its question to that subsystem. -
semlith languagesprints the language names--langaccepts and the extensions each covers. An unrecognised name is an error naming this command, not a silent empty result.
Notes
No store format change. files.path has been recorded since 0.1.0, so
filtering works on an existing store with no re-indexing, and a store written
by 0.3.0 is readable by 0.2.0.
Install
Download the archive for your platform, unpack it, and put semlith on
your PATH. Linux builds need OpenBLAS at runtime
(apt-get install libopenblas-dev or your distribution's equivalent).
Intel macOS has no prebuilt binary: ONNX Runtime no longer publishes
x86_64 macOS builds.
Verify a download against SHA256SUMS before running it.