jackin-refresh-pr — Claude Code skill: what it does, how to install
Reconciles an open pull request title and body with the current branch diff. Keeps local verification blocks and prose aligned when scope shifts.
npx skills add jackin-project/jackin-dev --skill jackin-refresh-pr -a claude-codeWhat jackin-refresh-pr does
This skill synchronizes a PR's title and description with recent branch changes. Commits accumulate over time. When a typo fix turns into feature code, the original text misleads reviewers. The skill runs exclusively on explicit operator demand, preventing churn.
The workflow relies on cargo xtask pr body to inspect changes. The binary manages the Verify locally block selection, while the agent reads gh pr diff and git log to rewrite drifted prose. Authored notes inside kept verification blocks remain intact.
Updates must go through gh pr edit <PR> --body-file /tmp/pr-body.md. Markdown passed via --body breaks on code fences and dollar signs.
What it helps with
- update outdated PR summaries when scope shifts during development
- rebuild the Verify locally checklist using cargo xtask pr body
- rewrite drifted sections without wiping out manual reviewer notes
- prevent broken Markdown formatting and escaping issues in GitHub CLI
Example prompts for the agent
- Refresh the PR body and title to match the latest diff
- Reconcile PR #15 against current branch changes
- Update the verification steps for the open pull request
How to install jackin-refresh-pr
1Skills CLI (Vercel)
npx skills add jackin-project/jackin-dev --skill jackin-refresh-pr -a claude-code2Manually: put the files in place
~/.claude/skills/jackin-refresh-pr/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/jackin-refresh-pr/
1Skills CLI (Vercel)
npx skills add jackin-project/jackin-dev --skill jackin-refresh-pr -a codex2Manually: put the files in place
.agents/skills/jackin-refresh-pr/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add jackin-project/jackin-dev --skill jackin-refresh-pr -a cursor2Manually: put the files in place
.cursor/skills/jackin-refresh-pr/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install jackin-project/jackin-dev jackin-refresh-pr2Manually: put the files in place
.github/skills/jackin-refresh-pr/SKILL.md1Skills CLI (Vercel)
npx skills add jackin-project/jackin-dev --skill jackin-refresh-pr -a gemini-cli2Platform CLI
gemini skills install https://github.com/jackin-project/jackin-dev --path skills/jackin-refresh-prManually: put the files in place
.devin/skills/jackin-refresh-pr/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add jackin-project/jackin-dev --skill jackin-refresh-pr -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about jackin-refresh-pr
How to install jackin-refresh-pr in Claude Code?
Run npx skills add jackin-project/jackin-dev --skill jackin-refresh-pr -a claude-code. The definition will be placed in ~/.claude/skills/jackin-refresh-pr/SKILL.md.
What does jackin-refresh-pr do?
It inspects the current branch diff, aligns the PR title with Conventional Commits, updates verification blocks, and updates the PR body on GitHub.
Why does the skill enforce --body-file instead of --body?
Passing text directly via --body corrupts code fences and $ characters. Writing to a temporary file first keeps the Markdown intact.
Source text
SKILL.md · Apache-2.0
---
name: jackin-refresh-pr
description: Use only when the user explicitly requests this skill. Reconciles an open jackin❯ pull request's title and body against the current diff — regenerates the Verify-locally block selection and rewrites prose that has drifted.
argument-hint: "[PR]"
disable-model-invocation: true
license: Apache-2.0
user-invocable: true
---
# jackin-refresh-pr
Reconcile an open PR's title and body against the current diff, so the body describes what the branch **actually ships now** — not what it shipped when it was opened. Run when the body has drifted: more commits landed, scope grew or shifted, the title still reads `docs:` but the PR now ships a feature.
Shares `cargo xtask pr body` with `jackin-create-pr` — the binary owns the Verify-locally block selection; the agent owns the prose. This is the deliberate, on-demand version of the reconciliation `jackin-merge-pr` runs at its step 5.
## When to use
- Operator asks to refresh / update the PR body or title ("the body is out of date", "refresh the PR").
- Body has become actively misleading for a reviewer landing on it right now.
## When NOT to use
- Opening a new PR → `jackin-create-pr`.
- At merge-readiness → `jackin-merge-pr` step 5 reconciles as the final gate; don't double-refresh.
- After every iteration commit — refresh is operator-triggered, not commit-triggered (`.github/AGENTS.md` PR-body refresh policy). Auto-refreshing churns the body and wastes attention.
## Arguments
- `PR` — PR number (defaults to the current branch's PR).
## Process
1. **Resolve the PR.** `gh pr view <PR> --json number,title,body,headRefName,baseRefName`. Hold the current title and body.
2. **Gather the fresh shape.** `git fetch origin <baseRefName>`, then `cargo xtask pr body --base origin/<baseRefName> > /tmp/pr-body.fresh.md`. Read the **change digest on stderr** (the rust/docs/capsule/schema categories + file list) — that is what the change *is* now. Read the **fresh skeleton on stdout** — its set of `### ` blocks under `## Verify locally` is the selection the current diff requires.
3. **Reconcile the Verify-locally blocks.** Diff the fresh skeleton's block set against the live body's:
- In the fresh selection but missing from the body → add it (structure from the template, filled for this PR).
- In the body but dropped by the fresh selection → remove it.
- In both → **keep the operator's fill verbatim**. The Checkout block carries the real PR number; Rust tests carry the scoped filter; User smoke carries PR-specific steps. Never overwrite a kept block with the placeholder.
*Done when* every `### ` block under `## Verify locally` matches the binary's selection for the current diff, and every kept block retains its authored content.
4. **Reconcile the prose.** Read `gh pr diff <PR>` and `git log origin/<baseRefName>..HEAD --oneline`. For each prose section the body carries (Summary, What ships, Behavior changes, What this addresses, Hard rule, Not included, Migration notes):
- Still matches what shipped → leave untouched. Refresh is anti-churn; do not rewrite what is right.
- Drifted → rewrite to match the current diff. Section no longer earned → drop it. New outcome shipped with no section → add it.
*Done when* every prose section reflects the current diff, and no section restates the diff file-by-file.
5. **Reconcile the title.** Does the Conventional Commits subject still describe the shipped scope? If the PR grew — a `fix(typo)` that now ships a feature, a `docs:` that now contains code — update type and scope via `gh pr edit <PR> --title`. Pause for confirmation only if the scope shift is meaningful enough that the operator might not have noticed (`.github/AGENTS.md` title/description rule).
6. **Write the body.** Build the reconciled body in a temp file — kept prose, rewritten prose, reconciled blocks — then `gh pr edit <PR> --body-file /tmp/pr-body.md`. Never `--body "..."`; the body-construction rule in `.github/AGENTS.md` mandates `--body-file` to survive code fences and `$`.
7. **Verify the render.** `gh pr view <PR> --json body -q .body` — confirm no stray `` \` `` or `\$` from hand-editing. Fix with `--body-file` if broken.
8. **Report.** Name what moved: blocks added/dropped, prose sections rewritten, the title change (old → new) and why. Do not ask permission to refresh — the operator asked. Do surface a scope-shifting title change before it sticks if the operator might disagree.
## Common mistakes
- Regenerating the body from the skeleton and **losing the operator's prose** — the skeleton carries placeholders; refresh preserves authored content and only rewrites what drifted.
- Rewriting prose that was already accurate — churns the diff and wastes attention.
- Hand-selecting Verify-locally blocks instead of `cargo xtask pr body` — the binary is the selection oracle.
- Using `gh pr edit --body "..."` instead of `--body-file` — breaks on code fences and `$`.
- Forgetting the render check — a broken `` \` `` or `\$` ships silently.
- Refreshing after every commit — violates the operator-triggered policy.
## Tooling
`cargo xtask pr body --base origin/<base>` (jackin❯ repo) emits the change digest to stderr and the Verify-locally-block-filtered skeleton to stdout. Shared with `jackin-create-pr`. The binary owns block selection; the agent owns prose reconciliation. No xtask subcommand refreshes a PR — this skill orchestrates `pr body` (selection) + `gh pr edit` (write).
© jackin-project · Apache-2.0 · jackin-project/jackin-dev