ship
Skill25 starsChanged 6 months agoMITView on GitHub
Validate a branch, run quality gates, update documentation and changelog, and open a pull request. Supports GitHub (primary) and Azure DevOps (secondary). Designed for JavaScript/TypeScript projects; quality gate detection requires package.json. Use when the user says "ship", "ship this", "open a PR", "prepare a PR", "send this for review", "let's ship it", or any variation of wanting to finalize work and create a pull request.
- Installs packages
- Commits and pushes
194 other projects use a version of this.
Adopted by
Most recently taken up by
- claudialnathan/skillstheir own version, first seen Nov 15, 2026
- saleem-hadad/skillstheir own version, first seen Nov 15, 2026
- yagizdo/quivertheir own version, first seen Nov 15, 2026
- felipeam86/pipe-skillstheir own version, first seen Nov 15, 2026
- ShipfoxHQ/shipfoxtheir own version, first seen Nov 15, 2026
- wboayue/rust-ibapitheir own version, first seen Nov 9, 2026
Used with
Projects with it also use ios-sync, open-gstack-browser and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
Saqlain-811Skillios-sync
Regenerate the iOS debug bridge against the latest upstream gstack templates. (gstack)
Also in 6 projects that use this
seek888Skillopen-gstack-browser
Launch GStack Browser — AI-controlled Chromium with the sidebar extension baked in. Opens a visible browser window where you can watch every action in real time. The sidebar shows a live activity feed and chat. Anti-bot stealth built in. Use when asked to "open gstack browser", "launch browser", "connect chrome", "open chrome", "real browser", "launch chrome", "side panel", or "control my browser". Voice triggers (speech-to-text aliases): "show me the browser".
Also in 10 projects that use this
ayudaySkillsetup-deploy
Configure deployment settings for /land-and-deploy. Detects your deploy platform (Fly.io, Render, Vercel, Netlify, Heroku, GitHub Actions, custom), production URL, health check endpoints, and deploy status commands. Writes the configuration to CLAUDE.md so all future deploys are automatic. Use when: "setup deploy", "configure deployment", "set up land-and-deploy", "how do I deploy with gstack", "add deploy config".
Also in 19 projects that use this
ShreyRaviSkilllanding-report
Read-only queue dashboard for workspace-aware ship. Shows which VERSION slots are currently claimed by open PRs, which sibling Conductor workspaces have WIP work likely to ship soon, and what slot /ship would pick next. No mutations — just a snapshot. Use when asked to "landing report", "what's in the queue", "show me open PRs", or "which version do I claim next". (gstack)
Also in 9 projects that use this
zebbernSkilldebug-fix
Find and fix a bug or issue — from any source (GitHub issue, error message, user report, or observed behavior)
Also in 4 projects that use this
ramybarsoumSkilldocument-release
Post-ship documentation update. Reads all project docs, cross-references the diff, updates README/ARCHITECTURE/CONTRIBUTING/CLAUDE.md to match what shipped, polishes CHANGELOG voice, cleans up TODOS, and optionally bumps VERSION. Use when asked to "update the docs", "sync documentation", or "post-ship docs". Proactively suggest after a PR is merged or code is shipped.
Also in 23 projects that use this
Other versions194 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 194
- garrytan/gstack★ 141ksame name
- rtk-ai/rtk★ 86ksame name
- simstudioai/sim★ 30ksame name
- millionco/react-doctor★ 15ksame name
- BuilderIO/agent-native★ 7.6ksame name
- nightly-labs/openbot★ 6.3ksame name
- fallow-rs/fallow★ 5.3ksame name
- puncsky/system-design-and-architecture★ 3.6ksame name
- plugin87/ux-ui-agent-skills★ 3.1ksame name
- ShenSeanChen/waku-agent★ 2ksame name
184 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository13 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- content-wireframeSkill
- new-projectSkill
- orientSkill
- promote-skillSkill
- review-prSkill
- squash-branchSkill
- release-notesSkill
- writing-ticketsSkill
- hostSkill
- advisorSkill
- sounding-boardSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
35 rules. 0 are common, 13 are distinctive, and 22 are very specific to this project.
0
Common
Most of the 180 edited versions we read keep these.
13
Distinctive
This author's own choices. Worth a look.
22
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- could be automatic: a setting could enforce it
- Very specific: line 46
macOS / Linux: run directly — e.g. bash "$SCRIPTS/preflight.sh".
- Very specific: line 47
Windows (PowerShell): use Git Bash, not WSL bash.exe (which cannot see Windows-installed tools).
- Very specific: line 55
If bin\bash.exe does not exist under the git root, stop and tell the user to install Git for Windows (bundles Git Bash).
- Very specific: line 61
If the repository has its own ship skill at the repository root (.agents/skills/ship/SKILL.md or .cursor/skills/ship/SKILL.md), follow that …
- Very specific: line 62
If origin is not a GitHub remote, do not use gh.
- Distinctive: line 66
Verify that all required CLI tools are installed and authenticated before proceeding.
- Distinctive: line 81
If any core tool is missing, stop and tell the user which tool(s) need to be installed.
- Very specific: line 95
If the remote is ambiguous and both hosts are plausible, verify auth for whichever provider you will use in Step 6.
- Very specific: line 107
Use the provider field (and pr.provider when a PR exists) in Step 6 to pick the correct create/update commands.
- Very specific: line 113
Run $SCRIPTS/preflight.sh and parse the JSON output.
- Very specific: line 115
If uncommittedChanges is true, stop and ask the user to commit or stash.
- Very specific: line 116
If onDefaultBranch is true, create a new branch:
- Very specific: line 121
If rebaseStatus is "conflicts", stop and report the conflicting files from conflictFiles.
- Very specific: line 122
If rebaseStatus is "clean" or "skipped", proceed.
- Very specific: line 123
If commitsAhead is 0, stop — there is nothing to ship.
- Very specific: line 139
Run $SCRIPTS/detect-gates.sh and parse the JSON output.
- Very specific: line 141
If noPackageJson is true, warn the user that no quality gates were detected because this does not appear to be a JavaScript/TypeScript …
- Very specific: line 145
Run each gate's command in order (the array is already sorted: lint → typecheck → test → build).
- Distinctive: line 147
If a fix requires user input or judgment, stop and report the failure with context.
- Very specific: line 148
If gates is empty, skip this step and note it in the final report.
- Distinctive: line 163
Read each file first to understand its current structure and voice.
- Distinctive: line 164
Only update sections affected by the branch changes.
- Distinctive: line 166
Write for a developer audience.
- Distinctive: line 167
Use active voice and present tense.
- Distinctive: line 169
Do not document internal implementation details, private functions, or architecture decisions that are only relevant to the current change …
- Very specific: line 171
Use code formatting for commands, variables, and filenames.
- Distinctive: line 172
If neither file needs changes (e.g.
- Distinctive: line 173
Commit documentation updates to the current branch before proceeding.
- Very specific: line 177
Run $SCRIPTS/changelog-bump.sh info to get the current version and changelog format.
- Distinctive: line 194
Use past tense ("Added", "Fixed", "Improved").
- Distinctive: line 216
Windows (PowerShell): do not pass the JSON as a direct argument.
- Very specific: line 230
If the script output has "updated": true, it patched an existing draft entry (from a previous interrupted run) instead of creating a new …
- Very specific: line 241
Use the provider, prExists, and pr fields from the Step 2 preflight output.
- Distinctive: line 244
Create or update the PR using the detected provider:
- Very specific: line 248
Use this section only when origin is a GitHub remote (github.com or git@github:).
“Common” is measured: kept by at least 6 in 10 of the 180 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Ship
Pre-flight checklist that validates the branch, runs quality gates, updates documentation and changelog, and opens a pull request.
GitHub is the primary host; Azure DevOps is secondary. The scripts detect the provider from the git remote (github.com vs dev.azure.com). If origin is not a GitHub remote, do not use gh — even when the remote is ambiguous or a script falls back to GitHub.
Workflow overview
- [ ] Step 0: Defer to the repository (repo ship skill; skip gh if origin is not GitHub)
- [ ] Step 1: Verify CLI tools and host auth (GitHub or Azure DevOps)
- [ ] Step 2: Preflight (rebase, branch, existing PR, provider)
- [ ] Step 3: Quality gates (lint → typecheck → test → build)
- [ ] Step 4: Documentation (README.md, AGENTS.md)
- [ ] Step 5: Changelog bump
- [ ] Step 6: Push and open or update PR
- [ ] Step 7: Post-flight reportScript path placeholder
$SCRIPTS is a placeholder for the absolute path to the scripts/ directory next to this file — not a predefined shell or PowerShell variable. Resolve it before running any command:
- bash/zsh:
SCRIPTS=/abs/path/to/scripts - PowerShell:
$SCRIPTS = 'C:\abs\path\to\scripts'
Running helper scripts (cross-platform)
The helper scripts (preflight.sh, detect-gates.sh, changelog-bump.sh, backfill-pr.sh) are bash and require bash, jq, node, and git on PATH. PR operations also need gh (GitHub) and/or az (Azure DevOps), depending on the repo remote. If origin is not a GitHub remote, do not use gh.
- macOS / Linux: run directly — e.g.
bash "$SCRIPTS/preflight.sh". - Windows (PowerShell): use Git Bash, not WSL
bash.exe(which cannot see Windows-installed tools). Discover Git Bash from the git install, then invoke each script through it:
$gitRoot = Split-Path (Split-Path (Get-Command git).Source) # e.g. C:\Program Files\Git
$bash = Join-Path $gitRoot 'bin\bash.exe'
& $bash "$SCRIPTS/preflight.sh" # repeat per script + argsIf bin\bash.exe does not exist under the git root, stop and tell the user to install Git for Windows (bundles Git Bash).
Throughout the steps below, every $SCRIPTS/<name>.sh reference means run that script using the OS-appropriate invocation above.
Step 0 — Defer to the repository
If the repository has its own ship skill at the repository root (.agents/skills/ship/SKILL.md or .cursor/skills/ship/SKILL.md), follow that skill instead and stop here.
If origin is not a GitHub remote, do not use gh.
Step 1 — Prerequisites
Verify that all required CLI tools are installed and authenticated before proceeding.
Always required:
| Tool | Purpose |
git | Branch ops, commits, push |
jq | JSON parsing in shell scripts |
node | Inline JS for changelog and gates |
Check core tools:
- macOS / Linux (bash/zsh):
command -v git && command -v jq && command -v node - Windows (PowerShell):
'git','jq','node' | ForEach-Object { if (-not (Get-Command $_ -ErrorAction SilentlyContinue)) { "MISSING: $_" } }
If any core tool is missing, stop and tell the user which tool(s) need to be installed.
Host-specific tools — check only the provider that matches the repo (see Provider detection). If origin is not a GitHub remote, do not install, auth-check, or invoke gh.
| Provider | Tool | Install hint |
| GitHub | gh | macOS: brew install gh · cli.github.com |
| Azure DevOps | az | macOS: brew install azure-cli · aka.ms/azcli |
Confirm auth for the detected provider:
- GitHub:
gh auth status— if no active account, instruct the user to rungh auth login. Skip this whenoriginis not a GitHub remote. - Azure DevOps:
az account show(runaz loginif it errors) andaz extension show --name azure-devops(runaz extension add --name azure-devopsif missing).
If the remote is ambiguous and both hosts are plausible, verify auth for whichever provider you will use in Step 6. Prefer GitHub when both are available and origin is a GitHub remote. If origin is not a GitHub remote, do not use gh.
Provider detection
The preflight script sets a top-level provider field ("github" or "azure") by inspecting git remote get-url origin:
| Remote pattern | Provider |
github.com, git@github: | GitHub |
dev.azure.com, visualstudio.com, ssh.dev.azure.com | Azure DevOps |
| Other / unknown | Do not use gh. Try Azure DevOps if plausible; otherwise stop — unsupported host |
Use the provider field (and pr.provider when a PR exists) in Step 6 to pick the correct create/update commands. If origin is not a GitHub remote, do not treat provider as GitHub and do not use gh.
The pr object is normalized across hosts: provider, id, number, title, url. For GitHub, id and number are the same PR number. For Azure DevOps, both are the pull request ID.
Step 2 — Preflight
Run $SCRIPTS/preflight.sh and parse the JSON output. This fetches the default branch, rebases, checks for uncommitted changes, counts commits ahead, detects the provider, and checks for an existing PR — all in one call.
- If
uncommittedChangesistrue, stop and ask the user to commit or stash. - If
onDefaultBranchistrue, create a new branch:- Analyze the committed changes to determine the type of work.
- Pick the appropriate prefix from the table below.
- Generate a short, descriptive slug from the changes (e.g.
feature/add-team-cadence-grid). - Run
git checkout -b <prefix>/<slug>.
- If
rebaseStatusis"conflicts", stop and report the conflicting files fromconflictFiles. Do not attempt to resolve merge conflicts automatically. - If
rebaseStatusis"clean"or"skipped", proceed. - If
commitsAheadis0, stop — there is nothing to ship.
Branch prefixes:
| Prefix | Use when |
feature/ | New functionality or capabilities |
fix/ | Bug fixes |
chore/ | Maintenance, dependency updates, config changes |
refactor/ | Code restructuring with no behavior change |
docs/ | Documentation-only changes |
test/ | Adding or updating tests with no production code changes |
perf/ | Performance improvements |
Step 3 — Quality gates
Run $SCRIPTS/detect-gates.sh and parse the JSON output. The gates array contains each detected gate's name and command.
- If
noPackageJsonistrue, warn the user that no quality gates were detected because this does not appear to be a JavaScript/TypeScript project. Ask if they want to proceed without gates or provide manual commands to run.
Execution rules:
- Run each gate's
commandin order (the array is already sorted: lint → typecheck → test → build). - On failure, attempt to fix the issues and re-run the failing gate.
- If a fix requires user input or judgment, stop and report the failure with context.
- If
gatesis empty, skip this step and note it in the final report.
Step 4 — Documentation
Review the changes on the branch (git diff <default-branch>..HEAD) and update project documentation to reflect anything new, changed, or removed.
Files to check:
| File | Update when |
README.md | New features, changed setup steps, new scripts, new environment variables, updated project structure, or modified user-facing behavior |
AGENTS.md | New or changed conventions, module exports, component APIs, architectural patterns, data flows, or anything an AI agent needs to know when working in the codebase |
Rules:
- Read each file first to understand its current structure and voice.
- Only update sections affected by the branch changes. Do not rewrite unrelated content.
- Match the existing heading hierarchy, formatting, and level of detail.
- Write for a developer audience. Be direct and specific. Avoid marketing language.
- Use active voice and present tense. Keep sentences under 25 words.
- Lead with what the user or developer gains, not how the implementation works.
- Do not document internal implementation details, private functions, or architecture decisions that are only relevant to the current change — those belong in commit messages or PR descriptions, not README/AGENTS.
- Include practical examples (commands, config snippets, code) for any new capability.
- Use
code formattingfor commands, variables, and filenames. Use bold for UI elements. - If neither file needs changes (e.g. a pure refactor with no public-facing impact), skip this step.
- Commit documentation updates to the current branch before proceeding.
Step 5 — Changelog
Run $SCRIPTS/changelog-bump.sh info to get the current version and changelog format.
The script auto-detects the changelog format: it uses CHANGELOG.json if one exists, otherwise defaults to CHANGELOG.md. The format field in the output indicates which format is active.
Decide the bump level based on the changes:
patch— fixes onlyminor— features or improvementsmajor— breaking changes
Build a changes JSON object by analyzing git log <default-branch>..HEAD. Categorize each commit into: features, improvements, fixes, breaking, internal. Only include categories that have entries.
Writing changelog descriptions:
Transform raw commit messages into user-friendly language. The goal is descriptions that a non-technical stakeholder can understand.
- Lead with the user-visible outcome, not the implementation detail.
- Use past tense ("Added", "Fixed", "Improved").
- Strip commit prefixes (
fix:,feat:,chore:) — they are for categorization, not display. - Merge related commits into a single description when they represent one logical change.
- Filter noise: exclude commits that are purely internal (dependency bumps, CI config, test-only changes) unless they are the only changes on the branch — in that case, categorize them under
internal.
| Commit message | Changelog description |
fix: off-by-one in weekly rollup calc | Fixed off-by-one error in weekly rollup |
feat(dashboard): add cadence heatmap grid | Added team cadence heatmap grid to the dashboard |
refactor: extract date utils to shared module | (internal) Refactored date utilities into a shared module |
perf: memoize contributor sort | Improved contributor table rendering performance |
fix: tooltip flickers on hover in Safari | Fixed tooltip flickering on hover in Safari |
Then run (using the OS-appropriate script invocation from Running helper scripts):
$SCRIPTS/changelog-bump.sh bump <level> '<changes-json>'The <changes-json> argument contains double quotes and spaces, which need care:
- macOS / Linux: wrap it in single quotes — e.g.
... bump minor '{"features":["Added X"]}'. - Windows (PowerShell): do not pass the JSON as a direct argument. Windows PowerShell 5.1 strips embedded double quotes when invoking native executables, corrupting the JSON. Pass it via an environment variable and keep all bash quoting inside a temp script file:
# $bash is the Git Bash path from discovery above; re-derive it if not set in this session.
$env:SHIP_CHANGES = $changesJson
$env:SHIP_SCRIPT = "$SCRIPTS/changelog-bump.sh"
$tmp = Join-Path $env:TEMP 'ship-bump.sh'
Set-Content $tmp 'bash "$(cygpath -u "$SHIP_SCRIPT")" bump "$1" "$SHIP_CHANGES"' -Encoding ascii -NoNewline
& $bash $tmp patch # use patch, minor, or major
Remove-Item $tmp; Remove-Item Env:\SHIP_CHANGES, Env:\SHIP_SCRIPTThis delivers the JSON intact even with spaces, commas, and apostrophes. cygpath -u (shipped with Git Bash) normalizes the Windows path for bash, and -NoNewline avoids a trailing CRLF that some Git Bash builds would append to the last argument.
If the script output has "updated": true, it patched an existing draft entry (from a previous interrupted run) instead of creating a new one.
Amend the changelog into the last work commit so it does not create extra commits. The stderr redirect is shell-specific:
- macOS / Linux (bash/zsh):
git add CHANGELOG.json CHANGELOG.md 2>/dev/null; git commit --amend --no-edit - Windows (PowerShell):
git add CHANGELOG.json CHANGELOG.md 2>$null; git commit --amend --no-edit
The redirect suppresses the "pathspec did not match" warning when only one changelog file exists; the amend still succeeds either way.
Step 6 — Open the PR
Use the provider, prExists, and pr fields from the Step 2 preflight output. If origin is not a GitHub remote, do not use gh.
git push -u origin HEAD.- Create or update the PR using the detected provider:
GitHub (provider: "github")
Use this section only when origin is a GitHub remote (github.com or git@github:). If it is not, do not use gh — skip to Azure DevOps when that matches, or stop and report that the host is unsupported.
- New PR:
gh pr createwith a title and body derived from the commit log. - Existing PR:
gh pr edit <pr.number>(orgh pr editon the current branch) to update the title and body. - Body: a
## Summarysection with 1–3 bullet points, and a## Test plansection with a verification checklist.
gh pr create \
--title "Add team cadence heatmap grid" \
--body "$(cat <<'EOF'
## Summary
- Added heatmap grid to the dashboard
- Updated README with setup notes
## Test plan
- [ ] Verify grid renders with sample data
- [ ] Confirm mobile layout
EOF
)"Azure DevOps (provider: "azure")
- New PR:
az repos pr createwith a title and description derived from the commit log. - Existing PR:
az repos pr update --id <pr.id>to update the title and description. - Description: same sections as GitHub. The
--descriptionflag accepts multiple arguments — each becomes a separate line:
az repos pr create \
--source-branch feature/my-change \
--target-branch main \
--title "Add team cadence heatmap grid" \
--description "## Summary" \
--description "- Added heatmap grid to the dashboard" \
--description "- Updated README with setup notes" \
--description "" \
--description "## Test plan" \
--description "- [ ] Verify grid renders with sample data" \
--description "- [ ] Confirm mobile layout"Optional: Run
$SCRIPTS/backfill-pr.shafter creating the PR to add a PR link to the changelog entry. This is not run by default — use it if your team wants PR traceability in the changelog. The script uses the same provider detection as preflight. Iforiginis not a GitHub remote, do not usegh.
Step 7 — Post-flight report
Print a short summary:
- Branch name (and whether it was auto-created)
- Provider (GitHub or Azure DevOps)
- PR URL (and whether it was created or updated)
- Quality gates: which ran and their result (pass / skipped / fixed)
- Changelog version bump (e.g.
0.1.0 → 0.2.0) - Any warnings encountered during the run
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

