Skip to content
Back to skills

Bobby Ship

ASecurity

Ship Skill: Creates PRs from feature branches and waits for CI. Does NOT auto-merge — user merges manually. MANDATORY TRIGGERS: ship, deploy, release, merge, create PR, push, go live, launch.

  • 6 stars
  • 0 votes
  • 0 copies
  • 5 views
  • Added October 26, 2026
toolsgogit

Security analysis

A100/100

Pro scans all 3 files and shows the line behind each finding

Scanned October 26, 2026

npx -y skills add ccevans/bobbycode --skill bobby-ship --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Bobby Ship?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Bobby Ship
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/ccevans-bobby-ship/badge)](https://www.skillsdirectory.com/skills/ccevans-bobby-ship)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: ship-pr
description: "Ship Skill: Creates PRs from feature branches and waits for CI. Does NOT auto-merge — user merges manually. MANDATORY TRIGGERS: ship, deploy, release, merge, create PR, push, go live, launch."
argument-hint: "<ticket IDs to ship>"
---

# Bobby Ship Skill

> Creates PRs from feature branches and waits for CI. Does **not** auto-merge — the user merges PRs manually.

## Before Starting

1. **Check learnings** — Read `.claude/skills/bobby-ship/learnings.md` + `.claude/skills/bobby-ship/learnings.local.md`
2. **Check the queue** — Run `bobby ticket list shipping` to see what's ready

## Pre-Flight Checks

### 1. Shipping Count Sanity Check

Run `bobby ticket list shipping` and count the tickets.

**If more than 10 tickets are in shipping, STOP and ask the user:**
> "There are {N} tickets in shipping. Is this a batch release or were these bulk-migrated? Should I proceed with all of them?"

Do NOT proceed until the user confirms. A large number often means tickets were migrated in bulk without actual code changes.

### 2. Uncommitted Changes Gate

Run `git status --short` in each repo. If there are uncommitted source code changes (modified/new `.js`, `.ts`, `.rb`, `.py`, `.css`, `.html`, `.json`, `.yml`, etc.):

**STOP — do not ship.** Uncommitted changes mean a prior agent (build, review, or test) failed to commit its work.

For each affected ticket:
1. `bobby ticket move {ID} build`
2. `bobby ticket comment {ID} --by bobby-ship "Returned to build: uncommitted changes detected. Files: {list}. Build agent must commit all work before shipping."`

Then **abort the ship process**. The workflow will re-run build → review → test → ship with proper commits.

**Ignore non-source artifacts** (screenshots, CSVs, mockups, `.skill` files) — these are not blockers.

### 3. Git Author Email Check

Run `git config user.email`. If the result:
- Is empty, ends with `.local`, ends with `.internal`, or doesn't contain `@`

**STOP — do not ship.** The commit author email is invalid and will be rejected by deploy platforms (Vercel, GitHub Actions, etc.).

Tell the user:
> "Your git email is set to `{email}` which will block deployments. Run `git config user.email 'you@example.com'` with your GitHub email, then re-run ship."

### 4. Branch Check

Verify you're on a feature branch (not main/master). If on main, STOP — there's nothing to PR.

### 5. Rebase onto Main

Before pushing, rebase each repo's feature branch onto the latest main — so the PR contains only the feature's changes and CI tests against the latest code:

```
git fetch origin
git rebase origin/main
```

If there are conflicts, resolve them before continuing. PRs must be up-to-date with main to avoid merge conflicts.


## Ship Process

### Run Tests & Lint


1. All tests pass: `npm test`
2. Lint clean: `npm run lint`


### Rebase & Create Pull Request

1. Rebase: `git fetch origin && git rebase origin/main` — resolve any conflicts
2. Push the branch: `git push -u origin HEAD`
3. Create PR: `gh pr create --title "..." --body "..."`
   - Title: concise summary of what's shipping
   - Body: list the tickets being shipped with brief descriptions
4. Wait for CI to pass
5. **Do NOT merge.** Report the PR URL to the user.



## After PR Creation

For each ticket in `shipping` stage:
1. `bobby ticket comment {ID} --by bobby-ship "PR created: #{url}. Awaiting manual merge."`

Report all PR URLs to the user so they can review and merge manually.

**Do NOT run `gh pr merge` or any merge command.** The user decides when to merge.

## Completing Ship

Once all PRs are created and CI is passing:

1. For each ticket in `shipping` stage:
   - `bobby ticket move {ID} done`
   - Output `<bobby:done ticket="{ID}" stage="done" />`
2. Report all PR URLs to the user so they can review and merge at their discretion

**Important:** Moving to `done` means the code is PR'd and CI-green. The user merges PRs on their own schedule.

3. Run `bobby sync` to commit ticket state changes to the umbrella repo

## If Something Goes Wrong

- If CI fails: fix and re-push
- If deployment fails: investigate, don't retry blindly
- Document issues: `bobby learn bobby-ship "pattern" "description"`

---

## Project overrides

If `.claude/skills/bobby-ship/SKILL.local.md` exists, read it and follow it. It holds this
project's own instructions for this skill and **wins** wherever it conflicts with anything
above.

`SKILL.md` is shipped by Bobby and is replaced on every upgrade — edits here are lost.
`SKILL.local.md` is yours and is never overwritten.

Files in this skill

  • SKILL.md4.5 KB
  • learnings.local.md478 B
  • learnings.md381 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.