
Ops Projects
- 55 installs
- 3.2k repo stars
- Updated August 2, 2026
- davepoon/buildwithclaude
Show a portfolio dashboard for all GSD-tracked projects with phase status, git state, blockers, and next actions.
About
A portfolio dashboard that scans project directories for .planning/ folders and shows each project's phase status, git state, blockers, and next actions. A developer uses it to see the full portfolio at a glance.
- Scans ~/Projects and ~/gsd-workspaces for .planning/ directories
- Shows phase status, git state, blockers, and next actions per project
Ops Projects by the numbers
- 55 all-time installs (skills.sh)
- Ranked #1,591 of 3,280 Productivity & Planning skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/davepoon/buildwithclaude --skill ops-projectsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 55 |
|---|---|
| repo stars | ★ 3.2k |
| Last updated | August 2, 2026 |
| Repository | davepoon/buildwithclaude ↗ |
What it does
Show a portfolio dashboard for all GSD-tracked projects with phase status, git state, blockers, and next actions.
Files
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
# 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.jsonData 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 ${CLAUDE_PLUGIN_ROOT}/scripts/ops-gsd-registry-sync.sh 2>&1Show "Refreshing..." while running, then present the full updated dashboard.
---
Error states
- If
registry.jsonis 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) |