{"id":"598d1776-0dfc-4373-8b05-d777f661f9b7","shortId":"pvwZvC","kind":"skill","title":"reply-to-pr-threads","tagline":"Draft, confirm, and post replies to GitHub PR review threads. Handles per-category reply formatting, re-fetches thread resolution state so auto-resolved threads are skipped, and posts via GraphQL. Use when the user asks to \"reply to PR threads\", \"post PR thread replies\", or \"draf","description":"# Reply to PR Threads\n\nDraft replies for a processed review-thread list, confirm with the user, and post the surviving drafts.\n\n## Step 1: Run `/github-voice` Skill\n\nRun the `/github-voice` skill to load voice rules and the insider-vs-outsider detection.\n\n## Step 2: Re-fetch Thread State\n\nAuto-detect owner, repo, and PR number from the current branch if not provided, then query the current resolution state:\n\n```bash\ngh api graphql -f query='\nquery($owner: String!, $repo: String!, $pr: Int!) {\n  repository(owner: $owner, name: $repo) {\n    pullRequest(number: $pr) {\n      reviewThreads(first: 100) {\n        nodes { id isResolved }\n      }\n    }\n  }\n}' -f owner='{owner}' -f repo='{repo}' -F pr={pr_number}\n```\n\nDrop threads whose `isResolved` is now true. Reviewers or bots such as CodeRabbit may resolve threads after the original fetch, and drafting replies for them is wasted work.\n\n## Step 3: Draft Replies\n\nUse the processed-thread list from conversation context. Each entry has: thread id, file path, line, category (`fix`, `skip`, `answer`, or `clarify`), and per-category payload.\n\nKeep every reply to one or two sentences. No bullet-point reasoning. No bolded labels.\n\n**fix**: payload is a commit SHA, optionally with a divergence note.\n\n```\nFixed in <commit-sha>.\n```\n\nOnly add a brief sentence after the SHA when the fix meaningfully diverges from what the reviewer suggested. Otherwise the SHA alone is enough.\n\n**skip**: payload is the skip reasoning. State the reasoning directly. Do not apologize or hedge.\n\n**answer**: payload is raw answer text from `/answer-reviewer-questions`. Tighten to one or two sentences and apply `/github-voice` rules (no em dashes, natural tone). Do not cite transcripts or mention Claude. The reply reads as the implementer's own explanation.\n\n**clarify**: payload is a user-directed question. Draft it as directed.\n\n## Step 4: Present Drafts and Confirm\n\nOutput all drafts as text, grouped by file:\n\n```\n### <file-path>\n\n**Thread <id>** (<category>, line <line>)\nReviewer: <original comment, truncated if long>\nReply: <drafted reply>\n```\n\nThen use `AskUserQuestion` to ask whether to post. Offer:\n\n- **Post** — post all drafts as shown\n- **Cancel** — skip posting\n\n## Step 5: Post Replies\n\nFor each approved draft, post via the reply mutation:\n\n```bash\ngh api graphql -f query='\nmutation($threadId: ID!, $body: String!) {\n  addPullRequestReviewThreadReply(input: {pullRequestReviewThreadId: $threadId, body: $body}) {\n    comment { id }\n  }\n}' -f threadId=\"THREAD_ID\" -f body=\"REPLY_BODY\"\n```\n\nSubstitute `THREAD_ID` with the thread's id and `REPLY_BODY` with the drafted reply text for each post. Report what was posted and what was skipped (due to auto-resolution between re-fetch and posting).\n\nThen use the TaskList tool and proceed to any remaining task.\n\n## Rules\n\n- Never resolve or dismiss a review thread. Only reply. Let the reviewer resolve.\n- If a post mutation fails because the thread is already resolved, log the skip and continue with the rest.","tags":["reply","threads","turbo","tobihagemann","agent-skills","claude-code","claude-skills","developer-tools","skills"],"capabilities":["skill","source-tobihagemann","skill-reply-to-pr-threads","topic-agent-skills","topic-claude-code","topic-claude-skills","topic-developer-tools","topic-skills"],"categories":["turbo"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/tobihagemann/turbo/reply-to-pr-threads","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add tobihagemann/turbo","source_repo":"https://github.com/tobihagemann/turbo","install_from":"skills.sh"}},"qualityScore":"0.590","qualityRationale":"deterministic score 0.59 from registry signals: · indexed on github topic:agent-skills · 280 github stars · SKILL.md body (3,014 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-22T00:54:11.367Z","embedding":null,"createdAt":"2026-04-18T22:03:59.390Z","updatedAt":"2026-04-22T00:54:11.367Z","lastSeenAt":"2026-04-22T00:54:11.367Z","tsv":"'/answer-reviewer-questions':297 '/github-voice':80,84,306 '1':78 '100':148 '2':98 '3':191 '4':342 '5':383 'add':252 'addpullrequestreviewthreadrepli':406 'alon':272 'alreadi':494 'answer':214,290,294 'api':127,397 'apolog':287 'appli':305 'approv':388 'ask':43,368 'askuserquest':366 'auto':30,105,452 'auto-detect':104 'auto-resolut':451 'auto-resolv':29 'bash':125,395 'bodi':404,410,411,419,421,432 'bold':236 'bot':171 'branch':115 'brief':254 'bullet':232 'bullet-point':231 'cancel':379 'categori':19,211,220 'cite':315 'clarifi':216,329 'claud':319 'coderabbit':174 'comment':359,412 'commit':242 'confirm':7,68,346 'context':202 'continu':500 'convers':201 'current':114,122 'dash':310 'detect':96,106 'direct':284,335,340 'dismiss':475 'diverg':247,263 'draf':54 'draft':6,59,76,183,192,337,344,349,376,389,435 'drop':162 'due':449 'em':309 'enough':274 'entri':204 'everi':223 'explan':328 'f':129,152,155,158,399,414,418 'fail':489 'fetch':24,101,181,457 'file':208,354 'first':147 'fix':212,238,249,261 'format':21 'gh':126,396 'github':12 'graphql':38,128,398 'group':352 'handl':16 'hedg':289 'id':150,207,403,413,417,424,429 'implement':325 'input':407 'insid':93 'insider-vs-outsid':92 'int':137 'isresolv':151,165 'keep':222 'label':237 'let':481 'line':210,356 'list':67,199 'load':87 'log':496 'long':362 'may':175 'meaning':262 'mention':318 'mutat':394,401,488 'name':141 'natur':311 'never':472 'node':149 'note':248 'number':111,144,161 'offer':372 'one':226,300 'option':244 'origin':180,358 'otherwis':269 'output':347 'outsid':95 'owner':107,132,139,140,153,154 'path':209 'payload':221,239,276,291,330 'per':18,219 'per-categori':17,218 'point':233 'post':9,36,49,73,371,373,374,381,384,390,440,444,459,487 'pr':4,13,47,50,57,110,136,145,159,160 'present':343 'proceed':466 'process':63,197 'processed-thread':196 'provid':118 'pullrequest':143 'pullrequestreviewthreadid':408 'queri':120,130,131,400 'question':336 'raw':293 're':23,100,456 're-fetch':22,99,455 'read':322 'reason':234,280,283 'remain':469 'repli':2,10,20,45,52,55,60,184,193,224,321,363,385,393,420,431,436,480 'reply-to-pr-thread':1 'repo':108,134,142,156,157 'report':441 'repositori':138 'resolut':26,123,453 'resolv':31,176,473,484,495 'rest':503 'review':14,65,169,267,357,477,483 'review-thread':64 'reviewthread':146 'rule':89,307,471 'run':79,82 'sentenc':229,255,303 'sha':243,258,271 'shown':378 'skill':81,85 'skill-reply-to-pr-threads' 'skip':34,213,275,279,380,448,498 'source-tobihagemann' 'state':27,103,124,281 'step':77,97,190,341,382 'string':133,135,405 'substitut':422 'suggest':268 'surviv':75 'task':470 'tasklist':463 'text':295,351,437 'thread':5,15,25,32,48,51,58,66,102,163,177,198,206,355,416,423,427,478,492 'threadid':402,409,415 'tighten':298 'tone':312 'tool':464 'topic-agent-skills' 'topic-claude-code' 'topic-claude-skills' 'topic-developer-tools' 'topic-skills' 'transcript':316 'true':168 'truncat':360 'two':228,302 'use':39,194,365,461 'user':42,71,334 'user-direct':333 'via':37,391 'voic':88 'vs':94 'wast':188 'whether':369 'whose':164 'work':189","prices":[{"id":"184e5848-837c-4eff-8365-3c1ee0d6e49f","listingId":"598d1776-0dfc-4373-8b05-d777f661f9b7","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"tobihagemann","category":"turbo","install_from":"skills.sh"},"createdAt":"2026-04-18T22:03:59.390Z"}],"sources":[{"listingId":"598d1776-0dfc-4373-8b05-d777f661f9b7","source":"github","sourceId":"tobihagemann/turbo/reply-to-pr-threads","sourceUrl":"https://github.com/tobihagemann/turbo/tree/main/skills/reply-to-pr-threads","isPrimary":false,"firstSeenAt":"2026-04-18T22:03:59.390Z","lastSeenAt":"2026-04-22T00:54:11.367Z"}],"details":{"listingId":"598d1776-0dfc-4373-8b05-d777f661f9b7","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"tobihagemann","slug":"reply-to-pr-threads","github":{"repo":"tobihagemann/turbo","stars":280,"topics":["agent-skills","claude-code","claude-skills","developer-tools","skills"],"license":"mit","html_url":"https://github.com/tobihagemann/turbo","pushed_at":"2026-04-21T12:22:12Z","description":"A composable dev process for Claude Code, packaged as modular skills.","skill_md_sha":"09b587ae094efb0353f7b6101af22ba7d5798b3c","skill_md_path":"skills/reply-to-pr-threads/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/tobihagemann/turbo/tree/main/skills/reply-to-pr-threads"},"layout":"multi","source":"github","category":"turbo","frontmatter":{"name":"reply-to-pr-threads","description":"Draft, confirm, and post replies to GitHub PR review threads. Handles per-category reply formatting, re-fetches thread resolution state so auto-resolved threads are skipped, and posts via GraphQL. Use when the user asks to \"reply to PR threads\", \"post PR thread replies\", or \"draft PR reply messages\"."},"skills_sh_url":"https://skills.sh/tobihagemann/turbo/reply-to-pr-threads"},"updatedAt":"2026-04-22T00:54:11.367Z"}}