| Crates.io | loctree |
| lib.rs | loctree |
| version | 0.8.9 |
| created_at | 2025-11-29 09:47:34.901994+00 |
| updated_at | 2026-01-21 06:00:24.76694+00 |
| description | Fast, language-aware codebase analyzer for detecting dead exports, circular imports, and generating dependency graphs |
| homepage | |
| repository | https://github.com/Loctree/Loctree |
| max_upload_size | |
| id | 1956520 |
| size | 3,593,205 |
loctree is a static analysis tool designed for AI agents and developers building production-ready software. It helps overcome the common AI tendency to generate excessive artifacts that lead to re-export cascades, circular imports, and spaghetti dependencies.
Scan once, slice many. Run loct to capture your project's true structure, then use loct slice to extract focused context for any AI conversation.
React lazy() False Positive Fix - Dynamic imports via lazy(() => import('./Component')) are now correctly tracked:
loct dead and loct twins no longer report these as unuseddynamic() also covered0.8.0 Highlights:
loct i <file>, loct jq, loct trace work immediately in any repoloct from another directory now uses correct git contextArtifact-First Architecture - mental model centered around artifacts:
.loctree/snapshot.json - Complete graph data (imports, exports, LOC per file).loctree/findings.json - All detected issues (dead code, cycles, duplicates).loctree/agent.json - AI-optimized context bundle.loctree/manifest.json - Index for tooling and AI agentsQuery First - Use jq-style queries on artifacts:
loct '.dead_parrots' # Show dead code
loct '.summary.health_score' # Get health score
loct '.files | length' # Count files
# Install via Homebrew (macOS/Linux) - PR pending
brew install loctree # Coming soon!
# Or install from crates.io
cargo install loctree
# Scan your project (auto-detects stack)
cd your-project
loct
# View interactive report (HTML + graph)
loct report --serve
# Extract context for AI agents
loct slice src/components/ChatPanel.tsx --consumers --json
# Get AI-optimized hierarchical output
loct --for-ai
# Find circular imports
loct cycles
# Semantic duplicate analysis (dead parrots, twins, barrel chaos)
loct twins
# Detect dead exports
loct dead --confidence high
# Quick health check (cycles + dead + twins summary)
loct health
# Full codebase audit (cycles + dead + twins + orphans + shadows + crowds)
loct audit
# Verify tree-shaking in production bundles
loct dist dist/bundle.js.map src/
# jq-style queries on snapshot data (NEW!)
loct '.metadata' # extract metadata
loct '.files | length' # count files
loct '.edges[] | select(.from | contains("api"))' # filter
Based on extensive testing across TypeScript, Rust, Python, and Tauri codebases:
| Command | Rating | Best For |
|---|---|---|
loct slice <file> |
⭐⭐⭐⭐⭐ | AI context extraction - shows deps + consumers |
loct trace <handler> |
⭐⭐⭐⭐⭐ | Tauri apps - FE→BE pipeline visualization |
loct find <symbol> |
⭐⭐⭐⭐⭐ | Symbol search with semantic matching |
loct --for-ai |
⭐⭐⭐⭐ | AI bundle with quick wins and hub files |
loct query who-imports <file> |
⭐⭐⭐⭐ | Reverse dependency lookup |
loct health |
⭐⭐⭐⭐ | Quick health summary (cycles + dead + twins) |
loct coverage |
⭐⭐⭐⭐ | Test coverage gaps for handlers/events |
loct dead |
⭐⭐⭐ | Unused exports (JS/TS best, Python limited) |
AI agents face context drift — without understanding the real dependency graph, they generate new components instead of reusing existing ones, create barrel files that re-export everything, and build circular dependencies that compile but break at runtime.
loctree solves this by:
slice)Extract 3-layer context for any file — perfect for AI conversations:
loct slice src/App.tsx --consumers
Slice for: src/App.tsx
Core (1 files, 150 LOC):
src/App.tsx (150 LOC, ts)
Deps (3 files, 420 LOC):
[d1] src/hooks/useAuth.ts (80 LOC)
[d2] src/contexts/AuthContext.tsx (200 LOC)
[d2] src/utils/api.ts (140 LOC)
Consumers (2 files, 180 LOC):
src/main.tsx (30 LOC)
src/routes/index.tsx (150 LOC)
Total: 6 files, 750 LOC
trace)Follow a Tauri command through the entire pipeline:
loct trace get_user
Handler: get_user
Registration:
src-tauri/src/main.rs:45 generate_handler![get_user, ...]
Implementation:
src-tauri/src/commands/user.rs:12 #[tauri::command] pub async fn get_user(...)
Frontend Invocations:
src/hooks/useUser.ts:8 invoke('get_user', { id })
src/components/Profile.tsx:23 invoke('get_user', { id: props.userId })
--for-ai)Hierarchical JSON designed for AI agents with quick wins and hub files:
loct --for-ai
{
"summary": {
"files_analyzed": 127,
"missing_handlers": 2,
"unregistered_handlers": 1,
"circular_imports": 0
},
"quick_wins": [
{
"priority": 1,
"action": "Add missing handler",
"target": "delete_session",
"location": "src/api/auth.ts:45",
"impact": "Fixes runtime error"
}
],
"hub_files": [
{ "path": "src/api/index.ts", "connections": 23 }
]
}
loctree supports comprehensive analysis across multiple languages:
| Language | Status | Key Features |
|---|---|---|
| Rust | Exceptional | 0% false positives on rust-lang/rust (35,387 files, ~787 files/sec) |
| Go | Perfect | ~0% false positives on golang/go (17,182 files) |
| TypeScript/JavaScript | Full | JSX/TSX support, React patterns, Flow annotations, WeakMap/WeakSet patterns |
| Python | Full | Library mode with stdlib auto-detection, __all__ tracking |
| Svelte | Full | .d.ts re-export tracking, component analysis |
| Vue | Full | Component analysis, SFC support |
| Dart/Flutter | Full | Complete language support (new in v0.6.x) |
loctree automatically detects your project type:
| Marker | Stack | Auto-Ignores | Extensions |
|---|---|---|---|
Cargo.toml |
Rust | target/ |
.rs |
tsconfig.json |
TypeScript | node_modules/ |
.ts, .tsx, .jsx |
pyproject.toml |
Python | .venv/, __pycache__/ |
.py |
src-tauri/ |
Tauri | All above | .ts, .tsx, .rs |
vite.config.* |
Vite | dist/ |
Auto |
pubspec.yaml |
Dart/Flutter | .dart_tool/, build/ |
.dart |
For Tauri projects, loctree validates the entire command pipeline:
loct commands
#[tauri::command] but not in generate_handler![]React.lazy() dynamic importsStructural test coverage based on import analysis (no runtime instrumentation):
loct coverage # All coverage gaps
loct coverage --handlers # Only Tauri handler gaps
loct coverage --min-severity high # Filter by severity
loct coverage --json # JSON output for CI
Identifies coverage gaps by severity:
Fast directory tree with LOC counts:
loct tree src/
# Find build artifacts to clean
loct tree --find-artifacts
# Output: /path/to/node_modules, /path/to/target, ...
# Show gitignored files
loct tree --show-ignored
Find problems before they become tech debt:
# Check if similar component exists before creating
loct find ChatSurface
# Found: ChatPanel (distance: 2), ChatWindow (distance: 3)
# Find potentially unused exports (improved detection in v0.6.x)
loct dead --confidence high
# Detect circular import cycles (with visualization in reports)
loct cycles
# Analyze impact of changing a file
loct impact src/utils/api.ts
# Find a symbol across the codebase
loct find useAuth
# Twins analysis (dead parrots, exact twins, barrel chaos)
loct twins
loct twins --dead-only # Only exports with 0 imports
Enhanced Dead Code Detection (v0.6.x):
__all__ - Respects public API declarations in Python modules# Example: Python stdlib analysis
loct dead --library-mode
# Skips: __all__ exports, Lib/ directory public APIs
# Example: npm package analysis
loct dead
# Auto-detects: package.json "exports" field, excludes public API
## Library / Framework Mode
loctree intelligently handles libraries and frameworks to avoid false positives:
**Automatic Detection:**
- **npm packages** with `exports` field in package.json
- **Python stdlib** detection via `Lib/` directory and `__all__` exports
- **Public API exclusion** - Exports in public APIs are not flagged as dead code
**Manual Activation:**
```bash
loct --library-mode
# or in .loctree/config.toml:
library_mode = true
Features:
__all__ for Python public API boundarieslibrary_example_globs in config.loctree/report.html and .loctree/analysis.json automaticallyAdvanced Pattern Detection:
loct lint --entrypoints
### HTML Reports
Generate interactive HTML reports with dependency graphs:
```bash
loct report --graph --output report.html
Features:
Smoke Test Results:
# Fail if frontend invokes missing backend handlers
loct lint --fail
# Fail if events lack listeners/emitters or have races
loct events --json
# SARIF 2.1.0 output for GitHub/GitLab
loct lint --sarif > results.sarif
loct (Rust) - AI-oriented Project Analyzer
Modes:
(default) Scan, save snapshot + reports to .loctree/
slice <file> Holographic slice (add --consumers, --json)
find Unified search (symbols, similar, impact)
dead Unused exports (alias/barrel aware)
cycles Circular imports
twins Semantic duplicates (dead parrots, exact twins, barrel chaos)
commands Tauri FE↔BE bridges (missing/unused)
events Emit/listen/races summary
tree Directory tree with LOC counts
report --graph HTML report with graph
lint --fail --sarif CI guardrails / SARIF output
diff --since <id> Compare snapshots, show delta
query <kind> <target> Quick queries (who-imports, where-symbol, component-of)
'<filter>' jq-style query on snapshot (e.g., '.metadata', '.files | length')
--for-ai AI-optimized hierarchical JSON (legacy flag)
jq Query options:
-r, --raw Raw output (no JSON quotes for strings)
-c, --compact Compact output (one line per result)
-e, --exit-status Exit 1 if result is false/null
--arg <name> <value> Bind string variable
--argjson <name> <json> Bind JSON variable
--snapshot <path> Use specific snapshot file
Find options:
--similar <query> Similar components/symbols
--symbol <name> Symbol definitions/usages
--impact <file> What imports this file
Slice options:
--consumers Include files that import the target
--json JSON output for piping to AI
Query kinds:
who-imports <file> Files that import target
where-symbol <name> Where symbol is defined/used
component-of <file> Which graph component contains file
Tree options:
--find-artifacts Find build dirs (node_modules, target, etc.)
--show-ignored Show only gitignored files
--summary[=N] Show totals + top N large files
Common:
-g, --gitignore Respect .gitignore
-I, --ignore <path> Ignore path (repeatable)
--full-scan Re-analyze all (ignore cache)
--verbose Detailed progress
brew install loctree
cargo install loctree
git clone https://github.com/Loctree/Loctree
cd loctree/loctree_rs
cargo install --path .
.
├── loctree_rs/ # Main Rust crate (crates.io: loctree)
│ ├── src/
│ │ ├── main.rs # CLI entry point
│ │ ├── slicer.rs # Holographic slice
│ │ ├── detect.rs # Auto-detect stack
│ │ ├── tree.rs # Tree mode
│ │ ├── snapshot.rs # Incremental scanning
│ │ └── analyzer/ # Import/export analysis
│ │ ├── trace.rs # Handler tracing
│ │ ├── coverage.rs # Tauri command coverage
│ │ ├── for_ai.rs # AI-optimized output
│ │ └── ...
│ └── Cargo.toml
├── reports/ # HTML report renderer (crates.io: report-leptos)
│ └── src/
│ ├── lib.rs # Leptos SSR
│ └── components/ # Report UI components
├── landing/ # Landing page (Leptos SPA)
├── tools/ # Install scripts, git hooks
└── .github/workflows/ # CI configuration
# Setup git hooks (auto-runs on `make install`)
make git-hooks
# Run tests
cd loctree_rs && cargo test
# Run all checks
cargo fmt && cargo clippy -- -D warnings && cargo test
"The goal isn't 'make it work'. The goal is: we know WHY it works (or doesn't)."
loctree makes the invisible visible:
Show that your project uses loctree:
[](https://crates.io/crates/loctree)
Or use the SVG badge:
[](https://crates.io/crates/loctree)
Dual-licensed under MIT OR Apache-2.0. See LICENSE-MIT and LICENSE-APACHE.
Developed with 💀 by The Loctree Team (c)2025