Website · Installation · Tools · External Extract · Skills · 34 Languages
A cross-platform code intelligence server built in Rust, providing LSP-quality features across 34 programming languages via the Model Context Protocol (MCP).
Julie is now in maintenance mode. Existing users can keep using the current release line, but new code-intelligence development has moved to Miller.
If you are choosing a tool for a new agent workflow, start with Miller instead of Julie. Julie remains available for existing deployments that depend on its current MCP server, extraction, or plugin behavior.
Without code intelligence, AI agents waste most of their context window just reading code. A 500-line file costs ~2,000 tokens. Understanding a module means reading every file in it. Tracing a function's callers means grepping the entire codebase. Every token spent reading raw files is a token unavailable for reasoning, planning, and generating code — and once the context window fills up, the session is over.
Julie parses your codebase once with tree-sitter, builds a searchable index with a full reference graph, and returns only what the agent actually needs. Fewer tokens per operation means more operations before hitting context limits — and longer, more productive coding sessions:
| Task | Without Julie | With Julie | Savings |
|---|---|---|---|
| Understand a file's API | Read whole file (~3,000 tokens) | get_symbols structure mode (~300 tokens) |
~90% |
| Find a function definition | Grep + read matching files (~4,000+ tokens) | fast_search definitions mode (~100 tokens) |
~97% |
| Investigate before modifying | Read file + grep refs (~5,000+ tokens) | deep_dive overview (~200 tokens) |
~96% |
| Orient on a new area | Read 5-10 files (~10,000+ tokens) | get_context with token budgeting (~800 tokens) |
~92% |
The key difference from simpler code indexing tools: Julie doesn't just extract symbols — it builds a reference graph so agents can navigate code relationships (who calls this function? what does it call? what types flow through it?) without reading files at all.
- Fast symbol search with code-aware tokenization (CamelCase/snake_case splitting, stemming, <5ms)
- Cross-language code navigation (go-to-definition, find-references) across 34 languages
- Test-aware search — automatic test detection across all 34 languages with smart filtering (
exclude_tests) - AST-aware refactoring with workspace-wide rename and dry-run preview
- Operational metrics — per-tool timing, context efficiency tracking, "bytes NOT injected" headline metric
- Multi-workspace support for indexing and searching related codebases
- In-process stdio MCP server — single binary, zero configuration, works with any MCP client
- Multi-session coordination — per-workspace leader locks allow one writer and read-only followers over shared indexes
- Shared registry and indexes —
$JULIE_HOME/registry.dbplus$JULIE_HOME/indexes/keep related workspaces available across sessions
- Search latency: <5ms (Tantivy full-text search)
- Memory usage: <100MB typical workload
- Startup time: <2s (database + Tantivy indexing)
- Single binary server with GPU-accelerated embedding sidecar (auto-provisioned via
uv)
Incremental Updates: Only changed files are re-indexed, typically completing in 3-15 seconds.
Julie uses embeddings for semantic search, related symbol discovery, and intelligent code navigation. These features are powered by a managed Python sidecar (sentence-transformers + PyTorch) with automatic GPU acceleration.
uv lets Julie install Python 3.12 and all sidecar dependencies automatically. You do not need to install Python yourself. If uv or the sidecar is unavailable, keyword search and code navigation still work; embedding-backed features stay disabled until the sidecar is available.
macOS:
brew install uvWindows (open PowerShell):
winget install --id=astral-sh.uv -eIf winget is not available, use the standalone installer instead:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"Linux:
curl -LsSf https://astral.sh/uv/install.sh | shAfter installing, open a new terminal and verify with uv --version.
On first launch, Julie automatically creates a Python 3.12 environment, installs PyTorch and the embedding model, and detects your GPU. Everything is cached, so subsequent launches are instant.
Julie auto-detects your GPU and uses it for faster embeddings:
- NVIDIA (CUDA): auto-detected; the correct torch+CUDA variant is installed automatically
- AMD/Intel (DirectML): auto-detected on Windows via
torch-directml - Apple Silicon (MPS): auto-detected by PyTorch
- CPU: used when no GPU is available (slower, but fully functional)
Python 3.12 is used because it has the best PyTorch hardware acceleration compatibility across all GPU backends.
JULIE_HOME: relocate shared registry state and workspace indexes (default:~/.julie). Must be an absolute path; empty or relative values are rejected. Existing installs upgrade in place — set this only if you want to move Julie's storage to another drive or path. Seedocs/OPERATIONS.mdfor the migration checklist.JULIE_EMBEDDING_SIDECAR_MODEL_ID: any HuggingFace model ID (default:nomic-ai/CodeRankEmbed, 768d code-optimized). Changing models automatically wipes and re-embeds all vectors on the next indexing run.- See
docs/operations/embedding-sidecar.mdfor all environment variables and troubleshooting
Core: Rust, TypeScript, JavaScript, Python, Java, C#, VB.NET, PHP, Ruby, Swift, Kotlin, Scala
Systems: C, C++, Go, Lua, Zig
Functional: Elixir
Specialized: GDScript, Vue, QML, R, Razor, SQL, HTML, CSS, Regex, Bash, PowerShell, Dart
Documentation: Markdown, JSON, TOML, YAML
The julie-plugin bundles pre-built binaries, Julie skills, and the MCP server registration. No Rust toolchain required.
# Add the plugin marketplace
/plugin marketplace add anortham/julie-plugin
# Install (user scope, available across all projects)
/plugin install julie@julie-pluginThe Claude Code plugin starts Julie automatically. Do not also run claude mcp add unless you are doing a manual binary install.
Clone the plugin repo, then run the installer:
git clone https://github.com/anortham/julie-plugin.git
node julie-plugin/bin/install-codex.cjsThe installer adds Julie skills, hooks, and AGENTS.md guidance. It prints the exact MCP command for your checkout. The normal user-level shape is:
codex mcp add julie -- node /absolute/path/to/julie-plugin/hooks/run.cjsCodex CLI and Codex Desktop do not send MCP roots, so Julie uses the process cwd/startup hint. In normal CLI use this is the repo you launched from. If a desktop app starts Julie from the wrong directory, set JULIE_WORKSPACE in that app's MCP config or launch from the repo root.
Clone the plugin repo, then run the installer:
git clone https://github.com/anortham/julie-plugin.git
node julie-plugin/bin/install-opencode.cjsThe installer adds Julie skills, a precedence plugin, and AGENTS.md guidance. It prints an opencode.json MCP block using the plugin launcher:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"julie": {
"type": "local",
"command": ["node", "/absolute/path/to/julie-plugin/hooks/run.cjs"],
"enabled": true
}
}
}Both helper installers are idempotent and support --uninstall for clean removal.
git clone https://github.com/anortham/julie.git
cd julie
cargo build --releaseTo enable the /web-research skill for fetching and indexing web content, download the latest binary from browser39 releases and add it to your PATH.
This is optional. All other Julie features work without it.
Use this path when you are not using the Claude Code plugin or the Codex/OpenCode helper installers.
Download a release archive for your platform from GitHub releases, extract julie-server, and use its absolute path in your MCP config. Supported release targets are macOS Apple Silicon, macOS Intel, Linux x86_64, and Windows x86_64.
Upgrading from an older split-daemon install? julie-adapter and julie-daemon are gone from the current MCP runtime. Every MCP client config must launch julie-server directly. If an old config still points at julie-adapter, change the command to the julie-server path, then restart the MCP client. Plugin users should update or reinstall the Julie plugin so its launcher also starts julie-server.
Stale adapter configs usually show up as old processes named julie-adapter or julie-daemon, or config files whose command path still ends in one of those names. Stop those old processes after updating the config; a fresh session should only start julie-server.
Client workspace-resolution support:
| Client | Sends MCP roots? | Needs JULIE_WORKSPACE? |
|---|---|---|
| Claude Code | Yes (on first request) | No (uses cwd / roots) |
| VS Code + GitHub Copilot | Yes | No |
| Codex CLI | No — uses cwd | Only if cwd is wrong |
| Codex Desktop | No — uses cwd/startup hint | Only if cwd is wrong |
| OpenCode | No — uses cwd | Optional; useful for project configs |
| Cursor / Windsurf / others | Varies | Safe default: set it |
Julie prefers client roots when the startup hint is weak (cwd). Explicit CLI --workspace or JULIE_WORKSPACE always wins regardless of client support.
Claude Code (user-level, available in all projects):
claude mcp add --scope user julie -- /path/to/julie-serverOr edit ~/.claude.json directly for more control (e.g., env vars, model override):
{
"mcpServers": {
"julie": {
"type": "stdio",
"command": "/path/to/julie-server",
"args": [],
"env": {
"JULIE_WORKSPACE": "/path/to/your/project"
}
}
}
}For project-level only, use --scope project or omit the scope flag. When using claude mcp add, Julie uses the current directory as the workspace root — JULIE_WORKSPACE is only needed if you want to override that.
VS Code with GitHub Copilot (.vscode/mcp.json):
{
"servers": {
"julie": {
"type": "stdio",
"command": "/path/to/julie/target/release/julie-server"
}
}
}VS Code's MCP client sends workspace folders as MCP roots, so Julie resolves the project root automatically on the first tool call. No
JULIE_WORKSPACEenv is needed — set one only to override VS Code's open folder.Windows? Use backslashes in the command path:
"command": "C:\\path\\to\\julie-server.exe"All
envvalues are optional — see the env options table below for defaults.
Codex CLI / Codex Desktop (~/.codex/config.toml):
[mcp_servers.julie]
command = "/path/to/julie-server"Prefer
codex mcp add julie -- /path/to/julie-serverfor manual registration. When using the plugin launcher, usecodex mcp add julie -- node /absolute/path/to/julie-plugin/hooks/run.cjs.
OpenCode (~/.config/opencode/opencode.json for global, or <repo>/opencode.json for project):
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"julie": {
"type": "local",
"command": ["/path/to/julie-server"],
"enabled": true,
"environment": {
"JULIE_WORKSPACE": "/absolute/path/to/your/project"
}
}
}
}OpenCode expects
commandas an array and the env key isenvironment(notenv).JULIE_WORKSPACEis optional when OpenCode starts from the repo root; set it when OpenCode launches Julie from an unreliable cwd. Thejulie-plugininstaller (node bin/install-opencode.cjs) wires up skills, the precedence plugin, and AGENTS.md but leaves this MCP block to you.
Cursor / Windsurf / Other MCP Clients:
{
"mcpServers": {
"julie": {
"command": "/path/to/julie-server",
"env": {
"JULIE_WORKSPACE": "/path/to/your/project"
}
}
}
}All env values are optional — see the table below for defaults.
| Variable | Values | Default | Notes |
|---|---|---|---|
JULIE_WORKSPACE |
Absolute path to project root | Client roots (if supported), else cwd |
Overrides workspace detection. Set this when a no-roots client launches Julie from the wrong directory. |
JULIE_EMBEDDING_PROVIDER |
auto, sidecar |
auto |
Selects embedding backend. auto resolves to sidecar on all platforms. |
JULIE_EMBEDDING_SIDECAR_MODEL_ID |
Any HuggingFace model ID | nomic-ai/CodeRankEmbed |
Sidecar model. CodeRankEmbed (768d) is code-optimized. |
JULIE_EMBEDDING_STRICT_ACCEL |
1 |
unset | Disable embeddings entirely when no GPU is available. |
First Use / Verify:
Julie indexes your workspace automatically on first connection or first primary tool call. Ask your agent to run manage_workspace(operation="health") if you want to confirm which workspace is bound. First indexing may take a few seconds on small projects and longer on large repos; later sessions reuse the cached index and file watcher updates.
fast_search- Full-text code search with code-aware tokenization- Content search (grep-style line matches) or definition search (symbol names with signatures)
- Definition search promotes exact symbol matches with kind, visibility, and signature
- <5ms search latency with CamelCase/snake_case splitting, English stemming
- Automatic OR-fallback when strict AND returns zero results
exclude_testsparameter for filtering test symbols from results- Language and file pattern filtering
get_context- Token-budgeted context for a concept or task- Returns relevant code subgraph with pivots (full code) and neighbors (signatures)
- Pipeline: search → centrality ranking → graph expansion → adaptive token allocation → formatted output
- Adaptive budget: few results → deep context, many results → broad overview
- Use at the start of a task for area-level orientation
deep_dive- Progressive-depth symbol investigation- Overview (~200 tokens), context (~600 tokens), or full (~1500 tokens) detail levels
- Kind-aware: functions show callers/callees/types, traits show implementations, structs show fields/methods
- Includes test locations with quality tiers and centrality scores
- Identifier fallback for references that relationships miss
fast_refs- Find all references to a symbol with structured outputcall_path- Trace one shortest call-graph path between two symbols- Answers "how does A reach B?" in a single call
- Walks calls, instantiations, and overrides only, returns the hop chain with edge kinds
- Handles disconnected pairs with a clear "no path" result
- Supports
from_file_path/to_file_pathdisambiguation for shared names - CLI:
julie-server call-path "LoginButton::onClick" "insert_session" - CLI with file hints:
julie-server call-path handle_request write_response --from-file src/server.rs --to-file src/response.rs
get_symbols- Smart file reading with 70-90% token savings- View file structure without reading full content
- Extract specific symbols with complete code bodies
- Structure/minimal/full reading modes
blast_radius- Deterministic impact analysis for changed files, internal symbol IDs, or revision ranges- Returns ranked impacted symbols, likely tests, deleted files, and spillover handles for long lists
- Seed with
file_paths, internalsymbol_ids, or Julie revision numbers - Prefer
file_pathswhen you know a symbol name or file path - Use before refactoring or after a change to see affected callers and tests
- CLI:
julie-server blast-radius --files src/auth/login_flow.rs
spillover_get- Fetch the next page for largeget_contextorblast_radiusresults- Reuses the stored spillover handle instead of rerunning the underlying query
edit_file- Edit files without reading them first- Three-phase matching: exact substring, trimmed-line (whitespace/indent tolerance), DMP fuzzy (typo tolerance)
- Supports first, last, or all occurrence replacement
- Dry-run preview with unified diff output (standard
@@hunk headers) - Bracket balance validation for code files
- CRLF-aware matching preserves line ending style
rewrite_symbol- Edit a symbol by name without reading the file first- Operations:
replace_full,replace_body,replace_signature,insert_before,insert_after,add_doc - Symbol lookup by qualified name (e.g.,
MyClass::method); usefile_pathto disambiguate - Combine with
deep_divefor zero-read editing workflows - Dry-run preview with unified diff output
- Operations:
rename_symbol- Rename symbols across the workspace- Updates all references atomically
- Scope control:
workspace(default),all, orfile:<path>to disambiguate shared names - Preview mode with
dry_runparameter
manage_workspace- Index, register, open, remove, refresh, list, stat, clean, health-check workspaces, and launch the dashboard- Operations:
index,register,open,remove,list,refresh,stats,clean,health,dashboard - Cross-workspace work: call
openfirst, then pass the returnedworkspace_idto other tools
- Operations:
Operational and session metrics are surfaced through the dashboard. Start it from a shell with
julie-server dashboard, or from an MCP session withmanage_workspace(operation="dashboard").
Default Ignore Patterns - Julie automatically excludes common build artifacts and dependencies to prevent indexing noise:
- Build outputs:
target/,build/,dist/,out/,obj/,bin/ - Language-specific caches:
.gradle/,.dart_tool/,cmake-build-*/ - Framework caches:
.next/,.nuxt/ - Dependencies:
node_modules/,vendor/ - Version control:
.git/ - Test coverage:
coverage/,.nyc_output/ - Python bytecode:
__pycache__/,*.pyc - Minified files:
*.min.js,*.bundle.js,*.map
Custom Ignore Patterns - Create a .julieignore file in your workspace root for project-specific exclusions:
# .julieignore example
experimental/
legacy-code/
third-party/
*.generated.ts
Patterns use glob syntax (**/ for recursive, * for wildcard). Default patterns cover 99% of use cases - only use .julieignore for project-specific needs.
Beyond the MCP server, Julie ships a process-facing extractor for hosts written in Go, C#, or any runtime that owns its own process management and file watching. julie-server extract parses a project root and writes the canonical SQLite schema into a caller-owned database file. It does not use MCP transport, Tantivy, shared registry state, or embeddings.
# Full scan (incremental — only changed files are re-extracted)
julie-server extract scan --root /repo --db /var/lib/code.sqlite --json
# Rebuild from scratch in one transaction
julie-server extract scan --root /repo --db /var/lib/code.sqlite --force --json
# Single-file updates from a watcher
julie-server extract update --root /repo --db /var/lib/code.sqlite --file src/lib.rs --json
julie-server extract delete --root /repo --db /var/lib/code.sqlite --file src/lib.rs --json
# Recompute reference scores and test linkage after mutations
julie-server extract analyze --db /var/lib/code.sqlite --json
# Read schema version, totals, and analysis state without taking the write lock
julie-server extract info --db /var/lib/code.sqlite --jsonKey properties:
- Idempotent. Repeated calls with unchanged inputs return
unchangedand commit nothing. - Caller-owned DB. Julie owns the schema; hosts own the file, backups, and lifecycle.
- Per-DB exclusive write lock at
<db_path>.julie-extract.lock(30s default timeout).extract infois read-only. - Single canonical root per DB. Pointing the same DB at a different root fails unless you use
scan --force. - Hard-coded ignore policy (
.gitignore,.julieignore, hard blacklist, 1 MiB per-file cap). Repeatable--ignore-filenarrows the indexable set but cannot override the blacklist. - No silent data loss. A parser failure that would erase known-good rows exits non-zero and preserves existing data.
See docs/EXTERNAL_EXTRACT.md for the full report schema, exit codes, watcher integration recipe, and SQLite contract.
Julie automatically detects tests during indexing across all 34 languages, with no configuration required. It recognizes #[test], @Test, pytest, describe/it, and other language-specific test patterns.
- Search filtering —
fast_searchsupportsexclude_teststo keep test symbols out of production code results - Test navigation —
deep_diveshows which test functions reference a symbol, so agents can find relevant tests without grepping
For test coverage measurement (which lines executed, branch coverage), use your language's coverage tool (cargo llvm-cov, pytest --cov, istanbul, etc.). Julie handles test navigation and filtering; runtime tools handle coverage.
Julie ships with a focused set of pre-built skills, reusable prompt workflows that combine Julie's tools into higher-level capabilities. Skills are invoked as slash commands (e.g., /explore-area) in harnesses that support them, or used as system prompt instructions.
The plugin distributes four user-facing skills (/editing, /explore-area, /impact-analysis, /web-research); this repo also ships /search-debug for Julie development.
| Skill | Description |
|---|---|
/editing |
Zero-read editing: understand and modify code using edit_file, rewrite_symbol, and rename_symbol without reading files first |
| Skill | Description |
|---|---|
/explore-area |
Orient on an unfamiliar area with token-budgeted exploration via get_context |
/impact-analysis |
Analyze blast radius of changing a symbol — callers grouped by risk |
| Skill | Description |
|---|---|
/web-research |
Fetch web pages via browser39, index locally, and read selectively with Julie tools |
Web research applies Julie's token-efficiency model to web content. Instead of dumping an entire documentation page into context (often 10,000+ tokens), /web-research fetches the page as clean markdown, saves it locally where Julie's filewatcher indexes it, then uses fast_search and get_symbols to read just the sections you need. Requires browser39 (download a binary release).
| Skill | Description |
|---|---|
/search-debug |
Diagnose why a search returns unexpected results (for Julie development; not distributed in the plugin) |
Skills ship as SKILL.md files in .claude/skills/. Most modern AI coding harnesses now support the same skill format — just copy the skill directories to the right location:
| Harness | Skills Directory | Notes |
|---|---|---|
| Claude Code | .claude/skills/ |
Works automatically — skills are already here |
| VS Code / GitHub Copilot | .claude/skills/ or .github/skills/ |
Reads .claude/skills/ natively — no copying needed |
| Gemini CLI | .gemini/skills/ or .agents/skills/ |
Copy skill directories; same SKILL.md format |
| Windsurf | .windsurf/skills/ |
Copy skill directories to .windsurf/skills/ |
| Cursor | .cursor/rules/ |
Copy SKILL.md content into .mdc files in the rules directory |
| Codex CLI | ~/.codex/skills/ or .agents/skills/ |
Copy skill directories, or use node bin/install-codex.cjs from julie-plugin |
| OpenCode | ~/.config/opencode/skills/ or .opencode/skills/ |
Auto-discovered (also reads ~/.claude/skills/ natively); use node bin/install-opencode.cjs from julie-plugin for symlinks + precedence plugin |
For harnesses that read .claude/skills/ natively (Claude Code, VS Code/Copilot): skills work out of the box when Julie's repo is cloned.
For other harnesses: copy .claude/skills/*/ directories to the harness-specific skills directory listed above. Each skill is a self-contained directory with a SKILL.md file.
- Tree-sitter parsers for accurate symbol extraction across all languages
- Tantivy full-text search with code-aware tokenization (CamelCase/snake_case splitting, English stemming)
- Graph centrality ranking using pre-computed reference scores from the relationship graph
- SQLite storage for symbols, identifiers, relationships, types, and file metadata
- Per-workspace isolation with separate databases and indexes
- In-process MCP protocol over stdio (JSON-RPC), with no background daemon or HTTP bridge
- Per-workspace leader locks so one session owns writes while other sessions serve read-only requests from SQLite WAL and Tantivy mmap
- Embedding pipeline with GPU-accelerated Python sidecar (CUDA/DirectML/MPS/CPU), shared through a resident embedding host per
$JULIE_HOME
- Rust (stable, 1.85+) — rustup.rs
- uv — auto-provisions Python 3.12 and the embedding sidecar (see Embeddings and GPU Acceleration)
git clone https://github.com/anortham/julie.git
cd julie
cargo buildJulie runs as an in-process stdio MCP server. When an MCP client starts
julie-server, that process serves MCP directly and coordinates shared indexes
through per-workspace leader locks:
cargo run -- --workspace /path/to/your/projectTo test with an MCP client, point it at your debug build:
claude mcp add julie-dev -- /path/to/julie/target/debug/julie-serverAfter rebuilding (cargo build), restart your MCP client or start a new
session so the client launches the new binary.
Useful local commands:
julie-server dashboard # Open the web dashboard in your browser
julie-server search "query" --workspace . --standalone --jsonJulie has a tiered xtask runner so the documented commands stay aligned with the checked-in manifest:
# Default local loop from the current diff
cargo xtask test changed
# Tiny smoke pass
cargo xtask test smoke
# Batch-level regression gate
cargo xtask test dev
# System / startup coverage
cargo xtask test system
# Search-quality / dogfood tier
cargo xtask test dogfood
# Broad branch-level pass
cargo xtask test full
# Inspect available tiers and buckets
cargo xtask test listUse cargo xtask test changed for the local loop. It maps the current git diff to the smallest matching bucket set, then falls back to dev if shared infrastructure moved. Run cargo xtask test dev once per completed batch, not after every edit.
Use raw cargo test --lib <filter> only when narrowing a failure after changed or an xtask tier points you at the right area. The dogfood tier is intentionally heavier because it loads the large search-quality fixture and runs real searches.
All tiers are currently green. If a test fails, it is a real regression — investigate it.
src/
├── main.rs # Entry point: in-process MCP serve or subcommand dispatch
├── handler.rs # MCP tool handler (rmcp ServerHandler)
├── cli.rs # CLI argument parsing and workspace resolution
├── startup.rs # Workspace initialization and staleness detection
├── cli_tools/ # Standalone CLI command bootstrap
├── daemon/ # Registry DB, leader-lock compatibility, project logging
├── dashboard/ # Standalone read-only dashboard (htmx + Tera templates)
├── extractors/ # Language-specific symbol extraction (34 languages)
├── external_extract/ # Process-facing extractor commands
├── health/ # Health report and diagnostics
├── indexing_core/ # Shared indexing orchestration
├── embeddings/ # Embedding pipeline, sidecar supervisor and protocol
├── tools/ # MCP tool implementations
│ ├── deep_dive/ # Progressive-depth symbol investigation
│ ├── editing/ # edit_file, rewrite_symbol
│ ├── get_context/ # Token-budgeted context retrieval
│ ├── impact/ # blast_radius
│ ├── metrics/ # Session metrics for the dashboard
│ ├── navigation/ # fast_refs, call_path
│ ├── refactoring/ # rename_symbol
│ ├── search/ # fast_search
│ ├── spillover/ # spillover_get
│ ├── symbols/ # get_symbols
│ └── workspace/ # manage_workspace
├── workspace/ # Multi-workspace management and registry
└── tests/ # Test infrastructure
python/
└── embeddings_sidecar/ # GPU-accelerated embedding sidecar (PyTorch + sentence-transformers)
fixtures/ # Test data (SOURCE/CONTROL files, real-world samples)
MIT License - see LICENSE file for details
See CLAUDE.md for development guidelines and architecture documentation.