LogoSkills

issue-processor-agent

Specialized agent for sequential ZenHub issue processing (simple flat fallback โ€” superseded by /dev:batch for hierarchical Epics)

ํ•ญ๋ชฉ๋‚ด์šฉ
triggers@issue-processor
MCP Serverszenhub, sequential
Modelsonnet

โš ๏ธ Superseded by /dev:batch (commands/dev/batch.md) for any Epic with a real Storyโ†’Sub-task hierarchy. This agent loops over epic.children flatly โ€” it does not distinguish Story vs Sub-task, does not create an Epic branch, and does not apply the hierarchical branch strategy (branch-hierarchy). Use /dev:batch as the default entry point; call @issue-processor directly only when you deliberately want the simpler flat loop (e.g. an Epic whose children are all independent, parent-less issues).

@issue-processor โ€” Epic ํ•˜์œ„ ์ด์Šˆ ํ‰๋ฉด ์ฒ˜๋ฆฌ (๋‹จ์ˆœ ํด๋ฐฑ)#

ํ•œ๋งˆ๋””๋กœ#

ํฐ ์ž‘์—… ๋ฌถ์Œ(Epic) ์•„๋ž˜์— ๋‹ฌ๋ฆฐ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ํ•  ์ผ(์ด์Šˆ)์„, ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•ด ์ฃผ๋Š” ๋‹ด๋‹น ์ผ๊พผ์ž…๋‹ˆ๋‹ค. ๊ณต์žฅ์˜ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ์ฒ˜๋Ÿผ, ์ด์Šˆ๋ฅผ ํ•œ ๊ฑด์”ฉ ์ง‘์–ด "์ž‘์—… ์ค‘ โ†’ ์ฝ”๋“œ ์ž‘์„ฑ โ†’ ๊ฒ€ํ†  ์š”์ฒญ โ†’ ์™„๋ฃŒ"๊นŒ์ง€ ํ˜๋ ค๋ณด๋‚ด๊ณ  ๋‹ค์Œ ์ด์Šˆ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

Story/Sub-task ๊ณ„์ธต์„ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ํ‰๋ฉด ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. Epic ์•„๋ž˜ Storyโ†’Sub-task ๊ณ„์ธต์ด ์‹ค์ œ๋กœ ์žˆ๋‹ค๋ฉด /dev:batch(์ •์‹ ๊ณ„์ธต ์ฒ˜๋ฆฌ, ๋ธŒ๋žœ์น˜ ๋ถ„๋ฆฌ)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด ์—์ด์ „ํŠธ๋Š” @issue-processor๋กœ ์ง์ ‘ ํ˜ธ์ถœํ•  ๋•Œ๋งŒ ์”๋‹ˆ๋‹ค.

๋ˆ„๊ฐ€ยท์–ธ์ œ ์“ฐ๋‚˜์š”#

  • Epic ์ž์‹๋“ค์ด ๊ณ„์ธต ์—†์ด(๋ชจ๋‘ ๋…๋ฆฝ์ ์œผ๋กœ) ์Œ“์—ฌ ์žˆ์–ด, ๊ตณ์ด Story/Sub-task ๋ธŒ๋žœ์น˜ ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š” ์—†์„ ๋•Œ
  • @issue-processor๋กœ ์ง์ ‘ ํ˜ธ์ถœํ•ด ๋‹จ์ˆœ ํ‰๋ฉด ์ฒ˜๋ฆฌ๋ฅผ ์›ํ•  ๋•Œ โ€” ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์—๋Š” /dev:batch๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋ฌด์—‡์„ ํ•ด์ฃผ๋‚˜์š”#

Epic์— ์†ํ•œ ์ž์‹ ์ด์Šˆ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ฐ ์ด์Šˆ๋งˆ๋‹ค ๋‹ค์Œ์„ ์ž๋™์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ZenHub ๋ณด๋“œ์—์„œ ์ด์Šˆ ์ƒํƒœ๋ฅผ ์ž‘์—… ์ค‘(In Progress) โ†’ ๊ฒ€ํ† /QA(Review/QA) ๋กœ ์ด๋™
  • ์ด์Šˆ๋ณ„ ์ž‘์—… ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ๊ณผ ์ปค๋ฐ‹
  • GitHub PR(Pull Request) ์ƒ์„ฑ ๋ฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ˜์˜
  • ๋ณ‘ํ•ฉ(merge) ํ›„ ์ด์Šˆ๋ฅผ ํ™•์‹คํžˆ ์ข…๋ฃŒ(Closed) ์ƒํƒœ๋กœ ๋งˆ๊ฐ (Done์— ๋ฐฉ์น˜ํ•˜์ง€ ์•Š์Œ)
  • ๋งˆ์ง€๋ง‰์— ์ฒ˜๋ฆฌํ•œ ์ด์Šˆ ๋ชฉ๋ก๊ณผ ๋‚จ์€ ์ด์Šˆ๋ฅผ ์ •๋ฆฌํ•œ ์™„๋ฃŒ ๋ณด๊ณ 

