| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| Invoke | /zenhub:epic |
| Aliases | /zenhub:story, /issue:create |
| Tools | Read, Edit, Write, Glob, Grep |
| Model | sonnet |
| Skills | zenhub |
| MCP Servers | zenhub |
/zenhub:epic โ ๊ธฐํ์ ZenHub ์ผ๊ฐ์ผ๋ก ์๋ ์ ๋ฆฌ#
ํ๋ง๋๋ก#
๋จธ๋ฆฟ์ ๊ธฐํ์ด๋ Figma ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ, ZenHub์ ์ผ๊ฐ(Initiative โ Project โ Epic โ Story โ ์ธ๋ถ์์ ) ํํ๋ก ์๋ ์ ๋ฆฌํด ์ฃผ๋ ๋น์์ ๋๋ค. ํฐ ๋ชฉํ๋ฅผ ์ค๊ฐ ๋ชฉํ๋ก, ๋ค์ ํ๋ฉด ๋จ์ ์์ ์ผ๋ก ์ชผ๊ฐ๊ณ , ๋ฌด์๋ถํฐ ํ ์ง ์ฐ์ ์์๊น์ง ๋งค๊ฒจ ๋ณด๋์ ์ค ์ธ์ ์ค๋๋ค.
๋๊ฐยท์ธ์ ์ฐ๋์#
- ๊ธฐํยทPMยท๊ฐ๋ฐ ๋ด๋น์๊ฐ, ์ ๊ธฐ๋ฅ์ ZenHub ์ผ๊ฐ์ผ๋ก ๋ง๋ค์ด ์ฐฉ์ํ๋ ค ํ ๋
- ๋์์ธ(Figma) ๋ถ์์ด ๋๋, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ค์ ์์ ํฐ์ผ์ผ๋ก ์ฎ๊ธฐ๊ณ ์ถ์ ๋
- ์ฌ๋ฌ ํ๋ฉดยท์์ ์ ๋ง๋ค๋ฉด์ ๋ฌด์๋ถํฐ ํ ์ง ์ฐ์ ์์(P0/P1/P2) ์ ์ผ์ ์ ํจ๊ป ์ ๋ฆฌํ๊ณ ์ถ์ ๋
๋ฌด์์ ํด์ฃผ๋์#
- ZenHub์ Initiative(์ ํ) โ Project(์ ํ) โ Epic โ Story โ ์ธ๋ถ์์ (Sub-task) ๊ณ์ธต ๊ตฌ์กฐ๋ก ์ผ๊ฐ์ ๋ง๋ค์ด ์ค๋๋ค.
- ๊ฐ ์ผ๊ฐ์ ํฉ๊ฒฉ ๊ธฐ์ค(Acceptance Criteria) ๊ณผ BDD ํ ์คํธ ์๋๋ฆฌ์ค๋ฅผ ํ๊ตญ์ด๋ก ๋ถ์ฌ ์ค๋๋ค.
-
๋ง๋ค๊ธฐ ์ ์ ์ฐ์ ์์๋ฅผ ์ ์๋ก ๋งค๊ฒจ
p0/p1/p2๋ผ๋ฒจ์ ๋ฌ๊ณ , ์ฐ์ ์์ ์์๋๋ก ๋ณด๋ ํ์ดํ๋ผ์ธ์ ๋ฐฐ์นํฉ๋๋ค. - ์คํ ๋ฆฌ ํฌ์ธํธ(๋์ด๋ ์ ์)์ ์ผ์ (์์ยท์ข ๋ฃ์ผ)์ ๋ฃ์ด ๋ก๋๋งต์ ํ์๋๊ฒ ํฉ๋๋ค.
- ์ ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ํ์ผ๋ค๋ก ๋จ๊น๋๋ค:
.claude/docs/{๊ธฐ๋ฅ}/zenhub/
โโโ epic.md
โโโ stories/
โโโ list_story.md
โโโ detail_story.md
โโโ form_story.md
์ด๋ป๊ฒ ์ฐ๋์#
# ๊ธฐ๋ณธ: Epic + Story ๋ฌถ์ ์์ฑ
/zenhub:epic
# ๋ณ์นญ(๊ฐ์ ์์ด์ ํธ๋ฅผ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ํธ์ถ)
/zenhub:story
/issue:create
ํธ์ถํ๋ฉด ์ฐ์ ์์๋ฅผ ๋จผ์ ๊ฒํ ํด ๋ณด์ฌ์ฃผ๊ณ , ์ฌ์ฉ์๊ฐ ํ์ธํ ๋ค์์ผ ์ค์ ์ผ๊ฐ์ ๋ง๋ญ๋๋ค. (๋ง๋ ๋ค์๋ ์ฐ์ ์์ ๋ผ๋ฒจ์ ๋ฐ๊ฟ ์ ์์ผ๋ฏ๋ก, ์์ฑ ์ ํ์ธ์ด ์ค์ํฉ๋๋ค.)
์์์ ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง๋์#
-
์ฐ์ ์์ ๋จผ์ ์ ํ๊ธฐ โ ์์กด์ฑยท๊ฐ์นยท์ํยท๋
ธ๋ ฅ์ ์ ์๋ก ๋งค๊ฒจ ์ผ๊ฐ๋ง๋ค
p0/p1/p2๋ฅผ ์ ํฉ๋๋ค. (๋ผ๋ฒจ์ ์์ฑ ํ ๋ชป ๋ฐ๊พธ๋ฏ๋ก ์์ฑ๋ณด๋ค ๋จผ์ ํฉ๋๋ค.) - ๊ณ์ธต ์์๋๋ก ์์ฑ โ Project(์์ฒญ ์) โ Epic โ Story ์ฌ๋ฌ ๊ฐ โ ์ธ๋ถ์์ ์์ผ๋ก ๋ง๋ค๊ณ , ๋ถ๋ชจ-์์ ๊ด๊ณ๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค.
- ์ ์ยท์ผ์ ์ ๋ ฅ โ ์คํ ๋ฆฌ ํฌ์ธํธ์ ์์ยท์ข ๋ฃ์ผ์ ํจ๊ป ๋ฃ์ต๋๋ค. (๋ ๋ค ๋ฃ์ด์ผ ๋ก๋๋งต ์ผ์ ๋ง๋์ ํ์๋ฉ๋๋ค.)
- ๋ณด๋ ์ค ์ธ์ฐ๊ธฐ โ ์ฐ์ ์์๊ฐ ๋์ ์(P0 โ P1 โ P2)์ผ๋ก ํ์ดํ๋ผ์ธ์ ๋ฐฐ์นํฉ๋๋ค.
- ์คํ๋ฆฐํธ ๋ฐฐ์ โ ์์ฒญ ์ P0 ์คํ ๋ฆฌ๋ฅผ ์คํ๋ฆฐํธ์ ๋ฃ์ต๋๋ค.
โ๏ธ ์์ธ ์ต์ ยท์คํ ๋ช ์ธ (๊ฐ๋ฐ์ / AI ์์ด์ ํธ์ฉ)
Role#
- Project Creation (optional): Create Project-level issues that wrap multiple Epics
- Epic Creation: Create Feature-level Epics
- Story Creation: Create screen-level Stories (under Epic)
- Acceptance Criteria Attachment: Attach BDD scenario-based Acceptance Criteria
- Priority Review: Score every issue (dependency/value/risk/effort) before creation and assign
p0/p1/p2 - Pipeline Sorting: Place created issues into pipelines per the priority matrix
- Label Management: Auto-apply appropriate labels
ZenHub MCP Tools#
| Tool | Purpose |
|---|---|
createGitHubIssue | Create GitHub issue (required โ createZenhubIssue prohibited, see rules/zenhub-conventions.md) |
setParentForIssues | Set Project-Epic / Epic-Story relationship |
moveIssueToPipeline | Move Pipeline (โ ๏ธ no in-pipeline position param) |
setIssueEstimate | Set Story Points (SP only โ does not affect the timeline) |
setDatesForIssue | Set timeline start/end dates (required for roadmap display โ needs zenhubOrganizationId) |
setIssueType | Change Issue Type |
getIssueTypes | Query Issue Type list (includes hierarchy level) |
getUpcomingSprint / listRecentSprints | Query Sprints |
addIssuesToSprints | Assign P0 Stories to Sprint |
Dynamic Workspace Info Query (required before issue creation)#
Issue Type ID, Repository ID, and Pipeline ID differ per workspace.
Dynamically query based on the workspace configured in .mcp.json at the project root:
// 1. Repository ID + Pipeline ID
const workspace = await mcp__zenhub__getWorkspacePipelinesAndRepositories();
const repoId = workspace.githubRepositories.find(r = > /* select GitHub repo */).id;
// 2. Issue Type ID (level: 1=Initiative, 2=Project, 3=Epic, 4=Feature/Bug/Task, 5=Sub-task)
const issueTypes = await mcp__zenhub__getIssueTypes({ repositoryId: repoId });
const initiativeType = issueTypes.find(t = > t.name === " Initiative " ); // may be absent โ fallback to Project/Epic top-level
const projectType = issueTypes.find(t = > t.name === " Project " ); // may be absent โ fallback to Epic top-level
const epicTypeId = issueTypes.find(t = > t.name === " Epic " ).id;
const featureTypeId = issueTypes.find(t = > t.name === " Feature " ).id;
const subtaskTypeId = issueTypes.find(t = > t.name === " Sub-task " ).id;Workflow#
0. Priority review (score dependency/value/risk/effort โ p0/p1/p2 per issue)
โ (labels are immutable after creation โ review MUST precede creation)
0.5. Create Initiative issue, if requested (createGitHubIssue + issueTypeId=Initiative)
โ
1. Create Project issue, if requested (createGitHubIssue + issueTypeId=Project, parentIssueId=Initiative when created)
โ
2. Create Epic issue (createGitHubIssue + issueTypeId=Epic, parentIssueId=Project, or =Initiative directly if no Project)
โ
3. Create Story issues (createGitHubIssue + issueTypeId=Feature ร N, parentIssueId=Epic)
โ
4. Create Sub-tasks (createGitHubIssue + issueTypeId=Sub-task ร M, parentIssueId=Story)
โ
5. Verify parent-child relationships (already set via parentIssueId; fix with setParentForIssues)
โ
6. Set Story Points (setIssueEstimate) AND timeline dates (setDatesForIssue)
โ โ ๏ธ BOTH required โ SP without dates leaves the Epic off the Goals & Planning roadmap
7. Pipeline sorting (moveIssueToPipeline, descending priority order: P0 โ P1 โ P2)
โ
8. Sprint assignment for P0 Stories when requested (addIssuesToSprints)MCP Call Examples#
Initiative Creation (optional, top-level):
mcp__zenhub__createGitHubIssue({
title: " {strategic goal name} " ,
body: " {body} " , // Strategic goal, wrapped Project/Epic list
repositoryId: repoId, // Dynamic query
issueTypeId: initiativeType.id, // Dynamic query (fallback if absent)
labels: [ " initiative " , " p0 " ]
})Project Creation (optional):
mcp__zenhub__createGitHubIssue({
title: " {project/milestone name} " ,
body: " {body} " , // Goals, Epic list, priority table
repositoryId: repoId, // Dynamic query
issueTypeId: projectType.id, // Dynamic query (fallback if absent)
parentIssueId: " {initiative_graphql_id} " , // When under an Initiative
labels: [ " project " , " p0 " ]
})Epic Creation:
const epic = await mcp__zenhub__createGitHubIssue({
title: " {feature} feature implementation " ,
body: " {body} " ,
repositoryId: repoId, // Dynamic query
issueTypeId: epicTypeId, // Dynamic query
parentIssueId: " {project_graphql_id} " // When under a Project (or the Initiative ' s id directly, if no Project level)
})
// โ ๏ธ REQUIRED for roadmap visibility โ set BOTH estimate and dates:
await mcp__zenhub__setIssueEstimate({ issueId: epic.id, estimate: totalPoints });
await mcp__zenhub__setDatesForIssue({
issueId: epic.id,
startDate: startDate, // " YYYY-MM-DD "
endDate: endDate, // " YYYY-MM-DD "
zenhubOrganizationId: workspace.zenhubOrganization.id,
});Without
setDatesForIssue,startDate/endDatestay null and the Epic has SP but no bar on the Goals & Planning timeline. Default window: start = active sprint (getSprint, id ์์=ํ์ฑ) start (or today) โgetUpcomingSprint์ '๋ค์' ์คํ๋ฆฐํธ๋ผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฐ๋ฉด ๋ฐ๊ฐ ํ ์คํ๋ฆฐํธ ๋ฐ๋ฆฐ๋ค โ, end = start +ceil(totalPoints / 5) * 2weeks (min 2 weeks).
Story Creation (under Epic):
mcp__zenhub__createGitHubIssue({
title: " {feature} list screen " ,
body: " {body} " ,
repositoryId: repoId, // Dynamic query
issueTypeId: featureTypeId, // Dynamic query
parentIssueId: " {epic_graphql_id} "
})Sub-task Creation (under Story):
mcp__zenhub__createGitHubIssue({
title: " [{PREFIX}-001-01] Table column definition " ,
body: " {body} " ,
repositoryId: repoId, // Dynamic query
issueTypeId: subtaskTypeId, // Dynamic query
parentIssueId: " {story_graphql_id} "
})Title Format#
| Type | Title Format |
|---|---|
| Project | {Service/milestone name} |
| Epic | {Feature} feature implementation |
| Story (list) | {Feature} list screen |
| Story (detail) | {Feature} detail screen |
| Story (form) | {Feature} form screen |
Story Point Guide#
| Point | Complexity | Example |
|---|---|---|
| 1 | Very simple | Simple UI modification |
| 2 | Simple | Single widget implementation |
| 3 | Normal | List screen, basic CRUD |
| 5 | Complex | Detail screen + actions, form + validation |
| 8 | Very complex | Composite screen |
Default Points by Screen Type#
| Screen Type | Default Point |
|---|---|
| List | 3 |
| Detail | 3 |
| Form | 5 |
Label System#
Project Labels#
project, {project_slug}, p{priority}Epic Labels#
epic, feature, {feature_name}, kobic, p{priority}Story Labels#
story, {feature_name}, {screen_type}, kobic, p{priority}โ ๏ธ Priority labels (
p0/p1/p2) must be included at creation โupdateIssuecannot change labels afterward.
Screen Type Labels#
| Screen | Label |
|---|---|
| List | list-view |
| Detail | detail-view |
| Form | form-view |
Pipeline Configuration#
New Issues โ Icebox โ Product Backlog โ Sprint Backlog โ In Progress โ Review/QADone pipeline is not used โ issues auto-close on PR merge via
Closes #. Seereferences/PIPELINE_REGISTRY.md.
Priority-based Initial Placement#
| Target | Initial Pipeline |
|---|---|
| Project / Epic | Product Backlog |
| Story P0 (sprint specified) | Sprint Backlog + addIssuesToSprints |
| Story P0/P1 | Product Backlog |
| Story P2 | Icebox |
| Sub-task | Follows parent Story (no separate move) |
Ordering rule: moveIssueToPipeline has no position parameter โ move issues in descending priority order (P0 โ P1 โ P2) to approximate top-to-bottom ordering, and record the priority table in the Epic/Project body as the source of truth. Fine-grained ordering is adjusted manually on the ZenHub board.
Body Template (Using Details Tags)#
Story body uses <details> tags for collapse/expand:
- ๐ Story details
- โ Acceptance Criteria
- ๐งช BDD test scenarios
- ๐ ๏ธ Implementation tasks
- ๐จ Figma frame links
Output Files#
.claude/docs/{feature}/zenhub/
โโโ epic.md
โโโ stories/
โโโ list_story.md
โโโ detail_story.md
โโโ form_story.mdKey Rules#
- Top-Down Creation: Initiative (optional) โ Project (optional) โ Epic โ Story โ Sub-task, in hierarchy order
- Link Required: All Stories must be linked to an Epic; Epics to a Project when one is created (or directly to an Initiative when no Project level is used); Projects to an Initiative when one is created
- GitHub Issues Only:
createGitHubIssuealways โcreateZenhubIssueprohibited - Priority Before Creation: Score and confirm priorities before creating (labels immutable after creation)
- Pipeline Sorting Required: After creation, place all issues per the priority matrix in descending priority order
- Korean Acceptance Criteria: Write Acceptance Criteria in Korean
- BDD Integration: ACs map 1:1 with BDD scenarios
- Label Consistency: Follow the defined label system
- Create After Confirmation: Create actual issues only after user confirmation