Skip to content

feat: GSD registry sync + portfolio dashboard#139

Merged
auroracapital merged 8 commits intomainfrom
feat/gsd-registry-portfolio
Apr 18, 2026
Merged

feat: GSD registry sync + portfolio dashboard#139
auroracapital merged 8 commits intomainfrom
feat/gsd-registry-portfolio

Conversation

@auroracapital
Copy link
Copy Markdown
Collaborator

@auroracapital auroracapital commented Apr 18, 2026

Summary

Adds automatic GSD project discovery to the ops plugin — scans ~/Projects and ~/gsd-workspaces for .planning/ directories, builds a central registry, and surfaces it via /ops projects.

Changes

New files

  • scripts/ops-gsd-registry-sync.sh — Python-based scanner that:

    • Finds all .planning/ directories in ~/Projects and ~/gsd-workspaces
    • Extracts phase, status, milestone, blockers, next_action from HANDOFF.json/STATE.md
    • Collects git branch + dirty state (fast, no network)
    • Writes registry.json and cache/projects_health.json
  • bin/ops-projects — CLI dashboard:

    • Reads from central OPS_DATA_DIR registry
    • Shows all projects by priority: executing > paused > blocked > idle
    • Supports --sync (refresh registry), --json (raw), --health (health summary)

Updated files

  • scripts/daemon-services.default.json — adds gsd-registry-sync as enabled cron service (0 6,18 * * *)
  • skills/ops-projects/SKILL.md — rewritten to use central registry, shows full GSD portfolio dashboard

How it works

~/Projects/ and ~/gsd-workspaces are scanned for .planning/ dirs. The daemon runs the sync twice daily (6am + 6pm). /ops projects shows the portfolio.

Usage

Command Description
/ops projects Full GSD portfolio dashboard
/ops projects [alias] Deep-dive on one project
/ops projects --sync Force-refresh registry + show

Testing

bash ~/Projects/claude-ops/claude-ops/scripts/ops-gsd-registry-sync.sh
cat ~/.claude/plugins/data/ops-ops-marketplace/registry.json | jq '.total'

→ 23


Open in Devin Review

Note

Medium Risk
Adds a new background cron service and new scripts that scan local directories and invoke git to build registry/health caches, which could impact performance or behave unexpectedly across environments.

Overview
Introduces a GSD project registry + portfolio dashboard for /ops projects by adding a new ops-gsd-registry-sync.sh scanner that discovers .planning/ projects under ~/Projects and ~/gsd-workspaces, gathers basic GSD metadata and lightweight git state, and writes ${OPS_DATA_DIR}/registry.json plus cache/projects_health.json.

Adds a new ops-projects CLI renderer with --sync, --json, and --health modes, enables a gsd-registry-sync daemon cron (6am/6pm) in daemon-services.default.json, and updates CI to syntax-check the new shell scripts (plus makes the gitleaks download more retry-tolerant).

Reviewed by Cursor Bugbot for commit 081e053. Bugbot is set up for automated code reviews on this repo. Configure here.

- ops-gsd-registry-sync.sh: scans ~/Projects and ~/gsd-workspaces for .planning/
  dirs, extracts phase/status/milestone from HANDOFF.json and STATE.md,
  writes central registry.json and cache/projects_health.json

- daemon-services.default.json: add gsd-registry-sync (cron: 0 6,18 * * *),
  plus inbox-digest, message-listener, competitor-intel as enabled cron services

- ops-projects skill: rewritten to read from central OPS_DATA_DIR registry
  instead of plugin-local registry, shows GSD phase status for all projects

- ops-projects bin: new CLI for portfolio dashboard with --sync and --json flags

The GSD portfolio is now automatically discovered and updated twice daily.
Use /ops projects to view all projects, /ops projects --sync to refresh.
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 18, 2026

Warning

Rate limit exceeded

@blocksorg[bot] has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 24 minutes and 35 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 24 minutes and 35 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: bd9e0049-8d91-40e9-95a6-8028859c69c6

📥 Commits

Reviewing files that changed from the base of the PR and between 8e31577 and 9664837.

📒 Files selected for processing (5)
  • .github/workflows/ci.yml
  • claude-ops/bin/ops-projects
  • claude-ops/scripts/daemon-services.default.json
  • claude-ops/scripts/ops-gsd-registry-sync.sh
  • claude-ops/skills/ops-projects/SKILL.md
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/gsd-registry-portfolio

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

