Skip to content
Merged
13 changes: 7 additions & 6 deletions SKILL.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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.
Expand Down
9 changes: 3 additions & 6 deletions overrides/babysit-pr/SKILL.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
8 changes: 3 additions & 5 deletions overrides/babysit/SKILL.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
8 changes: 3 additions & 5 deletions overrides/review-security/SKILL.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
38 changes: 38 additions & 0 deletions tests/discovery-frontmatter.test.mjs
Original file line number Diff line number Diff line change
@@ -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);
});
}
Loading