์–ด๋–ป๊ฒŒ ์“ฐ๋‚˜์š”#

# ์Šฌ๋ž˜์‹œ ๋ช…๋ น์œผ๋กœ ์ผ๊ด„ ์ฒ˜๋ฆฌ ์‹คํ–‰
/dev:batch

# ๋˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœ
@issue-processor

์œ„ ๋ช…๋ น์€ Epic ์•„๋ž˜ ์ด์Šˆ๋“ค์„ ์ž๋™์œผ๋กœ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. (๋ณ„๋„ ์˜ต์…˜ยทํ”Œ๋ž˜๊ทธ๋Š” ์—†์Šต๋‹ˆ๋‹ค.)

์•ˆ์—์„œ ๋ฌด์Šจ ์ผ์ด ๋ฒŒ์–ด์ง€๋‚˜์š”#

ํฌ๊ฒŒ ์„ธ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

  1. ์ด์Šˆ ๋ถ„์„ โ€” Epic ์•„๋ž˜ ๋ชจ๋“  ์ž์‹ ์ด์Šˆ๋ฅผ ์กฐํšŒํ•˜๊ณ , ์˜์กด ์ˆœ์„œ๋ฅผ ํŒŒ์•…ํ•ด ์ฒ˜๋ฆฌ ๊ณ„ํš์„ ์„ธ์›๋‹ˆ๋‹ค.
  2. ์ด์Šˆ๋ณ„ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ โ€” ์ด์Šˆ ํ•˜๋‚˜๋งˆ๋‹ค ๋‹ค์Œ์„ ์ฐจ๋ก€๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์ƒํƒœ๋ฅผ "์ž‘์—… ์ค‘"์œผ๋กœ ์ด๋™
    • ์ฝ”๋“œ ๊ตฌํ˜„(๋˜๋Š” ๊ธฐ์กด ๊ตฌํ˜„ ํ™•์ธ) ํ›„ ์ž‘์—… ๋ธŒ๋žœ์น˜ ์ƒ์„ฑยท์ปค๋ฐ‹
    • ์ƒํƒœ๋ฅผ "๊ฒ€ํ† /QA"๋กœ ์ด๋™ํ•˜๊ณ  PR ์ƒ์„ฑ
    • ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๊ธฐ๋‹ค๋ ค ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜
    • ๋ณ‘ํ•ฉ ํ›„ ์ด์Šˆ๊ฐ€ ์‹ค์ œ๋กœ ์ข…๋ฃŒ๋๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์•ˆ ๋์œผ๋ฉด ์ง์ ‘ ์ข…๋ฃŒ ์ฒ˜๋ฆฌ
    • ๋‹ค์Œ ์ด์Šˆ๋กœ ์ด๋™
  3. ์™„๋ฃŒ ๋ณด๊ณ  โ€” ์ฒ˜๋ฆฌํ•œ ์ด์Šˆ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๊ณ  ๋‚จ์€ ์ด์Šˆ๋ฅผ ์ ๊ฒ€ํ•ฉ๋‹ˆ๋‹ค.

์ด์Šˆ์— BDD ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์œผ๋ฉด, ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ฝ์–ด ์ฝ”๋“œ์™€ ๋Œ€์‘์‹œํ‚ค๊ณ  ๋น ์ง„ ๊ตฌํ˜„์„ ๋ณด์™„ํ•œ ๋’ค ํ™”๋ฉด์—์„œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด์Šˆ ์ƒํƒœ๊ฐ€ "Done"์— ๋จธ๋ฌด๋Š” ๊ฒƒ์„ ๋ง‰๊ณ , ๋ณ‘ํ•ฉ ์‹œ GitHub๊ณผ ZenHub๊ฐ€ ๋ชจ๋‘ ์ข…๋ฃŒ ์ƒํƒœ๋กœ ๋™๊ธฐํ™”๋˜๋„๋ก ํ•œ ๋ฒˆ ๋” ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.


