{"id":"8db146ba-bd5c-4490-8508-238d48f47a8d","shortId":"DYsqkr","kind":"skill","title":"PR Description Writer","tagline":"Writes clear, thorough pull request descriptions from a diff or list of changes.","description":"# PR Description Writer\n\n## What this skill does\n\nThis skill directs the agent to read a diff or a plain summary of changes and produce a complete, well-structured pull request description. It covers what changed, why it changed, how reviewers can test it, and what edge cases or risks to be aware of — so reviewers can do their job without having to chase you for context.\n\nUse this when you're about to open a PR and want a description that will actually get reviewed instead of skipped, or when you need to document a large change for future reference.\n\n## How to use\n\n### Claude Code / Cline\n\nCopy this file to `.agents/skills/pr-description-writer/SKILL.md` in your project root.\n\nThen ask:\n- *\"Write a PR description for these changes using the PR Description Writer skill.\"*\n- *\"Use the PR Description Writer skill. Here's the diff.\"*\n\nYou can provide:\n- A `git diff main...HEAD` or `git diff` output\n- A bullet list of what changed (if the diff is too large to paste)\n- The GitHub issue number this PR closes (optional)\n- Any context about why the change was needed\n\n### Cursor / Codex\n\nPaste the instructions from the section below into your session, then provide your diff or change summary.\n\n## The Prompt / Instructions for the Agent\n\nWhen asked to write a pull request description, follow these steps:\n\n### 1. Understand the change\n\nRead the diff or change list and identify:\n- What files / modules were touched?\n- Is this a new feature, a bug fix, a refactor, a performance improvement, or a configuration change?\n- What was the motivation? (If not stated, ask — or make a reasonable inference and flag it for the author to verify)\n- Are there any breaking changes or behavioral differences a user or caller would notice?\n\n### 2. Write the PR description\n\nProduce a description with these exact sections:\n\n**## Summary**\n1-3 bullet points. Each bullet is one complete thought. Focus on the *what* and the *why*, not the implementation details. Example:\n- Adds rate limiting to the `/auth/login` endpoint to prevent brute-force attacks\n- Limits failed login attempts to 5 per minute per IP, after which requests return 429\n\n**## Changes**\nA more detailed breakdown for reviewers. Group related changes together. Use sub-bullets if needed:\n- `server/auth.ts` — added `checkRateLimit()` middleware before the password comparison step\n- `server/middleware/rateLimiter.ts` — new file: generic rate limiter using an in-memory sliding window\n- `tests/auth.test.ts` — added 4 new test cases covering the rate limit behavior\n\n**## Test Plan**\nA checklist of how to verify the change works. Written as concrete steps a reviewer can follow:\n- [ ] Run `npm test` — all tests should pass\n- [ ] `POST /auth/login` with valid credentials returns 200\n- [ ] `POST /auth/login` 6 times in 1 minute from the same IP returns 429 on the 6th request\n- [ ] After 1 minute, requests succeed again\n\n**## Screenshots or recordings** (optional)\nIf the change has a UI component, include this section with a note to attach screenshots. Otherwise omit it.\n\n**## Risks and notes**\nAny caveats, known limitations, or things the reviewer should pay special attention to:\n- The in-memory rate limiter resets on server restart — a Redis-backed implementation is tracked in #234\n- This change does not affect the `/auth/refresh` endpoint\n\n**## Related**\n- Closes #[issue number] (if applicable)\n- Related to #[other PR or issue] (if applicable)\n\n### 3. Tone rules\n\n- Write for the reviewer, not for yourself\n- Be specific — \"updated the login handler\" is useless; \"added a 5 req/min rate limit on failed logins\" is useful\n- Assume the reviewer knows the codebase but has not looked at this change yet\n- Flag anything uncertain: \"I believe this is backwards-compatible but please check the `formatDate` caller in `ReportPage.tsx`\"\n\n### 4. Output format\n\nProduce the PR description in a fenced markdown block so it can be copy-pasted directly into GitHub.\n\n## Example\n\n**Input to Agent:**\n> \"Use the PR Description Writer skill. Here's a summary of my changes:\n> - Added a `CopyableCodeBlock` component that shows a code block with a copy button\n> - Used it in the JSON Formatter tool to replace the plain `<pre>` tag\n> - Updated the Header component to add a link to the new AI Resources page\n> This closes issue #88.\"\n\n**Output from Agent:**\n\n```markdown\n## Summary\n\n- Adds a reusable `CopyableCodeBlock` component with a one-click copy button for code output\n- Replaces the plain `<pre>` tag in the JSON Formatter with `CopyableCodeBlock`, improving usability\n- Adds an AI Resources link to the site header\n\n## Changes\n\n- `client/src/components/CopyableCodeBlock.tsx` — new component: renders a code block with syntax highlighting and a copy-to-clipboard button using the Clipboard API\n- `client/src/tools/JsonFormatter.tsx` — replaced `<pre>` output with `<CopyableCodeBlock>`\n- `client/src/components/Header.tsx` — added \"AI Resources\" nav link pointing to `/ai-resources`\n\n## Test Plan\n\n- [ ] Run `npm test` — all tests pass\n- [ ] Open the JSON Formatter tool, format some JSON, and verify the copy button copies the output to clipboard\n- [ ] Click the copy button twice — verify it shows a \"Copied!\" confirmation on the first click and resets after 2 seconds\n- [ ] Check the header on desktop and mobile — \"AI Resources\" link should be visible and route correctly\n\n## Risks and Notes\n\n- `CopyableCodeBlock` uses the async Clipboard API — this requires HTTPS or localhost. It will silently fail on plain HTTP (no existing pages served over plain HTTP, so this is fine).\n\n## Related\n\n- Closes #88\n```\n\n## Notes\n\n- The more context you provide, the better the description. A full diff is ideal; a bullet list of changes works too.\n- If the PR is very large (100+ files), describe the intent and major areas affected rather than pasting the entire diff.\n- The Test Plan section is the most commonly skipped in practice and the most valuable to reviewers — do not omit it.\n- This skill writes the description only. It does not open the PR or interact with GitHub directly.","tags":["description","writer","openagentskills","notysoty","agent-skills","claude","claude-code","claude-skills","cline","cursor","llm","llm-skills"],"capabilities":["skill","source-notysoty","skill-pr-description-writer","topic-agent-skills","topic-claude","topic-claude-code","topic-claude-skills","topic-cline","topic-cursor","topic-llm","topic-llm-skills","topic-skills"],"categories":["openagentskills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/Notysoty/openagentskills/pr-description-writer","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add Notysoty/openagentskills","source_repo":"https://github.com/Notysoty/openagentskills","install_from":"skills.sh"}},"qualityScore":"0.454","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 8 github stars · SKILL.md body (6,051 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-05-18T19:13:23.423Z","embedding":null,"createdAt":"2026-05-18T13:20:44.900Z","updatedAt":"2026-05-18T19:13:23.423Z","lastSeenAt":"2026-05-18T19:13:23.423Z","tsv":"'-3':319 '/ai-resources':772 '/auth/login':345,445,452 '/auth/refresh':538 '1':236,318,456,469 '100':898 '2':305,817 '200':450 '234':531 '3':554 '4':409,615 '429':367,463 '5':358,574 '6':453 '6th':466 '88':696,869 'actual':100 'ad':386,408,572,654,765 'add':340,684,702,729 'affect':536,906 'agent':28,224,640,699 'agents/skills/pr-description-writer/skill.md':128 'ai':690,731,766,826 'anyth':598 'api':759,843 'applic':545,553 'area':905 'ask':134,226,277 'assum':583 'async':841 'attach':492 'attack':352 'attempt':356 'attent':511 'author':288 'awar':69 'back':526 'backward':605 'backwards-compat':604 'behavior':297,417 'believ':601 'better':877 'block':626,662,745 'break':294 'breakdown':372 'brute':350 'brute-forc':349 'bug':259 'bullet':171,320,323,382,886 'button':666,713,755,793,802 'caller':302,612 'case':64,412 'caveat':501 'chang':16,38,52,55,114,141,175,197,217,239,244,269,295,368,377,427,480,533,595,653,738,889 'chase':80 'check':609,819 'checklist':421 'checkratelimit':387 'claud':121 'clear':5 'click':711,799,813 'client/src/components/copyablecodeblock.tsx':739 'client/src/components/header.tsx':764 'client/src/tools/jsonformatter.tsx':760 'cline':123 'clipboard':754,758,798,842 'close':190,541,694,868 'code':122,661,715,744 'codebas':588 'codex':201 'common':920 'comparison':392 'compat':606 'complet':42,326 'compon':484,657,682,706,741 'concret':431 'configur':268 'confirm':809 'context':83,193,873 'copi':124,632,665,712,752,792,794,801,808 'copy-past':631 'copy-to-clipboard':751 'copyablecodeblock':656,705,726,838 'correct':834 'cover':50,413 'credenti':448 'cursor':200 'describ':900 'descript':2,9,18,48,97,138,145,151,232,309,312,621,644,879,938 'desktop':823 'detail':338,371 'diff':12,32,157,163,168,178,215,242,882,912 'differ':298 'direct':26,634,950 'document':111 'edg':63 'endpoint':346,539 'entir':911 'exact':315 'exampl':339,637 'exist':857 'fail':354,579,852 'featur':257 'fenc':624 'file':126,249,396,899 'fine':866 'first':812 'fix':260 'flag':284,597 'focus':328 'follow':233,436 'forc':351 'format':617,786 'formatd':611 'formatt':672,724,784 'full':881 'futur':116 'generic':397 'get':101 'git':162,167 'github':185,636,949 'group':375 'handler':569 'head':165 'header':681,737,821 'highlight':748 'http':855,862 'https':846 'ideal':884 'identifi':247 'implement':337,527 'improv':265,727 'in-memori':402,514 'includ':485 'infer':282 'input':638 'instead':103 'instruct':204,221 'intent':902 'interact':947 'ip':362,461 'issu':186,542,551,695 'job':76 'json':671,723,783,788 'know':586 'known':502 'larg':113,181,897 'limit':342,353,399,416,503,518,577 'link':686,733,769,828 'list':14,172,245,887 'localhost':848 'login':355,568,580 'look':592 'main':164 'major':904 'make':279 'markdown':625,700 'memori':404,516 'middlewar':388 'minut':360,457,470 'mobil':825 'modul':250 'motiv':273 'nav':768 'need':109,199,384 'new':256,395,410,689,740 'note':490,499,837,870 'notic':304 'npm':438,776 'number':187,543 'omit':495,932 'one':325,710 'one-click':709 'open':91,781,943 'option':191,477 'otherwis':494 'output':169,616,697,716,762,796 'page':692,858 'pass':443,780 'password':391 'past':183,202,633,909 'pay':509 'per':359,361 'perform':264 'plain':35,677,719,854,861 'plan':419,774,915 'pleas':608 'point':321,770 'post':444,451 'pr':1,17,93,137,144,150,189,308,549,620,643,894,945 'practic':923 'prevent':348 'produc':40,310,618 'project':131 'prompt':220 'provid':160,213,875 'pull':7,46,230 'rate':341,398,415,517,576 'rather':907 're':88 'read':30,240 'reason':281 'record':476 'redi':525 'redis-back':524 'refactor':262 'refer':117 'relat':376,540,546,867 'render':742 'replac':675,717,761 'reportpage.tsx':614 'req/min':575 'request':8,47,231,365,467,471 'requir':845 'reset':519,815 'resourc':691,732,767,827 'restart':522 'return':366,449,462 'reusabl':704 'review':57,72,102,374,434,507,560,585,929 'risk':66,497,835 'root':132 'rout':833 'rule':556 'run':437,775 'screenshot':474,493 'second':818 'section':207,316,487,916 'serv':859 'server':521 'server/auth.ts':385 'server/middleware/ratelimiter.ts':394 'session':211 'show':659,806 'silent':851 'site':736 'skill':22,25,147,153,646,935 'skill-pr-description-writer' 'skip':105,921 'slide':405 'source-notysoty' 'special':510 'specif':565 'state':276 'step':235,393,432 'structur':45 'sub':381 'sub-bullet':380 'succeed':472 'summari':36,218,317,650,701 'syntax':747 'tag':678,720 'test':59,411,418,439,441,773,777,779,914 'tests/auth.test.ts':407 'thing':505 'thorough':6 'thought':327 'time':454 'togeth':378 'tone':555 'tool':673,785 'topic-agent-skills' 'topic-claude' 'topic-claude-code' 'topic-claude-skills' 'topic-cline' 'topic-cursor' 'topic-llm' 'topic-llm-skills' 'topic-skills' 'touch':252 'track':529 'twice':803 'ui':483 'uncertain':599 'understand':237 'updat':566,679 'usabl':728 'use':84,120,142,148,379,400,582,641,667,756,839 'useless':571 'user':300 'valid':447 'valuabl':927 'verifi':290,425,790,804 'visibl':831 'want':95 'well':44 'well-structur':43 'window':406 'without':77 'work':428,890 'would':303 'write':4,135,228,306,557,936 'writer':3,19,146,152,645 'written':429 'yet':596","prices":[{"id":"00f7158e-b8ee-414c-bee3-76211b7a41e0","listingId":"8db146ba-bd5c-4490-8508-238d48f47a8d","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"Notysoty","category":"openagentskills","install_from":"skills.sh"},"createdAt":"2026-05-18T13:20:44.900Z"}],"sources":[{"listingId":"8db146ba-bd5c-4490-8508-238d48f47a8d","source":"github","sourceId":"Notysoty/openagentskills/pr-description-writer","sourceUrl":"https://github.com/Notysoty/openagentskills/tree/main/skills/pr-description-writer","isPrimary":false,"firstSeenAt":"2026-05-18T13:20:44.900Z","lastSeenAt":"2026-05-18T19:13:23.423Z"}],"details":{"listingId":"8db146ba-bd5c-4490-8508-238d48f47a8d","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"Notysoty","slug":"pr-description-writer","github":{"repo":"Notysoty/openagentskills","stars":8,"topics":["agent-skills","claude","claude-code","claude-skills","cline","cursor","llm","llm-skills","skills"],"license":"mit","html_url":"https://github.com/Notysoty/openagentskills","pushed_at":"2026-03-28T06:50:19Z","description":"A  community-driven library of reusable AI agent skills for Claude Code, Cursor, Codex, Cline, and more.","skill_md_sha":"5e16057f0b03b6af6ec5f6f432ceea03f557e950","skill_md_path":"skills/pr-description-writer/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Notysoty/openagentskills/tree/main/skills/pr-description-writer"},"layout":"multi","source":"github","category":"openagentskills","frontmatter":{"name":"PR Description Writer","description":"Writes clear, thorough pull request descriptions from a diff or list of changes."},"skills_sh_url":"https://skills.sh/Notysoty/openagentskills/pr-description-writer"},"updatedAt":"2026-05-18T19:13:23.423Z"}}