Doctor
Health check for this agent. Inspects config, identity, memory, SQLite index, QMD, crons, hooks, HTTP bridge, messaging plugins, and dreaming. When invoked with --fix, applies safe auto-repairs (create memory dir, sync index, delete stale BOOTSTRAP.md) before re-running checks.
This is a CORE feature — always available. See docs/doctor.md for the full list of checks and auto-fixes.
When to use
- Right after
/agent:createor/agent:import— verify setup is clean - When memory search returns nothing or feels wrong — check SQLite integrity
- When heartbeats don't seem to fire — verify crons and active hours
- When you enabled the HTTP bridge but the browser can't connect — probe it
- Anytime something feels off
How it works
- Refresh the cron audit FIRST —
CronList→writeback.sh audit— so the registry's.auditstate is current - Call the MCP tool
agent_doctorwithaction='check'(oraction='fix'when the user passes--fix); its cron-registry check reads the.audityou just refreshed - The tool returns a structured report; pass it through as-is (the tool already formats a card)
- Supplement with cron status rendered from the same
CronListoutput — the MCP server cannot see Claude Code's cron state
Steps
Step 1 — Detect mode
- If the user's message contains
--fixor/agent:doctor fixor says "arreglar" / "auto-fix" / "repara" → mode isfix - Otherwise → mode is
check
Step 2 — Refresh the cron audit (BEFORE the card)
The agent_doctor card reads the registry's persisted .audit offline. Refresh it first, or the card may render stale/contradictory cron state.
CronList is a deferred tool. Load it first:
ToolSearch(query='select:CronList')
Call CronList() and pipe its FULL output (verbatim, including a literal No scheduled jobs.) to the mechanical auditor:
printf '%s\n' "<full CronList output>" | bash "$CLAUDE_PLUGIN_ROOT/skills/crons/writeback.sh" audit
(Exit 4 = CronList format drift — remember it and report it as its own ⚠️ line in Step 4.) Keep the CronList output for Step 4.
Step 3 — Run the MCP tool
Call:
agent_doctor(action='<mode>')
Print the returned card verbatim.
Step 4 — Add cron status
Append a cron section rendered from the Step 2 CronList output (do not call it again):
- Heartbeat cron: look for a job whose
promptcontains/agent:heartbeat→ report schedule - Dreaming cron: look for a job whose
promptcontainsdream→ report schedule - If either is missing, show
⚠️and suggest: "Missing cron — run the default crons flow (see AGENTS.md)" - If the audit line reported
orphaned>0, add:⚠️ <N> registry reminder(s) not firing — run /agent:crons reconcile - If the audit printed
blocked key=lines, add:⚠️ <B> reminder(s) with ambiguous live duplicates — review with /agent:crons list
Format:
Crons:
✅ Heartbeat: */30 * * * *
✅ Dreaming: 0 3 * * *
✅ Registry audit: alive=5/5
Step 5 — Surface hints
If the diagnostic card includes any → hint: lines, those are already rendered. Do not repeat them; the user has what they need.
Step 6 — If in fix mode, remind the user to reload
After a fix run, if any fix was applied or any hook-related issue remains, recommend /mcp to reload the MCP server. Example:
Some changes take effect only after reloading the MCP server. Run `/mcp` to apply.
Response style
- Terse. No preamble. Just the card + cron section + optional reload hint.
- On messaging channels (WhatsApp, Telegram, Discord), collapse the card to one line per check:
✅ Config · ✅ Identity · ⏸️ HTTP · ℹ️ Dreaming · ...— full card is too wide for mobile. - On CLI or WebChat, keep the full multi-line card.
Never
- Do NOT run auto-fixes without the user asking. If they say
/agent:doctor, only check. Only apply fixes on--fixor when the user explicitly asks to repair. - Do NOT invent diagnostic categories not implemented in
lib/doctor.ts. If they ask about something not covered (e.g. "check my OpenAI API key"), say the doctor doesn't cover that yet — or consultdocs/doctor.mdfor the current check list.
References
docs/doctor.md— full feature documentationlib/doctor.ts— implementation (checks + fixes)docs/INDEX.md— master feature index