kentcdodds/kcd-skills · Archived

ship-pr

Babysit a PR. Iterate with AI reviewers and CI. Get it ready and maybe merge. Send summary message.

First seen Jul 10, 2026

Installation

$ npx skills add kentcdodds/kcd-skills --skill ship-pr

Stronger alternatives

This repository is archived — consider an actively maintained alternative.

Similar popular skills

Related neighbors and high-traction skills in the same topics — useful to compare before installing.

Also in this package

Other skills from kentcdodds/kcd-skills.

npx skills add kentcdodds/kcd-skills

Browse all from kentcdodds/kcd-skills

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Not declared
Cursor Declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Repository health

Stars 41
License LICENSE
Default branch main
Open issues 1
Status Archived

Skill metadata

Parsed from SKILL.md frontmatter.

Declared agents cursor

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 3,095 B
  • docs SUMMARY.md 114 B

History

  1. First seen on skills.sh
  2. First recorded snapshot · 16 installs

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

  1. Mark ready — kody:@kentcdodds/github/pr/set-review-status with

{ prUrl, status: 'ready' }, or { owner, repo, prNumber, status: 'ready' }

  1. Wait for CI — gh pr checks (compose loop-on-ci, fix-ci)
  2. Fix failures; address valid AI-reviewer feedback (ignore insignificant nits /

already-fixed / wrong); check mergability with base branch and rebase if needed

  1. Green and no valid feedback left → break
  2. 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'
	})
}