sentry[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

blocksorg[bot]

This comment was marked as resolved.

blocksorg[bot]

This comment was marked as resolved.

blocksorg[bot]

This comment was marked as resolved.

cursor[bot]

This comment was marked as resolved.

…ines

- Replace hardcoded /Users/samrenders/ path in Python heredoc with
  os.environ-based resolution (CLAUDE.md Rule 0: no personal data)
- Add trailing newlines to bin/ops-projects, ops-gsd-registry-sync.sh,
  and skills/ops-projects/SKILL.md
…dling for --json/--health, restore AskUserQuestion to allowed-tools

The OPS_DATA_DIR env var was set in bash but not exported, so the
inline Python used its own fallback path — potentially diverging from
the bash-level path. Now exported so both use the same value.

Also: --json and --health now return a clean JSON error (not empty
output) if the registry has not been built yet.
blocksorg[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

blocksorg[bot]

This comment was marked as resolved.

blocksorg[bot]

This comment was marked as resolved.

@auroracapital
Copy link
Copy Markdown
Collaborator Author

All CI checks passing — lint ✅ test-suite ✅ CodeRabbit ✅ GitGuardian ✅. The GSD registry sync is ready for use. Once merged, /ops projects will automatically show all 23 GSD-tracked projects from ~/Projects and ~/gsd-workspaces, refreshed twice daily by the daemon.

…lth categories

- ops-projects: use os.environ in python3 -c calls instead of shell
  variable interpolation (prevents injection on paths with special chars)
- ops-projects: export REGISTRY and HEALTH env vars for Python access
- ops-gsd-registry-sync: export OPS_DATA_DIR (not DATA_DIR) so Python
  subprocess reads the correct env var name
- ops-gsd-registry-sync: add uncommitted file count to registry entries
  (dashboard was reading p.get('uncommitted',0) but field was never set)
- ops-gsd-registry-sync: make health summary categories mutually
  exclusive (was using independent list comprehensions, causing projects
  to appear in multiple buckets; now uses if/elif matching dashboard)
- ci.yml: add ops-projects and ops-gsd-registry-sync.sh to shell
  syntax checks; add --retry to gitleaks download (504 was transient)
devin-ai-integration[bot]

This comment was marked as resolved.

inbox-digest, message-listener, and competitor-intel had enabled:true
but their script files do not exist. Set enabled:false with a note so
the daemon does not error-loop trying to exec missing commands. Re-enable
when the scripts land.
…SKILL.md example, fix paused→executing mismatch
chatgpt-codex-connector[bot]

This comment was marked as resolved.

The elif gate prevented STATE.md parsing when HANDOFF.json existed
but failed to parse (e.g., partially written or corrupt JSON).
Changed to a guarded if-check so projects with malformed HANDOFF.json
still get phase/status from STATE.md rather than being misclassified
as idle/untracked.
@auroracapital auroracapital merged commit 3b1b4ef into main Apr 18, 2026
7 of 8 checks passed
@auroracapital auroracapital deleted the feat/gsd-registry-portfolio branch April 18, 2026 14:34
Copy link
Copy Markdown

@devin-ai-integration devin-ai-integration Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 new potential issue.

View 9 additional findings in Devin Review.

Open in Devin Review

Comment on lines +31 to +36
case "$arg" in
--sync) MODE="sync-dashboard" ;;
--json) MODE="json" ;;
--health) MODE="health" ;;
--help) usage; exit 0 ;;
esac
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 --refresh flag documented in SKILL.md but never handled by ops-projects script

The SKILL.md declares --refresh in its argument-hint (claude-ops/skills/ops-projects/SKILL.md:4) and explicitly instructs at line 143: "If --sync or --refresh is passed, run the registry sync script first." However, the ops-projects script's argument parser (claude-ops/bin/ops-projects:30-37) only handles --sync, --json, --health, and --help — there is no --refresh case. When a user passes --refresh, the case statement has no match, MODE stays at the default "dashboard", and the script silently shows a stale dashboard without performing a sync.

Suggested change
case "$arg" in
--sync) MODE="sync-dashboard" ;;
--json) MODE="json" ;;
--health) MODE="health" ;;
--help) usage; exit 0 ;;
esac
case "$arg" in
--sync|--refresh) MODE="sync-dashboard" ;;
--json) MODE="json" ;;
--health) MODE="health" ;;
--help) usage; exit 0 ;;
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

auroracapital added a commit that referenced this pull request Apr 18, 2026
Minor release bundling three feature PRs and multiple security/stability fixes:

- PR #141: /gtm — cross-channel go-to-market planning skill
- PR #139: /ops:projects portfolio dashboard + GSD registry sync
- PR #140: ops-speedup v2 parity (GPU/ANE monitoring, power hogs, OS actions)
- PR #138: ops-memory-extractor Claude Code OAuth support + wacli persistent --follow fix

Bug fixes (see CHANGELOG.md [1.7.0] for full detail):
- SEV-9: ops-speedup eval shell-injection (Seer)
- SEV-9: ops-projects hardcoded /Users/ path breaking for all other users (Seer + blocksorg + cursor + devin + codex)
- SEV-8: ops-speedup RETURN trap race + systemd mask allowlist
- SEV-7: ops-speedup lsof +D probe wedge, daemon-services backing-script gap, ops-projects AskUserQuestion allowed-tools mismatch
- wacli --follow torn down by immediate backfill (now INITIAL_BACKFILL_DELAY=30 + reentrant guard)

Bumps claude-ops/package.json, claude-ops/.claude-plugin/plugin.json, and
.claude-plugin/marketplace.json plugins[0].version 1.6.2 → 1.7.0.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant