Source tree in, versioned artifact out

Extraction without shortcuts.

Each of 40 languages gets its own hand-written tree-sitter extractor. The output is one SQLite artifact any tool can read: symbols with real signatures, resolved references, framework route facts, doc comments, and complexity metrics. There are no query files anywhere in the codebase, and no coverage claim without fixture evidence behind it.

What it is

A standalone extraction engine with a durable contract.

julie-extract walks a source tree and produces a versioned SQLite artifact: files, symbols, identifiers, relationships, type facts, literals, source regions, doc comments, complexity metrics, structural facts, and parse diagnostics. JSONL export mirrors the same data for streaming consumers. The integration surface is a CLI plus documented schema contracts, so tools in C#, Python, Go, JavaScript, or Rust consume it by spawning a binary and reading a database.

Extraction is imperative Rust per language instead of tree-sitter query packs. There is not a single .scm file in the repository, and the tree-sitter query engine is never invoked. The extra code pays for what queries cannot express: context carried across the tree, language scope rules, framework conventions, and reference resolution that refuses to guess.

40 languages each with its own hand-written extractor, held to one fixture-proven quality bar
Versioned family store optional multi-worktree index generations with fenced concurrent writers (v2.31.0+)
0 query files extraction logic is ordinary Rust with tests; there are no .scm packs and no query engine

Coverage

One quality bar across the whole polyglot list.

The capability snapshot (julie-extract languages --json) reports 40 languages. Framework awareness rides on top as typed structural facts: route and endpoint definitions across Express, Fastify, NestJS, Next.js, Flask, FastAPI, Django, Rails, Laravel, Symfony, Phoenix, Spring, Ktor, Gin, Echo, Axum, Actix, ASP.NET, Nuxt, Vue, and React, plus htmx attributes, Alpine directives, and SQL DDL/DML shapes.

bashccppcsharpcssdart elixirerlangfsharpgdscriptgohtmljava javascriptjsonjsxkotlinlua markdownphppowershellpythonqmlqmldir rrazorregexrubyrustscala sqlswifttomltsxtypescript vbnetvuexmlyamlzig

No silent cells

Every coverage claim is fixture-proven.

The capability matrix refuses vague "supported" claims. Every language × domain cell is either backed by golden fixture evidence, or carries a recorded reason the domain does not apply to that language. Missing extractor work cannot hide behind not_applicable, and a strict CI gate fails when the fixtures drift from the claims.

Reference resolution has its own committed coverage artifact: every golden fixture's identifiers, relationships, and pending relationships are classified by outcome, resolution tier, and method (resolved, ambiguous, missing, or explicitly unattempted). Zero cells are recorded rather than omitted.

Fixture-proven native coverage by extraction domain (40 languages).
DomainProven coverageApplicable closure
Symbols40/4040/40
Structural facts40/4040/40
Literals39/4039/40
Relationships38/4038/40
Body spans38/4038/39
Source regions38/4038/39
Doc comments37/4037/39
Identifiers36/4036/37
Complexity metrics32/4032/34
Types31/4031/33

"Applicable closure" means a cell is either fixture-proven or carries a recorded reason the domain is not a real construct in that language. Quality policy and gates are in the repository README.

Consume the artifact

Spawn the binary, read the database.

Standalone artifacts use scan/update/export. The optional versioned family store supports concurrent worktrees with fenced writers; see docs/contracts/store-v1.md and the latest release.

Current release: v2.37.2. A source file that vanishes between a consumer's delta enumeration and the store update read now commits as a delete instead of failing the request, and store import planning skips a vanished file. Read the release notes for details.

Who consumes it

Built to sit under other tools.

# Download a release binary (macOS/Linux/Windows archives published per release)
# https://github.com/anortham/julie-extractors/releases/latest

# Or build from source
cargo build --release -p julie-extract-cli --bin julie-extract
./target/release/julie-extract --version

# Read the artifact from Python with only the standard library
python3 examples/python/sqlite_consumer.py artifact.sqlite
  • Miller is the flagship consumer: a local code-intelligence MCP server whose agents got 2.2× more tasks right than with grep and file reads.
  • Every command takes --json and returns a stable machine-readable report; human output is not part of the contract.
  • SQLite schema and JSONL contracts are versioned and documented in docs/contracts/.