Repository files navigation

ACI

ACI is a Rust-first codebase indexer. It walks a repository, detects source languages, extracts a neutral graph of files, symbols, imports, exports, calls, references, and package dependencies, then stores that graph for fast queries and export.

The goal is a small, deterministic indexing engine that can grow from structural Tree-sitter extraction into richer semantic enrichment without changing the internal graph model.

What It Does

  • Indexes code into per-file graph partitions.
  • Emits stable IDs from repository, path, language, symbol kind, names, and source spans.
  • Tracks fact provenance and confidence so structural, SCIP, LSP, and compiler facts can coexist.
  • Stores full indexes as compact binary packs with JSONL manifests.
  • Supports incremental replacement of changed files and reverse dependencies.
  • Queries symbols, dependencies, callers, callees, references, packages, and impact sets.
  • Exports graph data as JSONL, KiteDB-shaped JSONL, SCIP-shaped JSON, and LSIF-shaped JSON.

Crates

CrateResponsibility
aci-coreGraph model, IDs, spans, diagnostics, language types, fact quality.
aci-adaptersLanguage detection, Tree-sitter extraction, scanner fallback, fixtures.
aci-indexerDiscovery, filtering, fingerprinting, parallel indexing, incremental planning.
aci-diffBranch-to-branch semantic diffing over indexed graph snapshots.
aci-storeManifests, packed partitions, delta logs, snapshots, symbol/dependency indexes.
aci-querySymbol lookup, dependency traversal, callers, callees, references, impact.
aci-exportJSONL, KiteDB, SCIP, and LSIF export shapes.
aci-watchFilesystem watch and debounce helpers.
aci-cliThin command-line entry point over the library crates.

Supported Inputs

Current adapters cover:

LanguageDetectionExtraction
C, C++, Objective-CExtensions and parser supportTree-sitter with scanner fallback
Go, Java, RustExtensions and parser supportTree-sitter with scanner fallback
JavaScript, TypeScript, TSXExtensions and parser supportTree-sitter with scanner fallback
PythonExtension and shebang supportTree-sitter with scanner fallback
JSON / package.jsonFilename and extensionPackage/dependency extraction

Unsupported, binary, generated, and vendor paths are skipped before parsing.

Quickstart

Install the latest release:

curl -fsSL https://aci.mask.dev/install.sh | sh

Run the tests:

cargo test --workspace

Index the current repository into .aci:

cargo run -p aci-cli -- index .
cargo run -p aci-cli -- index . --max-parse-bytes 10485760

Query symbols:

cargo run -p aci-cli -- query symbols
cargo run -p aci-cli -- query symbols --name main
cargo run -p aci-cli -- query --pretty symbols --name main
cargo run -p aci-cli -- query --pretty --color always symbols --name main
cargo run -p aci-cli -- query --format json symbols --name main

Symbol queries include jump locations in path:line:column form after the store is indexed with the current binary. Query commands default to text output; use --format json before the query subcommand for machine-readable output. Query and export commands use .aci by default; pass --store only when reading a different store path.

Query dependencies and impact:

cargo run -p aci-cli -- query deps --file src/lib.rs
cargo run -p aci-cli -- query packages
cargo run -p aci-cli -- query callers main
cargo run -p aci-cli -- query callees main
cargo run -p aci-cli -- query refs main
cargo run -p aci-cli -- query deps-tree main --depth 2
cargo run -p aci-cli -- query impact src/lib.rs
cargo run -p aci-cli -- query --pretty impact src/lib.rs

Compare two Git refs semantically:

cargo run -p aci-cli -- diff main feature
cargo run -p aci-cli -- diff main feature --agent
cargo run -p aci-cli -- diff main feature --pretty
cargo run -p aci-cli -- diff main feature --format json --pretty
cargo run -p aci-cli -- diff main feature --agent --format json --pretty
cargo run -p aci-cli -- diff main feature --agent --max-parse-bytes 10485760

aci diff checks each ref out into an isolated detached worktree, indexes both trees, then reports file, symbol, public API, dependency, diagnostic, and impact changes without mutating the current working tree.

Tree-sitter adapters skip files above the parse byte cap and fall back to structural scanners when fallback mode is enabled. Use --max-parse-bytes on index, watch, diff, bench cold, and bench query-path when a repository has large generated-by-hand source files that should still get parser-backed facts. The default protects indexing latency and memory on mixed repositories.

Keep the store updated while editing:

cargo run -p aci-cli -- watch .
cargo run -p aci-cli -- watch . --debounce-ms 250
cargo run -p aci-cli -- watch . --once --max-wait-ms 5000
cargo run -p aci-cli -- watch . --max-parse-bytes 10485760

Export the graph:

cargo run -p aci-cli -- export --format jsonl
cargo run -p aci-cli -- export --format scip --output graph.scip.json

Run a cold-index benchmark:

cargo run -p aci-cli -- bench cold . --variant tree-sitter-fallback

Development Workflow

Use this as the local quality gate before committing:

./scripts/check-loc.sh
cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps
./scripts/validate-packaging.sh

Benchmark and budget scripts live under scripts/:

  • bench-cold-index.sh
  • bench-incremental-index.sh
  • bench-query-latency.sh
  • bench-memory.sh
  • bench-real-repo.sh
  • bench-structural-variants.sh
  • validate-performance.sh

Architecture Notes

ACI keeps parser-specific details behind adapters. Every adapter emits the same aci-core graph model, and storage writes are partitioned by file so changed files can be replaced without rewriting unrelated graph data.

Full index writes stream compact partition records into partitions/pack-00000.bin and write manifest.jsonl. Incremental updates write changed file partitions and append replacement records to delta.jsonl. Snapshots are optional compaction artifacts for faster query startup.

Documentation

Contributing and Security

See CONTRIBUTING.md for setup, validation, and pull request expectations. See SECURITY.md for vulnerability reporting.

Current Limits

  • Extraction is strongest for structural facts. Semantic enrichment exists, but compiler/LSP-grade facts are still adapter work.
  • Query APIs are library-first; the CLI intentionally stays thin.
  • Store compatibility is tested for the current packed layout. Old local .aci stores should be regenerated after storage format changes.

About

Rust-first codebase indexer for symbols, dependencies, call graphs, references, impact analysis, and graph exports.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

