claw-mo-manage
Interactive management hub for mo markdown viewer. Shows current state and lets the user choose what to do — including a safe "refresh" that re-scans the filesystem without destroying the session.
For config schema, HTTP API, --restart vs --clear semantics, and CLI wrappers (--unwatch, --close): read ${CLAUDE_PLUGIN_ROOT}/references/shared.md
Steps
1. Gather State
Check prerequisite first: command -v mo >/dev/null 2>&1. If missing, tell the user to install and stop.
Then in parallel:
mo --status --json— all running servers- Read
${CLAUDE_PLUGIN_DATA}/config.json— all configured projects - Get current project key:
git rev-parse --show-toplevel
For the current project, extract the live group→patterns mapping from the JSON output and compare it against saved config. Mark the session out of sync if they differ.
2. Display Dashboard
mo server status
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
● project-a :6342 running docs(12) plans(3) default(2)
● project-b :6367 running specs(5)
○ project-c :6315 stopped
Current project: project-a (:6342)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Match config entries to running servers for accurate status (● / ○). Also list any running servers found by mo --status --json that aren't in config (user may have started them manually).
If the current project's configured mapping and live mapping differ, show an explicit warning:
⚠ current project is out of sync
configured: {docs: [docs/**/*.md], default: [*.md]}
live: {docs: [/abs/path/docs/*.md], default: [/abs/path/*.md]}
what this means:
- the running mo session is not watching the same patterns as saved config
- the next `/claw-mo-up` will clear this runtime and rebuild it from saved config
recommended actions:
- if saved config is correct → Server control → Reset session (or just run /claw-mo-up)
- if saved config is outdated → Modify patterns/groups (add/remove), or re-run /claw-mo-setup
3. Ask What to Do
Use AskUserQuestion with a two-step approach to stay within the 4-option limit:
First question — category:
Options:
1. Modify patterns/groups (add, remove, rename)
2. Files (add, remove from view)
3. Server control (refresh, stop, reset, restart)
If "Modify patterns/groups" → second question:
Options:
1. Add pattern to a group
2. Remove pattern from a group
3. Add new group
4. Remove group
If "Files" → second question:
Options:
1. Add a file to a group (ad-hoc, like /claw-mo-open)
2. Close a file currently open in mo
If "Server control" → second question:
Options:
1. Refresh (re-scan filesystem, keep session) — runs `mo --restart`
2. Reset current session (clear saved state + restart empty, then rebuild from config)
3. Stop a server
4. Toggle autosync for this project (PostToolUse hook)
If the session is out of sync and the user chose "Modify patterns/groups", recommend Reset first so later changes apply on top of a known-good runtime.
4. Handle Each Action
All runtime mutations should use the mo CLI when there is a CLI equivalent (-w/--unwatch/--close/--restart). Fall back to the HTTP API only when no CLI path exists. Config file updates happen after the runtime mutation succeeds.
Add pattern:
- Ask which group (show existing groups)
- Ask the glob pattern
- If server running:
mo --no-open -w "$PATTERN" -t "$GROUP" -p $PORT- Otherwise skip the runtime step
- Update config file
- Confirm
Remove pattern:
- Show current patterns per group
- Ask which to remove
- If server running:
mo --unwatch "$PATTERN" -t "$GROUP" -p $PORT- mo accepts either the original glob or the absolute path form reported by
--status
- mo accepts either the original glob or the absolute path form reported by
- Update config file
- Confirm
Add group:
Ask group name and one initial pattern → start it via mo -w ... -t name -p $PORT if running → update config
Remove group:
Show groups, ask which → mo --unwatch for every pattern in that group (group disappears when it has no files or patterns) → update config (remove group key)
Add file (ad-hoc):
Delegate to /claw-mo-open logic (HTTP API POST to /_/api/groups/$GROUP/files). Warn this is runtime-only unless persisted.
Close a file:
curl -s "http://localhost:$PORT/_/api/groups"→ list files in each group- Ask which file
mo --close "$(realpath file)" -t "$GROUP" -p $PORT- No config update needed (ad-hoc file, not a pattern)
Refresh (re-scan):
mo --restart -p $PORT(no prompt, safe)- Verify with
mo --status --jsonand report new file counts - This is the fix when docs exist on disk but don't appear in mo — same mechanism
/claw-mo-upuses by default.
Reset session:
printf 'y\n' | mo --clear -p $PORT- Ask: "Restart with saved config now?" (equivalent to
/claw-mo-up) - If yes, run the per-group start sequence from config
Stop a server:
- Show all running servers (from
mo --status --json) with their ports and projects - Ask which to stop (by number or port)
mo --shutdown -p $PORT- Confirm — note that config is preserved so
/claw-mo-upcan restart it later
Toggle autosync:
- Read current
autosyncfield (defaulttrueif absent) - Show current state:
Autosync is ON — .md writes by Claude are added to mo automatically. - AskUserQuestion: flip it?
- Update config file only — no runtime call needed; the hook reads the config on each fire
- Confirm new state
5. Loop or Exit
After each action, show the updated dashboard and ask if they want another action. Exit when done.
Gotchas
- Prefer
mo --restartover--clearfor rescans — restart preserves session; clear destroys the backup. The old "just clear everything" reflex wipes state that didn't need wiping. - Only
--clearprompts for confirmation — pipeprintf 'y\n'.--restart,--shutdown,--close,--unwatchdo not prompt. - Config is desired state — always update config AND runtime (CLI or API) together when making a persistent change.
- Compare full live group→patterns mapping to config before assuming a running server is reusable — matching port or group names alone isn't enough.
- If session is out of sync, prefer Reset before multiple runtime edits; otherwise stale groups/patterns persist and
/claw-mo-upwill discard your runtime edits on the next invocation. - Group names must be simple lowercase — they become URL path segments.
- If the server is not running, only update config — skip CLI/API calls.
- "Close a file" only removes it from the view — the file on disk is untouched and will be re-added if it matches a watch pattern and
mo --restartruns. - "Stop a server" only stops the process — config and backup are preserved so
/claw-mo-upcan restart it later. mo --unwatchaccepts both relative globs and absolute paths (the form--statusshows). Either works.- Autosync is read per fire, not cached: flipping it takes effect on the next
Write|Edit|MultiEdit— no need to restart mo or reload Claude. The hook re-reads config.json every invocation, so the toggle is effectively live.