CLI commands
Exact setup and doctor commands, flags, environment inputs, effects, checks, and exit behavior.
A
JInstalling @cavuno/board adds the cavuno-board binary. It has exactly two verbs:
1cavuno-board <setup|doctor>
Run it through the package or binary name:
12npx @cavuno/board setupnpx @cavuno/board doctor
An omitted or unknown verb prints the usage line and exits 1.
setup
1npx @cavuno/board setup
Setup reads the current directory and the package’s shipped skill manifest. It does not create application routes, source files, environment files, or a Board SDK client.
Framework detection
The current detector reads dependencies and devDependencies from the project’s package.json:
@tanstack/react-startpresent →tanstack-start.- Anything else, including no
package.json→ no detected framework.
Setup always selects core skills. It also selects the flavor whose manifest framework matches the detected value. Other framework wiring remains a manual documentation task until a matching flavor ships.
Target directories
Setup checks these roots:
.agents/skills.claude/skills.codex/skills.cursor/skills
If any exists, the corpus is copied to every existing root. If none exists, setup creates .agents/skills. Each selected cavuno-board-* directory is created and copied recursively. Re-running overwrites matching versioned skill files and does not intentionally touch unrelated skills.
The output lists:
- Installed package/manifest version.
- Detected framework or
none (core skills only). - Target roots and unique copied skill names.
- The required
PUBLIC_CAVUNO_BOARDvalue and optionalPUBLIC_CAVUNO_API_URLoverride as next-step instructions.
Setup only prints those environment variables; it does not write them.
Verify setup
1234test -f .claude/skills/cavuno-board-setup/SKILL.md || \test -f .codex/skills/cavuno-board-setup/SKILL.md || \test -f .cursor/skills/cavuno-board-setup/SKILL.md || \test -f .agents/skills/cavuno-board-setup/SKILL.md
Run setup again after every SDK upgrade. Doctor compares installed SKILL.md content with the corpus shipped by the currently installed package.
doctor
1npx @cavuno/board doctor [--frontend <url>] [--sandbox]
Doctor reads the current working directory and these environment variables:
| Variable | Required | Effect |
|---|---|---|
PUBLIC_CAVUNO_API_URL | No | API-origin override. Default: https://api.cavuno.com. Use only when Cavuno supplies another environment. |
PUBLIC_CAVUNO_BOARD | Yes | Doctor requires a publishable key in the exact form pk_ plus 32 hexadecimal characters. Unlike the runtime client, doctor does not accept a board ID or slug. |
RESEND_API_KEY | Only for one platform sandbox check | Lets the email-boundary probe confirm that registration produced a verification send. Without it, that check skips loudly. |
Tier 1 — static and API checks
These run on every invocation:
env.api-url: the default or explicit override is a valid URL.env.board-key: key has the exact publishable-key shape.static.api:{apiBase}/v1/openapi.jsonreturns a JSON object with an OpenAPI version string.static.board:/v1/boards/{key}resolves to JSON board context, including for a password-protected board.static.skills: installed Cavuno skill files match the current package corpus. Missing skill roots or no installed Cavuno skills are reported as skipped, not passed.static.theme: whensrc/tokens.cssexists, its SHA-256 hash must matchsrc/theme/resolved.tsand the board context’s platform snapshot. A non-migrated project without the token file skips this check.
--frontend <url> — tier 2 reads
12npx @cavuno/board doctor \--frontend https://jobs.example.com
The flag adds five deployed frontend checks:
read.home: the root returns successful HTML.read.jobs:/jobscontains a canonical/companies/{company}/jobs/{job}detail link.read.jsonld: the first linked detail page contains parseableJobPostingJSON-LD.read.sitemap:/sitemap.xmlparses, a child sitemap is followed when necessary, and a sample page resolves.read.robots:/robots.txtcontains aUser-agentdirective.
The frontend base is used for probes even when sitemap <loc> values contain the production canonical host. Without --frontend, all five checks remain visible as skipped.
--sandbox — tier 3 writes
12PUBLIC_CAVUNO_BOARD=pk_0123456789abcdef0123456789abcdef \npx @cavuno/board doctor --sandbox
--sandbox opts into these write checks:
- Confirm the resolved board context has
sandbox: true. - Register one generated candidate and log in with the same credentials.
- If
RESEND_API_KEYexists, poll the platform Resend account for the verification send. - Apply as that candidate to the first job returned by the sandbox.
- Create an anonymous, consented job-alert subscription.
Doctor refuses the entire write tier when the board is not the platform sandbox. The remaining write checks then skip. Probe data is not cleaned up; the platform sandbox is reset separately.
Registration can hit its server rate limit after repeated runs. Doctor reports that failure and advises waiting rather than claiming the downstream checks passed.
Exit and output behavior
Every check prints an ID, tier, status mark, and detail. The summary lists passed, failed, and skipped IDs.
- Exit
0: no check failed. Skips can still be present and are printed as “NOT verified.” - Exit
1: one or more checks failed. - Exit
1: doctor crashed before producing a normal summary. - Setup returns
0when copying completes; filesystem or manifest failures terminate non-zero.
Skipped checks never count as passes or failures. A zero exit therefore means “everything that ran passed,” not “every tier ran.”
Recommended release command
12npx @cavuno/board setupnpx @cavuno/board doctor --frontend https://preview.jobs.example.com
Use --sandbox only in a separate run pointed at the platform sandbox key. See Run doctor for the release workflow.