ACI

ACI is a Rust-first codebase indexer. It walks a repository, detects source languages, extracts a neutral graph of files, symbols, imports, exports, calls, references, and package dependencies, then stores that graph for fast queries and export.

The goal is a small, deterministic indexing engine that can grow from structural Tree-sitter extraction into richer semantic enrichment without changing the internal graph model.

What It Does

  • Indexes code into per-file graph partitions.
  • Emits stable IDs from repository, path, language, symbol kind, names, and source spans.
  • Tracks fact provenance and confidence so structural, SCIP, LSP, and compiler facts can coexist.
  • Stores full indexes as compact binary packs with JSONL manifests.
  • Supports incremental replacement of changed files and reverse dependencies.
  • Queries symbols, dependencies, callers, callees, references, packages, and impact sets.
  • Exports graph data as JSONL, KiteDB-shaped JSONL, SCIP-shaped JSON, and LSIF-shaped JSON.

Crates

CrateResponsibility
aci-coreGraph model, IDs, spans, diagnostics, language types, fact quality.
aci-adaptersLanguage detection, Tree-sitter extraction, scanner fallback, fixtures.
aci-indexerDiscovery, filtering, fingerprinting, parallel indexing, incremental planning.
aci-diffBranch-to-branch semantic diffing over indexed graph snapshots.
aci-storeManifests, packed partitions, delta logs, snapshots, symbol/dependency indexes.
aci-querySymbol lookup, dependency traversal, callers, callees, references, impact.
aci-exportJSONL, KiteDB, SCIP, and LSIF export shapes.
aci-watchFilesystem watch and debounce helpers.
aci-cliThin command-line entry point over the library crates.

Supported Inputs

Current adapters cover:

LanguageDetectionExtraction
C, C++, Objective-CExtensions and parser supportTree-sitter with scanner fallback
Go, Java, RustExtensions and parser supportTree-sitter with scanner fallback
JavaScript, TypeScript, TSXExtensions and parser supportTree-sitter with scanner fallback
PythonExtension and shebang supportTree-sitter with scanner fallback
JSON / package.jsonFilename and extensionPackage/dependency extraction

Unsupported, binary, generated, and vendor paths are skipped before parsing.

Quickstart

Install the latest release:

curl -fsSL https://aci.mask.dev/install.sh | sh

Run the tests:

cargo test --workspace

Index the current repository into .aci:

cargo run -p aci-cli -- index .
cargo run -p aci-cli -- index . --max-parse-bytes 10485760

Query symbols:

cargo run -p aci-cli -- query symbols
cargo run -p aci-cli -- query symbols --name main
cargo run -p aci-cli -- query --pretty symbols --name main
cargo run -p aci-cli -- query --pretty --color always symbols --name main
cargo run -p aci-cli -- query --format json symbols --name main

Symbol queries include jump locations in path:line:column form after the store is indexed with the current binary. Query commands default to text output; use --format json before the query subcommand for machine-readable output. Query and export commands use .aci by default; pass --store only when reading a different store path.

Query dependencies and impact:

cargo run -p aci-cli -- query deps --file src/lib.rs
cargo run -p aci-cli -- query packages
cargo run -p aci-cli -- query callers main
cargo run -p aci-cli -- query callees main
cargo run -p aci-cli -- query refs main
cargo run -p aci-cli -- query deps-tree main --depth 2
cargo run -p aci-cli -- query impact src/lib.rs
cargo run -p aci-cli -- query --pretty impact src/lib.rs

Compare two Git refs semantically:

cargo run -p aci-cli -- diff main feature
cargo run -p aci-cli -- diff main feature --agent
cargo run -p aci-cli -- diff main feature --pretty
cargo run -p aci-cli -- diff main feature --format json --pretty
cargo run -p aci-cli -- diff main feature --agent --format json --pretty
cargo run -p aci-cli -- diff main feature --agent --max-parse-bytes 10485760

aci diff checks each ref out into an isolated detached worktree, indexes both trees, then reports file, symbol, public API, dependency, diagnostic, and impact changes without mutating the current working tree.

Tree-sitter adapters skip files above the parse byte cap and fall back to structural scanners when fallback mode is enabled. Use --max-parse-bytes on index, watch, diff, bench cold, and bench query-path when a repository has large generated-by-hand source files that should still get parser-backed facts. The default protects indexing latency and memory on mixed repositories.

Keep the store updated while editing:

cargo run -p aci-cli -- watch .
cargo run -p aci-cli -- watch . --debounce-ms 250
cargo run -p aci-cli -- watch . --once --max-wait-ms 5000
cargo run -p aci-cli -- watch . --max-parse-bytes 10485760

Export the graph:

cargo run -p aci-cli -- export --format jsonl
cargo run -p aci-cli -- export --format scip --output graph.scip.json

Run a cold-index benchmark:

cargo run -p aci-cli -- bench cold . --variant tree-sitter-fallback

Development Workflow

Use this as the local quality gate before committing:

./scripts/check-loc.sh
cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps
./scripts/validate-packaging.sh

Benchmark and budget scripts live under scripts/:

  • bench-cold-index.sh
  • bench-incremental-index.sh
  • bench-query-latency.sh
  • bench-memory.sh
  • bench-real-repo.sh
  • bench-structural-variants.sh
  • validate-performance.sh

Architecture Notes

ACI keeps parser-specific details behind adapters. Every adapter emits the same aci-core graph model, and storage writes are partitioned by file so changed files can be replaced without rewriting unrelated graph data.

Full index writes stream compact partition records into partitions/pack-00000.bin and write manifest.jsonl. Incremental updates write changed file partitions and append replacement records to delta.jsonl. Snapshots are optional compaction artifacts for faster query startup.

Documentation

Contributing and Security

See CONTRIBUTING.md for setup, validation, and pull request expectations. See SECURITY.md for vulnerability reporting.

Current Limits

  • Extraction is strongest for structural facts. Semantic enrichment exists, but compiler/LSP-grade facts are still adapter work.
  • Query APIs are library-first; the CLI intentionally stays thin.
  • Store compatibility is tested for the current packed layout. Old local .aci stores should be regenerated after storage format changes.

About

Rust-first codebase indexer for symbols, dependencies, call graphs, references, impact analysis, and graph exports.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ACI

