Work / ACI
ACI
A Rust-first codebase indexer that turns repositories into queryable software graphs.
ACI walks source repositories, extracts a neutral graph of files, symbols, imports, exports, calls, references, and package dependencies, then stores that graph for fast local queries and export.
Overview
ACI walks source repositories, extracts a neutral graph of files, symbols, imports, exports, calls, references, and package dependencies, then stores that graph for fast local queries and export.
Why it matters
Developer tools need durable code understanding, not disposable prompt context. ACI keeps parser-specific details behind adapters and gives downstream tools a stable model for lookup, traversal, impact analysis, and semantic enrichment.
How it works
Step 01
Discover and filter the repository
The indexer walks the target repo with ignore rules, skips unsupported, binary, generated, and vendor paths, then classifies each source file by language.
Step 02
Fingerprint files for incremental work
Each candidate file is hashed so unchanged files can be reused. Changed files become a bounded indexing plan instead of forcing a full rebuild.
Step 03
Extract structural facts through adapters
Language adapters use Tree-sitter where available, fall back to scanners when needed, and emit symbols, imports, exports, calls, references, packages, spans, and provenance.
Step 04
Normalize into the core graph model
Adapter-specific details collapse into deterministic IDs and neutral graph records so query, storage, and export code do not need to know which parser produced a fact.
Step 05
Write replaceable file partitions
ACI stores graph data by file partition with compact manifests and delta logs, so an incremental update can replace one file without rewriting unrelated graph data.
Step 06
Query or export the graph
The CLI and library layers read the store for symbol lookup, dependency traversal, callers, callees, references, impact analysis, JSONL, SCIP, LSIF, and KiteDB-shaped exports.
Architecture
The crates stay narrow so parser code, storage mutation, query behavior, and CLI commands can evolve independently.
aci-core
Owns the graph model, deterministic IDs, source spans, language types, diagnostics, and fact confidence.
aci-indexer
Handles discovery, fingerprinting, scheduling, cache invalidation, and pipeline orchestration.
aci-adapters
Contains language detection, Tree-sitter extraction, scanner fallback, and package/dependency extraction.
aci-store
Persists manifests, packed partitions, delta logs, snapshots, and adjacency-oriented indexes.
aci-query
Provides symbol lookup, dependency traversal, callers, callees, references, packages, and impact queries.
aci-export
Projects the internal graph into JSONL, SCIP-shaped JSON, LSIF-shaped JSON, and KiteDB-compatible records.
System
01
Neutral graph model
Normalizes files, symbols, spans, dependencies, references, and provenance into shared Rust crates.
02
Incremental indexing
Hashes files, skips unchanged paths, and replaces per-file graph partitions without rewriting the full store.
03
Query and export layer
Supports symbol lookup, dependency traversal, callers, references, impact sets, JSONL, SCIP, LSIF, and KiteDB-shaped exports.
