Mole CLI Release Flow
tw93/Mole
Runbook for assessing and executing a Mole CLI release: distribution channels, pre-flight checks, capital-V tags, build artifacts and the handoff to curated release notes.
A skill your agent uses when the user is done editing and wants to ship the current branch via a pull request — phrases like "open a PR", "ship it", "ship this", "submit the PR", "let's send it"…
The automated check flagged lines worth reading first. See the safety section below.
$ npx skills add openbootdotdev/openboot --skill ship-pr -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install openbootdotdev/openboot ship-pr --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/openbootdotdev/openboot.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/ship-pr .claude/skills/ship-pr && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "ship-pr" agent skill from https://github.com/openbootdotdev/openboot/tree/main/.agents/skills/ship-pr into .claude/skills/ship-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ship-pr", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/openbootdotdev/openboot/tree/main/.agents/skills/ship-prType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add openbootdotdev/openboot --skill ship-pr -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install openbootdotdev/openboot ship-pr --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openbootdotdev/openboot.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/ship-pr .agents/skills/ship-pr && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ship-pr" agent skill from https://github.com/openbootdotdev/openboot/tree/main/.agents/skills/ship-pr into .agents/skills/ship-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ship-pr", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add openbootdotdev/openboot --skill ship-pr -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install openbootdotdev/openboot ship-pr --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openbootdotdev/openboot.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/ship-pr .cursor/skills/ship-pr && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "ship-pr" agent skill from https://github.com/openbootdotdev/openboot/tree/main/.agents/skills/ship-pr into .cursor/skills/ship-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ship-pr", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/openbootdotdev/openboot.git --path .agents/skills/ship-pr--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add openbootdotdev/openboot --skill ship-pr -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install openbootdotdev/openboot ship-pr --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openbootdotdev/openboot.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/ship-pr .gemini/skills/ship-pr && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "ship-pr" agent skill from https://github.com/openbootdotdev/openboot/tree/main/.agents/skills/ship-pr into .gemini/skills/ship-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ship-pr", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install openbootdotdev/openboot ship-prInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add openbootdotdev/openboot --skill ship-pr -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/openbootdotdev/openboot.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/ship-pr .github/skills/ship-pr && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "ship-pr" agent skill from https://github.com/openbootdotdev/openboot/tree/main/.agents/skills/ship-pr into .github/skills/ship-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ship-pr", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add openbootdotdev/openboot --skill ship-pr -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install openbootdotdev/openboot ship-pr --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openbootdotdev/openboot.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/ship-pr .opencode/skills/ship-pr && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "ship-pr" agent skill from https://github.com/openbootdotdev/openboot/tree/main/.agents/skills/ship-pr into .opencode/skills/ship-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ship-pr", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
ship-prA skill your agent uses when the user is done editing and wants to ship the current branch via a pull request — phrases like "open a PR", "ship it", "ship this", "submit the PR", "let's send it"…
Ship PR is an agent skill from openbootdotdev/openboot. Use when the user is done editing and wants to ship the current branch via a pull request — phrases like "open a PR", "ship it", "ship this", "submit the PR", "let's send it", "merge it", "land this", "提 PR", "提个 PR", "提个 MR". Trigger whenever the user signals a change is finished and should head to the default branch, even if they don't say the word "PR". Walks the whole branch-to-merge flow for any GitHub repo with a mandatory review gate — the steps and their rules live in the body. Do NOT trigger for gh pr…
Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `agents/openai.yaml`).
It sits in Development, covering Pull requests and Human-in-the-loop approvals. It works with GitHub, Homebrew and macOS. The repository describes itself as: Set up your Mac dev environment in one command — CLI + Web Dashboard + Team sharing. The licence is MIT.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 259b119. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
ghgitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use gh and git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Ship PR loads about 3.6k tokens when it runs. Until then it costs about 163 tokens; SKILL.md has 1,855 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found patterns that need a careful read before installing.
synced"). On a clean review, don't ask for confirmation *before* merging.Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from openbootdotdev/openboot at commit 259b119, republished under its MIT licence (© openbootdotdev). 1,855 words, ~3,618 tokens.
.claude/skills/ship-pr/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.The canonical way to move a finished change from a feature branch to the repo's default branch through a pull request — for any GitHub repo, without hardcoding one project's build commands or check names.
There are two gates between your branch and the default branch:
Auto-merge is intentionally not used. gh pr merge --auto merges the
moment CI passes, which skips the review gate entirely — that defeats the
purpose. The merge command is run from this session, after the diff has
been reviewed.
gh pr create --draft and stop..github/workflows/, branch protection, or repo settings
→ these usually need a human in the GitHub UI too; flag it.v1.2.3) → releases follow the repo's
own release process, not this flow.git status -sb # clean except the expected diff?
git rev-parse --abbrev-ref HEAD # the current branch
git fetch origin --quiet # refresh the remote base ref
git remote set-head origin --auto >/dev/null # fetch never creates origin/HEAD; this does
BASE=$(git symbolic-ref --quiet --short refs/remotes/origin/HEAD 2>/dev/null | sed 's@^origin/@@')
BASE=${BASE:-main} # the repo's default branch
git log --oneline "origin/$BASE..HEAD" # commits actually exist$BASE is the repo's default branch — usually main, sometimes master
or develop. Don't assume main; use what was detected. Comparisons run
against the remote ref origin/$BASE (hence the git fetch), so they
match what GitHub will diff the PR against even when the local base branch
is missing or stale — common in worktrees and feature-only checkouts.
git remote get-url origin) → stop; this
flow is gh-only, tell the user (a GitLab "MR" needs a different flow).origin/$BASE → stop, nothing to ship.gh pr view succeeds) → still
push (Step 2) so the PR has the latest commits, then skip Step 3 and
continue at Step 4.git push -u origin "$(git rev-parse --abbrev-ref HEAD)"If the repo installs a pre-push hook (Husky, core.hooksPath, etc.) it
runs here automatically — don't re-run the same lint/test suite by hand.
If no hook is installed, that's the user's setup; CI is still the gate.
Check for a PR template first — using it keeps the PR consistent with the repo's conventions instead of inventing a different shape:
ls .github/pull_request_template.md .github/PULL_REQUEST_TEMPLATE.md \
PULL_REQUEST_TEMPLATE.md pull_request_template.md \
docs/PULL_REQUEST_TEMPLATE.md docs/pull_request_template.md \
.github/PULL_REQUEST_TEMPLATE/ 2>/dev/nullIf a template exists, fill in its sections honestly — including any
cross-repo / checklist items (e.g. "needs a docs update?"). Do not
discard it by passing a wholly custom --body. gh pr create without
--body tries to open an interactive editor, so fill the template
offline and pass it back:
gh pr create --title "<conventional commit subject>" --body-file <filled-template-file>If there's no template, fall back to a sensible default:
gh pr create --title "<conventional commit subject>" --body "$(cat <<'EOF'
## Summary
- <what changed and why>
## Test plan
- [ ] <how you verified>
EOF
)"Title rules:
feat: / fix: / docs: / refactor: /
test: / chore: / ci: / perf: / style: / build: / revert:.fix(api):, feat(editor):.gh pr checks --watchThis blocks until every check finishes. (Run straight after gh pr create
it can error with "no checks reported" before the first check registers —
wait a few seconds and re-run; exit code 8 just means checks are still
pending.) If a required check fails:
gh run view --log-failed), explain it to the user,
and ask whether to fix it now.If you can't tell which checks are required, the ones branch protection
enforces are; gh pr checks marks the rest, and the merge in Step 7 will
refuse anyway if a required one is red.
Once CI is green, the diff needs an inferential review — behaviour, design,
test coverage, risk, rollback. Prefer to have the @claude GitHub bot do
this first pass on the PR itself, so the review lives next to the code where
the whole team can see it. Fall back to a local review only when the bot isn't
available.
5a — Is the Claude bot wired up for this repo?
The bot is the Claude GitHub App driven by anthropics/claude-code-action. The
reliable, permission-free signal is a workflow that uses it:
grep -rilE 'anthropics/claude-code-action|@claude' .github/workflows 2>/dev/null(With repo-admin scope you could also confirm via
gh api "repos/{owner}/{repo}/installations" --jq '.[].app.slug', but that
403s without admin — don't depend on it.)
5b — Request the review (or pick up an automated one)
PR=$(gh pr view --json number -q .number)Some repos run claude-code-action automatically on every push
(on: pull_request), so a claude[bot] review for the current commit may
already be on its way — check before posting, to avoid asking twice:
gh pr view "$PR" --json comments \
-q '.comments[] | select(.author.login|test("claude|github-actions")) | "\(.author.login)\t\(.createdAt)"'(Comment objects carry createdAt, not updatedAt — and the sticky
comment is edited in place, so an old timestamp can still be a live
review. When in doubt, just mention the bot again.)
If there's no current bot comment, summon it with a mention. A focused prompt gets a more useful review than a bare "review this":
gh pr comment "$PR" --body "@claude please review this PR — focus on correctness, design, test coverage for the branches it adds, risk, and how it rolls back."(@claude is the default trigger; a repo can rename it via trigger_phrase in
its workflow. If the mention gets no response at all, check the workflow for a
custom phrase.)
5c — Wait for the bot, then read its review
The bot answers in a single sticky comment it edits in place — it shows progress first (checkboxes like "Analyzing…") and fills in the real review when done. Wait for it to finish; don't act on a half-written comment. It usually lands in under a minute, occasionally a few minutes under load.
for i in $(seq 1 30); do
body=$(gh pr view "$PR" --json comments \
-q '[.comments[] | select(.author.login|test("claude|github-actions"))] | last | .body')
if [ -n "$body" ] && ! printf '%s' "$body" | grep -qiE 'analyzing|in progress|- \[ \]'; then
printf '%s\n' "$body" && break
fi
sleep 10
doneRe-fetch until the body reads as a completed review (no lingering
"Analyzing…/in progress" markers). The author is normally claude[bot];
a repo using a custom github_token surfaces it as github-actions[bot]
instead — either way it's obviously a Claude review by its content. A
workflow configured to submit a formal PR review rather than a comment
shows up under gh pr view --json reviews — glance there before declaring
the bot unavailable. If nothing
substantive shows up after a few minutes, treat the bot as unavailable and fall
back. (If the loop times out but a bot comment is visible — e.g. a finished
review whose body happens to contain unchecked checkboxes — read it manually
instead of discarding it.) Carry whatever it found into Step 6.
5d — Local fallback
When the bot isn't wired up, or never returns a finished review, review the full PR diff yourself so the gate still closes:
git diff "origin/$BASE"...HEAD/code-review command or a repo-specific review skill is available, run
it on the full diff — it's purpose-built for this.Either way, the findings feed into Step 6.
Every finding lands in exactly one bucket. Getting this right is what keeps the gate from failing open.
Self-fixable → fix now, then loop back to Step 4. Mechanical
corrections clearly inside the PR's stated scope: typos, formatting, doc
wording, dead code this PR introduced, missing imports, missing tests for
branches this PR adds, bug fixes that don't change observable behaviour,
or following through on a rule the user already stated this session. Fix
it, push to the same branch, wait for CI again, then re-request the
review: capture the current sticky-comment body first, mention @claude
again, and poll (as in 5c) until the body changes from what you captured
and reads as complete — the sticky comment is edited in place, so the
pre-fix review stays visible (and satisfies 5c's break condition) until
the new one lands. Then re-triage. Don't
prompt the user — the point is to spend their attention only on real
decisions.
Needs user judgment → surface and stop. Anything with a genuine choice: design / API shape / behaviour changes, anything touching a deliberate prior decision or an existing convention, anything that would expand the PR beyond its stated scope — anything you'd ask a teammate about before pushing. State the file/line, the option, and the question; stop the flow.
Clean → merge directly. If CI is green AND nothing is self-fixable AND nothing needs judgment, go straight to Step 7. Don't ask "want me to merge?" — asking when there's nothing to decide just burns attention. The loop is supposed to close itself.
Rule of thumb: would a thoughtful engineer file this as a question, push a follow-up commit, or just merge it? Escalate / fix / merge accordingly.
Reached on a clean review, or after the user approved a merge following an escalation.
gh pr merge --squash --delete-branch--auto — it skips the review gate (Step 5).--admin — it bypasses branch protection.--squash keeps the default branch at one commit per PR; if the repo
only allows merge commits or rebase, use --merge / --rebase instead
(gh errors and tells you if the method isn't enabled).Report the result as a one-liner ("PR #N merged, branch deleted, local synced"). On a clean review, don't ask for confirmation before merging.
--delete-branch deleted the local and remote branch, and gh already
switched the checkout back to the base branch — so don't git branch -d
afterwards; the branch is gone and the command just errors. The one thing
gh doesn't do is pull:
git pull --ff-onlyIf the merge ran from somewhere unusual (a worktree, detached HEAD) and
the local branch survived, delete it manually with git branch -d. This
step is part of the loop, not optional: because the merge is synchronous
(no --auto), there's no reason to leave the checkout behind the base.
--auto by default — it skips the review gate, the whole reason
for this skill. If the user explicitly asks for it: don't arm it
silently — say what it skips, and offer to close the gate now (review
the diff first, then arm auto-merge; at that point --auto only skips
the CI wait). If they still want it after being told, do it: their
repo, their call. Caveat: auto-merge stays armed across later pushes,
so disarm or re-review before pushing anything else.--admin — bypasses branch protection.gh pr create unless the user asks —
it invalidates in-flight reviews and re-runs CI from scratch.© openbootdotdev, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in .agents/skills/ship-pr of openbootdotdev/openboot.
Open the folder on GitHubat commit 259b119
Ship PR next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Ship PR this skillopenbootdotdev/openboot | 275 | — | ~3.6k | Automated safety check: Warn | MIT | |
| Mole CLI Release Flowtw93/Mole | 70k | — | ~2.5k | Automated safety check: Pass | GPL-3.0 | |
| Releaseeugene1g/agent-safehouse | 2.1k | — | ~3.5k | Automated safety check: Pass | Apache-2.0 | |
| Review This Branchno-human-ai/no_human | 330 | — | ~1.4k | Automated safety check: Pass | MIT | |
| Plannotator Referencebacknotprop/plannotator | 9.2k | — | ~6.3k | Automated safety check: Warn | Apache-2.0 | |
| Debug Os Failure On GitHubstrands-agents/box | 110 | — | ~1.3k | Automated safety check: Notes | Apache-2.0 |
tw93/Mole
Runbook for assessing and executing a Mole CLI release: distribution channels, pre-flight checks, capital-V tags, build artifacts and the handoff to curated release notes.
eugene1g/agent-safehouse
Run the local Agent Safehouse release flow: inspect commits since the last published release, propose the next SemVer version and changelog, present a dry-run for confirmation, then update…
no-human-ai/no_human
Run the nohuman review gate (fresh-session adversarial reviewer + tamper guard) over the current branch or a GitHub pull request, with no server, no database, and no onboarding, and relay the…
backnotprop/plannotator
Reference for picking the right Plannotator tool or command for plan review, code review, annotating files and URLs, archived plan decisions and Guided Reviews.
strands-agents/box
Debug a CI failure on an OS you are not on (you are on Linux, it fails on macos-latest, or the reverse) without opening a pull request per attempt.
kmworks/kmreader
Create and merge KMReader GitHub pull requests. An agent skill from kmworks/kmreader.
openbootdotdev/openboot
A skill your agent uses when adding a new CLI subcommand or feature to openboot.
Categories
A skill your agent uses when the user is done editing and wants to ship the current branch via a pull request — phrases like "open a PR", "ship it", "ship this", "submit the PR", "let's send it"…. Ship PR is an agent skill from openbootdotdev/openboot. Use when the user is done editing and wants to ship the current branch via a pull request — phrases like "open a PR", "ship it", "ship this", "submit the PR", "let's send it", "merge it", "land this", "提 PR", "提个 PR", "提个 MR".
Ship PR fits situations like: the user is done editing and wants to ship the current branch via a pull request — phrases like open a PR; ever the user signals a change is finished and should head to the default branch; even if they dont say the word PR; gh pr view / status checks on an existing PR.
Run `npx skills add openbootdotdev/openboot --skill ship-pr -a claude-code`. Or copy the skill folder (.agents/skills/ship-pr in openbootdotdev/openboot) into .claude/skills/ship-pr in your project. Claude Code loads it when a task matches its description.
Run `npx skills add openbootdotdev/openboot --skill ship-pr -a codex`. Or copy the skill folder (.agents/skills/ship-pr in openbootdotdev/openboot) into .agents/skills/ship-pr in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add openbootdotdev/openboot --skill ship-pr -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ship-pr, .gemini/skills/ship-pr, .github/skills/ship-pr and .opencode/skills/ship-pr in your project.
Going by SKILL.md and its folder, Ship PR needs the command-line tools its instructions call (gh and git).
SKILL.md contains no URLs. Its commands use gh and git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md flagged 1 warning(s): tells the agent its actions are pre-authorized / not to stop for confirmation. Read the flagged lines before installing; the check is not a guarantee either way.
Ship PR is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.6k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Ship PR: Mole CLI Release Flow (tw93/Mole, 70k stars), Release (eugene1g/agent-safehouse, 2.1k stars), Review This Branch (no-human-ai/no_human, 330 stars) and Plannotator Reference (backnotprop/plannotator, 9.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
openbootdotdev (a GitHub organization) maintains it in openbootdotdev/openboot, which has 275 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on September 23, 2026.
Source: openbootdotdev/openboot on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.