ACI is a Rust-first codebase indexer. It walks a repository, detects source languages, extracts a neutral graph of files, symbols, imports, exports, calls, references, and package dependencies, then stores that graph for fast queries and export.

The goal is a small, deterministic indexing engine that can grow from structural Tree-sitter extraction into richer semantic enrichment without changing the internal graph model.

What It Does

  • Indexes code into per-file graph partitions.
  • Emits stable IDs from repository, path, language, symbol kind, names, and source spans.
  • Tracks fact provenance and confidence so structural, SCIP, LSP, and compiler facts can coexist.
  • Stores full indexes as compact binary packs with JSONL manifests.
  • Supports incremental replacement of changed files and reverse dependencies.
  • Queries symbols, dependencies, callers, callees, references, packages, and impact sets.
  • Exports graph data as JSONL, KiteDB-shaped JSONL, SCIP-shaped JSON, and LSIF-shaped JSON.

Crates

CrateResponsibility
aci-coreGraph model, IDs, spans, diagnostics, language types, fact quality.
aci-adaptersLanguage detection, Tree-sitter extraction, scanner fallback, fixtures.
aci-indexerDiscovery, filtering, fingerprinting, parallel indexing, incremental planning.
aci-diffBranch-to-branch semantic diffing over indexed graph snapshots.
aci-storeManifests, packed partitions, delta logs, snapshots, symbol/dependency indexes.
aci-querySymbol lookup, dependency traversal, callers, callees, references, impact.
aci-exportJSONL, KiteDB, SCIP, and LSIF export shapes.
aci-watchFilesystem watch and debounce helpers.
aci-cliThin command-line entry point over the library crates.

Supported Inputs

Current adapters cover:

LanguageDetectionExtraction
C, C++, Objective-CExtensions and parser supportTree-sitter with scanner fallback
Go, Java, RustExtensions and parser supportTree-sitter with scanner fallback
JavaScript, TypeScript, TSXExtensions and parser supportTree-sitter with scanner fallback
PythonExtension and shebang supportTree-sitter with scanner fallback
JSON / package.jsonFilename and extensionPackage/dependency extraction

Unsupported, binary, generated, and vendor paths are skipped before parsing.

Quickstart

Install the latest release:

curl -fsSL https://aci.mask.dev/install.sh | sh

Run the tests:

cargo test --workspace

Index the current repository into .aci:

cargo run -p aci-cli -- index .
cargo run -p aci-cli -- index . --max-parse-bytes 10485760

Query symbols:

cargo run -p aci-cli -- query symbols
cargo run -p aci-cli -- query symbols --name main
cargo run -p aci-cli -- query --pretty symbols --name main
cargo run -p aci-cli -- query --pretty --color always symbols --name main
cargo run -p aci-cli -- query --format json symbols --name main

Symbol queries include jump locations in path:line:column form after the store is indexed with the current binary. Query commands default to text output; use --format json before the query subcommand for machine-readable output. Query and export commands use .aci by default; pass --store only when reading a different store path.

Query dependencies and impact:

cargo run -p aci-cli -- query deps --file src/lib.rs
cargo run -p aci-cli -- query packages
cargo run -p aci-cli -- query callers main
cargo run -p aci-cli -- query callees main
cargo run -p aci-cli -- query refs main
cargo run -p aci-cli -- query deps-tree main --depth 2
cargo run -p aci-cli -- query impact src/lib.rs
cargo run -p aci-cli -- query --pretty impact src/lib.rs

Compare two Git refs semantically:

cargo run -p aci-cli -- diff main feature
cargo run -p aci-cli -- diff main feature --agent
cargo run -p aci-cli -- diff main feature --pretty
cargo run -p aci-cli -- diff main feature --format json --pretty
cargo run -p aci-cli -- diff main feature --agent --format json --pretty
cargo run -p aci-cli -- diff main feature --agent --max-parse-bytes 10485760

aci diff checks each ref out into an isolated detached worktree, indexes both trees, then reports file, symbol, public API, dependency, diagnostic, and impact changes without mutating the current working tree.

Tree-sitter adapters skip files above the parse byte cap and fall back to structural scanners when fallback mode is enabled. Use --max-parse-bytes on index, watch, diff, bench cold, and bench query-path when a repository has large generated-by-hand source files that should still get parser-backed facts. The default protects indexing latency and memory on mixed repositories.

Keep the store updated while editing:

cargo run -p aci-cli -- watch .
cargo run -p aci-cli -- watch . --debounce-ms 250
cargo run -p aci-cli -- watch . --once --max-wait-ms 5000
cargo run -p aci-cli -- watch . --max-parse-bytes 10485760

Export the graph:

cargo run -p aci-cli -- export --format jsonl
cargo run -p aci-cli -- export --format scip --output graph.scip.json

Run a cold-index benchmark:

cargo run -p aci-cli -- bench cold . --variant tree-sitter-fallback

Development Workflow

Use this as the local quality gate before committing:

./scripts/check-loc.sh
cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps
./scripts/validate-packaging.sh

Benchmark and budget scripts live under scripts/:

  • bench-cold-index.sh
  • bench-incremental-index.sh
  • bench-query-latency.sh
  • bench-memory.sh
  • bench-real-repo.sh
  • bench-structural-variants.sh
  • validate-performance.sh

Architecture Notes

ACI keeps parser-specific details behind adapters. Every adapter emits the same aci-core graph model, and storage writes are partitioned by file so changed files can be replaced without rewriting unrelated graph data.

Full index writes stream compact partition records into partitions/pack-00000.bin and write manifest.jsonl. Incremental updates write changed file partitions and append replacement records to delta.jsonl. Snapshots are optional compaction artifacts for faster query startup.

Documentation

Contributing and Security

See CONTRIBUTING.md for setup, validation, and pull request expectations. See SECURITY.md for vulnerability reporting.

Current Limits

  • Extraction is strongest for structural facts. Semantic enrichment exists, but compiler/LSP-grade facts are still adapter work.
  • Query APIs are library-first; the CLI intentionally stays thin.
  • Store compatibility is tested for the current packed layout. Old local .aci stores should be regenerated after storage format changes.

About

Rust-first codebase indexer for symbols, dependencies, call graphs, references, impact analysis, and graph exports.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ACI

