infra[notask]: add multi-repo coverage to DevOps PR status skill#2500
Merged
Conversation
The pr-skills team dashboard only ever scanned the primary monorepo, even though the qv-devops-pr-status SKILL.md described extraRepos coverage that was never implemented. Build that coverage so the DevOps pod can see PR activity across the ops/dev/research repos it owns, not just tetherto/qvac. - team.mjs: parse optional extraRepos (validated string array, defaults []) - pr-activity.mjs: fetch open PRs from primary repo + each extraRepos entry (pod is sole owner there, all PRs in-scope regardless of path), resolve glob entries via gh repo list, tag each PR with repo/prRef, and skip unreachable repos with a meaningful stderr reason - pr-status.mjs: emit a Repos: summary header and render owner/repo#<num> refs for extra-repo PRs (primary repo keeps bare #<num>), incl. JSON - devops.json: add the curated extraRepos list (qvac stays primary) - SKILL.md + README.md: reconcile docs with the implemented behavior review/my modes are unchanged (primary repo only), so qv-pr-mine and the daily-work-update consumer are unaffected.
tetherto/oss-actions is a DevOps-owned shared GitHub Actions repo that was missing from the curated extraRepos list. Add it (and update the SKILL.md Ops listing) so the dashboard scans it alongside github-ops.
Extend the DevOps extraRepos list with the org/qvac ops + CI repos the pod owns: qvac-actions, qvac-devops, qvac-testops, release-ops, data-github-ops. Update the SKILL.md Ops listing to match. Validated: all five resolve and are scanned (19 reachable extras total).
classifyTeamPRs de-duped the re-review vs stale/active buckets using a Set keyed on the bare PR number. Now that the dashboard spans multiple repos via extraRepos, numbers are no longer unique, so a re-review PR could mask a same-numbered stale/active PR in a different repo and silently drop it from every section. Key the set on the repo-qualified prRef instead.
Address review findings on the multi-repo DevOps PR-status dashboard: - pr-status.mjs: cap the Excluded section at 10 rendered PRs per repo with a "+N more in <repo>" summary, so a busy sole-owner extraRepos entry (or a pile of bot PRs) can't bury the dashboard. --json still carries the full list. Drop the now-inaccurate "touches pod paths" wording from the section header. - pr-activity.mjs: warn when an org's `gh repo list` hits the 1000-repo cap so glob resolution can no longer silently miss repos; require extraRepos specs to be exactly owner/name (reject "owner/group/name" instead of truncating it). - README.md: document the per-repo Excluded cap.
GSServita
approved these changes
Jun 9, 2026
Contributor
Tier-based Approval Status |
sidj-thr
approved these changes
Jun 9, 2026
NamelsKing
approved these changes
Jun 10, 2026
Collaborator
Author
|
/review |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🎯 What problem does this PR solve?
qv-devops-pr-statusdashboard only ever scanned the primary monorepo (tetherto/qvac), even though the SKILL.md prose advertisedextraReposmulti-repo coverage that was never implemented in code. The DevOps pod owns work across ~two dozen ops/dev/research repos and had no single view of open PRs across them.qvac-*glob +oss-actions. This PR uses an explicit curatedextraReposlist (keeping glob support available for anyone who prefers it).📝 How does it solve it?
extraReposlist to.github/teams/<pod>.json(validated inteam.mjs, defaults to[]). In--mode team,collectPRActivityscans the primary repo (path-filtered byownedPaths) plus every open PR in each extra repo, where the pod is treated as the sole owner.resolveExtraReposaccepts plainowner/nameentries andowner/prefix-*globs (resolved per run viagh repo list). Repos the caller cannot read are skipped with a one-line stderr reason instead of aborting the run.pr-status.mjsemits aRepos:scope header and renders extra-repo PRs asowner/repo#<num>(the monorepo keeps bare#<num>) across the active sections, the Excluded section, and JSON output.--mode review/--mode myare unchanged (primary repo only), soqv-pr-mineand the daily-work-update consumer are unaffected.… +N more in <repo>summary, so a busy sole-owner extra repo can't bury the dashboard (--jsonstill carries the full list).gh repo listglob resolution warns when it hits the 1000-repo cap instead of silently missing repos.extraReposspecs must be exactlyowner/name; multi-segment specs (owner/group/name) are now rejected with a warning rather than silently truncated.prRef, so same-numbered PRs in different repos no longer mask each other.🧪 How was it tested?
node .cursor/skills/_lib/pr-skills/pr-status.mjs --pod devops --mode team --authors podagainst the live curated list: scanned the monorepo + 19 reachable extra repos; the 7 unreachableqvac-research-*/qvac-model-toolsrepos were skipped withCould not resolve to a Repositoryreasons and the run continued.tetherto/qvac-workbench(11 excluded PRs) rendered 10 entries +… +1 more in tetherto/qvac-workbench — use --json for the full list.owner/repo#<num>and monorepo PRs stay bare#<num>; theRepos:header lists the primary repo + 19 extra.--mode mystill scans only the primary repo.node --checkclean on the edited scripts; no linter errors.Scope note: the curated
extraReposlist has 26 entries; 7 (qvac-research-*,qvac-model-tools) are currently unreachable for the runner's account (private/no-access or renamed) and auto-activate once reachable.🤖 Regenerated with Cursor (skill:
/qv-devops-pr-create)