{"id":"0514dea9-9436-4d9d-a594-533f324e8bf8","shortId":"VEab8N","kind":"skill","title":"pr-writer","tagline":"Create pull requests following Sentry's engineering practices.","description":"# PR Writer\n\nCreate pull requests following Sentry's engineering practices.\n\n**Requires**: GitHub CLI (`gh`) authenticated and available.\n\n## When to Use\n- You are ready to open a pull request and need a structured description based on the committed branch diff.\n- You want the PR body to capture what changed, why it changed, and any reviewer context.\n- You are using GitHub CLI and need a repeatable PR-writing workflow rather than writing the description ad hoc.\n\n## Prerequisites\n\nBefore creating a PR, ensure all changes are committed. If there are uncommitted changes, run the `sentry-skills:commit` skill first to commit them properly.\n\n```bash\n# Check for uncommitted changes\ngit status --porcelain\n```\n\nIf the output shows any uncommitted changes (modified, added, or untracked files that should be included), invoke the `sentry-skills:commit` skill before proceeding.\n\n## Process\n\n### Step 1: Verify Branch State\n\n```bash\n# Detect the default branch — note the output for use in subsequent commands\ngh repo view --json defaultBranchRef --jq '.defaultBranchRef.name'\n```\n\n```bash\n# Check current branch and status (substitute the detected branch name above for BASE)\ngit status\ngit log BASE..HEAD --oneline\n```\n\nEnsure:\n- All changes are committed\n- Branch is up to date with remote\n- Changes are rebased on the base branch if needed\n\n### Step 2: Analyze Changes\n\nReview what will be included in the PR:\n\n```bash\n# See all commits that will be in the PR (substitute detected branch name for BASE)\ngit log BASE..HEAD\n\n# See the full diff\ngit diff BASE...HEAD\n```\n\nUnderstand the scope and purpose of all changes before writing the description.\n\n### Step 3: Write the PR Description\n\nUse this structure for PR descriptions (ignoring any repository PR templates):\n\n```markdown\n<brief description of what the PR does>\n\n<why these changes are being made - the motivation>\n\n<alternative approaches considered, if any>\n\n<any additional context reviewers need>\n```\n\n**Do NOT include:**\n- \"Test plan\" sections\n- Checkbox lists of testing steps\n- Redundant summaries of the diff\n\n**Do include:**\n- Clear explanation of what and why\n- Links to relevant issues or tickets\n- Context that isn't obvious from the code\n- Notes on specific areas that need careful review\n\n### Step 4: Create the PR\n\n```bash\ngh pr create --draft --title \"<type>(<scope>): <description>\" --body \"$(cat <<'EOF'\n<description body here>\nEOF\n)\"\n```\n\n**Title format** follows commit conventions:\n- `feat(scope): Add new feature`\n- `fix(scope): Fix the bug`\n- `ref: Refactor something`\n\n## PR Description Examples\n\n### Feature PR\n\n```markdown\nAdd Slack thread replies for alert notifications\n\nWhen an alert is updated or resolved, we now post a reply to the original\nSlack thread instead of creating a new message. This keeps related\nnotifications grouped and reduces channel noise.\n\nPreviously considered posting edits to the original message, but threading\nbetter preserves the timeline of events and works when the original message\nis older than Slack's edit window.\n\nRefs SENTRY-1234\n```\n\n### Bug Fix PR\n\n```markdown\nHandle null response in user API endpoint\n\nThe user endpoint could return null for soft-deleted accounts, causing\ndashboard crashes when accessing user properties. This adds a null check\nand returns a proper 404 response.\n\nFound while investigating SENTRY-5678.\n\nFixes SENTRY-5678\n```\n\n### Refactor PR\n\n```markdown\nExtract validation logic to shared module\n\nMoves duplicate validation code from the alerts, issues, and projects\nendpoints into a shared validator class. No behavior change.\n\nThis prepares for adding new validation rules in SENTRY-9999 without\nduplicating logic across endpoints.\n```\n\n## Issue References\n\nReference issues in the PR body:\n\n| Syntax | Effect |\n|--------|--------|\n| `Fixes #1234` | Closes GitHub issue on merge |\n| `Fixes SENTRY-1234` | Closes Sentry issue |\n| `Refs GH-1234` | Links without closing |\n| `Refs LINEAR-ABC-123` | Links Linear issue |\n\n## Guidelines\n\n- **One PR per feature/fix** - Don't bundle unrelated changes\n- **Keep PRs reviewable** - Smaller PRs get faster, better reviews\n- **Explain the why** - Code shows what; description explains why\n- **Mark WIP early** - Use draft PRs for early feedback\n\n## Editing Existing PRs\n\nIf you need to update a PR after creation, use `gh api` instead of `gh pr edit`:\n\n```bash\n# Update PR description\ngh api -X PATCH repos/{owner}/{repo}/pulls/PR_NUMBER -f body=\"$(cat <<'EOF'\nUpdated description here\nEOF\n)\"\n\n# Update PR title\ngh api -X PATCH repos/{owner}/{repo}/pulls/PR_NUMBER -f title='new: Title here'\n\n# Update both\ngh api -X PATCH repos/{owner}/{repo}/pulls/PR_NUMBER \\\n  -f title='new: Title' \\\n  -f body='New description'\n```\n\nNote: `gh pr edit` is currently broken due to GitHub's Projects (classic) deprecation.\n\n## References\n\n- [Sentry Code Review Guidelines](https://develop.sentry.dev/engineering-practices/code-review/)\n- [Sentry Commit Messages](https://develop.sentry.dev/engineering-practices/commit-messages/)\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["writer","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity-skills"],"capabilities":["skill","source-sickn33","skill-pr-writer","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/pr-writer","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34616 github stars · SKILL.md body (5,323 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-23T00:51:24.895Z","embedding":null,"createdAt":"2026-04-18T21:42:39.580Z","updatedAt":"2026-04-23T00:51:24.895Z","lastSeenAt":"2026-04-23T00:51:24.895Z","tsv":"'-1234':445,556,562 '-5678':490,493 '-9999':531 '/engineering-practices/code-review/)':706 '/engineering-practices/commit-messages/)':712 '/pulls/pr_number':642,661,676 '1':149 '123':570 '1234':548 '2':216 '3':268 '4':337 '404':484 'abc':569 'access':472 'account':467 'across':535 'ad':85,130,525 'add':358,375,476 'alert':380,384,509 'altern':285 'analyz':217 'api':455,625,636,655,670 'approach':286 'area':331 'ask':746 'authent':26 'avail':28 'base':45,186,191,211,242,245,253 'bash':114,153,173,227,341,631 'behavior':520 'better':424,591 'bodi':55,347,544,644,682 'boundari':754 'branch':49,151,157,176,182,199,212,239 'broken':691 'bug':365,446 'bundl':581 'captur':57 'care':334 'cat':348,645 'caus':468 'chang':59,62,94,101,118,128,196,206,218,262,521,583 'channel':412 'check':115,174,479 'checkbox':296 'clarif':748 'class':518 'classic':697 'clear':308,721 'cli':24,71 'close':549,557,565 'code':327,506,596,701 'command':165 'commit':48,96,107,111,143,198,230,354,708 'consid':287,415 'context':66,320 'convent':355 'could':460 'crash':470 'creat':4,14,89,338,344,401 'creation':622 'criteria':757 'current':175,690 'dashboard':469 'date':203 'default':156 'defaultbranchref':170 'defaultbranchref.name':172 'delet':466 'deprec':698 'describ':725 'descript':44,84,266,272,278,370,599,634,648,684 'detect':154,181,238 'develop.sentry.dev':705,711 'develop.sentry.dev/engineering-practices/code-review/)':704 'develop.sentry.dev/engineering-practices/commit-messages/)':710 'diff':50,250,252,305 'draft':345,606 'due':692 'duplic':504,533 'earli':604,609 'edit':417,441,611,630,688 'effect':546 'endpoint':456,459,513,536 'engin':10,20 'ensur':92,194 'environ':737 'environment-specif':736 'eof':349,350,646,650 'event':429 'exampl':371 'exist':612 'expert':742 'explain':593,600 'explan':309 'extract':497 'f':643,662,677,681 'faster':590 'feat':356 'featur':360,372 'feature/fix':578 'feedback':610 'file':133 'first':109 'fix':361,363,447,491,547,554 'follow':7,17,353 'format':352 'found':486 'full':249 'get':589 'gh':25,166,342,561,624,628,635,654,669,686 'git':119,187,189,243,251 'github':23,70,550,694 'group':409 'guidelin':574,703 'handl':450 'head':192,246,254 'hoc':86 'ignor':279 'includ':137,223,292,307 'input':751 'instead':399,626 'investig':488 'invok':138 'isn':322 'issu':317,510,537,540,551,559,573 'jq':171 'json':169 'keep':406,584 'limit':713 'linear':568,572 'linear-abc':567 'link':314,563,571 'list':297 'log':190,244 'logic':499,534 'mark':602 'markdown':284,374,449,496 'match':722 'merg':553 'messag':404,421,435,709 'miss':759 'modifi':129 'modul':502 'move':503 'name':183,240 'need':41,73,214,333,616 'new':359,403,526,664,679,683 'nois':413 'note':158,328,685 'notif':381,408 'null':451,462,478 'obvious':324 'older':437 'one':575 'onelin':193 'open':36 'origin':396,420,434 'output':124,160,731 'owner':640,659,674 'patch':638,657,672 'per':577 'permiss':752 'plan':294 'porcelain':121 'post':391,416 'pr':2,12,54,77,91,226,236,271,277,282,340,343,369,373,448,495,543,576,620,629,633,652,687 'pr-write':76 'pr-writer':1 'practic':11,21 'prepar':523 'prerequisit':87 'preserv':425 'previous':414 'proceed':146 'process':147 'project':512,696 'proper':113,483 'properti':474 'prs':585,588,607,613 'pull':5,15,38 'purpos':259 'rather':80 'readi':34 'rebas':208 'reduc':411 'redund':301 'ref':366,443,560,566 'refactor':367,494 'refer':538,539,699 'relat':407 'relev':316 'remot':205 'repeat':75 'repli':378,393 'repo':167,639,641,658,660,673,675 'repositori':281 'request':6,16,39 'requir':22,750 'resolv':388 'respons':452,485 'return':461,481 'review':65,219,335,586,592,702,743 'rule':528 'run':102 'safeti':753 'scope':257,357,362,724 'section':295 'see':228,247 'sentri':8,18,105,141,444,489,492,530,555,558,700,707 'sentry-skil':104,140 'share':501,516 'show':125,597 'skill':106,108,142,144,716 'skill-pr-writer' 'slack':376,397,439 'smaller':587 'soft':465 'soft-delet':464 'someth':368 'source-sickn33' 'specif':330,738 'state':152 'status':120,178,188 'step':148,215,267,300,336 'stop':744 'structur':43,275 'subsequ':164 'substitut':179,237,734 'success':756 'summari':302 'syntax':545 'task':720 'templat':283 'test':293,299,740 'thread':377,398,423 'ticket':319 'timelin':427 'titl':346,351,653,663,665,678,680 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'treat':729 'uncommit':100,117,127 'understand':255 'unrel':582 'untrack':132 'updat':386,618,632,647,651,667 'use':31,69,162,273,605,623,714 'user':454,458,473 'valid':498,505,517,527,739 'verifi':150 'view':168 'want':52 'window':442 'wip':603 'without':532,564 'work':431 'workflow':79 'write':78,82,264,269 'writer':3,13 'x':637,656,671","prices":[{"id":"f280a8bf-1281-4d95-b7ed-5a9023a0ba3a","listingId":"0514dea9-9436-4d9d-a594-533f324e8bf8","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:42:39.580Z"}],"sources":[{"listingId":"0514dea9-9436-4d9d-a594-533f324e8bf8","source":"github","sourceId":"sickn33/antigravity-awesome-skills/pr-writer","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/pr-writer","isPrimary":false,"firstSeenAt":"2026-04-18T21:42:39.580Z","lastSeenAt":"2026-04-23T00:51:24.895Z"}],"details":{"listingId":"0514dea9-9436-4d9d-a594-533f324e8bf8","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"pr-writer","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34616,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-22T06:40:00Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"69c0e978c92d21a942d72bf75b896962a2f98c30","skill_md_path":"skills/pr-writer/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/pr-writer"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"pr-writer","description":"Create pull requests following Sentry's engineering practices."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/pr-writer"},"updatedAt":"2026-04-23T00:51:24.895Z"}}