ACI is a Rust-first codebase indexer. It walks a repository, detects source languages, extracts a neutral graph of files, symbols, imports, exports, calls, references, and package dependencies, then stores that graph for fast queries and export.

The goal is a small, deterministic indexing engine that can grow from structural Tree-sitter extraction into richer semantic enrichment without changing the internal graph model.

What It Does

  • Indexes code into per-file graph partitions.
  • Emits stable IDs from repository, path, language, symbol kind, names, and source spans.
  • Tracks fact provenance and confidence so structural, SCIP, LSP, and compiler facts can coexist.
  • Stores full indexes as compact binary packs with JSONL manifests.
  • Supports incremental replacement of changed files and reverse dependencies.
  • Queries symbols, dependencies, callers, callees, references, packages, and impact sets.
  • Exports graph data as JSONL, KiteDB-shaped JSONL, SCIP-shaped JSON, and LSIF-shaped JSON.

Crates

CrateResponsibility
aci-coreGraph model, IDs, spans, diagnostics, language types, fact quality.
aci-adaptersLanguage detection, Tree-sitter extraction, scanner fallback, fixtures.
aci-indexerDiscovery, filtering, fingerprinting, parallel indexing, incremental planning.
aci-diffBranch-to-branch semantic diffing over indexed graph snapshots.
aci-storeManifests, packed partitions, delta logs, snapshots, symbol/dependency indexes.
aci-querySymbol lookup, dependency traversal, callers, callees, references, impact.
aci-exportJSONL, KiteDB, SCIP, and LSIF export shapes.
aci-watchFilesystem watch and debounce helpers.
aci-cliThin command-line entry point over the library crates.

Supported Inputs

Current adapters cover:

LanguageDetectionExtraction
C, C++, Objective-CExtensions and parser supportTree-sitter with scanner fallback
Go, Java, RustExtensions and parser supportTree-sitter with scanner fallback
JavaScript, TypeScript, TSXExtensions and parser supportTree-sitter with scanner fallback
PythonExtension and shebang supportTree-sitter with scanner fallback
JSON / package.jsonFilename and extensionPackage/dependency extraction

Unsupported, binary, generated, and vendor paths are skipped before parsing.

Quickstart

Install the latest release:

curl -fsSL https://aci.mask.dev/install.sh | sh

Run the tests:

cargo test --workspace

Index the current repository into .aci:

cargo run -p aci-cli -- index .
cargo run -p aci-cli -- index . --max-parse-bytes 10485760

Query symbols:

cargo run -p aci-cli -- query symbols
cargo run -p aci-cli -- query symbols --name main
cargo run -p aci-cli -- query --pretty symbols --name main
cargo run -p aci-cli -- query --pretty --color always symbols --name main
cargo run -p aci-cli -- query --format json symbols --name main

Symbol queries include jump locations in path:line:column form after the store is indexed with the current binary. Query commands default to text output; use --format json before the query subcommand for machine-readable output. Query and export commands use .aci by default; pass --store only when reading a different store path.

Query dependencies and impact:

cargo run -p aci-cli -- query deps --file src/lib.rs
cargo run -p aci-cli -- query packages
cargo run -p aci-cli -- query callers main
cargo run -p aci-cli -- query callees main
cargo run -p aci-cli -- query refs main
cargo run -p aci-cli -- query deps-tree main --depth 2
cargo run -p aci-cli -- query impact src/lib.rs
cargo run -p aci-cli -- query --pretty impact src/lib.rs

Compare two Git refs semantically:

cargo run -p aci-cli -- diff main feature
cargo run -p aci-cli -- diff main feature --agent
cargo run -p aci-cli -- diff main feature --pretty
cargo run -p aci-cli -- diff main feature --format json --pretty
cargo run -p aci-cli -- diff main feature --agent --format json --pretty
cargo run -p aci-cli -- diff main feature --agent --max-parse-bytes 10485760

aci diff checks each ref out into an isolated detached worktree, indexes both trees, then reports file, symbol, public API, dependency, diagnostic, and impact changes without mutating the current working tree.

Tree-sitter adapters skip files above the parse byte cap and fall back to structural scanners when fallback mode is enabled. Use --max-parse-bytes on index, watch, diff, bench cold, and bench query-path when a repository has large generated-by-hand source files that should still get parser-backed facts. The default protects indexing latency and memory on mixed repositories.

Keep the store updated while editing:

cargo run -p aci-cli -- watch .
cargo run -p aci-cli -- watch . --debounce-ms 250
cargo run -p aci-cli -- watch . --once --max-wait-ms 5000
cargo run -p aci-cli -- watch . --max-parse-bytes 10485760

Export the graph:

cargo run -p aci-cli -- export --format jsonl
cargo run -p aci-cli -- export --format scip --output graph.scip.json

Run a cold-index benchmark:

cargo run -p aci-cli -- bench cold . --variant tree-sitter-fallback

Development Workflow

Use this as the local quality gate before committing:

./scripts/check-loc.sh
cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps
./scripts/validate-packaging.sh

Benchmark and budget scripts live under scripts/:

  • bench-cold-index.sh
  • bench-incremental-index.sh
  • bench-query-latency.sh
  • bench-memory.sh
  • bench-real-repo.sh
  • bench-structural-variants.sh
  • validate-performance.sh

Architecture Notes

ACI keeps parser-specific details behind adapters. Every adapter emits the same aci-core graph model, and storage writes are partitioned by file so changed files can be replaced without rewriting unrelated graph data.

Full index writes stream compact partition records into partitions/pack-00000.bin and write manifest.jsonl. Incremental updates write changed file partitions and append replacement records to delta.jsonl. Snapshots are optional compaction artifacts for faster query startup.

Documentation

Contributing and Security

See CONTRIBUTING.md for setup, validation, and pull request expectations. See SECURITY.md for vulnerability reporting.

Current Limits

  • Extraction is strongest for structural facts. Semantic enrichment exists, but compiler/LSP-grade facts are still adapter work.
  • Query APIs are library-first; the CLI intentionally stays thin.
  • Store compatibility is tested for the current packed layout. Old local .aci stores should be regenerated after storage format changes.

About

Rust-first codebase indexer for symbols, dependencies, call graphs, references, impact analysis, and graph exports.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

