ctxloom Documentation
Complete reference for all CLI commands, MCP tools, and configuration options.
Quick Start
Up and running in under a minute. No API keys, no cloud, no Python.
Install
npm install -g ctxloom-proConfigure AI tools
One-time. Detects all MCP clients automatically.
ctxloom setupPin ctxloom to this project
One-time per project. Writes a .mcp.json in the project root with CTXLOOM_ROOT pinned to this directory, and appends .ctxloom/ to .gitignore.
cd /path/to/your/project
ctxloom initIndex project
ctxloom indexPrefer manual configuration? Two layers — a global entry so your AI tool can find the binary, plus a per-project .mcp.json so the server pins to the right codebase.
Global — what ctxloom setup writes:
{
"mcpServers": {
"ctxloom": {
"command": "ctxloom",
"args": []
}
}
}Per-project — what ctxloom init writes (commit this with the repo):
{
"mcpServers": {
"ctxloom": {
"command": "ctxloom",
"args": [],
"env": { "CTXLOOM_ROOT": "/absolute/path/to/project" }
}
}
}MCP clients like Claude Code and Cursor merge per-project config over global. Without the per-project entry, the server's cwd is whatever your editor was launched from — and most clients do not relaunch MCP servers when you switch projects in a running session, so the binding can stick to the wrong codebase. The CTXLOOM_ROOT in .mcp.json closes that gap.
For CI runners or Claude Desktop (no project concept), pin the global entry instead by adding "env": { "CTXLOOM_ROOT": "/path" } there too.
CLI Commands
| Command | Description |
|---|---|
ctxloom | Start MCP server (Stdio transport) |
ctxloom init | Scaffold .mcp.json + .gitignore + agent-harness rules (CLAUDE.md / AGENTS.md / GEMINI.md), hooks (.claude/hooks/), and 6 pre-packaged skills |
ctxloom setup | Auto-detect 17 MCP hosts (Claude Desktop, Claude Code, Cursor, Windsurf, Zed, Gemini CLI, OpenAI Codex CLI, Kiro, VS Code/Copilot, Continue, OpenCode, Aider, Augment, Kilo, Kimi, Qwen, JetBrains) and register ctxloom MCP server in each one that is installed. Fixes 2026 vendor-path corrections for Continue (per-server YAML), Codex (TOML), and OpenCode (`mcp` key). |
ctxloom init --host=<id> | Write agent-rule files (CLAUDE.md-style) for an additional host: cursor, aider, copilot, windsurf. Comma-separated; --host=all writes every adapter. Distinct from ctxloom setup, which writes MCP server registrations. |
ctxloom init --skip-harness | Pre-v1.4 behavior: only .mcp.json + .gitignore (no rules/hooks/skills) |
ctxloom init --dry-run | Print what would change, write nothing |
ctxloom init --force | Overwrite HMAC-tampered rule blocks (refused without this flag) |
ctxloom index | Index current directory + build dependency graph |
ctxloom budget-stats | Aggregate per-tool budget telemetry — fallback distribution + p50/p75/p95 original-token distribution. The p75 column is the input for per-tool default tuning |
ctxloom budget-stats --window=Nd | Window the report to last N days (default 14). Accepts 1d, 7d, 14d, 30d |
ctxloom budget-stats --tool=<name> | Filter to a specific tool (e.g. ctx_get_file) |
ctxloom dashboard | Open the web dashboard at http://localhost:7842 |
ctxloom dashboard --port=N | Start dashboard on a custom port |
ctxloom dashboard --open | Launch and open browser automatically |
ctxloom register <path> | Register a repo for cross-repo search |
ctxloom register <path> --alias <name> | Register with a short alias usable as project_root in tool calls |
ctxloom repos | List all registered repos and aliases |
ctxloom status | Show license tier, expiry, and machine binding |
ctxloom trial | Start a 14-day free trial (interactive email prompt) |
ctxloom activate <KEY> | Activate a purchased license on this machine |
ctxloom deactivate | Release this machine’s seat (e.g. before re-imaging) |
ctxloom grammars | Show grammar cache status |
ctxloom grammars --download | Pre-download all language grammars |
ctxloom rules check | Check .ctxloom/rules.yml against the dependency graph |
ctxloom rules check --json | JSON output (schemaVersion: 1) for CI parsers |
ctxloom rules check --use-snapshot | Skip re-indexing, use existing graph snapshot |
ctxloom rules check --limit=N | Limit text output to N violations (default: 50) |
ctxloom --help | Show help |
Multi-Project Supportv1.1+
One ctxloom MCP server can serve multiple repos at once. Every tool accepts an optional project_root parameter — an alias or absolute path — so your agent can query across all your codebases from a single server.
register vs init— what's the difference?
ctxloom registerpassive data sourceAdds one entry to ~/.ctxloom/repos.json. The target repo stays untouched. Sufficient when you only want to query that repo from another project — e.g. cross-repo search, or referencing it by alias in tool calls.
ctxloom initagent-ready workspaceWrites .mcp.json + agent-rule blocks (CLAUDE.md / AGENTS.md / GEMINI.md) + hooks + prepackaged skills into the repo. Required only when you open it in Claude Code / Cursor and want the harness, SessionStart banner, and PostToolUse auto-update active there too.
Setup
# From anywhere — registers an alias in ~/.ctxloom/repos.json
ctxloom register /path/to/frontend --alias frontend
# List registered repos
ctxloom reposcd /path/to/frontend
ctxloom init # writes .mcp.json + agent rules + hooks + skills
ctxloom index # builds graph + vectors + git overlay
ctxloom register /path/to/frontend --alias frontend # so other projects can target itUsing the alias in tool calls
// Read a file from the registered "frontend" repo
{
"tool": "ctx_get_file",
"args": {
"path": "src/App.tsx",
"project_root": "frontend"
}
}
// Or pass an absolute path directly (no register needed)
{
"tool": "ctx_search",
"args": {
"query": "useEffect",
"project_root": "/path/to/frontend"
}
}<ctxloom_indexing>envelope on the first touch so the agent knows it's a cold start.Resolution order
- 1Explicit alias — project_root matches a name in ~/.ctxloom/repos.json — resolves to that absolute path
- 2Absolute path — project_root is an absolute path — used directly (must exist and be readable)
- 3Default project — project_root omitted — falls back to the server's default (the dir it was launched from)
- 4Structured error — Returns alias_not_found / no_default_project / project_root_not_found XML if resolution fails — agents can recover instead of crashing
Tuning
| Env variable | Description | Default |
|---|---|---|
| CTXLOOM_MAX_PROJECTS | LRU cap on simultaneously-active project states. Older projects evict to disk; first touch re-hydrates. | 5 |
| CTXLOOM_DISABLE_MULTIPROJECT | Set to 1 to revert to v1.0.x single-project behavior (project_root is ignored). | unset |
project_id (SHA-256 of the canonical path, first 16 hex chars). Disable entirely with CTXLOOM_NO_TELEMETRY=1.MCP Tools34
ctx_blast_radius, ctx_hub_nodes, ctx_bridge_nodes, ctx_architecture_overview, ctx_knowledge_gaps, ctx_surprising_connections, ctx_detect_changes.ctx_get_minimal_contextOrientation anchor — every agent workflow’s mandatory first call. ~150 tokens covering graph readiness, recent changes, top hubs, and a task-aware suggested-first-tool. Pass task="<intent>" and regex routing picks the right next tool.
ctx_searchHybrid semantic + graph search. Use it when: finding files by concept or relationship.
ctx_get_fileSafe file read, 5 MB limit, path traversal protected. Use it when: reading a specific file safely.
ctx_get_context_packetPrimary file + dependency skeletons + reverse importers in one call. Use it when: giving AI full context for a file.
ctx_similar_filesFind semantically similar files via vector embeddings. Use it when: finding related implementations.
ctx_cross_repo_searchFederated search across all registered repos. Use it when: working across multiple repos.
ctx_full_text_searchHybrid keyword + vector with regex. Use it when: finding exact strings or patterns.
ctx_blast_radius"What breaks if I change this?" import + call graph traversal. Supports detail_level="minimal".
ctx_hub_nodesTop-N files by import degree (chokepoints). Supports detail_level="minimal".
ctx_bridge_nodesTop-N files by betweenness centrality (connectors). Supports detail_level="minimal".
ctx_community_listLouvain clustering — groups files into architectural modules.
ctx_architecture_overviewHigh-level summary: communities, hubs, coupling. Supports detail_level="minimal".
ctx_knowledge_gapsIsolated files, untested hubs, dead code candidates. Supports detail_level="minimal".
ctx_surprising_connectionsCircular deps, cross-community imports, prod→test violations. Supports detail_level="minimal".
ctx_find_large_functionsFunctions/classes exceeding a line threshold, sorted by size.
ctx_get_call_graphBidirectional call graph with configurable depth.
ctx_get_definitionSymbol definition lookup via AST index.
ctx_execution_flowDFS call graph traversal from entry point with cycle detection.
ctx_get_affected_flowsGiven a set of changed files, returns the execution flows that pass through them — pinpoints which user journeys are at risk.
ctx_refactor_previewRead-only symbol rename diff preview across entire codebase.
ctx_apply_refactorWrite symbol renames atomically (supports dry_run).
ctx_git_diff_reviewAll-in-one review packet: git diffs + skeletons + blast radius.
ctx_wiki_generateGenerate .ctxloom/wiki/ — one Markdown page per community. No LLM needed.
ctx_graph_exportExport to GraphML, DOT, Obsidian, SVG, or interactive D3.js HTML.
ctx_suggested_questionsGraph-driven review questions without LLM.
ctx_detect_changesRisk-scored change analysis (critical/high/medium/low). Supports detail_level="minimal".
ctx_graph_snapshotSave named checkpoint of the dependency graph.
ctx_graph_diffDiff two named snapshots — added/removed nodes and edges.
ctx_git_couplingCo-change analysis from git history (Jaccard + recency decay).
ctx_risk_overlayPer-file composite risk: churn 35% + bug density 30% + bus factor 20% + coupling 15%.
ctx_rules_checkCheck .ctxloom/rules.yml against the live dependency graph. Returns {schemaVersion:1, violations, warnings}. Config reloaded on every call.
ctx_get_rulesInject project rules from .cursorrules, CLAUDE.md, .ctxloomrc.
ctx_statusServer status: graph size, vector count, init state.
ctx_get_workflowPre-written tool sequences for review/debug/onboard/refactor/audit.
Git Risk Overlay
ctxloom . --with-git --git-window-days=365ctxloom . --no-gitNew tools
ctx_git_couplingGiven a file, returns top co-changed siblings with confidence score.
- node — target file path
- limit — default 10
- minConfidence — default 0.1
- windowDays — default 365
ctx_risk_overlayPer-file composite risk score 0–1.
Enriched tools
ctx_detect_changes— each file now includes overlay_risk block with churn, bug density, owners, coupled siblings.ctx_blast_radius— adds historicalCoupling section for files that co-change but aren't reachable via imports.Import Boundary Rules
Enforce import boundaries on your codebase as a CI lint step — no runtime overhead, no flaky tests. Marketed as the Architecture Rules Engine; the rest of this section uses that name.
.ctxloom/rules.yml.Quick start
# Check rules against the indexed dependency graph
ctxloom rules check
# JSON output (CI-friendly)
ctxloom rules check --json
# Use existing snapshot, skip re-indexing
ctxloom rules check --use-snapshotConfig — .ctxloom/rules.yml
version: 1
rules:
- name: domain must not import infra
type: no-import
from: "src/domain/**"
to: "src/infra/**"
severity: error # optional, defaults to "error"
- name: no legacy shared imports
type: no-import
from: "src/features/**"
to: "src/shared/legacy/**"
severity: warningRule fields
| Field | Required | Description |
|---|---|---|
| name | ✅ | Human-readable label shown in violations |
| type | ✅ | Always no-import in v1 |
| from | ✅ | picomatch glob — files that must not import |
| to | ✅ | picomatch glob — files that must not be imported |
| severity | ❌ | "error" (default) or "warning" |
Exit codes
| Code | Meaning |
|---|---|
| 0 | Clean — no error violations (warnings are allowed) |
| 1 | One or more error-severity violations found |
| 2 | Config file invalid or I/O error |
CI integration
name: Architecture rules
on: [push, pull_request]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npm install -g ctxloom-pro
- run: ctxloom index
- run: ctxloom rules check --jsonMCP tool — ctx_rules_check
Exposes the same engine to your AI assistant. Config is reloaded on every call — no server restart needed when rules change.
{
"schemaVersion": 1,
"violations": [
{
"rule": "domain must not import infra",
"severity": "error",
"from": "src/domain/user.ts",
"to": "src/infra/db.ts"
}
],
"warnings": []
}ctxloom-bot
A GitHub Action that posts a risk-scored summary comment and inline review notes on every pull request — running entirely inside your CI. No hosted service, no LLM calls, no external accounts, no per-PR cost.
What it does on every PR:
- →Posts a risk-scored summary: overall risk label + score, blast radius, top high-risk files
- →Inline review comments anchored at the highest-risk hunks
- →Suggests reviewers from git ownership + co-change history
- →Optional Check Run to block merges above a risk threshold
Enable it on a repo
Option 1 — one command (if you have the CLI installed, npm install -g ctxloom-pro):
ctxloom install-pr-bot
git add .github/workflows/ctxloom-review.yml
git commit -m "ci: enable ctxloom pr-bot"
git pushIt writes the workflow below — default branch auto-detected, action pinned to @v1. Use --force to overwrite an existing file or --ref v1.7.9 to pin an exact release for reproducible reviews.
Option 2 — paste the workflow yourself:
name: ctxloom review
on:
pull_request:
types: [opened, synchronize, reopened]
permissions:
contents: read
pull-requests: write
checks: write
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # REQUIRED — git overlay needs full history
- uses: kodiii/ctxloom-pr-bot@v1fetch-depth: 0 is mandatory. Without it the graph can't build co-change and ownership data, and the bot falls back to file-count-onlyrisk scoring (you'll see a note saying exactly that on the PR comment). This is the #1 setup mistake.First run builds the dependency graph (~10–60s for typical repos); subsequent runs reuse the workflow cache. Private repos also need a CTXLOOM_LICENSE_KEY repo secret — the MCP server refuses to start without it.
Configure via .ctxloom.yml
Optional — place at your repo root to override defaults:
risk_threshold: 0.7 # 0–1; comments fire above this
inline_comments: true # post per-hunk inline notes
suggested_reviewers: true # nominate reviewers from git history
check_run: false # set true to BLOCK merge on high risk
excluded_paths: [] # globs the bot ignores
max_inline_per_pr: 10 # cap on inline comments (avoids spam)Cost
| Resource | Who pays |
|---|---|
| GitHub Actions minutes | Repo owner (~30–90s/PR; free for public repos) |
| LLM tokens | Nobody — this action calls no LLM |
| Cloud / server hosting | Nobody — no hosted service exists |
Optional: LLM-narrated reviews opt-in
Want a narrative layer on top of the deterministic analysis? A separate workflow runs four specialist Claude subagents (security, architecture, testing, performance) in parallel, each calling ctxloom's MCP tools for structural evidence so the LLM never hallucinates the graph. It's risk-gated— only fires on PRs the deterministic bot already flagged medium-or-higher, so you don't spend tokens on trivial changes. You can even run it locally from Claude Desktop / Claude Code with no API key using your existing session — no GitHub Action, no secrets. See the AI-REVIEWS.md guide in the repo for the three setup paths.
Web Dashboard
A local web UI that visualises your codebase's graph, risk, ownership, and community data in real time — no cloud required.
Launch
# Index first (with git history for full metrics)
ctxloom index --with-git
# Start the dashboard
ctxloom dashboardVisit http://localhost:7842 — no browser extension required. Use --port=N to change the port or --open to auto-launch the browser.
Views
| View | What it shows |
|---|---|
| Overview | File count, edge count, community count, git status, risk breakdown donut, top architectural hubs |
| Dependency Graph | Interactive D3 force-directed graph — hover for details, click to highlight neighbours, search to pan, community colour legend, risk rings for high/critical files |
| Risk | Sortable, filterable table with composite risk score (churn × 0.3 + bug density × 0.3 + bus factor × 0.2 + coupling × 0.2) |
| Communities | Auto-detected Louvain modules — expandable cluster cards listing all member files |
| Ownership | Per-file primary owner, share %, bus factor — filterable by file or contributor name |
| Debt Trends | Time-series view of architectural debt — risk score, hub count, community count, and orphan count over the last N indexed snapshots. Surfaces regressions before they compound. |
| Guide | In-app reference explaining every metric and how to interpret the data |
Interactivity
- ◆Click any filename in Risk, Ownership, or Communities to open a file preview drawer with full source and an Open in IDE button (VS Code, Cursor, or system default).
- ◆Auto-reload — the dashboard watches
.ctxloom/graph-snapshot.jsonand reloads in-place whenctxloom indexupdates it. No server restart needed. - ◆↻ Refresh button in the Overview header triggers a manual reload of all graph and git data.
Risk Tiers
| Tier | Score | Meaning |
|---|---|---|
| critical | > 0.8 | Urgent — high churn, sole owner, heavily coupled |
| high | > 0.6 | Should be addressed soon |
| medium | > 0.3 | Monitor — watch for growth |
| low | ≤ 0.3 | Acceptable |
ctxloom index --with-git to enable the full risk overlay before launching the dashboard.Language Support
| Language | Import Graph | Symbol Index | Skeletonization |
|---|---|---|---|
| TypeScript / JavaScript | ✅ Full AST | ✅ | ✅ |
| Python | ✅ Relative imports | ✅ | ✅ |
| Rust | ✅ mod resolution | ✅ | ✅ |
| Go | ✅ go.mod module-path + package fan-out | ✅ | ✅ |
| Java | ✅ Dot-to-slash | ✅ | ✅ |
| C# | ✅ Namespace resolution | ✅ | ✅ |
| Ruby | ✅ Relative paths | ✅ | ✅ |
| Kotlin | ✅ Package imports | ✅ | ✅ |
| Swift | ✅ Module imports | ✅ | ✅ |
| PHP | ✅ PSR-4 + require_once | ✅ | ✅ |
| Dart | ✅ Relative imports | ✅ | ✅ |
| Vue SFC | ✅ Script block | ✅ | ✅ |
| Jupyter Notebook | ✅ Python cell imports | ✅ | ✅ |
| C / C++ | ✅ Local #include | ✅ | ✅ |
| Scala | ✅ sbt + flat package layouts | ✅ | ✅ |
| Lua | ✅ require + init.lua | ✅ | ✅ |
| Elixir | ✅ alias/import → lib/<snake_case>.ex | ✅ | ✅ |
| Zig | ✅ @import("./*.zig") + path guards | ✅ | ✅ |
Architecture (internals)
How ctxloom itself is built — entry point, tool registry, context engine, file watcher, persistence. For contributors and the curious.
MCP Interface
Stdio transport
34 Tools — ToolRegistry
Dependency
Graph
VectorDB
LanceDB
Skeletonizer
tree-sitter
File Watcher
chokidar · 200ms debounce · incremental re-index
Snapshot Manager
atomic writes · crash-safe · local filesystem
How search works
- 1Embed — Query embedded with sentence-transformers/all-MiniLM-L6-v2 (local, 384-dim)
- 2Vector search — ANN query against LanceDB
- 3Graph expansion — Results expanded via import graph (importers/imports get score boost)
- 4Skeletonize — Dependency files reduced to signature-only views (~92% token reduction)
Token Reduction Benchmarks
Measured on real open-source repos — not estimated.
v1.7.0 · External-oracle benchmark
Token reduction below is the full-source skeletonization bench (5 frameworks, 6,154 files). For the prediction-quality bench (F1, recall, graph reachability against a GitHub PR-diff oracle) — see the External-oracle benchmark on the home page.
| Repository | Language | Raw tokens | Skeleton tokens | Reduction |
|---|---|---|---|---|
| vercel/next.js | TypeScript | ~12.2M | ~584k | 95% |
| honojs/hono | TypeScript | ~185k | ~30k | 84% |
| vitejs/vite | TypeScript | ~459k | ~105k | 77% |
| withastro/astro | TypeScript | ~805k | ~191k | 76% |
| nestjs/nest | TypeScript | ~409k | ~177k | 57% |
| Weighted average · 6,154 files | ~14.1M | ~1.1M | 92% |
npm run bench:reposSecurity
- ✓Path traversal prevention (CWE-22), symlink-aware — all file inputs validated against project root
- ✓Shell injection prevention — execFileSync with argument arrays, no shell string interpolation
- ✓XML injection prevention — all user-controlled strings escaped before XML output
- ✓File size limits — files over 5 MB rejected and skipped by indexer
- ✓Input bounds — limit capped at 100, depth capped at 20 across all tools
- ✓Atomic snapshot writes — written to .tmp then renamed, prevents torn reads
- ✓Snapshot schema validation — validated before hydration, prevents prototype pollution
Environment Variables
| Variable | Description | Default |
|---|---|---|
| CTXLOOM_ROOT | Project root directory to index | Current working directory |
| LOG_LEVEL | Logging verbosity: debug / info / warn / error | info |
| CTXLOOM_GRAMMAR_CDN | CDN base URL for grammar downloads (air-gapped environments) | Built-in |
| CTXLOOM_MAX_PROJECTS | LRU cap on simultaneously-active project states (multi-project) | 5 |
| CTXLOOM_DISABLE_MULTIPROJECT | Set to 1 to revert to single-project behavior (project_root ignored) | unset |
| CTXLOOM_TASK_TOOL_BUDGET | Per-task tool-call ceiling. Over-budget calls auto-downgrade to skeleton/minimal mode. | 8 |
| CTXLOOM_DISABLE_BUDGET | Set to 1 to disable server-enforced response budgets (kill switch) | unset |
| CTXLOOM_LEARNED_SUGGESTIONS | Set to 1 to mine local telemetry for next_tool_suggestions (opt-in) | unset |
| CTXLOOM_TELEMETRY_LEVEL | all (PostHog + Sentry) / error (Sentry only) / off (silent) | all |
| CTXLOOM_NO_TELEMETRY | Set to 1 to disable all telemetry (alias for telemetry_level=off) | unset |
| CTXLOOM_TELEMETRY_DIR | Absolute path override for budget-event JSONL files | ~/.ctxloom/telemetry/ |
Build from Source
git clone https://github.com/kodiii/ctxloom.git
cd ctxloom
npm install
npm run build
ctxloom index
node dist/index.jsTroubleshooting
The handful of failure modes that account for ~all "Server disconnected", "Could not attach to MCP server ctxloom", and "graph is empty" reports we've seen.
MCP server disconnects immediately on every tool call
Symptom in your MCP client logs:
[ctxloom] Server transport closed unexpectedly, this is likely due to the
process exiting early. ... [error] Server disconnected.Cause #1 — Inactive license. The CLI exits to stderr the moment a tool call arrives if no active license is found, which closes the stdio MCP channel.
ctxloom status # should show LICENSED or TRIALING
ctxloom trial # 14-day free trial
# or
ctxloom activate <YOUR_KEY> # if you already have a keyCause #2 — CTXLOOM_ROOT not set, MCP client spawned ctxloom with cwd=/. Common with Claude Desktop and any client that doesn't inherit a project cwd. ctxloom then attempts to index the entire filesystem from /, which on macOS produces thousands of EMFILE: too many open files warnings and eventually crashes with ENFILE: file table overflow before the first tool call returns.
CTXLOOM_ROOT in your MCP config's env block. "Auto-detected if not set" means "defaults to process.cwd()" — and that is / for most desktop MCP clients, not your project.Fix the config:
{
"mcpServers": {
"ctxloom": {
"command": "ctxloom",
"env": {
"CTXLOOM_ROOT": "/absolute/path/to/your/project"
}
}
}
}After restart you should see "Project root","root":"/your/project" followed by "File watcher active" in the log — not thousands of /dev/* permission warnings.
Working across multiple repos in one session
Register each repo with a short alias, then pass project_root on each tool call:
ctxloom register /Users/me/work/api --alias api
ctxloom register /Users/me/work/web --alias web
ctxloom register /Users/me/work/mobile --alias mobile
ctxloom repos # verifyThen in your AI tool, calls become:
ctx_search { project_root: "api", query: "rate limiter" }
ctx_blast_radius { project_root: "web", file: "src/auth.ts" }Without an alias, project_root must be an absolute path. Aliases also unlock ctx_cross_repo_search.
Graph builds with 0 edges (especially on Python, Rust, or Java projects)
Symptom: ctxloom index reports a healthy file count but Graph built with 0 edges, and your AI tool says things like "structural blast-radius/coverage tracing isn't available". Most common on projects first indexed under an older ctxloom that pre-dated absolute import resolution for that language.
ctxloom indexreuses an existing graph snapshot when the file count is stable. The staleness check is file-count-based, not version-based, so an empty snapshot from an older binary can survive an upgrade and re-hydrate "successfully" — even though the import resolver that wrote it didn't know how to follow from src.api.auth import … style absolute imports.Clear the snapshot and rebuild from scratch:
rm -rf .ctxloom
ctxloom index
# expect: "Graph built with N edges" where N > 0After the rebuild, .ctxloom/graph-snapshot.json will contain populated forwardEdges for each source file — and any subsequent AI session will pick up callers, blast radius, and impact analysis correctly. The .ctxloom/directory is machine-local; it's already in the default gitignore and safe to delete at any time.
Stale CLI install
If ctxloom --version shows 1.0.x or your logs report "serverInfo":{"version":"1.0.0"}, you're running a pre-multi-project build that lacks the no-default safety mode and the project_root parameter. Refresh:
npm install -g ctxloom-pro@latest
ctxloom --version # verify
ctxloom statusChangelog
Live release history, rendered straight from CHANGELOG.md on the ctxloom main branch.
View the full live changelog
Auto-refreshes every hour. New releases on main appear here within 60 minutes — no website redeploy required.