plugins/git/skills/pull-request/SKILL.md
--- name: pull-request description: Invoke this skill BEFORE running any gh pr create, gh pr edit, or gh pr comment command, or any task that will produce or modify a GitHub pull request. This is the skill for authoring outbound PR communication: creating, drafting, opening, filing, or starting a PR; updating a PR body or description; posting a comment or reply to review feedback. Trigger on short and casual phrasings, not only the literal word "create". Example triggers: "create a PR", "draft a
npx skillsauth add technicalpickles/pickled-claude-plugins plugins/git/skills/pull-requestInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Authoring PR communication that respects busy reviewers. All bodies and comments are drafted to .scratch/pr-bodies/ for human review before posting. Anti-patterns (metrics, diff-noise, H1 headings) are avoided. Manual edits are detected before overwriting.
| Operation | Typical phrasing | gh command at end |
|---|---|---|
| Create | "create/draft/open/file a PR", "push and PR it" | gh pr create --body-file |
| Update body | "update the PR body", "rewrite the PR description" | gh pr edit --body-file |
| Comment | "comment on the PR", "reply to review feedback" | gh pr comment --body-file |
"update the PR" is ambiguous:
Prefer body update when there are no reviews yet, the user says "update the description", or scope changed. Prefer comment when reviews are in, the user is responding to feedback, or they want to notify watchers (comments generate notifications, body updates do not).
Check for a PR template (.github/pull_request_template.md, .github/PULL_REQUEST_TEMPLATE.md, .github/PULL_REQUEST_TEMPLATE/*.md) and CONTRIBUTING.md (also .github/CONTRIBUTING.md, docs/CONTRIBUTING.md). If a template exists, follow it exactly.
## Summary
- Material impact point 1
- Material impact point 2 (2-4 bullets total)
## Test plan
- How to verify (only if non-obvious)
Optional sections based on context: ## Breaking changes, ## Migration notes, ## Follow-up work.
Imperative mood (Add, Fix, Update, Refactor), under 72 characters, capitalize first word, no trailing period. Derive from the branch name when semantic, otherwise from the first commit.
Metrics (unless the PR is about them): "Added 15 tests", "Modified 8 files", "Added 250 lines", "Coverage to 85%", "Runtime 2.5s to 1.2s".
Diff-visible details: "Created new Foo class", "Refactored into smaller functions", "Used async/await", "Added error handling" (unless that is the PR's focus).
Over-explaining: "After careful consideration of multiple approaches...", "significantly improves the developer experience by implementing a novel approach...".
Structural noise: H1 heading (GitHub shows the title separately), listing technologies unless a new dependency, file structure changes unless architectural, "following best practices" (assumed), "easy to" / "simple to" (condescending).
The rule: If a reviewer can see it in the diff or CI output, do not put it in the body unless it is the central focus.
Three to five sentences, conversational, professional. Acknowledge reviewer input. Explain reasoning when non-obvious. A common opening pattern: "I've updated the PR to address the feedback: ..."
gh pr view --json number 2>/dev/null. If one exists, error or route to update.git log <base>..HEAD, PR template, CONTRIBUTING.md..scratch/pr-bodies/drafts/<slug>.md. Show the draft to the user and allow edits.gh pr create --title "..." --body-file <draft-path> (add --draft if the user asked for a draft)..scratch/pr-bodies/<number>/<timestamp>-body.md and write metadata.json with the body hash.gh pr view --json number,body,title,state. Load metadata.json if present. Warn if closed or merged.shasum -a 256) and compare to last_generated_hash. If different and the diff is more than whitespace, ask: overwrite, merge, or cancel.<base>..HEAD. If scope is unchanged from last generation, skip the update and say "description still accurate"..scratch/pr-bodies/<number>/<timestamp>-body.md. Show the diff (current vs proposed) and confirm.gh pr edit <number> --body-file <file>. Update metadata.json (new hash, timestamp).gh pr view --json number,title,reviews,comments..scratch/pr-bodies/<number>/<timestamp>-comment.md. Show the draft and confirm.gh pr comment <number> --body-file <file>.Always: current branch is not main/master; gh is installed and authenticated; the user has seen and approved the draft.
Create: branch has commits ahead of base. Update: PR exists and is open. Comment: comment is not empty.
If gh is missing, fall back with brew install gh. If not authenticated, gh auth login.
.scratch/pr-bodies/
drafts/
<slug>.md # Pre-creation drafts
<pr-number>/
metadata.json # See schema below
<timestamp>-body.md # Timestamped body versions
<timestamp>-comment.md # Timestamped comments
metadata.json:
{
"pr_number": 123,
"branch": "feature/foo",
"base": "main",
"title": "Add foo",
"created_at": "2025-11-07T10:30:00Z",
"last_generated_hash": "abc123...",
"last_updated_at": "2025-11-07T16:45:30Z",
"manual_edits_detected": false
}
Timestamps use ISO 8601 with hyphens (2025-11-07T10-30-00). Slugs are lowercase with hyphens and special chars stripped.
Keep: metadata.json, the last five timestamped files, any in-progress draft. Clean up after PR creation: the draft file. Optional: timestamped files older than 30 days.
base=$(gh pr view --json baseRefName -q .baseRefName 2>/dev/null)
if [ -z "$base" ]; then
git show-ref --verify --quiet refs/heads/main && base=main || base=master
fi
gh pr list --head <branch> --state open. If exactly one open, use it. If zero, check --state all and offer to create new. If more than one (rare), ask which.
gh pr create/edit/comment.gh pr create without --body-file. Shell-escaping issues and no draft review step.main/master. Stop and ask the user to branch first.gh pr list --head <branch>.tools
--- name: writing-for-scannability description: Use when structuring prose so readers can skim it - drafting or restructuring READMEs, docs, PR or issue bodies, design docs, RFCs, or any long-form text where a wall of prose hides the structure. Also use when explicitly asked to make something scannable or skimmable, convert prose to a list, surface a buried list, fix a wall of text, or decide whether bullets or prose fit. Strong signal: text with parallel sentence shapes, contrast markers ("that
development
Ignore actually-lsp nudges for an ecosystem in this project. Use when the user wants to silence, dismiss, or ignore the LSP setup nudges for a specific ecosystem (Rust, TypeScript, Ruby), or invokes `/actually-lsp-ignore` directly. Writes `dismissed=true` to `.claude/actually-lsp.json`. Persistent across sessions for this project only.
tools
Diagnose and fix LSP setup for the current project's detected ecosystems (Rust, TypeScript, Ruby). Use when the SessionStart hook nudged about a missing LSP plugin, when the env isn't ready (no `bundle install`, no `cargo build`, missing server binary), when LSP calls are failing, or when the user invokes `/actually-lsp-doctor` directly. Walks the per-ecosystem state machine, reports what's missing, then runs the fix.
tools
--- name: investigating-runs description: Use whenever the user mentions a GitHub Actions / GHA run, even casually — invoke this skill before reaching for raw `gh` commands, because the bundled `gha-snapshot` helper distills `gh run view --log-failed` (a firehose) into a readable block with per-job status, failed-step log tails, and annotations. Specific triggers (any one is enough): a `github.com/.../actions/runs/...` URL; the phrase "GitHub Actions" or "GHA"; the `gh run` CLI; a failing workfl