- name
- ops-projects
- description
- Portfolio dashboard for all GSD-tracked projects. Scans ~/Projects and ~/gsd-workspaces for .planning/ directories, shows phase status, git state, blockers, and next actions for every project. Run /ops projects to see the full portfolio.
- argument-hint
- [project-alias|--sync|--refresh]
- allowed-tools
- ["Bash","Read","Grep","Glob","WebFetch","AskUserQuestion"]
- effort
- low
- maxTurns
- 20
- disallowedTools
- ["Edit","Write","NotebookEdit"]
## Runtime Context
Before rendering, load:
1. **Preferences**: `cat ${OPS_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json` โ read `owner`, `timezone`
2. **Daemon health**: `cat ${OPS_DATA_DIR}/daemon-health.json` โ show service status in dashboard footer
3. **GSD registry**: `cat ${OPS_DATA_DIR}/registry.json` โ primary project index (updated by daemon twice daily + on-demand with --sync)
# OPS โบ PROJECTS โ GSD Portfolio Dashboard
## Quick commands
```bash
# 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.json` is missing/empty: show a one-shot sync prompt
```
No 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) |
View on GitHub