ACI

ACI is a Rust-first codebase indexer. It walks a repository, detects source languages, extracts a neutral graph of files, symbols, imports, exports, calls, references, and package dependencies, then stores that graph for fast queries and export.

The goal is a small, deterministic indexing engine that can grow from structural Tree-sitter extraction into richer semantic enrichment without changing the internal graph model.

What It Does

  • Indexes code into per-file graph partitions.
  • Emits stable IDs from repository, path, language, symbol kind, names, and source spans.
  • Tracks fact provenance and confidence so structural, SCIP, LSP, and compiler facts can coexist.
  • Stores full indexes as compact binary packs with JSONL manifests.
  • Supports incremental replacement of changed files and reverse dependencies.
  • Queries symbols, dependencies, callers, callees, references, packages, and impact sets.
  • Exports graph data as JSONL, KiteDB-shaped JSONL, SCIP-shaped JSON, and LSIF-shaped JSON.

Crates

CrateResponsibility
aci-coreGraph model, IDs, spans, diagnostics, language types, fact quality.
aci-adaptersLanguage detection, Tree-sitter extraction, scanner fallback, fixtures.
aci-indexerDiscovery, filtering, fingerprinting, parallel indexing, incremental planning.
aci-diffBranch-to-branch semantic diffing over indexed graph snapshots.
aci-storeManifests, packed partitions, delta logs, snapshots, symbol/dependency indexes.
aci-querySymbol lookup, dependency traversal, callers, callees, references, impact.
aci-exportJSONL, KiteDB, SCIP, and LSIF export shapes.
aci-watchFilesystem watch and debounce helpers.
aci-cliThin command-line entry point over the library crates.

Supported Inputs

Current adapters cover:

LanguageDetectionExtraction
C, C++, Objective-CExtensions and parser supportTree-sitter with scanner fallback
Go, Java, RustExtensions and parser supportTree-sitter with scanner fallback
JavaScript, TypeScript, TSXExtensions and parser supportTree-sitter with scanner fallback
PythonExtension and shebang supportTree-sitter with scanner fallback
JSON / package.jsonFilename and extensionPackage/dependency extraction

Unsupported, binary, generated, and vendor paths are skipped before parsing.

Quickstart

Install the latest release:

curl -fsSL https://aci.mask.dev/install.sh | sh

Run the tests:

cargo test --workspace

Index the current repository into .aci:

cargo run -p aci-cli -- index .
cargo run -p aci-cli -- index . --max-parse-bytes 10485760

Query symbols:

cargo run -p aci-cli -- query symbols
cargo run -p aci-cli -- query symbols --name main
cargo run -p aci-cli -- query --pretty symbols --name main
cargo run -p aci-cli -- query --pretty --color always symbols --name main
cargo run -p aci-cli -- query --format json symbols --name main

Symbol queries include jump locations in path:line:column form after the store is indexed with the current binary. Query commands default to text output; use --format json before the query subcommand for machine-readable output. Query and export commands use .aci by default; pass --store only when reading a different store path.

Query dependencies and impact:

cargo run -p aci-cli -- query deps --file src/lib.rs
cargo run -p aci-cli -- query packages
cargo run -p aci-cli -- query callers main
cargo run -p aci-cli -- query callees main
cargo run -p aci-cli -- query refs main
cargo run -p aci-cli -- query deps-tree main --depth 2
cargo run -p aci-cli -- query impact src/lib.rs
cargo run -p aci-cli -- query --pretty impact src/lib.rs

Compare two Git refs semantically:

cargo run -p aci-cli -- diff main feature
cargo run -p aci-cli -- diff main feature --agent
cargo run -p aci-cli -- diff main feature --pretty
cargo run -p aci-cli -- diff main feature --format json --pretty
cargo run -p aci-cli -- diff main feature --agent --format json --pretty
cargo run -p aci-cli -- diff main feature --agent --max-parse-bytes 10485760

aci diff checks each ref out into an isolated detached worktree, indexes both trees, then reports file, symbol, public API, dependency, diagnostic, and impact changes without mutating the current working tree.

Tree-sitter adapters skip files above the parse byte cap and fall back to structural scanners when fallback mode is enabled. Use --max-parse-bytes on index, watch, diff, bench cold, and bench query-path when a repository has large generated-by-hand source files that should still get parser-backed facts. The default protects indexing latency and memory on mixed repositories.

Keep the store updated while editing:

cargo run -p aci-cli -- watch .
cargo run -p aci-cli -- watch . --debounce-ms 250
cargo run -p aci-cli -- watch . --once --max-wait-ms 5000
cargo run -p aci-cli -- watch . --max-parse-bytes 10485760

Export the graph:

cargo run -p aci-cli -- export --format jsonl
cargo run -p aci-cli -- export --format scip --output graph.scip.json

Run a cold-index benchmark:

cargo run -p aci-cli -- bench cold . --variant tree-sitter-fallback

Development Workflow

Use this as the local quality gate before committing:

./scripts/check-loc.sh
cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps
./scripts/validate-packaging.sh

Benchmark and budget scripts live under scripts/:

  • bench-cold-index.sh
  • bench-incremental-index.sh
  • bench-query-latency.sh
  • bench-memory.sh
  • bench-real-repo.sh
  • bench-structural-variants.sh
  • validate-performance.sh

Architecture Notes

ACI keeps parser-specific details behind adapters. Every adapter emits the same aci-core graph model, and storage writes are partitioned by file so changed files can be replaced without rewriting unrelated graph data.

Full index writes stream compact partition records into partitions/pack-00000.bin and write manifest.jsonl. Incremental updates write changed file partitions and append replacement records to delta.jsonl. Snapshots are optional compaction artifacts for faster query startup.

Documentation

Contributing and Security

See CONTRIBUTING.md for setup, validation, and pull request expectations. See SECURITY.md for vulnerability reporting.

Current Limits

  • Extraction is strongest for structural facts. Semantic enrichment exists, but compiler/LSP-grade facts are still adapter work.
  • Query APIs are library-first; the CLI intentionally stays thin.
  • Store compatibility is tested for the current packed layout. Old local .aci stores should be regenerated after storage format changes.

About

Rust-first codebase indexer for symbols, dependencies, call graphs, references, impact analysis, and graph exports.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ACI

