Orient in an unfamiliar or large codebase with CLEO's code-intelligence graph (cleo nexus) and project map (cleo map). Use before planning or editing unfamiliar code, for brownfield onboarding, to find what a change would break, or to map a project's structure, communities and execution flows. Triggers on "map the codebase", "understand this project", "what calls X", "what would break", "brownfield analysis", "project structure".
Install
npx skillscat add kryptobaseddev/cleo/ct-codebase-mapper Install via the SkillsCat registry.
Codebase Mapper
Two instruments, used together:
cleo nexusis the symbol graph: callers, callees, blast radius,
communities and execution flows, parsed from source. Use it for any question
about how code connects.cleo mapis the project survey: stack, architecture, structure,
conventions, testing, integrations and concerns. Use it for the one-page
overview, and--storeto keep the findings in BRAIN.
1. Check the index before trusting it
cleo nexus statusRead nodeCount, lastIndexedAt and staleFileCount against fileCount,
and freshness.commitsBehind (commits on freshness.baseRef the index has
not seen) with freshness.ageDays.
Queries refresh a stale index inline when the last run's cost, scaled to the
repository and the stale set, fits nexus.autoRefresh.budgetMs; otherwise they
warn W_NEXUS_INDEX_STALE. freshness.changedFilesSinceIndex is a quick
git-diff count of tracked files changed since the indexed revision. Refresh with cleo nexus analyze (incremental; --full
rebuilds). An empty or stale index gives confident-looking but incomplete
answers — say which you relied on.
registry counts the registered projects by recorded health. Whenregistry.unreachable is above zero, registry.cleanCommand is the dry run
(cleo nexus projects clean --orphans --dry-run) that shows which rows are
really gone; report it, and leave removal to the owner. registry.otherHost
counts rows whose project lives on another machine sharing the store (a live
location on another device); projects clean never removes those and lists
them under otherHost. A legacy row with no location record is judged only by
its path root, so a same-username path from another machine stays removable:
read the dry run before removing.
assessment.referenceCount is how many static references the graph could not
resolve, so known callers are incomplete. Inspect them a page at a time:
cleo nexus status --references # per-kind counts + first 20
cleo nexus status --references --reference-kind unresolved --references-limit 500
cleo nexus status --references --references-offset <referencesPage.nextOffset>referencesByKind counts the whole list; referencesPage holds one page
(max 5000). The full list is never returned in one call; it is named in_withheld.references with its size.
Project-scoped queries use the declared portable project id. --project-id
may name that id or a recorded, unambiguous legacy alias; an alias warnsW_NEXUS_LEGACY_PROJECT_ID. A foreign or colliding id is refused: run the
query from the intended checkout. Moving a checkout retains its id and graph;
never derive a replacement id from the new path or re-analyze solely for a move.
2. Survey the project
cleo map # full survey
cleo map --focus concerns # one area: stack | architecture | structure |
# conventions | testing | integrations | concerns
cleo map --store # same survey, findings stored to BRAIN
# (tagged source: 'codebase-map')
cleo map --brief # one line per folder of exported names (nexus graph,
# else git-tracked walk), --budget N chars (default 2000)3. Find the structure
cleo nexus clusters # detected communities (modules that change together)
cleo nexus flows # detected execution flows (entry point → callees)
cleo nexus search-code "<text>" # locate a symbol by name, file pattern or keyword4. Before editing a symbol
cleo nexus impact <symbol> # blast radius: direct, indirect, transitive callers
cleo nexus context <symbol> # callers, callees, community, flows
cleo nexus full-context <symbol> # plus BRAIN memories, tasks and conduit threadsHIGH/CRITICAL impact means review the affected callers before editing.UNKNOWN means the assessment is incomplete, and NONE means nothing was
detected in the assessed graph — static analysis cannot prove every runtime
caller, so an empty footprint alone never establishes that a change is safe.
When a symbol name is ambiguous, pass the qualified candidate the command
returns and confirm against the source.
On a stale index, impact and context refresh it inline when the size-scaled
cost estimate fits the budget: one refresh at a time per project, a larger one
only when cleo run admits it, and none for 30 minutes after one fails or is
aborted (freshness.refreshCooldownUntil; the next cleo nexus analyze ends
the pause). An aborted refresh keeps its parse work for the next run. Otherwise
they answer from the stale index and say so. --no-refresh (or CLEO_NEXUS_AUTO_REFRESH=false)
always answers from the index as it stands.
Every graph answer carries data.freshness (indexedRevision, baseRef,commitsBehind to the base branch, commitsBehindHead, ageDays). When the
index is more than nexus.freshness.maxCommitsBehind (default 50) commits
behind the checked-out HEAD, or the symbol is missing from an index that is
stale for this checkout, the query fails withE_NEXUS_INDEX_STALE (exit 111) and error.fix names the reindex command. Run
it, then repeat the query. --allow-stale (impact, context) orCLEO_NEXUS_ALLOW_STALE=1 accepts the stale answer; say that you did.
cleo nexus reindex-on-merge --enable opts a project into a background
reindex after each merge into the base branch (the CLEO post-merge hook; it
waits for idle cleo run admission and gives up after 300s). cleo nexus status shows the last real outcome as reindexOnMerge (ran, deferred or
failed, with the reason); skips are not recorded.
5. Across projects: where each one lives, and its state
cleo nexus projects status # every project, per device: path, branch, dirty, ahead/behind
cleo nexus projects status --dirty --behind # filters: --missing --dirty --behind --ahead --stale --errored
cleo nexus projects status --device current # one machine (device id, hostname or current)
cleo nexus projects status --refresh # re-probe this device first (bounded; --fetch also fetches)The output lists counts first, then one page (--limit, --offset). It reads
recorded probes. ahead/behind are as of remote.fetchedAt, and stale
flags an old or missing probe or fetch. Read matched and hasMore before
concluding "none".
When to use
| Situation | Start with |
|---|---|
| New or brownfield project | cleo nexus status, then cleo map --store |
| Planning an epic in unfamiliar code | cleo map --focus architecture, cleo nexus clusters |
| About to change a function or type | cleo nexus impact <symbol> |
| "Who calls this / what does this call?" | cleo nexus context <symbol> |
| Tech-debt review | cleo map --focus concerns |
| "Which machines hold this project, and is it pushed?" | cleo nexus projects status |
cleo map output
{
projectContext: ProjectContext, // From detectProjectType()
stack: StackAnalysis, // Languages, frameworks, deps
architecture: ArchAnalysis, // Layers, entry points, patterns
structure: StructureAnalysis, // Directory tree with annotations
conventions: ConventionAnalysis, // Naming, linting, formatting
testing: TestingAnalysis, // Framework, patterns, coverage
integrations: IntegrationAnalysis, // APIs, DBs, CI/CD
concerns: ConcernAnalysis, // TODOs, large files, complexity
analyzedAt: string
}