SKILL.md
Ship PR
AI reviewers
Prefer Cursor Bugbot. Never comment bugbot run or cursor review yourself (kody-bot cannot trigger BugBot). Trigger with kody:@kentcdodds/bugbot using { prUrl } or { owner, repo, prNumber }. Do not pass a GitHub account.
import triggerBugbot from 'kody:@kentcdodds/bugbot'
await triggerBugbot({ prUrl })
Loop
- Mark ready —
kody:@kentcdodds/github/pr/set-review-statuswith
{ prUrl, status: 'ready' }, or { owner, repo, prNumber, status: 'ready' }
- Wait for CI —
gh pr checks(composeloop-on-ci,fix-ci) - Fix failures; address valid AI-reviewer feedback (ignore insignificant nits /
already-fixed / wrong); check mergability with base branch and rebase if needed
- Green and no valid feedback left → break
- Push → repeat
Merge and Deploy if requested or the change is low risk
Squash and merge PR as Kody with kody:@kentcdodds/github/pr/merge using { prUrl, mergeMethod: 'squash' } (or { owner, repo, prNumber, ... }; optional commitTitle), watch CI deploy. Relevant links for the discord message include: agent, PR, CI job, and relevant deployment page(s).
Other useful exports on the same package: pr/get-checks for check-run status without gh, and request / graphql (kody:@kentcdodds/github/request, kody:@kentcdodds/github/graphql) for one-off authenticated GitHub calls.
Done → Discord
Always summarize (merged or not) by calling kody:@kentcdodds/discord/send-shipped-pr with structured fields. Do not use raw post-message and do not compute or guess token cost — the export fetches the billed Cursor Cloud Agent usage and formats the cost line.
agentId (required):
- In a Cursor Cloud Agent VM, read it from the metadata socket: curl -fsS
--unix-socket "${CURSORAGENTSOCKET:-/run/cursor/api.sock}" http://cursor-agent/v1/meta-data/agent/id
- Otherwise pass the
bc-id from the agent URL you were launched as
(https://cursor.com/agents/{id}).
title: a human headline of the change, not ship owner/repo#N (repo and PR already have links). Example: OpenAPI spec fetches now count against daily quota.
difficulty (always set): 'Easy' | 'Medium' | 'Hard'. Distinct from merge risk. Easy = small/localized; Medium = several files or real behavior change; Hard = architecture, migrations, subtle correctness, or wide blast radius.
import sendShippedPr from 'kody:@kentcdodds/discord/send-shipped-pr'
export default async function main() {
return sendShippedPr({
agentId, // bc- id from the metadata socket or launch URL
title: 'OpenAPI spec fetches now count against daily quota',
difficulty: 'Easy', // or 'Medium' | 'Hard'
summary: 'What shipped / parked / blocked and why.',
prUrl: 'https://github.com/owner/repo/pull/1',
repo: 'owner/repo',
extras: ['CI green', 'preview verified'],
status: 'Shipped', // or 'Parked' | 'Blocked'
})
}