{"id":"bd5bfce7-28b6-4ba8-8b11-dea645a61f5e","shortId":"jdEsDU","kind":"skill","title":"Issue to PR Planner","tagline":"Takes a GitHub issue and produces a step-by-step implementation plan with file locations and code changes needed.","description":"# Issue to PR Planner\n\n## What this skill does\n\nThis skill takes a GitHub issue (or any feature request / bug report) and turns it into a concrete, step-by-step implementation plan. It reads the codebase to identify the relevant files, understands the existing patterns, and produces an ordered list of changes with enough detail that a developer — or an agent executing the plan — can work through it without ambiguity.\n\nUse this at the start of a feature or bug fix to align on exactly what needs to change before writing code, or to hand off implementation work to another developer or AI agent.\n\n## How to use\n\n### Claude Code / Cline\n\nCopy this file to `.agents/skills/issue-to-pr-planner/SKILL.md` in your project root.\n\nThen ask:\n- *\"Use the Issue to PR Planner skill on this issue: [paste issue text].\"*\n- *\"Plan the implementation for GitHub issue #142 using the Issue to PR Planner skill.\"*\n\nProvide the full issue text including the title, description, and any acceptance criteria or comments.\n\n### Cursor\n\nAdd the instructions below to your `.cursorrules` or paste them into the Cursor AI pane. Paste the issue text before asking for the plan.\n\n### Codex\n\nPaste the issue text and provide the directory structure or key file list. Ask Codex to follow the instructions below.\n\n## The Prompt / Instructions for the Agent\n\nWhen asked to plan an implementation from an issue, follow these steps:\n\n### Step 1 — Understand the issue\n\nRead the issue thoroughly. Identify:\n- **Type**: Bug fix, new feature, enhancement, refactoring, documentation\n- **Goal**: What should be true after this is done?\n- **Acceptance criteria**: Are there explicit criteria? If not, infer them from the description.\n- **Out of scope**: What is the issue explicitly NOT asking for?\n\nIf the issue is ambiguous, note the ambiguity and state the assumption you're making to proceed.\n\n### Step 2 — Explore the codebase\n\nRead the relevant parts of the codebase:\n1. Use the directory structure to find files related to the feature area\n2. Read the most relevant source files — entry points, the component or service mentioned in the issue, related tests\n3. Identify the existing patterns (naming conventions, how similar features are implemented, how tests are structured)\n\nNote: for large codebases, focus on the most relevant 3–5 files. Don't read everything.\n\n### Step 3 — Identify all required changes\n\nList every change needed:\n- Files to create (new components, routes, tests, migrations)\n- Files to modify (existing logic, exports, route registrations, type definitions)\n- Files to delete (if the issue involves removal)\n- Configuration or environment changes (new env vars, updated config)\n\nFor each change, note the specific function, class, or section that needs to change — not just the file.\n\n### Step 4 — Produce the implementation plan\n\nOrder the changes from first to last. The order should follow a natural dependency graph — create types before using them, create database migrations before writing queries, write tests before or alongside implementation.\n\nFormat each step as:\n\n```\n### Step N — [Action verb] [what]\n**File**: `path/to/file.ts`\n**Change**: [Specific description of what to add, modify, or remove]\n**Why**: [Why this step is needed]\n**Notes**: [Any gotchas, patterns to follow, or decisions the implementer needs to make]\n```\n\n### Step 5 — List open questions\n\nIf there are design decisions the issue doesn't answer, list them. Don't block the plan — make a recommendation and flag that it was a judgment call.\n\n### Format the full output\n\n```markdown\n## Implementation Plan for: [Issue Title]\n\n### Issue Type\n[Bug / Feature / Enhancement / Refactor]\n\n### Goal\n[One sentence]\n\n### Acceptance Criteria\n- [ ] [Criterion 1]\n- [ ] [Criterion 2]\n...\n\n### Files to change\n- `path/to/file.ts` — [reason]\n- `path/to/new-file.ts` — [create new]\n\n---\n\n### Implementation Steps\n\n[Steps as described above]\n\n---\n\n### Open Questions / Decisions\n1. [Question] — **Recommendation**: [your recommendation]\n\n### Estimated Complexity\n[Small (< 2hrs) / Medium (half day) / Large (1–2 days) / XL (needs to be broken into sub-issues)]\n```\n\n## Example\n\n**Input to Agent:**\n> \"Use the Issue to PR Planner skill.\n>\n> **Issue #88: Add rate limiting to the login endpoint**\n>\n> Currently the `POST /api/auth/login` endpoint has no rate limiting. Attackers can brute-force passwords. We should limit login attempts to 5 per IP per 15 minutes. After 5 failed attempts, return a 429 with a message telling the user when they can retry.\"\n\n**Output from Agent:**\n\n> ## Implementation Plan for: Add rate limiting to the login endpoint\n>\n> ### Issue Type\n> Security enhancement\n>\n> ### Goal\n> Prevent brute-force attacks on the login endpoint by limiting failed attempts per IP.\n>\n> ### Acceptance Criteria\n> - [ ] After 5 failed login attempts from the same IP within 15 minutes, the endpoint returns 429\n> - [ ] The 429 response body includes a `retryAfter` field with seconds until the window resets\n> - [ ] Successful logins do not count against the limit\n> - [ ] Rate limit state resets after the 15-minute window\n>\n> ### Files to change\n> - `server/middleware/rateLimit.ts` — create new rate limiting middleware\n> - `server/routes/auth.ts` — apply middleware to login route\n> - `server/routes/auth.test.ts` — add tests for rate limiting behavior\n>\n> ---\n>\n> ### Implementation Steps\n>\n> #### Step 1 — Install and configure a rate limiter\n> **File**: `package.json`\n> **Change**: Add `express-rate-limit` as a dependency (`npm install express-rate-limit`)\n> **Why**: Provides a battle-tested sliding window implementation so we don't build this from scratch\n>\n> #### Step 2 — Create the login rate limit middleware\n> **File**: `server/middleware/rateLimit.ts`\n> **Change**: Create a `loginRateLimit` middleware using `express-rate-limit` configured for 5 attempts per 15 minutes, keyed by IP. Return a 429 with `{ error: 'Too many attempts', retryAfter: N }` on limit exceeded.\n> **Why**: Separating the middleware into its own file keeps the route file clean and makes the limiter independently testable\n> **Notes**: Use `skipSuccessfulRequests: true` so only failed logins count. Check if a Redis store is needed for multi-instance deployments.\n>\n> #### Step 3 — Apply middleware to the login route\n> **File**: `server/routes/auth.ts`\n> **Change**: Import `loginRateLimit` and add it as a middleware before the login handler: `router.post('/login', loginRateLimit, loginHandler)`\n> **Why**: Applies the limit only to login, not all auth routes\n>\n> #### Step 4 — Write tests\n> **File**: `server/routes/auth.test.ts`\n> **Change**: Add tests: (a) 5 failed attempts → 6th returns 429 with retryAfter, (b) successful login does not increment counter, (c) counter resets after window\n> **Notes**: Use `jest.useFakeTimers()` to simulate window expiry without waiting 15 real minutes\n>\n> ### Open Questions\n> 1. **Single-server vs. multi-instance** — In-memory rate limiting won't work correctly if there are multiple server instances. **Recommendation**: Use in-memory for now (single EC2), but note that a Redis store will be needed before horizontal scaling.\n>\n> ### Estimated Complexity\n> Small (< 2 hours)\n\n## Notes\n\n- A good plan is specific enough that another developer can execute it without asking questions. If you find yourself writing \"update the function,\" ask yourself which function and what exactly to change.\n- For large issues, recommend breaking them into sub-issues rather than producing a single 20-step plan.\n- This skill produces a plan, not the code. To execute the plan, work through the steps one at a time.","tags":["issue","planner","openagentskills","notysoty","agent-skills","claude","claude-code","claude-skills","cline","cursor","llm","llm-skills"],"capabilities":["skill","source-notysoty","skill-issue-to-pr-planner","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/issue-to-pr-planner","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 (7,610 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:22.269Z","embedding":null,"createdAt":"2026-05-18T13:20:43.367Z","updatedAt":"2026-05-18T19:13:22.269Z","lastSeenAt":"2026-05-18T19:13:22.269Z","tsv":"'/api/auth/login':660 '/login':956 '1':253,332,592,612,625,808,1014 '142':165 '15':682,746,780,874,1009 '2':321,345,594,626,850,1061 '20':1111 '2hrs':620 '3':364,389,397,933 '4':460,971 '429':690,751,753,881,985 '5':390,538,678,685,737,871,980 '6th':983 '88':649 'accept':184,279,589,734 'action':503 'add':189,514,650,707,799,818,946,977 'agent':85,128,239,640,703 'agents/skills/issue-to-pr-planner/skill.md':139 'ai':127,202 'align':107 'alongsid':495 'ambigu':94,307,310 'anoth':124,1071 'answer':551 'appli':793,934,960 'area':344 'ask':145,209,227,241,301,1077,1087 'assumpt':314 'attack':666,723 'attempt':676,687,731,740,872,886,982 'auth':968 'b':988 'battl':836 'battle-test':835 'behavior':804 'block':556 'bodi':755 'break':1100 'broken':632 'brute':669,721 'brute-forc':668,720 'bug':43,104,263,582 'build':845 'c':995 'call':569 'chang':23,76,113,401,404,435,443,454,467,508,597,785,817,859,942,976,1095 'check':920 'class':448 'claud':132 'clean':904 'cline':134 'code':22,116,133,1121 'codebas':60,324,331,383 'codex':213,228 'comment':187 'complex':618,1059 'compon':355,410 'concret':50 'config':440 'configur':432,811,869 'convent':370 'copi':135 'correct':1030 'count':770,919 'counter':994,996 'creat':408,480,485,601,787,851,860 'criteria':185,280,284,590,735 'criterion':591,593 'current':657 'cursor':188,201 'cursorrul':195 'databas':486 'day':623,627 'decis':531,546,611 'definit':423 'delet':426 'depend':478,825 'deploy':931 'describ':607 'descript':181,291,510 'design':545 'detail':79 'develop':82,125,1072 'directori':221,335 'document':269 'doesn':549 'done':278 'ec2':1045 'endpoint':656,661,713,727,749 'enhanc':267,584,717 'enough':78,1069 'entri':352 'env':437 'environ':434 'error':883 'estim':617,1058 'everi':403 'everyth':395 'exact':109,1093 'exampl':637 'exceed':891 'execut':86,1074,1123 'exist':68,367,417 'expiri':1006 'explicit':283,299 'explor':322 'export':419 'express':820,829,866 'express-rate-limit':819,828,865 'fail':686,730,738,917,981 'featur':41,102,266,343,373,583 'field':759 'file':19,65,137,225,339,351,391,406,414,424,458,506,595,783,815,857,899,903,940,974 'find':338,1081 'first':469 'fix':105,264 'flag':563 'focus':384 'follow':230,249,475,529 'forc':670,722 'format':497,570 'full':175,572 'function':447,1086,1090 'github':7,37,163 'goal':270,586,718 'good':1065 'gotcha':526 'graph':479 'half':622 'hand':119 'handler':954 'horizont':1056 'hour':1062 'identifi':62,261,365,398 'implement':16,55,121,161,245,375,463,496,533,575,603,704,805,840 'import':943 'in-memori':1022,1039 'includ':178,756 'increment':993 'independ':909 'infer':287 'input':638 'instal':809,827 'instanc':930,1021,1036 'instruct':191,232,236 'involv':430 'ip':680,733,744,878 'issu':1,8,25,38,148,155,157,164,168,176,206,216,248,256,259,298,305,361,429,548,578,580,636,643,648,714,1098,1105 'jest.usefaketimers':1002 'judgment':568 'keep':900 'key':224,876 'larg':382,624,1097 'last':471 'limit':652,665,674,709,729,773,775,790,803,814,822,831,855,868,890,908,962,1026 'list':74,226,402,539,552 'locat':20 'logic':418 'login':655,675,712,726,739,767,796,853,918,938,953,965,990 'loginhandl':958 'loginratelimit':862,944,957 'make':317,536,559,906 'mani':885 'markdown':574 'medium':621 'memori':1024,1041 'mention':358 'messag':693 'middlewar':791,794,856,863,895,935,950 'migrat':413,487 'minut':683,747,781,875,1011 'modifi':416,515 'multi':929,1020 'multi-inst':928,1019 'multipl':1034 'n':502,888 'name':369 'natur':477 'need':24,111,405,452,523,534,629,926,1054 'new':265,409,436,602,788 'note':308,380,444,524,911,1000,1047,1063 'npm':826 'one':587,1130 'open':540,609,1012 'order':73,465,473 'output':573,701 'package.json':816 'pane':203 'part':328 'password':671 'past':156,197,204,214 'path/to/file.ts':507,598 'path/to/new-file.ts':600 'pattern':69,368,527 'per':679,681,732,873 'plan':17,56,88,159,212,243,464,558,576,705,1066,1113,1118,1125 'planner':4,28,151,171,646 'point':353 'post':659 'pr':3,27,150,170,645 'prevent':719 'proceed':319 'produc':10,71,461,1108,1116 'project':142 'prompt':235 'provid':173,219,833 'queri':490 'question':541,610,613,1013,1078 'rate':651,664,708,774,789,802,813,821,830,854,867,1025 'rather':1106 're':316 'read':58,257,325,346,394 'real':1010 'reason':599 'recommend':561,614,616,1037,1099 'redi':923,1050 'refactor':268,585 'registr':421 'relat':340,362 'relev':64,327,349,388 'remov':431,517 'report':44 'request':42 'requir':400 'reset':765,777,997 'respons':754 'retri':700 'retryaft':758,887,987 'return':688,750,879,984 'root':143 'rout':411,420,797,902,939,969 'router.post':955 'scale':1057 'scope':294 'scratch':848 'second':761 'section':450 'secur':716 'sentenc':588 'separ':893 'server':1017,1035 'server/middleware/ratelimit.ts':786,858 'server/routes/auth.test.ts':798,975 'server/routes/auth.ts':792,941 'servic':357 'similar':372 'simul':1004 'singl':1016,1044,1110 'single-serv':1015 'skill':31,34,152,172,647,1115 'skill-issue-to-pr-planner' 'skipsuccessfulrequest':913 'slide':838 'small':619,1060 'sourc':350 'source-notysoty' 'specif':446,509,1068 'start':99 'state':312,776 'step':13,15,52,54,251,252,320,396,459,499,501,521,537,604,605,806,807,849,932,970,1112,1129 'step-by-step':12,51 'store':924,1051 'structur':222,336,379 'sub':635,1104 'sub-issu':634,1103 'success':766,989 'take':5,35 'tell':694 'test':363,377,412,492,800,837,973,978 'testabl':910 'text':158,177,207,217 'thorough':260 'time':1133 'titl':180,579 'topic-agent-skills' 'topic-claude' 'topic-claude-code' 'topic-claude-skills' 'topic-cline' 'topic-cursor' 'topic-llm' 'topic-llm-skills' 'topic-skills' 'true':274,914 'turn':46 'type':262,422,481,581,715 'understand':66,254 'updat':439,1084 'use':95,131,146,166,333,483,641,864,912,1001,1038 'user':696 'var':438 'verb':504 'vs':1018 'wait':1008 'window':764,782,839,999,1005 'within':745 'without':93,1007,1076 'won':1027 'work':90,122,1029,1126 'write':115,489,491,972,1083 'xl':628","prices":[{"id":"196005a8-1ac8-4fd2-bd0b-ccc1b7542244","listingId":"bd5bfce7-28b6-4ba8-8b11-dea645a61f5e","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:43.367Z"}],"sources":[{"listingId":"bd5bfce7-28b6-4ba8-8b11-dea645a61f5e","source":"github","sourceId":"Notysoty/openagentskills/issue-to-pr-planner","sourceUrl":"https://github.com/Notysoty/openagentskills/tree/main/skills/issue-to-pr-planner","isPrimary":false,"firstSeenAt":"2026-05-18T13:20:43.367Z","lastSeenAt":"2026-05-18T19:13:22.269Z"}],"details":{"listingId":"bd5bfce7-28b6-4ba8-8b11-dea645a61f5e","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"Notysoty","slug":"issue-to-pr-planner","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":"7b050a4669f3e7c50d83e47a21fc8969b7724d48","skill_md_path":"skills/issue-to-pr-planner/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Notysoty/openagentskills/tree/main/skills/issue-to-pr-planner"},"layout":"multi","source":"github","category":"openagentskills","frontmatter":{"name":"Issue to PR Planner","description":"Takes a GitHub issue and produces a step-by-step implementation plan with file locations and code changes needed."},"skills_sh_url":"https://skills.sh/Notysoty/openagentskills/issue-to-pr-planner"},"updatedAt":"2026-05-18T19:13:22.269Z"}}