ACI is a Rust-first codebase indexer. It walks a repository, detects source languages, extracts a neutral graph of files, symbols, imports, exports, calls, references, and package dependencies, then stores that graph for fast queries and export.

The goal is a small, deterministic indexing engine that can grow from structural Tree-sitter extraction into richer semantic enrichment without changing the internal graph model.

What It Does

  • Indexes code into per-file graph partitions.
  • Emits stable IDs from repository, path, language, symbol kind, names, and source spans.
  • Tracks fact provenance and confidence so structural, SCIP, LSP, and compiler facts can coexist.
  • Stores full indexes as compact binary packs with JSONL manifests.
  • Supports incremental replacement of changed files and reverse dependencies.
  • Queries symbols, dependencies, callers, callees, references, packages, and impact sets.
  • Exports graph data as JSONL, KiteDB-shaped JSONL, SCIP-shaped JSON, and LSIF-shaped JSON.

Crates

CrateResponsibility
aci-coreGraph model, IDs, spans, diagnostics, language types, fact quality.
aci-adaptersLanguage detection, Tree-sitter extraction, scanner fallback, fixtures.
aci-indexerDiscovery, filtering, fingerprinting, parallel indexing, incremental planning.
aci-diffBranch-to-branch semantic diffing over indexed graph snapshots.
aci-storeManifests, packed partitions, delta logs, snapshots, symbol/dependency indexes.
aci-querySymbol lookup, dependency traversal, callers, callees, references, impact.
aci-exportJSONL, KiteDB, SCIP, and LSIF export shapes.
aci-watchFilesystem watch and debounce helpers.
aci-cliThin command-line entry point over the library crates.

Supported Inputs

Current adapters cover:

LanguageDetectionExtraction
C, C++, Objective-CExtensions and parser supportTree-sitter with scanner fallback
Go, Java, RustExtensions and parser supportTree-sitter with scanner fallback
JavaScript, TypeScript, TSXExtensions and parser supportTree-sitter with scanner fallback
PythonExtension and shebang supportTree-sitter with scanner fallback
JSON / package.jsonFilename and extensionPackage/dependency extraction

Unsupported, binary, generated, and vendor paths are skipped before parsing.

Quickstart

Install the latest release:

curl -fsSL https://aci.mask.dev/install.sh | sh

Run the tests:

cargo test --workspace

Index the current repository into .aci:

cargo run -p aci-cli -- index .
cargo run -p aci-cli -- index . --max-parse-bytes 10485760

Query symbols:

cargo run -p aci-cli -- query symbols
cargo run -p aci-cli -- query symbols --name main
cargo run -p aci-cli -- query --pretty symbols --name main
cargo run -p aci-cli -- query --pretty --color always symbols --name main
cargo run -p aci-cli -- query --format json symbols --name main

Symbol queries include jump locations in path:line:column form after the store is indexed with the current binary. Query commands default to text output; use --format json before the query subcommand for machine-readable output. Query and export commands use .aci by default; pass --store only when reading a different store path.

Query dependencies and impact:

cargo run -p aci-cli -- query deps --file src/lib.rs
cargo run -p aci-cli -- query packages
cargo run -p aci-cli -- query callers main
cargo run -p aci-cli -- query callees main
cargo run -p aci-cli -- query refs main
cargo run -p aci-cli -- query deps-tree main --depth 2
cargo run -p aci-cli -- query impact src/lib.rs
cargo run -p aci-cli -- query --pretty impact src/lib.rs

Compare two Git refs semantically:

cargo run -p aci-cli -- diff main feature
cargo run -p aci-cli -- diff main feature --agent
cargo run -p aci-cli -- diff main feature --pretty
cargo run -p aci-cli -- diff main feature --format json --pretty
cargo run -p aci-cli -- diff main feature --agent --format json --pretty
cargo run -p aci-cli -- diff main feature --agent --max-parse-bytes 10485760

aci diff checks each ref out into an isolated detached worktree, indexes both trees, then reports file, symbol, public API, dependency, diagnostic, and impact changes without mutating the current working tree.

Tree-sitter adapters skip files above the parse byte cap and fall back to structural scanners when fallback mode is enabled. Use --max-parse-bytes on index, watch, diff, bench cold, and bench query-path when a repository has large generated-by-hand source files that should still get parser-backed facts. The default protects indexing latency and memory on mixed repositories.

Keep the store updated while editing:

cargo run -p aci-cli -- watch .
cargo run -p aci-cli -- watch . --debounce-ms 250
cargo run -p aci-cli -- watch . --once --max-wait-ms 5000
cargo run -p aci-cli -- watch . --max-parse-bytes 10485760

Export the graph:

cargo run -p aci-cli -- export --format jsonl
cargo run -p aci-cli -- export --format scip --output graph.scip.json

Run a cold-index benchmark:

cargo run -p aci-cli -- bench cold . --variant tree-sitter-fallback

Development Workflow

Use this as the local quality gate before committing:

./scripts/check-loc.sh
cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps
./scripts/validate-packaging.sh

Benchmark and budget scripts live under scripts/:

  • bench-cold-index.sh
  • bench-incremental-index.sh
  • bench-query-latency.sh
  • bench-memory.sh
  • bench-real-repo.sh
  • bench-structural-variants.sh
  • validate-performance.sh

Architecture Notes

ACI keeps parser-specific details behind adapters. Every adapter emits the same aci-core graph model, and storage writes are partitioned by file so changed files can be replaced without rewriting unrelated graph data.

Full index writes stream compact partition records into partitions/pack-00000.bin and write manifest.jsonl. Incremental updates write changed file partitions and append replacement records to delta.jsonl. Snapshots are optional compaction artifacts for faster query startup.

Documentation

Contributing and Security

See CONTRIBUTING.md for setup, validation, and pull request expectations. See SECURITY.md for vulnerability reporting.

Current Limits

  • Extraction is strongest for structural facts. Semantic enrichment exists, but compiler/LSP-grade facts are still adapter work.
  • Query APIs are library-first; the CLI intentionally stays thin.
  • Store compatibility is tested for the current packed layout. Old local .aci stores should be regenerated after storage format changes.

About

Rust-first codebase indexer for symbols, dependencies, call graphs, references, impact analysis, and graph exports.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ACI

