Runtime Context
Before rendering, load:
- Preferences:
cat ${OPS_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json— readowner,timezone - Daemon health:
cat ${OPS_DATA_DIR}/daemon-health.json— show service status in dashboard footer - GSD registry:
cat ${OPS_DATA_DIR}/registry.json— primary project index (updated by daemon twice daily + on-demand with --sync)
Quick commands
# Refresh registry data on demand
bash ${CLAUDE_PLUGIN_ROOT}/scripts/ops-gsd-registry-sync.sh
# Show registry contents
cat ${OPS_DATA_DIR}/registry.json
Show health summary
cat ${OPS_DATA_DIR}/cache/projects_health.json
## Data flow
~/Projects/ ~/gsd-workspaces/ │ │ ▼ ▼ [project]/.planning/ [project]/.planning/ │ │ ├── HANDOFF.json ├── HANDOFF.json ← active-phase projects ├── STATE.md ├── MILESTONES.md ├── ROADMAP.md └── STATE.md └── MILESTONES.md │ ▼ ops-gsd-registry-sync.sh (daemon: 6am + 6pm) │ ▼ ${OPS_DATA_DIR}/ ├── registry.json ← all projects, sorted by priority └── cache/ └── projects_health.json ← health summary │ ▼ ops-projects skill reads this
---
## Dashboard output
Build the dashboard from `${OPS_DATA_DIR}/cache/projects_health.json` (fall back to `${OPS_DATA_DIR}/registry.json` if missing). Show:
╔══════════════════════════════════════════════════════════════╗ ║ OPS ► PROJECTS [owner] [date] [daemon status] ║ ╠══════════════════════════════════════════════════════════════╣ ║ GSD Portfolio — 23 projects ║ ║ ║ ║ 🟢 EXECUTING (3) ║ ║ my-webapp Phase 12 [executing] branch: main 0 dirty ║ ║ my-plugin Phase 16 [executing] branch: main 2 dirty ║ ║ my-saas-app Phase 39 [executing] branch: dev 0 dirty ║ ║ ║ ║ 🟡 PAUSED (4) ║ ║ my-project-a Phase 08 [paused] branch: feat 1 dirty ║ ║ my-project-b Phase 3 [verifying] branch: main 0 dirty ║ ║ ... ║ ║ ║ ║ 🔴 BLOCKED (1) ║ ║ my-ecommerce Phase 7 [await-UAT] branch: prod 0 dirty ║ ║ ║ ║ ⚪ IDLE / UNTRACKED (15) ║ ║ my-side-project Phase 1 [complete] branch: main 0 dirty ║ ║ my-other-app — — branch: dev 3 dirty ║ ║ ... ║ ╠══════════════════════════════════════════════════════════════╣ ║ ⚡ Services: message-listener ● | inbox-digest ⏱ 2h | gsd-registry ⏱ 12h ║ ╚══════════════════════════════════════════════════════════════╝
### Status indicators (from `status` field, case-insensitive)
- **executing** → 🟢
- **paused / verifying / phase_complete** → 🟡
- **human / uat / blocked / pending** → 🔴
- **empty status + has phase** → ⚪ (idle)
- **no phase, no status** → ⚪ (untracked/no GSD)
### Columns per project: ALIAS | PHASE | STATUS | BRANCH | DIRTY | NEXT ACTION
---
## Project deep-dive
If `$ARGUMENTS` contains a project alias, find it in the registry and show:
╔══════════════════════════════════════════════════════════════╗ ║ PROJECT — [alias] ║ ╠══════════════════════════════════════════════════════════════╣ ║ Path: ~/Projects/[alias]/ ║ ║ Phase: [phase] Status: [status] ║ ║ Milestone: [milestone name] ║ ║ Branch: [branch] Dirty: [N] Unpushed: [N] ║ ║ Blockers: [N] ║ ║ Next: [next_action text] ║ ║ ║ ║ GSD files: ✓ ROADMAP ✓ MILESTONES [HAS_HANDOFF] STATE ║ ╚══════════════════════════════════════════════════════════════╝
Actions: [1] Open project directory [2] Continue GSD (/gsd-next [alias]) [3] Git: branch / status / log [4] Run /ops projects (back to portfolio)
Present numbered actions and let the user pick by typing the number or action name.
---
## --sync flag
If `--sync` or `--refresh` is passed, run the registry sync script first, then display the updated dashboard:
```bash
bash ${CLAUDE_PLUGIN_ROOT}/scripts/ops-gsd-registry-sync.sh 2>&1
Show "Refreshing..." while running, then present the full updated dashboard.
Error states
- If
registry.jsonis missing/empty: show a one-shot sync promptNo project registry found. Run /ops projects --sync to build it. - If daemon health shows
action_needed: surface that in a warning banner
CLI reference (for manual use)
| Command | What it does |
|---|---|
/ops projects |
Show full portfolio |
/ops projects [alias] |
Deep-dive on one project |
/ops projects --sync |
Force-refresh registry + show dashboard |
/ops:setup registry |
Open registry setup (future) |