โš™๏ธ ์ƒ์„ธ ์˜ต์…˜ยท์‹คํ–‰ ๋ช…์„ธ (๊ฐœ๋ฐœ์ž / AI ์—์ด์ „ํŠธ์šฉ)

Role#

Specialized agent for automatically processing child issues under an Epic sequentially

Detailed Workflow#

Step 1: Issue Analysis#

  • Query all child issues under the Epic
  • Identify dependency order
  • Create implementation plan

Step 2: Per-Issue Processing (Loop)#

โš ๏ธ moveIssueToPipeline ๋Š” pipelineId(GraphQL id) ๋ฅผ ์š”๊ตฌํ•œ๋‹ค โ€” ์ด๋ฆ„ ๋ฌธ์ž์—ด์„ ๋„˜๊ธฐ๋ฉด ์•ˆ ๋œ๋‹ค. ๋ฃจํ”„ ์ „์— fail-closed ๋กœ id ๋ฅผ ํ•ด์„ํ•œ๋‹ค:

const ws  = await mcp__zenhub__getWorkspacePipelinesAndRepositories();
const pid = (n) = >   { const p = ws.pipelines.find(p = >   p.name === n); if (!p) throw new Error(` ' ${n} '   ์—†์Œ. ๋ผ์ด๋ธŒ: ${ws.pipelines.map(p = >   p.name).join( " ,  " )}`); return p.id; };
const inProgressId = pid( " In Progress " ), reviewQaId = pid( " Review/QA " );
foreach issue in epic.children:
  1. moveIssueToPipeline({ issueId: issue.id, pipelineId: inProgressId })
  2. Implement code or verify existing implementation
  3. git checkout -b feature/{issue-number}-{short-desc}
  4. Commit changes
  5. moveIssueToPipeline({ issueId: issue.id, pipelineId: reviewQaId })
  6. gh pr create --title  " {issue.title} "   --body  " Closes #{issue.number} " 
   7. Wait for code review and apply feedback
  8. Squash merge (merge = Close): `Closes #` auto-closes GitHub โ†’ ZenHub syncs to Closed
  8.5. Verify + fallback: `gh issue view {n} --json state` โ†’ if not CLOSED, `gh issue close {n} --reason completed`;
       `searchClosedIssues  " #{n} " ` โ†’ if missing, `updateIssue state:CLOSED`. Never park in Done (Done โ‰  closed).
  9. Move to next issue

Step 3: Completion Report#

  • Output list of processed issues
  • Check remaining issues

MCP Tool Usage#

Pipeline Move#

{
   " tool " :  " mcp__zenhub__moveIssueToPipeline " ,
   " arguments " : {
     " issueId " :  " {graphql_issue_id} " ,
     " pipelineId " :  " {target_pipeline_id} " 
   }
}
{
   " tool " :  " mcp__zenhub__searchLatestIssues " ,
   " arguments " : {
     " query " :  " parent:{epic_number} " 
   }
}

Issue Status Update#

{
   " tool " :  " mcp__zenhub__updateIssue " ,
   " arguments " : {
     " issueId " :  " {graphql_issue_id} " ,
     " state " :  " CLOSED " 
   }
}

Pipeline Query#

Pipeline IDs differ per workspace. Dynamic query:

const workspace = await mcp__zenhub__getWorkspacePipelinesAndRepositories();
const pipelines = workspace.pipelines;
// Find by name in pipelines:  " New Issues " ,  " In Progress " ,  " Review/QA " , etc.
// Done pipeline is NOT used (Done โ‰  closed). Merge = Close: `Closes #` โ†’ GitHub closed
// โ†’ ZenHub syncs to Closed. Verify with searchClosedIssues + fallback updateIssue.

BDD Scenario Verification Pattern#

  1. Read scenarios: Check BDD scenarios in the issue
  2. Code mapping: Identify code locations for each scenario step
  3. Gap analysis: Identify missing implementations
  4. Supplement: Add/modify code as needed
  5. Verification complete: Confirm via hot reload on UI

Error Handling#

Pipeline Move Failure#

  • Verify issue ID
  • Verify pipeline ID
  • Check permissions

PR Creation Failure#

  • Verify branch state
  • Verify remote branch push
  • Check GitHub auth status

Issue Close Failure#

  • Check issue state
  • Verify linked PR merge status

Best Practices#

  1. Small commits: Commit changes in small units
  2. Clear commit messages: Use Korean Conventional Commits
  3. BDD scenario first: Scenario-based verification
  4. Use hot reload: Verify changes immediately
  5. Apply code review feedback: Actively address feedback