Commands
Pasteable dora commands. Flags live on --help.
Copy a command, then add flags from --help. dora and doraval are the same binary. Use npx @hacksmith/doraval if dora is not on PATH.
Empty dora prints short --help. The first job is dora review --quick. The workspace map is dora scan.
dora --help # first loop + verb list
dora review --help # one command
dora --help --json # live map for agents
Exit codes
| Code | Meaning |
|---|---|
0 |
Clean |
1 |
Issues found |
2 |
Could not run |
Scan
dora # short --help
dora scan # workspace map
dora scan --json
dora scan --ci
dora scan --cwd "$GITHUB_WORKSPACE"
Read-only. No LLM. No API key.
Review
dora review --quick . # structure + heuristics; Findings first
dora review --quick ./path/to/skill-dir
dora review --all --quick --ci
dora review --deep . # require Judge; exit 2 if none
dora review --sessions . # require session evidence
dora review CLAUDE.md
dora review --json # includes sessionHealth (not --quick)
--quick is the first Review. It does not include Session health. A full Review adds a Session health block (token pressure). That block is not a Finding.
JSON comes after:
dora review --quick --json
Tiers: Review tiers.
Fix
dora fix . --dry-run
dora fix . --yes # mechanical; no TTY
dora fix . --brief # Judgment items; then replace
Re-run dora review --quick until exit 0.
Create
dora skill new --for claude --name review-pr --description "Reviews PRs" --yes
dora rule new --for cursor --name no-default-exports --yes
dora plugin new --for claude --name my-plugin --yes
dora agent new --for claude --name explorer --yes
Always pass --for. Then dora review --quick the new path.
Skill
dora skill # Authored + Global Skills
dora skill unused # this directory
dora skill unused --global # home Skills
dora skill unused --last 10 --since 30
dora skill remove ghost --dry-run
dora skill remove ghost --yes
dora skill remove ghost --for claude --yes
dora skill restore ghost --yes
dora skill unused lists unused Skills. It writes nothing.
Project unused reads this directory’s Sessions (last 30, 90 days). --global reads last 30 Sessions per agent, any project, and lists home Skills only. Do not mix the two. --last and --since override one run.
A Recent install is younger than Install age (default 90 days). Unused names it as never invoked. It is not a Remove candidate. Imported cache is a count, not a name dump. Config: review_window.last, review_window.max_age_days, install_age_days.
A Plugin with some unused children lists those children. A Plugin with none invoked lists the Plugin only. Next on a standalone unused Skill is dora skill remove <name> --dry-run. Next on a Plugin row or a Plugin-owned Skill is dora review --quick <plugin-root>. Next is never Review of $HOME. Home is never a Plugin root. An Owned child may still be removed by name.
Deletes an Authored Skill. Quarantines a Global Skill (home copy). An Owned Plugin child may be deleted. Restore puts a Quarantined Global Skill back. dora skill remove <plugin-name> does not uninstall a Plugin.
A detected agent needs --yes or --dry-run. A name clash needs --for, --global, or a path.
Scan and Review mark an Authored Skill that was never invoked in the Review window, and is not a Recent install, as R034. That is a Remove candidate. A Global Skill is never a Remove candidate from one project’s Sessions. Use dora skill unused --global for home Skills.
Memory
dora memory add "Never use default exports" --weight 8
dora memory add "Prefer named exports" --global
dora memory list
dora memory promote # hard rules → AGENTS.md
dora memory promote --dry-run
dora memory context --json --quiet
dora memory stash path/to/notes.md
dora memory restore path/to/notes.md
dora memory sync
Weights: 8+ hard · 5 default · 1–3 soft. Memory.
Conflicts
dora conflicts --dry-run
dora conflicts --yes
Settles Claude-vs-Cursor contradictions into AGENTS.md.
Session
dora session
dora session --agent claude --limit 20
dora session show <sessionId>
dora session --json
Read-only. Adapters: Claude, Grok, Cursor, Codex, Copilot.
The table shortens the id. show accepts that short id when it is unique. --json has the full sessionId. show prints token totals when the log has them. It says unavailable when it does not.
Harness
A routine is a saved use case at ~/.dora/harness/<slug>/. dora harness is the front desk. The Runtime runs the Loop. Today that Runtime is Hermes. Full flow: dora harness. dora harness new starts ask-dora / grilling-for-routine. After one good one-pass the grill may add a Fixed step. Human-visible messages end with Sent by pocket agent <slug>. Apply stamps that last line on the GitHub review and Slack post. A Run has no last chat. When the destination cannot tell, the night prompt uses a run handoff (handoff.md). boot is the apply alias. After apply, boot, list, pause, and resume, Dora prints Runtime watch commands. The family is ask-dora, review-with-dora, grilling-for-routine, and writing-for-routine.
Type this in the agent:
/ask-dora turn this loop-able check into a routine
Then use the CLI verbs:
dora harness
dora harness list
dora harness new
dora harness apply <slug>
dora harness apply <slug> --keep-copies
dora harness apply <slug> --from <path-or-url>
dora harness boot <slug>
dora harness show <slug>
dora harness models
dora harness logs <slug>
dora harness pause <slug>
dora harness resume <slug>
dora harness rm <slug>
dora harness open <slug>
Probe
dora probe --dry-run
dora probe --yes
dora probe --yes --json
Sends hello to doraval.dev and waits for ack. Needs identity.api_key. Stay logged in on /account and click ack within 60 seconds. A detected agent must pass --yes or --dry-run.
Exit 0 acked · 1 timeout or bad key · 2 no key or missing write flag.
Mint and store the key first: Connect the CLI.
Config
dora config # list keys
dora config setup # Judge wizard
dora config get eval.model
dora config set eval.model gpt-4.1
dora config set eval.judge auto
dora config set identity.api_key <token> --yes
identity.api_key is the token from doraval.dev/account. A detected agent must pass --yes or --dry-run to set a secret. --deep needs a Judge. Do not paste API keys into chat.
Plugin bump
dora plugin bump patch
dora plugin bump minor ./plugins
dora plugin bump 1.2.3 --yes
Also bumps marketplace manifests. Who is installed is dora scan. Judge keys are dora config setup.
Update
dora update
dora update --check
dora update --via npm
Help map
dora --help # short first page
dora --help --json # live map (read-only vs writes)
dora review --help # one verb
Completions
dora --completion bash
dora --completion zsh
dora --completion fish
Common mistakes
- Empty
dorais--help, not Scan. Usedora scanfor the workspace map. dora new,dora sessions,dora rules,dora reconcile,dora bump,dora providers, anddora agent-helpexit2. Each prints a Next line with the new name.dora conflictsapplies with--yes. There is no--apply.- Judge keys live on
dora config setup, not aproviderscommand. dora probewithoutidentity.api_keyexits2. Mint the key on/accountfirst.- Empty
dora harness newstartsask-dora/grilling-for-routine. It does not write a routine folder. - Laptop close is host sleep, not
dora harness pause. See dora harness.