| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| semlith-v0.17.0-aarch64-apple-darwin.tar.gz | 2026-09-15 | 22.4 MB | |
| semlith-v0.17.0-aarch64-unknown-linux-gnu.tar.gz | 2026-09-15 | 22.0 MB | |
| semlith-v0.17.0-x86_64-pc-windows-msvc.zip | 2026-09-15 | 20.1 MB | |
| semlith-v0.17.0-x86_64-unknown-linux-gnu.tar.gz | 2026-09-15 | 23.1 MB | |
| SHA256SUMS | 2026-09-15 | 448 Bytes | |
| README.md | 2026-09-15 | 6.3 kB | |
| Semlith 0.17.0 source code.tar.gz | 2026-09-15 | 937.3 kB | |
| Semlith 0.17.0 source code.zip | 2026-09-15 | 1.0 MB | |
| Totals: 8 Items | 89.5 MB | 0 | |
The code graph covered six of the forty-six languages --lang accepts. That gap
was a promise the product did not keep: --lang kotlin narrowed a search
perfectly well, and then semlith symbol answered nothing about the same corpus
with nothing saying why. It is closed.
One language table
- The extractor reads
filter::LANGUAGES, the table the search filter reads.graph::LANGUAGES— a second copy, six entries against forty-six — is gone, along with the extension table beside it.graph::has_graphanswers whether a language carries symbols and edges by asking whether a grammar exists, andgraph::language_ofdispatches through the samefilter::language_of_paththe filter uses. A test enumerates the table and fails for a row that has neither a grammar nor an entry ingraph::WITHOUT_GRAMMARgiving the reason, so the two halves cannot drift apart again. - Every language has a fixture that says what it must extract. A grammar
that compiles and extracts nothing would pass every other gate in the crate.
tests/fixtures/graph/<language>/holds a real file per language andgraph::tests::FIXTURESdeclares the symbols and edges each one must yield, with their kinds.
Forty grammars
- Twelve of the new grammars ship a tags query; twenty-eight do not. Those
get one under
queries/<language>/tags.scm, written against that grammar's own node names in the same capture vocabulary, and nothing downstream can tell the two families apart. - Nothing is vendored and nothing is a git dependency. Every grammar
resolves from crates.io through
tree-sitter-language, socargo publishis unaffected. Two languages needed a crate other than the obvious one, becausetree-sittersetslinks = "tree-sitter"and a grammar depending ontree-sitteritself cannot coexist with the version this crate links: clojure usestree-sitter-clojure-orchard, perl usests-parser-perl. THIRD-PARTY-NOTICESships with the crate and with every release archive, andtests/licences.rsrefuses a grammar outside a permissive allowlist. All forty-six are permissive: forty-three MIT, two Apache-2.0, one CC0-1.0.
What a symbol is in a language that has no functions
- Fourteen of the forty-six are markup, data or configuration, and their structure is their symbol set. A YAML, TOML or JSON key, a Markdown heading, a Terraform block label, a Dockerfile stage, a Makefile target, a GraphQL type, a protobuf message or RPC, a SQL table or view, a CSS selector, an HTML element with an id — each with a kind that says which.
- What they reference is files. An include, an import, a source, a
FROM, a stylesheet or scriptsrc, a Makefile prerequisite, the table a view selects from. A change to a base image or a shared module has a blast radius, and nothing in semlith could show it before. - Svelte and Vue contribute their template and say so. Their grammars hand
the
<script>block back as raw text, so a component's methods are not symbols and nothing pretends otherwise.
Fixed
- C and C++ attributed every call to the file rather than to the function
making it. Their bundled queries tag the declarator, so a function's range
stopped at its signature and "where is
helperinvoked" answeredmain.c. Live since 0.12.0. The supplement now spans the whole definition, and a general rule drops a definition that another of the same name and kind contains — same name and same kind, so a Rustmod xholding anfn xkeeps both. - C++ captured no calls at all, C# captured no invocations, JavaScript captured no imports, PHP captured neither a require nor a function call, and Swift captured no calls. Each now has the supplement its bundled query needed.
- Elm recorded nothing about a declaration depending on another. Its bundled
query captures the name in a type annotation as a reference and the body of a
declaration not at all, so
acquire = helperproduced no edge between them.
Surface
semlith languagesprints agraphcolumn, which the portal's About page andsemlith_languagesalready showed. The About page's language card states the coverage rather than a count of exceptions.- No new command, tool, argument or schema.
FORMAT_VERSIONdoes not move, no column is added, a 0.16.0 store opens under 0.17.0 and the reverse. The new languages' symbols appear on the next index pass of those files, as every graph fact does.
What it costs
- The binary more than doubles: 47.0 MiB to 111.3 MiB, +64.3 MiB (+137%). Measured on macOS arm64 against a 0.16.0 build made with the same toolchain, both already symbol-light — the growth is parser tables, not debug information. OCaml alone is 12.6 MiB of it and the five largest grammars are 36 MiB. There is no ceiling by decision: the number is the deliverable. Per-platform release archive sizes are in the release assets for this tag.
- Retrieval moved, and the move was measured rather than assumed. Against
0.16.0 on the same machine, the same corpus and the same question set: hit@1
13 to 11, hit@3 18 to 18, hit@8 27 to 25.
wrong yesstays 0, which is a gate. Four causes were found and measured one at a time; three were defects and are fixed above, and the fourth — a same-language preference for ambiguous edge targets — was tried, scored two hits worse, and reverted. The residual is attributable: this release adds several thousand words of documentation that legitimately answer the harness's concept questions, and those questions accept only code spans. Seven questions rank lower than in 0.16.0 and three rank higher; all ten are named in the release record.
Install
macOS and Linux
:::sh
curl -fsSL https://raw.githubusercontent.com/semlith/semlith/main/install.sh | sh
Windows
:::powershell
irm https://raw.githubusercontent.com/semlith/semlith/main/install.ps1 | iex
Or download the archive for your platform below, unpack it, and put
semlith on your PATH. Intel macOS has no prebuilt binary: ONNX
Runtime no longer publishes x86_64 macOS builds.
Verify a download against SHA256SUMS before running it.