From cam-fleet-ops
Audit all repos in the user's GitHub fleet for CI Build and Lint workflow health. Categorizes failures into billing-cap (spending limit), dependabot-PR, cancelled-superseded, and real-source-error buckets. Use as the first step in any "fix all known issues" task — it gives a precise inventory of what's actually broken vs what's just noise. Filters by default-branch and push/schedule events to ignore PR branches.
How this skill is triggered — by the user, by Claude, or both
Slash command
/cam-fleet-ops:fleet-ci-auditThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> Use this as the **first step** of any fleet cleanup. The output is a precise table of what's broken, what's Dependabot noise, and what's waiting for the billing cap to reset.
Use this as the first step of any fleet cleanup. The output is a precise table of what's broken, what's Dependabot noise, and what's waiting for the billing cap to reset.
The full-fleet audit is what the user means when they say "fix all known issues" or "make the fleet green." Without this skill, the agent checks the latest run per repo, sees a wall of red, and starts debugging code that's already correct. The audit separates the real signal from the noise.
Every non-success conclusion in the fleet's CI/lint history falls into one of four categories. The order matters — check them in this order.
billing_cap — Spending limit needs to be increasedThe job was not started because recent account payments have failed or your spending limit needs to be increased.# Detect: search the run view output for the spending-limit string
gh run view <id> --repo camster91/<repo> | grep -i "spending limit"
dependabot_pr — Auto-PR failure on a non-main branchdependabot/npm_and_yarn/development-dependencies-<hash>. Event type is pull_request.# Detect: filter by event type and head_branch pattern
gh run list --repo camster91/<repo> --limit 20 \
--json event,headBranch,conclusion,createdAt \
| jq '.[] | select(.event == "pull_request" and (.headBranch | startswith("dependabot/")))'
cancelled — Superseded by a newer pushconclusion: cancelled with status: completed. The run was in-flight when a newer commit was pushed.concurrency: ci-build-${{ github.ref }} + cancel-in-progress: true is the default pattern. Pushing twice in quick succession cancels the first.completed/success or a real failure.real_source_error — Actual code problem on mainevent: push on the default branch, conclusion is failure, the error message describes a real code or config issue.prisma generate step missing from CIprocessFile used before declaration (TDZ error in TypeScript)gh repo list --limit 200 --no-archived --json name -q . | jq -r '.[]' | sort
Filter to active repos (not archived, not deleted, not just-skeleton).
For each repo, get the latest push/schedule run on the default branch. Filter out pull_request events. Filter out cancelled. Compare to the last successful push run on the same branch.
# Pseudocode
for repo in active_repos:
branch = gh_api(f"/repos/{repo}").default_branch
runs = gh_run_list(repo, branch=branch, limit=5)
for run in runs:
if run.event in ("push", "schedule"):
if run.conclusion == "success":
healthy.add(repo)
break
else:
# Check for billing cap
view = gh_run_view(run.id, repo)
if "spending limit" in view:
billing_cap.add(repo)
else:
real_issues.add((repo, run))
break
Print a table:
| Category | Count | Repos |
|----------|-------|-------|
| Healthy | 39 | <list> |
| billing_cap | 16 | <list> |
| dependabot_pr | (do not count — PR noise) | <do not enumerate> |
| cancelled | (do not count — superseded) | <do not enumerate> |
| real_source_error | 1 | <list with link to log> |
For each "real_source_error" repo, fetch the log, identify the file, and fix it. For each "billing_cap" repo, document the dependency and tell the user.
The audit result is a Telegram-friendly markdown report:
**Fleet audit: 59 active repos**
- **39 healthy** (CI Build + Lint green on default branch)
- **16 billing cap** (waiting for user to increase GitHub Pro spending limit)
- **4 real source errors** (with files to fix)
- `contraction-tracker`: TDZ error in `useContractions.ts` (line 47, uses `processFile` before declaration)
- `markup-clone`: Prisma 5.22 still installed (lockfile out of sync)
- ... etc.
The 16 billing-cap repos will all turn green after the cap resets. Nothing for me to do.
spending limit annotation is on the run, not the job — you need gh run view not gh run view <job-id> to see it.failure summaries — the run might be cancelled at the workflow level but the conclusion is still "failure" because cancellation is a failure state from the workflow's perspective. Always check status AND conclusion.Combine the audit (programmatic, fast) with manual verification of the source errors (one at a time, with vision checks when UI is involved). Don't try to "fix all" without categorizing first — you'll waste hours debugging code that's already correct, or chasing a Dependabot branch that the user doesn't care about.
eslint-flat-config-upgrade — When the audit finds repos with .eslintrc.* files, this is the next step. The audit tells you which repos need it; this skill tells you how to do the migration.prisma-fleet-migration — When the audit finds Prisma CLI Version 5.22.0 errors, the migration is the fix. Pair with this skill.dependabot-ops — When the audit finds Dependabot isn't enabled on a repo, this is how to enable it.spending-limit-detector — When the audit's billing-cap category is bigger than expected, this skill has more detail on detecting it.Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
npx claudepluginhub camster91/cam-fleet-bundle --plugin cam-fleet-ops