Last updated July 24, 2026
ContextDX Plugins
The plugins are how your codebase and your boards stay in step. They run inside the AI coding agent you already use — Claude Code, Codex, or Cursor — and they don't try to replace it: your agent still reads and writes the code, while the plugin keeps track of the system that code adds up to.
That traffic runs both ways.
Up, from the code. The plugin analyses your project locally and builds a structured graph of services, APIs, databases, concepts, and how they connect. That graph becomes a living board — you never draw a diagram.
Down, to the coding session. The board sends back everything your app has learned about how it should be built: compiled skills, the intents someone authored on the board, unbuilt designs, and aspect contracts. Your agent implements against that context instead of guessing at it.
There are two plugins:
| Plugin | Reads | Builds | Lead commands |
|---|---|---|---|
Cdx Code (cdx-code) | a codebase | an architecture board | /analyze · /build |
Cdx Work (cdx-work) | a document set | a knowledge board | /analyze-docs |
Both emit the same node/edge model and sync through the same engine — only the analysis brain differs (services, APIs, and imports vs. concepts, decisions, and references). Everything below applies to both unless a note calls out a difference. Cdx Code runs on Claude Code, Codex, or Cursor; Cdx Work on Claude Code and Codex (Cursor coming).
Either plugin connects as a Code Plugin source: where an OAuth source like Confluence lets the platform pull and interpret content, the plugin does the analysis locally in your AI coding session and pushes a ready-made graph.
Everything the plugins do runs inside your own AI coding session and needs no model provider connected. Connecting a model is only for the portal's in-app Chat.
This is the complete reference. For a guided first run, see Getting Started.
The five lifecycle stages
The commands are organized into five stages — /help renders this same grouping, and /status opens with a lifecycle dial telling you which stage you're in and the one next command to run:
| # | Stage | What it's for | Commands |
|---|---|---|---|
| 1 | Connect | Bind this project to a board | /login · /configure · /status · /help |
| 2 | Map | Turn the codebase / document set into a living board | /analyze-archetypes · /analyze (/analyze-docs) · /adopt · /inspect · /sync · /demo-insights |
| 3 | Understand | Run intelligence on the mapped board | /insights |
| 4 | Build | Let the platform's build context drive the code | /skills · /build · /intents |
| 5 | Operate | Keep production and the board in a scheduled loop | /monitor |
The stages form a loop, not a line: /monitor findings become insights an architect turns into intents; /build and /intents change the code; /analyze + /sync verify the change on the board; /insights evaluates the new state.
There are two starting points:
- Existing project? Start at Map — analyze and sync it onto a board.
- Empty repo bound to a platform app? Start at Build —
/buildimplements the build context the platform already carries, and the first/analyze+/syncafterwards is what populates your board.
How the plugins fit as a source
Code Plugin is a source type in the Sources catalog. It authenticates with a token + secret (not OAuth) and exchanges pre-structured data with the platform: it pushes graphs, findings, and aspect snapshots, and pulls archetypes, insight skills, compiled skills, intents, and aspect contracts. See Connecting Sources for the source model and the Boards API for the wire format underneath.
Prerequisites
- Claude Code, Codex, or Cursor installed and running
- A workspace with at least one board (your Root Board is created for you)
- A Code Plugin source bound to that board —
/loginsets this up for you in the browser; only the manual/configurepath needs you to copy credentials
The config file
The plugin reads .contextdx/config.json at the root of your repo or document set. /login writes it for you; for the manual path, get a Binding Token and API Secret from the portal (Sources → Add Source → Code Plugin — saving generates the secret) and create:
{
"bindingToken": "YWJjMTIz...",
"apiSecret": "ck_cp_live_xxx",
"branch": "main",
"boardSlug": "my-project-overview"
}| Field | Required | Default | Notes |
|---|---|---|---|
bindingToken | Yes | — | Base64url-encoded orgId:bindingId from the portal. Sent as X-CodePlugin-Token. |
apiSecret | Yes | — | Must start with ck_cp_live_. Sent as X-CodePlugin-Secret. The plugin rejects anything else. |
branch | Yes | main | The git branch this board is bound to. Must match the binding, or /sync fails with 400 Branch Mismatch. |
boardSlug | Yes | — | The Root Board slug. /login and /configure discover and write this for you. |
baseUrl | No | https://platform.contextdx.com/api | Override only for self-hosted instances. |
excludePaths | No | node_modules, dist, .git, coverage | Paths skipped during analysis. |
includeTests | No | false | Set true to include test files in analysis. (Cdx Code only.) |
includeSourceReferences | No | true | Set false to omit file-path source references from synced nodes and edges (see Source references). |
validation.skipBoardStructureCheck | No | check runs | Opt out of the board-structure guardrail (see Sync guardrails). |
For headless and scheduled runs (e.g. a /monitor schedule in a fresh clone), every credential field can come from the environment instead: CONTEXTDX_BINDING_TOKEN, CONTEXTDX_API_SECRET, CONTEXTDX_BOARD_SLUG, CONTEXTDX_BASE_URL. Env vars win over the file. Credentials never belong in version control — /login and /configure add .contextdx/ to your .gitignore.
Install
Add the marketplace for your platform, then install the plugin you want — cdx-code or cdx-work:
/plugin marketplace add contextdx/cdx-claude
/plugin install cdx-code@contextdx # or cdx-work@contextdxRestart Claude Code after installing so the commands load. To scope the install, add --scope user (default), --scope project, or --scope local.
cdx-code and cdx-work are the install ids — everything else, in the docs and the portal, calls them Cdx Code and Cdx Work.
1 · Connect
Sign in — /login
/loginThe no-copy-paste path: your browser opens the portal, you sign in, pick a workspace and board, and the plugin writes the full credential triple (bindingToken + apiSecret + boardSlug) into .contextdx/config.json itself. Already bound and want a different board? /configure offers a rebind flow that reopens the browser picker.
Manual setup — /configure
/configureFor hand-managed credentials and self-hosted instances: reads .contextdx/config.json, validates it, tests the connection, and auto-discovers your Root Board (writing boardSlug for you). It reads credentials from the file rather than asking you to paste secrets inline.
Both commands end by telling you the one next step for this repo — /analyze-archetypes for an existing project, /build for an empty repo whose platform app already carries compiled skills.
Where am I? — /status
/statusRead-only and offline. The first line is the lifecycle dial — e.g. connected, 6 compiled skill(s), repo is empty — next: /build, or connected → mapped, with drift — next: /analyze (incremental) then /sync. Below it: configuration, the archetype precondition state, the board manifest, per-board analysis summaries (node/edge counts by type), sync status, an analysis coverage section (Cdx Code) — how much of the repo your boards describe, what's pending, and which nodes have gone stale — adopted aspects, and the files changed since each board's last analysis.
2 · Map
Settle the vocabulary — /analyze-archetypes (Phase 1)
Mapping runs a two-phase workflow. Phase 1 settles the archetype vocabulary — the set of node types your board uses — before Phase 2 describes the system. On a new codebase or document set, run this first:
/analyze-archetypesIt scans for patterns that don't fit your workspace's archetype catalogue and submits proposals for admin review, so every node lands on a fitting type instead of a misfit you'd have to re-type later. It's a precondition for /analyze (and /analyze-docs): if the catalogue or your commit has drifted, Phase 2 prompts you to run it. Admins review and approve the proposals in Archetypes.
| Flag | Effect |
|---|---|
--dry-run | Scan and validate proposals without submitting or writing state. |
--skip-submit | Write proposals to a file for manual review; don't submit. |
--replace | Overwrite a duplicate pending proposal instead of being rejected. |
--force | Bypass the local hash guard when submitting. |
Map the system — /analyze (Phase 2)
/analyzeThe plugin scans your project — detecting services, APIs, databases, and queues — and maps how they connect into a structured graph (an L0 overview, usually 10–30 nodes, grouped into domains). It runs locally; nothing is pushed until you /sync.
Mapping a document set instead? Run /analyze-docs (Cdx Work). It reads the same way but detects concepts, documents, decisions, and stakeholders rather than code, and takes the same flags below (--drill, --all, --clean).
It builds a drill-down hierarchy:
| Layer | Scope | What you see |
|---|---|---|
| L0 — Overview | Entire repo | Domains, services, external integrations |
| L1 — Domain | A single service/domain | Controllers, services, repositories, models |
| L2 — Component | A single module | Classes, handlers, internal wiring |
| L3 — Internals | Deep internals (opt-in) | The inner workings of a single component — only where you ask for that depth |
/analyze --drill <parent-board-slug>/<node-slug> # create a child (L1/L2) board for one node
/analyze --all # progressive pass across all layers, with review between levels
/analyze --clean # full re-analysis from scratchAnalysis is incremental by default — it reads the git diff since the commit it last analyzed and only re-touches changed files. This applies to every mode. Use --clean when an incremental result looks stale.
Analysis coverage (Cdx Code)
How much of the repo does the board actually describe? Every /analyze answers that with a deterministic analysis coverage ledger: it inventories the repo's architectural source files — including agent-native artifacts (skills, slash-commands, and agent definitions written as frontmattered markdown, the architecture of modern AI-tooling repos) — records which node covers each one, and diffs that against everything that changed since the last analysis — uncommitted edits included. Every run ends on the coverage dashboard — a progress bar with the change since your previous run (▲ up from 62%) and a ranked Where to go next list — and then offers a choice: analyse one of the recommended areas now (stale boards first, then the biggest unanalysed directories), or stop and /sync what you have. The same dashboard appears in /status. The numbers it shows:
- % analysed — files genuinely analysed, over the architectural total. A file that's merely mapped — claimed by a drill-down candidate whose child board hasn't been built yet — doesn't count until that drill-down runs, so a high-level map can never masquerade as deep analysis. Folders you've chosen to ignore and files the analyzer explicitly waived as non-architectural sit outside the denominator, so glue code never drags the number down.
- Mapped, awaiting drill-down — files placed on the map under a node that declares a child board not yet built. The dashboard names each pending drill-down and how many files it would convert from mapped to analysed.
- Pending — files no node covers yet. A to-triage list, not a failure: it's the exact worklist the next
/analyzepicks up. - Stale nodes — nodes whose files changed since the board last analysed them. This is the drift signal: the code moved, the board hasn't yet.
The ledger is what makes incremental analysis precise — /analyze re-touches exactly the stale nodes and pending files instead of re-deriving scope each run. A board analysed before coverage tracking reports coverage unknown until its next analysis records what each node covers.
Two optional config fields tune the ledger, both under a coverage key in .contextdx/config.json:
| Field | What it does |
|---|---|
coverage.ignore | Glob patterns (e.g. "**/utils/**") excluded from the denominator — for helpers and glue that shouldn't count against coverage. Ignored files stay visible as a count. |
coverage.extensions | Extra file extensions to count as source (e.g. ["php", "kt"]) for stacks beyond the built-in language list. The ledger tells you when it's skipping an extension. |
Pending and stale file names never leave your machine — /sync reports only the counts to your board's hub. The full file-level detail stays in .contextdx/coverage.json.
Extract contracts — /adopt (Cdx Code)
/adopt --db # extract the database schema aspect
/adopt --api # extract the API surface aspectBeyond nodes and edges, a board can carry aspects — structured snapshots of your database schema (tables, columns, keys, indexes) and API surface (endpoints, params, auth). /adopt extracts them from the code and reconciles them onto the bound board (--mode replace|merge); rows a human authored on the portal are never overwritten. These same snapshots come back down as contracts when /build materializes a design (see the Build stage below).
Inspect the running UI — /inspect (Cdx Code)
/inspect # open the running app; pick + annotate; record a session
/inspect --url http://localhost:3000
/inspect --capture <url> # headless: screenshot + element map, no human
/inspect --list | --show <id> # review recorded sessions/inspect turns what you see into work the board can carry. It opens your running app in a real browser — your installed Chrome, driven over the DevTools protocol, nothing downloaded, on a throwaway profile — and gives you a small draggable toolbar:
- Browse (the default) — the page is fully interactive. Log in, open menus, navigate to the screen you care about; nothing is captured yet.
- Pick — hover to highlight a component, click to select it (with an optional note). It records the CSS selector, the accessibility role/name, the component name when it can detect one, and correlates the route to a
ui.pageon your board. - Annotate — drag a box over a region and add a note ("this should be a dropdown"). Esc or clicking the armed button returns you to Browse.
Each session is saved locally under .contextdx/inspections/<id>/ — clean screenshots plus the structured metadata — and needs no credentials to capture; only sharing it back does. When you're done, /inspect asks what the session should become:
- Propose a new intent — draft a work item from your notes, anchored to the
ui.pageyou captured. - Attach to an intent you're working on — add the session as visual evidence to a claimed intent.
- Keep it local — just the screenshots and a readout of what each pick maps to in code.
Then, once you're connected, it offers to push — telling you exactly what leaves the machine (the environment name and the captured URLs) and confirming once. Pushing does two things: the intent's screenshots become visual context an architect can annotate, and each correlated page's clean screenshot + element map is stored on its ui.page as a page capture — the board's live picture of that screen.
No local browser — a cloud or headless session? /inspect --capture <url> takes the shot and records the element map without a human, so the capture path still works where a window can't open.
Push to the portal — /sync
/syncYour architecture appears as a visual diagram on your board: nodes for each component with their types and descriptions, edges showing imports, API calls, data access, and event flows.
/sync --board <slug> # sync a specific board
/sync --all # sync the entire layered tree/sync defaults to a smart, diff-based merge: it pulls the board's current server state, computes what changed, and pushes only the difference. Plain /sync pushes one board (and prompts if you have several). /sync is shared by both plugins and behaves identically. It's also what verifies intents: when a push matches a change an intent proposed, the server stamps it verified (see /intents under the Build stage).
After a successful push, /sync (Cdx Code) also reports the repo's analysis coverage snapshot — counts only, never file paths — which is what feeds the coverage card on your app board's hub, and tells you where coverage stands (naming the next /analyze when there's still a gap). A platform that predates coverage support is skipped silently; the sync itself never fails over it.
Source references
By default, every synced node and edge carries a source reference — the relative file path it was derived from, plus a navigable link into your git host when a remote is configured — and a node's description may include that path. This is what powers click-through from a board element back to the code (or, for Cdx Work, back to the document).
Source references send your repository's file paths (and, with a git remote, links to specific files) to the portal. If those paths are sensitive, opt out by setting "includeSourceReferences": false in .contextdx/config.json — /sync then pushes nodes and edges with no file paths anywhere in the payload. Your local analysis files under .contextdx/boards/ keep the paths regardless, so you can turn this back on later and re-sync without re-analyzing.
Sync guardrails
Before any board reaches the portal, /sync runs a structural check. If a board has more than 8 nodes but no domain_group containers, the sync is rejected — flat boards at that size almost always mean the analyzer skipped grouping, and they render as an unreadable wall of nodes. (This guardrail applies to Cdx Code; Cdx Work groups by subject area instead.)
The fix is to re-run /analyze; the agent's protocol includes a domain-grouping step that populates domain_group containers automatically. If your project is genuinely small enough that a flat board is right, opt out in .contextdx/config.json:
{
"validation": {
"skipBoardStructureCheck": true
}
}When disabled, every /sync prints a stderr notice ([cdx-sync] board-structure check disabled via config.validation.skipBoardStructureCheck) so the opt-out is never silent. Remove the field — or set it to false — to re-enable the check.
Seed a demo — /demo-insights
/demo-insights [count] [--board <slug>] [focus prompt]Makes a freshly mapped board presentable: generates a small set (default 3, clamped 2–4) of path-rich insights, each tracing a legible path across multiple nodes — ideal for demos and screenshots. It reuses the same skills and push pipeline as /insights.
3 · Understand
Run insights — /insights
/insightsInsight skills are defined on the portal — security checks, quality reviews, dependency audits. The server defines what each skill looks for; the plugin does the reasoning, reading the board and your source files locally, then pushing findings back. Each finding ties to a specific node and highlights the affected area on your diagram.
/insights find auth and data-access risks # match a natural-language prompt to skills
/insights --select # choose skills and a focus interactively
/insights --list # list available skills
/insights security-analysis # run a specific skill by slug
/insights --all # run every skillFindings aren't just observations: on the portal, an architect can create an intent from a finding — a work item that flows back to developers through /intents. That's how an analysis becomes a change (see “The loop” below).
/insights runs entirely in your AI coding session — no model provider required. This is different from the portal's in-app "With Insights" mode, which runs through Chat and does need a connected model. The insights tab in the portal only displays results; the plugin generates them here. Skill authoring is covered in Insight Skills.
4 · Build
The build stage is what makes the pipeline two-way: the platform carries your app's build context, and these commands make it real in code.
Pull the compiled skills — /skills
/skills # sync the compiled bundle into the repo
/skills --status # read-only: up to date? changed upstream? locally edited?A skill is composed on the platform from a shared library we curate — you add skills to an app and optionally customize them for that repo — and /skills compiles the resolved result into IDE-native skill files in your repo (for Claude Code: .claude/skills/). These files carry the guidelines and conventions your coding agent follows — they are the primary build context /build builds from.
A compiled skill is more than a single file. Alongside its SKILL.md, a skill can ship:
- reference files — supporting docs under the skill's own folder that the agent loads on demand;
- executable scripts — a
scripts/directory written with the executable bit set, for the deterministic steps a skill defines (a check, a scaffold, a transform). Scripts ship verbatim and read their inputs fromargv/env, so nothing inside them is rewritten on the way down; - a Sources & further reading section, when the skill points at external documentation.
Related skills can also arrive grouped into a named recipe — a curated set that lands together with a short index over its members, so a whole capability shows up in one move rather than as loose parts.
The write is never-clobber: a committed lock manifest (cdx-skills.lock.json) records what the command wrote, so a file you've edited locally — a SKILL.md, a reference, or a script — is detected and left alone, never overwritten. Commit the compiled skills and the lock — the whole team and every agent session then share them.
Skill scripts need a current plugin build. If yours predates script support, /skills still writes the prose and references normally, then reports how many files it held back (N skill file(s) need a newer plugin — run /update). Run /update to get a build that can receive them, then re-run /skills.
Build the app — /build (Cdx Code)
/build # assemble the build context, plan, implement (after your approval)
/build --plan # present the plan only — no files touched/build implements the platform's build context for this app in this repo — including in an empty repo. It assembles a build pack from four sources, by primacy:
- Compiled skills — the guidelines and conventions (
/skills; synced automatically first when stale). - Open intents — explicit architect work items.
- Board design — elements someone designed on the portal that have no source mapping yet ("unbuilt").
- Aspect contracts — the board's DB-schema and API-surface snapshots, materialized as migrations and endpoint contracts.
It classifies the repo (empty / partial / built), shows a brief with one recommended next step, and — only after you approve the plan — implements the unbuilt work unit by unit, verifying each with the project's own checks. Work an intent covers goes through the /intents claim/resolve machinery, so the architect sees attribution and verification.
/build is incremental and idempotent: the build context keeps evolving on the platform (skills recompiled, intents added, design edited), and re-running builds only the delta. A repo with no unbuilt work is pointed at /intents; a repo with source but no platform build context is routed to Map instead. No dead ends.
Close the loop when it's done: /analyze-archetypes → /analyze → /sync. For a skills-driven build this is what creates the board — the freshly built app becomes a mapped, living board. For a design-led build, the designed elements gain source mappings and stop counting as unbuilt.
Implement architect intents — /intents
/intents # pull the intent queue and pick one
/intents <intentId> # claim, implement, verify, resolve a specific intentAn intent is an architect-authored work item: a proposed change to the codebase (or document set), anchored to board elements, that you implement — or reject — from your coding session. The flow is deliberate: claim (single-winner — two developers can't silently duplicate work) → implement from the intent's Instructions and the anchor→file map → verify with the project's own checks → resolve as implemented, rejected, or resolved_other, with a note the architect reads. Stale intents (the board moved since authoring) are flagged and blocked from silent implementation.
An implemented resolution is recorded immediately, and resolutions flow back to the architect's board either way. Where the intent proposed a structural change to the board, it's additionally stamped verified once a later /sync push matches that change — your /sync prints which intents it just proved. An intent that only carries instructions has nothing for the sync to match, so its close stands on your resolution note.
The other half of this queue — authoring intents, creating them from findings, Release, assigning — happens on the portal; see Intents.
5 · Operate
Watch production — /monitor (Cdx Code)
/monitor # pull signals from connected monitoring tools
/monitor --input <signals-file> # or feed an exported/normalized signals file
/monitor --propose-intents # also file the highest-signal findings as unreleased intents
/monitor setup # configure sources + a recurring run/monitor pulls recent signals from your monitoring tools — error trackers (e.g. Sentry), CloudWatch alarms and log patterns, cloud-cost deltas — and correlates them with your board: a deterministic matcher maps stack frames, resource names, routes, and tags onto board elements, and uncertain matches become teach-once mapping prompts you answer exactly once. The shaped findings land on the portal as a draft insight under the built-in Operational Signals skill — one living instance per board, updated in place on every run, with stable finding ids so the intents you create from them keep their back-references across runs.
From there the loop closes on the portal: an architect reviews the draft, creates intents from the findings that deserve action, and developers pick those up with /intents. Or let the run do the filing: with --propose-intents, the highest-signal findings (a concrete recommendation, high or critical priority) arrive as unreleased intents, back-linked to their findings — they still wait for a person to review and release them. Production problem → board finding → released intent → code fix → the next /sync puts the fix on the board.
/monitor setup scaffolds the monitoring config, prints the MCP connect one-liners for your vendors, and — where the host supports it — creates the recurring run for you (a scheduled task on desktop, a routine in the cloud). For unattended runs, credentials come from the CONTEXTDX_* environment variables; secrets never transit the chat.
The loop (insights as intents)
Put together, the stages form the operating rhythm of a maintained system:
/monitor(scheduled) correlates production signals with the board and pushes a draft insight — and/insightsanalyses contribute findings the same way.- An architect reviews on the portal and creates intents from the findings that warrant action, each carrying its origin finding.
- A developer runs
/intents(or/build, which routes intent-covered work through it), claims the item, implements, verifies, and resolves. /analyze+/syncpush the changed code; where the intent proposed a structural change, the server matches the push against it and stamps it verified.- The next
/monitorrun shows the signal gone — or escalates it if it isn't.
The board is never just a picture: it's the ledger this loop runs through.
All commands
/help prints this list grouped by stage, with the plugin version. Operational commands are shared by both plugins and behave identically; domain-specific ones are marked.
| Command | Stage | Purpose |
|---|---|---|
/login | Connect | Browser sign-in: pick a workspace + board; writes the config for you |
/configure | Connect | Manual credential setup, connection test, rebind to another board |
/status | Connect | Lifecycle dial + config, archetypes, boards, sync state, analysis coverage, changed files |
/help | Connect | All commands, grouped by lifecycle stage |
/analyze-archetypes | Map | Phase 1 — settle the archetype vocabulary (--dry-run, --skip-submit, --replace, --force) |
/analyze | Map | Cdx Code Phase 2 — incremental analysis (--clean, --drill <board>/<node>, --all) |
/analyze-docs | Map | Cdx Work Phase 2 — incremental document analysis (same flags) |
/adopt | Map | Cdx Code — extract a DB-schema / API-surface aspect onto the board (--db, --api, --mode replace|merge) |
/inspect | Map | Cdx Code — capture the running UI (pick components, annotate screens) into intents (--url, --capture <url>, --list, --show) |
/sync | Map | Diff-based push (--board <slug>, --all) |
/demo-insights | Map | Seed 2–4 path-rich demo insights on a freshly mapped board |
/insights | Understand | Run insight skills (<prompt>, --select, --list, <skill-slug>, --all) |
/skills | Build | Compile the platform's skill bundle into the repo, never-clobber (--status) |
/build | Build | Cdx Code — build the app from the platform's build context (--plan) |
/intents | Build | Pull architect intents; claim, implement, verify, resolve (<intentId>, --list) |
/monitor | Operate | Cdx Code — correlate monitoring signals with the board → draft insight (setup, --input <file>) |
What the plugins write
Everything project-local lives under .contextdx/ at the root of your repo or document set, and the plugin keeps that directory gitignored:
config.json— your credentials and settingsboards/manifest.json— the board registry (slugs, layers, parent-child links, node/edge counts)boards/<board-slug>.json+boards/stores/<board-slug>.store.json— per-board analysis data and sync state (element hashes) for smart diffingskeletons/+coverage.json— the deterministic file inventories (repo.jsonrepo-wide,<board-slug>.jsonper drill-down) and the analysis-coverage ledger (Cdx Code)intents/— the pulled intent queue;insights/— deterministic context packs for insight runsinspections/—/inspectsessions: clean screenshots plus the picked/annotated metadataaspects/— adopted aspect snapshots;build/— the/buildbuild pack + pulled aspect contractsmonitoring/—/monitorconfig, signals, and the teach-once mapping file- caches and an archetype lock file used by the two-phase workflow
Two things are meant to be committed, both written by /skills: the compiled skill files (e.g. .claude/skills/) and their cdx-skills.lock.json — that's how the whole team and every agent session share the platform's operating knowledge.
A single SessionStart hook scaffolds config.json on first run and appends .contextdx/ to your .gitignore. There is no background auto-sync — analysis, sync, and monitoring happen only when you (or a schedule you created) run the commands.
What each plugin reads
Cdx Code analyzes application code: JavaScript/TypeScript, Python, Java, Go, C#/.NET, Ruby, and Rust. It does not analyze infrastructure-as-code (Terraform, CloudFormation, CDK). Files in other languages can still be counted toward analysis coverage via coverage.extensions.
Cdx Work analyzes a document set: Markdown/MDX, reStructuredText, AsciiDoc, plain text, wiki exports (Confluence, Notion), and PDFs — discovered across the usual locations (docs/, wiki/, rfcs/, adr/, specs/, policies/, notes/, root *.md).
Troubleshooting
| Symptom | Fix |
|---|---|
| Commands don't appear after install | Restart your editor (Claude Code, Codex, or Cursor) so the plugin's commands load. |
| "ContextDX not configured" | Run /login (browser) or /configure (manual) first — every command tells you this and stops. |
Credentials rejected (401 / auth_invalid) | The binding was revoked or the secret rotated — run /login to reconnect, or regenerate the credentials in the portal for the manual path. |
400 Branch Mismatch | Set branch in your config to the branch your board is bound to (e.g. main). The binding is the source of truth. |
"This server doesn't expose <feature> yet" | Skills, intents, aspects-pull, and monitoring need a current platform — ask your admin to upgrade. Commands degrade gracefully where they can. |
/analyze asks for /analyze-archetypes first | That's the Phase 1 precondition — run /analyze-archetypes. It re-prompts whenever the archetype catalogue or your commit has drifted. |
/inspect says "no browser found" | Install Chrome/Chromium, or point CDX_INSPECT_BROWSER at your browser binary. In a cloud or headless session use /inspect --capture <url> instead — it needs no visible window. |
/sync rejected by the board-structure check | A board with more than 8 nodes has no domain_group containers — re-run /analyze, or opt out via validation.skipBoardStructureCheck (see Sync guardrails). |
/build says "nothing to build from" | The platform carries no build context for this app yet — compile skills for it on the portal (or author a board design / intents), then re-run /build. |
/build routes you to Map | The repo has source but no platform build context — that's correct: map it first (/analyze-archetypes → /analyze → /sync). |
/skills reports files "left untouched" | You edited those compiled skill files locally, and the never-clobber lock protected them. Adopt your edits on the platform (app-tier override) or discard them and re-run /skills. |
/skills says N files "need a newer plugin" | Your plugin build predates skill scripts — the prose and references synced, but scripts were held back. Run /update, then re-run /skills to receive them. |
/monitor findings tagged unmatched | The signal's locators didn't match any board element — answer the teach-once mapping prompt, or leave them board-level; they're kept, never dropped. |
| Analysis looks stale | Re-run with /analyze --clean for a full re-analysis from scratch. |
| A board reports "coverage unknown" | It was analysed before coverage tracking existed — its nodes don't yet record what they cover. Re-run /analyze (or --clean); the next analysis writes the coverage data. |
| Coverage says files were "not counted" | Your stack's extension isn't in the built-in language list — add it to coverage.extensions in .contextdx/config.json so those files count in the analysis-coverage denominator. |
| No insight skills available | Insight skills are defined by your workspace admin in the portal. |
What's next
Getting Started
From one repo to a layered system landscape across repos and docs — no model setup required.
Boards API
The API headers, payload shape, and auth that power both plugins under the hood.
Connecting Sources
Combine code- and doc-derived structure with bound documentation sources for richer boards.
Insight Skills
How /insights skills are authored and configured at the workspace level.

