feat: GSD registry sync + portfolio dashboard#139
Conversation
- 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.
|
Warning Rate limit exceeded
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 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 configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (5)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
…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.
…move AskUserQuestion reference
|
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)
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
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.
| case "$arg" in | ||
| --sync) MODE="sync-dashboard" ;; | ||
| --json) MODE="json" ;; | ||
| --health) MODE="health" ;; | ||
| --help) usage; exit 0 ;; | ||
| esac |
There was a problem hiding this comment.
🟡 --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.
| 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 ;; |
Was this helpful? React with 👍 or 👎 to provide feedback.
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.
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:
bin/ops-projects — CLI dashboard:
Updated files
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
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
Note
Medium Risk
Adds a new background cron service and new scripts that scan local directories and invoke
gitto build registry/health caches, which could impact performance or behave unexpectedly across environments.Overview
Introduces a GSD project registry + portfolio dashboard for
/ops projectsby adding a newops-gsd-registry-sync.shscanner that discovers.planning/projects under~/Projectsand~/gsd-workspaces, gathers basic GSD metadata and lightweight git state, and writes${OPS_DATA_DIR}/registry.jsonpluscache/projects_health.json.Adds a new
ops-projectsCLI renderer with--sync,--json, and--healthmodes, enables agsd-registry-syncdaemon cron (6am/6pm) indaemon-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.