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.
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.
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.
| Domain | Proven coverage | Applicable closure |
|---|---|---|
| Symbols | 40/40 | 40/40 |
| Structural facts | 40/40 | 40/40 |
| Literals | 39/40 | 39/40 |
| Relationships | 38/40 | 38/40 |
| Body spans | 38/40 | 38/39 |
| Source regions | 38/40 | 38/39 |
| Doc comments | 37/40 | 37/39 |
| Identifiers | 36/40 | 36/37 |
| Complexity metrics | 32/40 | 32/34 |
| Types | 31/40 | 31/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
--jsonand 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/.