ci: gate apps/** and catalog/skill-packs.json#752
Merged
Conversation
Two previously ungated surfaces: - apps/** had zero CI despite Dependabot opening monthly grouped PRs against dashboard, mcp-server, and webhook — nothing ever verified those bumps left an app compiling. New ci-apps workflow: dashboard (typecheck + its 156 unit tests + `next build`, kept separate per the documented TS7/Next16 incompatibility), cli (typecheck, borrowing the dashboard's TypeScript since it has none of its own), mcp-server (build), webhook (syntax check + `wrangler deploy --dry-run`, no Cloudflare creds needed). Also added the missing apps/cli entry to dependabot.yml. - catalog/skill-packs.json is the one file routinely hand-edited by outside contributors (every community pack listing), with nothing validating it. New scripts/validate-skill-packs.mjs + ci-skill-packs gate: registry shape (JSON, owner/repo format, non-empty unique skills[], trust_level enum, capabilities against the locked taxonomy read out of bin/install-skill-pack, secrets_required shape) and README parity (every entry has a matching table row and vice versa, skill counts agree, --path flags agree, handles monorepos publishing multiple packs, checks the "N community skill packs" counter). Also catches a self-declared trust_level: trusted that isn't backed by trusted-sources.txt, which is what the installer actually checks. 30 test cases in scripts/tests/test_validate_skill_packs.sh, wired into ci-tests. Docs (CONTRIBUTING.md, PULL_REQUEST_TEMPLATE.md, community-skill-packs.md, apps/cli/README.md) updated to match.
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.
Summary
Two previously ungated surfaces in this repo:
apps/**had zero CI. Dependabot opens grouped monthly npm PRs againstapps/dashboard,apps/mcp-server, andapps/webhook(.github/dependabot.yml) — nothing has ever verified those bumps leave an app compiling. Newci-appsworkflow, one job per app so a red X names the broken surface:npm run typecheck), the 156 existing unit tests, andnext buildas three separate steps. Kept separate on purpose: the TS7/Next16 pin comment independabot.ymlrecords a real breakage wheretsc --noEmitpassed butnext buildcrashed.tsconfig.jsoncompiles../dashboard/lib/**/*.tsand pointstypeRootsthere (no TypeScript dep of its own), so the job installs the dashboard first.apps/cli/README.mddocuments the same.npm run build(itsdist/index.jsis the publishedbin, not just a type-check).node --check+wrangler deploy --dry-run(bundles the Worker, no Cloudflare credentials needed, so it's fork-PR-safe).Also added the missing
apps/clientry todependabot.yml— it was the only app with no dependency updates configured at all.catalog/skill-packs.jsonhad no validation. It's the one file in the repo routinely hand-edited by outside contributors — every community pack listing PR touches it directly, per the publishing checklist indocs/community-skill-packs.md. Newscripts/validate-skill-packs.mjs+ci-skill-packsgate checks:repoas strictowner/repo, non-empty uniqueskills[](kebab-case slugs),trust_levelenum, capabilities restricted to the locked taxonomy — read directly out ofALLOWED_CAPABILITIESinbin/install-skill-packso the two can never drift (same spirit asci-capabilities-parity),secrets_requiredasUPPER_SNAKEnames.--pathflags agree with the registry'spath(a mismatch here hands readers a copy-paste command that installs the wrong subtree), handles a monorepo publishing multiple packs from different subdirectories, and checks the "N community skill packs" Proof-of-work counter.trust_level: trustedthat isn't inskills/security/trusted-sources.txtis rejected —--listprints its badge from the registry, but the installer decides the real scan bypass from the trusted-sources file, so an unbacked claim would advertise "security scan skipped" without ever earning it.Confirmed the gate catches a live case: open PR #723's current diff would fail it — the README's pack counter says 10 while the registry it adds would total 13.
30 test cases added in
scripts/tests/test_validate_skill_packs.sh, wired intoci-tests.ymlalongside the existing suites.Docs updated to match:
.github/CONTRIBUTING.mdgate table,.github/PULL_REQUEST_TEMPLATE.mdcheckboxes,docs/community-skill-packs.md,apps/cli/README.md.Test plan
node scripts/validate-skill-packs.mjspasses against the committed registrybash scripts/tests/test_validate_skill_packs.sh— 30/30 passgh api) with the correct errorapps/dashboard:npm run typecheck,npm test(156/156),npm run buildall passapps/cli:npm run typecheckpasses (after installingapps/dashboard)apps/mcp-server:npm run typecheckandnpm run buildpassapps/webhook:node --check src/worker.jsandwrangler deploy --dry-runpassscripts/tests/*.sh/*.pysuites still pass (pre-existingtest_cron_due.shfailure is BSD-vs-GNUdateon macOS, unrelated to this change, passes in CI's Ubuntu runners)