Problem
When config values are invalid or stale (e.g., terminal.command = "ghostty" on macOS where the binary doesn't exist), loom fails at runtime with an unhelpful error. There's no way to proactively validate the config.
Proposal
Add a loom doctor command that validates the config and reports issues with suggested fixes. Checks should include:
- Binary existence: verify that
terminal.command and editor.command resolve to actual executables or valid open -a patterns
- Scan roots: verify paths in
registry.scan_roots exist and contain git repos
- Workspace root: verify
workspace.root exists and is writable
- Agent config: validate MCP server names, plugin format (
name@marketplace), marketplace repos are accessible
- Sandbox config: check that allowed paths exist
- Preset references: verify any preset names referenced in workspace manifests still exist in config
Example output
$ loom doctor
Checking config...
[ok] workspace root /Users/foo/workspaces exists
[ok] scan root /Users/foo/_github.com exists (found 42 repos)
[warn] terminal.command "ghostty" not found in PATH
hint: on macOS, use "open -a Ghostty" instead
[ok] editor.command "zed" found in PATH
[ok] 2 agent plugins validated
All checks passed (1 warning).
Context
Came up when an existing config had terminal.command = "ghostty" which doesn't work on macOS (needs open -a Ghostty). The PR #69 fix for detect_terminal() only helps new configs created via loom init. A doctor command would catch stale configs proactively.
Problem
When config values are invalid or stale (e.g.,
terminal.command = "ghostty"on macOS where the binary doesn't exist), loom fails at runtime with an unhelpful error. There's no way to proactively validate the config.Proposal
Add a
loom doctorcommand that validates the config and reports issues with suggested fixes. Checks should include:terminal.commandandeditor.commandresolve to actual executables or validopen -apatternsregistry.scan_rootsexist and contain git reposworkspace.rootexists and is writablename@marketplace), marketplace repos are accessibleExample output
Context
Came up when an existing config had
terminal.command = "ghostty"which doesn't work on macOS (needsopen -a Ghostty). The PR #69 fix fordetect_terminal()only helps new configs created vialoom init. A doctor command would catch stale configs proactively.