| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| triggers | @issue-processor |
| MCP Servers | zenhub, sequential |
| Model | sonnet |
โ ๏ธ Superseded by
/dev:batch(commands/dev/batch.md) for any Epic with a real StoryโSub-task hierarchy. This agent loops overepic.childrenflatly โ 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:batchas the default entry point; call@issue-processordirectly 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 ์๋ ์ด์๋ค์ ์๋์ผ๋ก ์์๋๋ก ์ฒ๋ฆฌํฉ๋๋ค. (๋ณ๋ ์ต์ ยทํ๋๊ทธ๋ ์์ต๋๋ค.)
์์์ ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง๋์#
ํฌ๊ฒ ์ธ ๋จ๊ณ๋ก ์งํ๋ฉ๋๋ค.
- ์ด์ ๋ถ์ โ Epic ์๋ ๋ชจ๋ ์์ ์ด์๋ฅผ ์กฐํํ๊ณ , ์์กด ์์๋ฅผ ํ์ ํด ์ฒ๋ฆฌ ๊ณํ์ ์ธ์๋๋ค.
-
์ด์๋ณ ๋ฐ๋ณต ์ฒ๋ฆฌ โ ์ด์ ํ๋๋ง๋ค ๋ค์์ ์ฐจ๋ก๋ก ์ํํฉ๋๋ค.
- ์ํ๋ฅผ "์์ ์ค"์ผ๋ก ์ด๋
- ์ฝ๋ ๊ตฌํ(๋๋ ๊ธฐ์กด ๊ตฌํ ํ์ธ) ํ ์์ ๋ธ๋์น ์์ฑยท์ปค๋ฐ
- ์ํ๋ฅผ "๊ฒํ /QA"๋ก ์ด๋ํ๊ณ PR ์์ฑ
- ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๊ธฐ๋ค๋ ค ํผ๋๋ฐฑ ๋ฐ์
- ๋ณํฉ ํ ์ด์๊ฐ ์ค์ ๋ก ์ข ๋ฃ๋๋์ง ํ์ธํ๊ณ , ์ ๋์ผ๋ฉด ์ง์ ์ข ๋ฃ ์ฒ๋ฆฌ
- ๋ค์ ์ด์๋ก ์ด๋
- ์๋ฃ ๋ณด๊ณ โ ์ฒ๋ฆฌํ ์ด์ ๋ชฉ๋ก์ ์ถ๋ ฅํ๊ณ ๋จ์ ์ด์๋ฅผ ์ ๊ฒํฉ๋๋ค.
์ด์์ 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 issueStep 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} "
}
}Issue Search#
{
" 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#
- Read scenarios: Check BDD scenarios in the issue
- Code mapping: Identify code locations for each scenario step
- Gap analysis: Identify missing implementations
- Supplement: Add/modify code as needed
- 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#
- Small commits: Commit changes in small units
- Clear commit messages: Use Korean Conventional Commits
- BDD scenario first: Scenario-based verification
- Use hot reload: Verify changes immediately
- Apply code review feedback: Actively address feedback