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.

Active
Systems Builder
Rust, Tree-sitter, graph indexes, CLI tooling

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.