- Docs
- Command and capability reference
Command and capability reference
Which tool-neutral intent maps to which Wicked Estate command, what each returns, which surface was executed versus read from schemas, and the capabilities that do not exist.
This page is the adopter-facing summary. The authoritative mapping ships inside the pack, because it is what the agent reads:
references/capability-map.md— every intent, its exact command, and what that command returns.references/gaps.md— a fourteen-point assessment against a general code-intelligence contract.references/evidence.md— how provenance, confidence and completeness are carried into an answer.references/investigation-patterns.md— the five patterns and their stop conditions.references/example-prompts.md— worked examples across debugging, feature impact, architecture, refactoring and modernization.
Two surfaces
Section titled “Two surfaces”Wicked Estate ships a command-line tool and an MCP server. The pack drives the CLI by default, for two reasons: the server advertises 30 tool schemas that stay resident in the agent’s context for a whole session, and the CLI is the larger surface — 42 names, several with no MCP equivalent.
| Surface | Maturity | Why |
|---|---|---|
| CLI | validated | Exercised end to end against a real index; tests pin the returned shapes of resolve, blast-radius (with --depth and confidence summary), path, lineage, traverse, rank (with --seeds), rules-inventory (top-level keys; per-engine entry fields are source-read), rules-recall, and other verbs on a small fixture |
| MCP | contract-complete | Mapped from upstream’s registered tools and conformance schemas. Never executed by this pack |
The memory, knowledge, and proposal domains are MCP-only. Register the server
only if you need them, and prefer --readonly. The richer MCP response shapes
(summary.top_by_pagerank on BlastRadius, Communities summaries,
ContextBundle) are also MCP-only. With --readonly, a store path that does
not exist is not created: the server serves that store as an empty in-memory
store and says so on stderr. If every answer from one store is empty,
check its path: the graph path comes from --db, else WICKED_ESTATE_DB, else .wicked-estate/graph.db relative to the server’s working directory, and the memory, knowledge, and cross-store paths come from WICKED_MEMORY_DB, WICKED_KNOWLEDGE_DB, and WICKED_XEDGE_DB, else from WICKED_HOME, else $HOME/.wicked.
Intent to command, in brief
Section titled “Intent to command, in brief”| Intent | Command |
|---|---|
| Resolve a name to a stable ID | wicked-estate resolve <name> --json |
| Fetch source | wicked-estate source --symbols <id> --json |
| What depends on this | wicked-estate blast-radius <name> [--depth N] [--cursor C] --json |
| What this depends on (forward) | wicked-estate lineage <symbol> --json (a name or a symbol id) |
| Walk by direction and edge kind | wicked-estate traverse <symbol> [--direction ...] [--edge-kinds ...] --json |
| Route from A to B | wicked-estate path <from> <to> [--max-depth N] --json |
| Bounded neighbourhood | wicked-estate graph-view --focus <name> |
| Load-bearing symbols | wicked-estate rank [--seeds ...] [--limit N] --json |
| Rules inventory | wicked-estate rules-inventory --json |
| Rules recall | wicked-estate rules-recall [--severity ...] --json |
| Subsystems | wicked-estate clusters --json |
| Task context | wicked-estate context <name> --budget <chars> --json |
| Graph size and freshness | wicked-estate stats --json (indexed commit, index time, commits behind) |
Traps worth knowing: lineage accepts a name or a symbol id, but an unknown
or ambiguous name exits non-zero with nothing on stdout, so resolve first when
a name may be shared. The CLI parses arguments strictly: a malformed value, a
surplus operand, a repeated flag, or a --db with no path exits 1 with nothing
on stdout, which is a command error and not an empty answer. Most read commands
refuse a --db path that does not exist or is empty with no graph at <db>
and create nothing; clusters, context, semantic, semantics, drift, cross-graph and correspond instead turn it into an empty graph and return an
empty result. Before running one, check that stats --json --db <path> shows a
non-zero nodes count for every database it will read. semantic and
clusters --weight semantic also return an empty result when the index has no
embeddings, with the reason only on stderr, and until tfstate has
imported live state, drift lists every declared resource as undeployed, which
is not drift. rank --seeds
biases a graph-wide ranking — seeded output includes symbols the seeds cannot
reach. To rank a dependent set, keep only the rows whose symbol is in your set
and report missing members as unranked.
What the CLI reports about completeness
Section titled “What the CLI reports about completeness”blast-radius --jsonreturnsunresolved,truncated_dependents,searched_depth,depth_horizon_reached,node_cap_reached,next_cursor,page {from, count, total}, and aconfidence {min, avg, edge_count}summary. One reply stays under 25,000 characters;truncated_dependentscounts the rows on later pages. Pass--cursor <next_cursor>untilnext_cursorisnullto get the whole resolved answer. A refused cursor (exit 1, nothing on stdout) means the answer changed, so start again from the first page. An accepted cursor says nothing about freshness;stats --jsondoes. A truedepth_horizon_reachedmeans more dependents lie beyond the depth searched; raise--depth(default 12, maximum 24). A truenode_cap_reachedmeans the node budget cut the walk, and no flag raises it. Eachblast-radiusrow carries a per-rowdepth(1 is a direct dependent) and no per-row confidence.lineage --jsonpages the same way, withnext_cursorand--cursor. Its default depth is 24, which is also its ceiling, so a truedepth_horizon_reachedthere has no deeper setting to try.path --jsonreturnsfound,depth_bounded,node_boundedandunresolved.found: falsemeans no route exists only whenunresolvedis null and both bound flags are false. A misspelled name setsunresolvedand still exits 0. With a bound flag true, a route may lie beyond the search.pathfollows every dependency edge kind, so read each hop’skind. Endpointlinecounts from 0; useline_1based.- Commands served by the same retrieval tools as the MCP server (
lineage,traverse,rank,rules-inventory,rules-recall) writeSTALENESS:to stderr under--json; in text mode they print it on stdout after the result (source-read fromtool_bridge.rs; pinned onlineage --json). They printN commit(s)for each root that is behind,unknownfor each root whose freshness could not be determined, and a single0 commitsline when every root was checked and none is behind (source-read frommain.rs).CLAMPED:, the line printed when a limit such as--depthabove 24 is lowered to its ceiling, follows the same channels.blast-radiusandpathsuppressSTALENESS:under--json, and textstatsstays silent when freshness is unknown, so check freshness withwicked-estate stats --json: the graph is current only whenstaleness.commits_behindis 0 andstaleness.unknownis empty.query,clustersandcontextprint commits-behind lines on stdout before their JSON, even under--json.
What does not exist on the CLI
Section titled “What does not exist on the CLI”- A ranked-dependents summary on blast-radius. MCP
BlastRadiusaddssummary.top_by_pagerank, which the CLI lacks. Its rows carry a per-rowdepth, and--depth 1still returns only direct dependents; seeevidence.mdfor the split. - Memory, knowledge, and proposal domains. These have no CLI verb.
Commands that write
Section titled “Commands that write”Read-only work needs none of these, and the pack asks before any of them:
index, scip, evidence, tfstate, import-telemetry, annotate, semantics,
compact, watch, supports retract, and clusters --annotate.