Symbols, resolved
SCIP index built by scip-go, scip-typescript, scip-python, and friends. Every definition, every reference, every call site, typed and ranked. Tree-sitter fallback when no indexer is installed.
Code knowledge base · Python · SCIP-native
Know your code. Change it safely.
A SCIP-native symbol graph over your repository, queried from a CLI, an HTTP API, or 79 MCP tools across 7 presets. The deterministic foundation LIP, ArchReview, Onboarding Tutor, and Cartographer all stand on. MIT-licensed, 226 tests passing, v9.2.0.
Tests passing
226
MCP tools
76
MCP presets
7
Review checks
20
Compliance frameworks
20
Current release
v9.2.0
Compiler-accurate, not pattern-matching
CKB builds a SCIP index of your repository and answers questions against it. Definitions, references, call edges, ownership, churn — every fact is derived from the index or the git history, not from regex matching source text. When the indexer is unavailable, tree-sitter parsing covers the basics; the code is still honest about which mode it is in.
SCIP index built by scip-go, scip-typescript, scip-python, and friends. Every definition, every reference, every call site, typed and ranked. Tree-sitter fallback when no indexer is installed.
getCallGraph walks both directions — callers and callees, bounded depth, cycle-safe. traceUsage answers the debugger question: how does execution reach this line?
analyzeImpact returns the reachable set of a proposed change: direct references, transitive callers, affected tests, cross-module edges. Risk-scored, not hand-waved.
compareAPI reads two refs and emits a structured list of breaking changes: removed exports, changed signatures, narrowed visibility. Feeds the review preset directly.
getArchitecture, getModuleOverview, listKeyConcepts. The high-level shape of the repo as the graph sees it, not as the README claims. Hotspots by churn × coupling.
getAffectedTests returns the minimal test set touching a diff. analyzeTestGaps flags untested functions inside the changed files. findDeadCode surfaces what the graph says no-one calls.
Language tiers: Go (T1), TypeScript / JavaScript / Python (T2), Rust / Java / Kotlin / C++ / Ruby / Dart (T3), C# / PHP (T4, experimental). Run ckb doctor before you wire it into CI — the doctor tells the truth about what your toolchain can actually index.
Load the smallest preset that answers the question
The Core preset ships 24 tools and is enough to finish an investigate-and-assess-impact task end-to-end. The compound tools — explore, understand, prepareChange, batchGet, batchSearch — collapse what used to be five sequential MCP calls into one. Reported in the README as 60-70 % fewer round-trips; in practice the tokens saved are the tokens you spend on the model that matters.
| Preset | Tools | What it enables |
|---|---|---|
| --preset=core | 24 | Default. Investigate-and-assess-impact workflow complete in one preset — the compound tools explore, understand, prepareChange cut 60-70% of round-trips. |
| --preset=review | 37 | Core plus summarizeDiff, summarizePr, reviewPR, compareAPI, scanSecrets, auditRisk, auditCompliance. The preset that runs in CI. |
| --preset=refactor | 34 | Core plus justifySymbol, analyzeCoupling, findDeadCodeCandidates, planRefactor. Safe-rename grade answers before the rename. |
| --preset=docs | 18 | Doc-symbol linking, staleness detection, coverage metrics. For the Onboarding Tutor and anyone auto-generating reference material. |
| --preset=ops | 16 | OpenTelemetry integration, observed usage, production dead-code detection. Runtime reality against the static graph. |
| --preset=federation | 12 | Remote index serving, multi-repo API contracts, cross-repo search. For monorepo federations and polyrepo orgs. |
| --preset=full | 76 | Every tool registered. Use when you are exploring what CKB can do, not when you are shipping to an AI session. |
Also on disk: SSE streaming for findReferences and searchSymbols, watch mode that re-indexes every 30 s when the graph goes stale, and an HTTP API on port 8080 for the tools that don’t speak MCP.
CKB is a foundation, not a product you open every day
You install CKB once per machine and forget about it. It is the thing the other nyxCore products are standing on — each of them asks CKB for facts and then adds its own judgement on top.
Seven review modes, 131 compliance checks, 221 tests
Uses CKB for hotspots, unwired modules, dead code, breaking-change detection, and every structural gate. Three of its seven modes run on CKB alone — zero LLM cost.
Blast-radius indexing, 200-800 ms edits on 500k-file repos
CKB speaks LIP v2.3 natively — stream_context for related-symbol attachment, query_expansion for vocabulary-mismatch recall, explain_match for semantic-search evidence chunks, register_project_root on handshake. Push-driven freshness, no polling.
AI-powered codebase onboarding with CKB integration
Launches `npx @tastehub/ckb` under the hood, walks a new hire through the graph as a guided tour: entrypoints, key concepts, ownership, recent change patterns.
Architectural maps, layer enforcement, 161 open action points
Linked as a static library through CGo. Skeleton extraction drops per-file AI context from 5k tokens to 200-500. Layer violations and health-score deltas gate PRs in the review preset.
Copy, paste, keep working
CKB is a single Go binary with a Node wrapper on npm. No runtime, no database, no hosted control plane — the index lives next to your .git directory and never leaves the machine.
# First-time setup inside a repo npx @tastehub/ckb init npx @tastehub/ckb index # auto-detects the language, calls the right SCIP emitter # Wire it into Claude Code with the review preset ckb mcp --preset=review --repo=. # Or run a PR review in CI — zero tokens, exit code on fail npx @tastehub/ckb review --base=main --ci --format=sarif > review.sarif # Ask the graph directly ckb hotspots --format=human ckb search HandleRequest ckb analyzeImpact internal/billing/charge.go:Charge
The HTTP API lives on ckb serve --port 8080 if you would rather not speak MCP. Token-authed upload endpoints for the index-server mode are documented in the wiki.
What this is not
Ipcha Mistabra wrote this section. Every product page in the nyxCore stack carries one. Here is where CKB will not help you — or will help only approximately.
Disclosure
Your IDE still owns go-to-definition, rename-refactor, inline diagnostics. CKB is a read-only index queried by agents and CI — the complement, not the substitute. If a question is best answered in a microsecond, your language server already answered it.
Disclosure
Go is Tier 1. TypeScript, JavaScript, Python are Tier 2. Rust, Java, Kotlin, C++, Ruby, Dart are Tier 3 — basic support, call graph may be incomplete. C# and PHP are experimental. `ckb doctor --tier standard` tells the truth before you commit to CI.
Disclosure
Hotspot scoring blends churn, complexity, and coupling — the weights are heuristics, not physics. Dead-code detection is confidence-scored, not a proof. Compliance rules map findings; they do not turn into audit certificates. Treat CKB as a prior, not a verdict.
Three paths, same binary
Node 20+ if you go via npm. No Node at all if you use the Homebrew tap or build from source. The CLI discovers your SCIP indexer on its own; install one only if you want the call graph.
# Option 1 — npm, the fastest path npm install -g @tastehub/ckb ckb setup # auto-writes .mcp.json for Claude Code, Cursor, Windsurf, … # Option 2 — Homebrew on macOS / Linux brew tap SimplyLiz/ckb brew install ckb # Option 3 — build from source git clone https://github.com/SimplyLiz/CodeMCP.git cd CodeMCP && go build -o ckb ./cmd/ckb
MIT licensed · index stays on your machine
Before you wire it into CI
Run ckb doctor --tier standard on a representative build host. It will tell you which language indexers are missing, whether incremental indexing is available for your stack, and whether your CI clone is shallow enough to break ckb review --base=main (as of v9.0.1 we auto-fetch the base ref; before that, depth-0 checkouts were a live failure mode). Calibrate the preset you actually want, pin it, then enable the gate.
Metis says: an index you never refresh is worse than no index at all.