ACI is a Rust-first codebase indexer. It walks a repository, detects source languages, extracts a neutral graph of files, symbols, imports, exports, calls, references, and package dependencies, then stores that graph for fast queries and export.

The goal is a small, deterministic indexing engine that can grow from structural Tree-sitter extraction into richer semantic enrichment without changing the internal graph model.

What It Does

  • Indexes code into per-file graph partitions.
  • Emits stable IDs from repository, path, language, symbol kind, names, and source spans.
  • Tracks fact provenance and confidence so structural, SCIP, LSP, and compiler facts can coexist.
  • Stores full indexes as compact binary packs with JSONL manifests.
  • Supports incremental replacement of changed files and reverse dependencies.
  • Queries symbols, dependencies, callers, callees, references, packages, and impact sets.
  • Exports graph data as JSONL, KiteDB-shaped JSONL, SCIP-shaped JSON, and LSIF-shaped JSON.

Crates

CrateResponsibility
aci-coreGraph model, IDs, spans, diagnostics, language types, fact quality.
aci-adaptersLanguage detection, Tree-sitter extraction, scanner fallback, fixtures.
aci-indexerDiscovery, filtering, fingerprinting, parallel indexing, incremental planning.
aci-diffBranch-to-branch semantic diffing over indexed graph snapshots.
aci-storeManifests, packed partitions, delta logs, snapshots, symbol/dependency indexes.
aci-querySymbol lookup, dependency traversal, callers, callees, references, impact.
aci-exportJSONL, KiteDB, SCIP, and LSIF export shapes.
aci-watchFilesystem watch and debounce helpers.
aci-cliThin command-line entry point over the library crates.

Supported Inputs

Current adapters cover:

LanguageDetectionExtraction
C, C++, Objective-CExtensions and parser supportTree-sitter with scanner fallback
Go, Java, RustExtensions and parser supportTree-sitter with scanner fallback
JavaScript, TypeScript, TSXExtensions and parser supportTree-sitter with scanner fallback
PythonExtension and shebang supportTree-sitter with scanner fallback
JSON / package.jsonFilename and extensionPackage/dependency extraction

Unsupported, binary, generated, and vendor paths are skipped before parsing.

Quickstart

Install the latest release:

curl -fsSL https://aci.mask.dev/install.sh | sh

Run the tests:

cargo test --workspace

Index the current repository into .aci:

cargo run -p aci-cli -- index .
cargo run -p aci-cli -- index . --max-parse-bytes 10485760

Query symbols:

cargo run -p aci-cli -- query symbols
cargo run -p aci-cli -- query symbols --name main
cargo run -p aci-cli -- query --pretty symbols --name main
cargo run -p aci-cli -- query --pretty --color always symbols --name main
cargo run -p aci-cli -- query --format json symbols --name main

Symbol queries include jump locations in path:line:column form after the store is indexed with the current binary. Query commands default to text output; use --format json before the query subcommand for machine-readable output. Query and export commands use .aci by default; pass --store only when reading a different store path.

Query dependencies and impact:

cargo run -p aci-cli -- query deps --file src/lib.rs
cargo run -p aci-cli -- query packages
cargo run -p aci-cli -- query callers main
cargo run -p aci-cli -- query callees main
cargo run -p aci-cli -- query refs main
cargo run -p aci-cli -- query deps-tree main --depth 2
cargo run -p aci-cli -- query impact src/lib.rs
cargo run -p aci-cli -- query --pretty impact src/lib.rs

Compare two Git refs semantically:

cargo run -p aci-cli -- diff main feature
cargo run -p aci-cli -- diff main feature --agent
cargo run -p aci-cli -- diff main feature --pretty
cargo run -p aci-cli -- diff main feature --format json --pretty
cargo run -p aci-cli -- diff main feature --agent --format json --pretty
cargo run -p aci-cli -- diff main feature --agent --max-parse-bytes 10485760

aci diff checks each ref out into an isolated detached worktree, indexes both trees, then reports file, symbol, public API, dependency, diagnostic, and impact changes without mutating the current working tree.

Tree-sitter adapters skip files above the parse byte cap and fall back to structural scanners when fallback mode is enabled. Use --max-parse-bytes on index, watch, diff, bench cold, and bench query-path when a repository has large generated-by-hand source files that should still get parser-backed facts. The default protects indexing latency and memory on mixed repositories.

Keep the store updated while editing:

cargo run -p aci-cli -- watch .
cargo run -p aci-cli -- watch . --debounce-ms 250
cargo run -p aci-cli -- watch . --once --max-wait-ms 5000
cargo run -p aci-cli -- watch . --max-parse-bytes 10485760

Export the graph:

cargo run -p aci-cli -- export --format jsonl
cargo run -p aci-cli -- export --format scip --output graph.scip.json

Run a cold-index benchmark:

cargo run -p aci-cli -- bench cold . --variant tree-sitter-fallback

Development Workflow

Use this as the local quality gate before committing:

./scripts/check-loc.sh
cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps
./scripts/validate-packaging.sh

Benchmark and budget scripts live under scripts/:

  • bench-cold-index.sh
  • bench-incremental-index.sh
  • bench-query-latency.sh
  • bench-memory.sh
  • bench-real-repo.sh
  • bench-structural-variants.sh
  • validate-performance.sh

Architecture Notes

ACI keeps parser-specific details behind adapters. Every adapter emits the same aci-core graph model, and storage writes are partitioned by file so changed files can be replaced without rewriting unrelated graph data.

Full index writes stream compact partition records into partitions/pack-00000.bin and write manifest.jsonl. Incremental updates write changed file partitions and append replacement records to delta.jsonl. Snapshots are optional compaction artifacts for faster query startup.

Documentation

Contributing and Security

See CONTRIBUTING.md for setup, validation, and pull request expectations. See SECURITY.md for vulnerability reporting.

Current Limits

  • Extraction is strongest for structural facts. Semantic enrichment exists, but compiler/LSP-grade facts are still adapter work.
  • Query APIs are library-first; the CLI intentionally stays thin.
  • Store compatibility is tested for the current packed layout. Old local .aci stores should be regenerated after storage format changes.

About

Rust-first codebase indexer for symbols, dependencies, call graphs, references, impact analysis, and graph exports.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

