gaal doctor is the diagnostic command. Run it any time gaal isn’t behaving the way you expect, it’s faster than reading the source.
What doctor checks
- Config validity, does
gaal.yamlparse? Does it conform to the schema? Are scope-restricted fields used in the wrong scope? - Source reachability, every
skills[*].sourceand everymcps[*].sourceURL is contacted (HEAD only, no download). - MCP target writability, every
mcps[*].targetfile is checked for read/write permission. Missing files are OK; the target will be created on sync. - Agent installation, for each agent in the registry, doctor reports whether gaal detects it on this machine.
- Telemetry status, opt-in / opt-out, plus the source file the value came from.
Exit codes
| Code | Meaning |
|---|---|
0 | Everything passed. |
1 | Warnings only, gaal will function, but something is suboptimal (e.g. an unreachable optional source). |
2 | Errors, gaal cannot operate as configured. |
Useful flags
--offline is what you want in CI environments without internet access, or when running over a metered connection.
Reading doctor output
The output is grouped by check category. Within each category, lines are prefixed with:| Prefix | Severity |
|---|---|
✓ | Passed. |
! | Warning, not blocking, but worth attention. |
✗ | Error, blocks sync. |
Common things doctor catches
- A workspace
gaal.yamltrying to settelemetry:. - An
mcps[].targetwhose parent directory doesn’t exist and isn’t writable by the current user. - A
skills[].sourceURL that 404s or requires authentication you haven’t set up. - An MCP target file that’s not valid JSON (someone hand-edited it incorrectly).
- A custom agents file at
~/.config/gaal/agents.yamlthat overrides a built-in entry.