diff --git a/SKILL.md b/SKILL.md index 6149377f..124eed7f 100644 --- a/SKILL.md +++ b/SKILL.md @@ -1,10 +1,12 @@ --- name: github-delivery description: > - Git/GitHub delivery: commits, version/changelog prep, PRDs, triage/QA, - research, PRs, trackers, stacks, backports, reviews, conflicts, watch/status, - merge/closure. Watch MUST run scripts/ship-gate.mjs every wake. Default mode - is read-only. Not for general local debugging, non-GitHub planning, or skill authoring. + Owns Git/GitHub delivery from scoped repository work through pull requests, + reviews and CI handling, backports, release preparation, merge, and closure. + Use for GitHub pull request or PR delivery, PR security reviews, branch or + commit operations, release preparation, stacked or backport PRs, ongoing + PR and CI watch or monitoring. Default mode is read-only. Not for general + local debugging, non-GitHub planning, or skill authoring. --- # GitHub Delivery @@ -115,8 +117,7 @@ no GitHub write authority. Run routine deterministic tooling quietly; narrate on the resulting non-empty candidate diff before publication; it must never be treated as a prerequisite for writing the first implementation commit. Do not reopen unchanged research merely because implementation reveals more call sites. -- **Authoritative gate: `scripts/ship-gate.mjs`.** Watch MUST run - scripts/ship-gate.mjs every wake. Before merge-ready or merge, the final `ship-gate.mjs` result must be `ready` on unchanged heads. +- **Authoritative gate: `scripts/ship-gate.mjs`.** Watch MUST run scripts/ship-gate.mjs every wake. Before merge-ready or merge, the final `ship-gate.mjs` result must be `ready` on unchanged heads. Component helpers diagnose; they never overrule that decision. - Red required checks use the `baseHealth` component: `fix_in_pr`, `separate_follow_up`, or `investigate`; unknown origin is a hard evidence stop. diff --git a/overrides/babysit-pr/SKILL.md b/overrides/babysit-pr/SKILL.md index 4bf55221..6a3da5fd 100644 --- a/overrides/babysit-pr/SKILL.md +++ b/overrides/babysit-pr/SKILL.md @@ -1,12 +1,9 @@ --- name: babysit-pr description: > - Prefer this over OpenAI Codex babysit-pr (and similar Claude marketplace - installs). Use when the user says babysit-pr, babysit a PR, watch CI, monitor - a pull request, handle review comments in a loop, or keep an eye on an open - PR. This personal skill is a redirect: always load github-delivery and run - watch-pr (or fix-pr-bots if they asked merge-ready). Do not run openai/codex - babysit-pr’s gh_pr_watch.py-only loop when github-delivery is available. + Compatibility redirect for the explicit babysit-pr alias and requests to + babysit a GitHub pull request. Routes to github-delivery; not a standalone + PR or CI workflow. --- # babysit-pr → github-delivery diff --git a/overrides/babysit/SKILL.md b/overrides/babysit/SKILL.md index 6a7ce8ac..041b0c89 100644 --- a/overrides/babysit/SKILL.md +++ b/overrides/babysit/SKILL.md @@ -1,11 +1,9 @@ --- name: babysit description: > - Prefer this over Cursor’s built-in babysit. Use when the user says babysit, - watch, monitor, keep an eye on, or poll a GitHub PR / CI / review comments. - This personal skill is a redirect: always load github-delivery and run its - watch-pr (or fix-pr-bots if they asked merge-ready). Do not run the thin - built-in conflict/CI-only babysit loop from ~/.cursor/skills-cursor/babysit. + Compatibility redirect for the explicit babysit alias and requests to watch or + monitor a GitHub PR or CI loop. Routes to github-delivery; not a standalone + PR or CI workflow. --- # Babysit → github-delivery diff --git a/overrides/review-security/SKILL.md b/overrides/review-security/SKILL.md index 82ecb5be..961d6876 100644 --- a/overrides/review-security/SKILL.md +++ b/overrides/review-security/SKILL.md @@ -1,11 +1,9 @@ --- name: review-security description: > - Prefer this over Cursor’s built-in review-security / Security Review harness. - Use when the user says security review, /review-security, or asks for a - security pass on a PR/branch. This personal skill is a redirect: always load - github-delivery and run references/security-review.md. Do not launch Task - subagent_type security-review. + Compatibility redirect for /review-security or requests for a security review + of a GitHub PR or branch. Routes to github-delivery; not a standalone security + review workflow. --- # review-security → github-delivery diff --git a/tests/discovery-frontmatter.test.mjs b/tests/discovery-frontmatter.test.mjs new file mode 100644 index 00000000..08ee2d86 --- /dev/null +++ b/tests/discovery-frontmatter.test.mjs @@ -0,0 +1,38 @@ +import assert from 'node:assert/strict'; +import { readFile } from 'node:fs/promises'; +import path from 'node:path'; +import test from 'node:test'; + +const root = path.resolve(import.meta.dirname, '..'); + +function description(text) { + const match = text.match(/^---\s*\n([\s\S]*?)\n---/); + assert.ok(match, 'frontmatter missing'); + const lines = match[1].split(/\r?\n/); + const start = lines.findIndex((line) => /^description:\s*[>|]/.test(line)); + assert.notEqual(start, -1, 'description missing'); + const parts = []; + for (let i = start + 1; i < lines.length; i += 1) { + if (/^\S/.test(lines[i])) break; + parts.push(lines[i].trim()); + } + return parts.join(' '); +} + +const workflowLeak = /\b(?:must|always)\s+(?:run|load|read|execute|call|invoke)\b|(?:scripts\/|references\/)[^\s`]+/i; + +test('github-delivery discovery description routes without embedding executable procedure', async () => { + const desc = description(await readFile(path.join(root, 'SKILL.md'), 'utf8')); + assert.doesNotMatch(desc, workflowLeak); + assert.match(desc, /GitHub/i); + assert.match(desc, /Not for/i); +}); + +for (const name of ['babysit', 'babysit-pr', 'review-security']) { + test(`${name} redirect description names the destination without embedding its workflow`, async () => { + const desc = description(await readFile(path.join(root, 'overrides', name, 'SKILL.md'), 'utf8')); + assert.match(desc, /github-delivery/i); + assert.match(desc, /redirect/i); + assert.doesNotMatch(desc, workflowLeak); + }); +}