ACI

ACI is a Rust-first codebase indexer. It walks a repository, detects source languages, extracts a neutral graph of files, symbols, imports, exports, calls, references, and package dependencies, then stores that graph for fast queries and export.

The goal is a small, deterministic indexing engine that can grow from structural Tree-sitter extraction into richer semantic enrichment without changing the internal graph model.

What It Does

  • Indexes code into per-file graph partitions.
  • Emits stable IDs from repository, path, language, symbol kind, names, and source spans.
  • Tracks fact provenance and confidence so structural, SCIP, LSP, and compiler facts can coexist.
  • Stores full indexes as compact binary packs with JSONL manifests.
  • Supports incremental replacement of changed files and reverse dependencies.
  • Queries symbols, dependencies, callers, callees, references, packages, and impact sets.
  • Exports graph data as JSONL, KiteDB-shaped JSONL, SCIP-shaped JSON, and LSIF-shaped JSON.

Crates

CrateResponsibility
aci-coreGraph model, IDs, spans, diagnostics, language types, fact quality.
aci-adaptersLanguage detection, Tree-sitter extraction, scanner fallback, fixtures.
aci-indexerDiscovery, filtering, fingerprinting, parallel indexing, incremental planning.
aci-diffBranch-to-branch semantic diffing over indexed graph snapshots.
aci-storeManifests, packed partitions, delta logs, snapshots, symbol/dependency indexes.
aci-querySymbol lookup, dependency traversal, callers, callees, references, impact.
aci-exportJSONL, KiteDB, SCIP, and LSIF export shapes.
aci-watchFilesystem watch and debounce helpers.
aci-cliThin command-line entry point over the library crates.

Supported Inputs

Current adapters cover:

LanguageDetectionExtraction
C, C++, Objective-CExtensions and parser supportTree-sitter with scanner fallback
Go, Java, RustExtensions and parser supportTree-sitter with scanner fallback
JavaScript, TypeScript, TSXExtensions and parser supportTree-sitter with scanner fallback
PythonExtension and shebang supportTree-sitter with scanner fallback
JSON / package.jsonFilename and extensionPackage/dependency extraction

Unsupported, binary, generated, and vendor paths are skipped before parsing.

Quickstart

Install the latest release:

curl -fsSL https://aci.mask.dev/install.sh | sh

Run the tests:

cargo test --workspace

Index the current repository into .aci:

cargo run -p aci-cli -- index .
cargo run -p aci-cli -- index . --max-parse-bytes 10485760

Query symbols:

cargo run -p aci-cli -- query symbols
cargo run -p aci-cli -- query symbols --name main
cargo run -p aci-cli -- query --pretty symbols --name main
cargo run -p aci-cli -- query --pretty --color always symbols --name main
cargo run -p aci-cli -- query --format json symbols --name main

Symbol queries include jump locations in path:line:column form after the store is indexed with the current binary. Query commands default to text output; use --format json before the query subcommand for machine-readable output. Query and export commands use .aci by default; pass --store only when reading a different store path.

Query dependencies and impact:

cargo run -p aci-cli -- query deps --file src/lib.rs
cargo run -p aci-cli -- query packages
cargo run -p aci-cli -- query callers main
cargo run -p aci-cli -- query callees main
cargo run -p aci-cli -- query refs main
cargo run -p aci-cli -- query deps-tree main --depth 2
cargo run -p aci-cli -- query impact src/lib.rs
cargo run -p aci-cli -- query --pretty impact src/lib.rs

Compare two Git refs semantically:

cargo run -p aci-cli -- diff main feature
cargo run -p aci-cli -- diff main feature --agent
cargo run -p aci-cli -- diff main feature --pretty
cargo run -p aci-cli -- diff main feature --format json --pretty
cargo run -p aci-cli -- diff main feature --agent --format json --pretty
cargo run -p aci-cli -- diff main feature --agent --max-parse-bytes 10485760

aci diff checks each ref out into an isolated detached worktree, indexes both trees, then reports file, symbol, public API, dependency, diagnostic, and impact changes without mutating the current working tree.

Tree-sitter adapters skip files above the parse byte cap and fall back to structural scanners when fallback mode is enabled. Use --max-parse-bytes on index, watch, diff, bench cold, and bench query-path when a repository has large generated-by-hand source files that should still get parser-backed facts. The default protects indexing latency and memory on mixed repositories.

Keep the store updated while editing:

cargo run -p aci-cli -- watch .
cargo run -p aci-cli -- watch . --debounce-ms 250
cargo run -p aci-cli -- watch . --once --max-wait-ms 5000
cargo run -p aci-cli -- watch . --max-parse-bytes 10485760

Export the graph:

cargo run -p aci-cli -- export --format jsonl
cargo run -p aci-cli -- export --format scip --output graph.scip.json

Run a cold-index benchmark:

cargo run -p aci-cli -- bench cold . --variant tree-sitter-fallback

Development Workflow

Use this as the local quality gate before committing:

./scripts/check-loc.sh
cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps
./scripts/validate-packaging.sh

Benchmark and budget scripts live under scripts/:

  • bench-cold-index.sh
  • bench-incremental-index.sh
  • bench-query-latency.sh
  • bench-memory.sh
  • bench-real-repo.sh
  • bench-structural-variants.sh
  • validate-performance.sh

Architecture Notes

ACI keeps parser-specific details behind adapters. Every adapter emits the same aci-core graph model, and storage writes are partitioned by file so changed files can be replaced without rewriting unrelated graph data.

Full index writes stream compact partition records into partitions/pack-00000.bin and write manifest.jsonl. Incremental updates write changed file partitions and append replacement records to delta.jsonl. Snapshots are optional compaction artifacts for faster query startup.

Documentation

Contributing and Security

See CONTRIBUTING.md for setup, validation, and pull request expectations. See SECURITY.md for vulnerability reporting.

Current Limits

  • Extraction is strongest for structural facts. Semantic enrichment exists, but compiler/LSP-grade facts are still adapter work.
  • Query APIs are library-first; the CLI intentionally stays thin.
  • Store compatibility is tested for the current packed layout. Old local .aci stores should be regenerated after storage format changes.

About

Rust-first codebase indexer for symbols, dependencies, call graphs, references, impact analysis, and graph exports.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages