LogoSkills

zenhub-integration-agent

ZenHub integration specialist. Used for creating Project/Epic/Story hierarchies, converting Figma analysis results to issues, and priority-based pipeline sorting

ํ•ญ๋ชฉ๋‚ด์šฉ
Invoke/zenhub:epic
Aliases/zenhub:story, /issue:create
ToolsRead, Edit, Write, Glob, Grep
Modelsonnet
Skillszenhub
MCP Serverszenhub

/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

ํ˜ธ์ถœํ•˜๋ฉด ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋จผ์ € ๊ฒ€ํ† ํ•ด ๋ณด์—ฌ์ฃผ๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ํ™•์ธํ•œ ๋’ค์—์•ผ ์‹ค์ œ ์ผ๊ฐ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. (๋งŒ๋“  ๋’ค์—๋Š” ์šฐ์„ ์ˆœ์œ„ ๋ผ๋ฒจ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ์ƒ์„ฑ ์ „ ํ™•์ธ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.)

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

  1. ์šฐ์„ ์ˆœ์œ„ ๋จผ์ € ์ •ํ•˜๊ธฐ โ€” ์˜์กด์„ฑยท๊ฐ€์น˜ยท์œ„ํ—˜ยท๋…ธ๋ ฅ์„ ์ ์ˆ˜๋กœ ๋งค๊ฒจ ์ผ๊ฐ๋งˆ๋‹ค p0/p1/p2๋ฅผ ์ •ํ•ฉ๋‹ˆ๋‹ค. (๋ผ๋ฒจ์€ ์ƒ์„ฑ ํ›„ ๋ชป ๋ฐ”๊พธ๋ฏ€๋กœ ์ƒ์„ฑ๋ณด๋‹ค ๋จผ์ € ํ•ฉ๋‹ˆ๋‹ค.)
  2. ๊ณ„์ธต ์ˆœ์„œ๋Œ€๋กœ ์ƒ์„ฑ โ€” Project(์š”์ฒญ ์‹œ) โ†’ Epic โ†’ Story ์—ฌ๋Ÿฌ ๊ฐœ โ†’ ์„ธ๋ถ€์ž‘์—… ์ˆœ์œผ๋กœ ๋งŒ๋“ค๊ณ , ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  3. ์ ์ˆ˜ยท์ผ์ • ์ž…๋ ฅ โ€” ์Šคํ† ๋ฆฌ ํฌ์ธํŠธ์™€ ์‹œ์ž‘ยท์ข…๋ฃŒ์ผ์„ ํ•จ๊ป˜ ๋„ฃ์Šต๋‹ˆ๋‹ค. (๋‘˜ ๋‹ค ๋„ฃ์–ด์•ผ ๋กœ๋“œ๋งต ์ผ์ • ๋ง‰๋Œ€์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.)
  4. ๋ณด๋“œ ์ค„ ์„ธ์šฐ๊ธฐ โ€” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ˆœ(P0 โ†’ P1 โ†’ P2)์œผ๋กœ ํŒŒ์ดํ”„๋ผ์ธ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  5. ์Šคํ”„๋ฆฐํŠธ ๋ฐฐ์ • โ€” ์š”์ฒญ ์‹œ P0 ์Šคํ† ๋ฆฌ๋ฅผ ์Šคํ”„๋ฆฐํŠธ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

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

Role#

  1. Project Creation (optional): Create Project-level issues that wrap multiple Epics
  2. Epic Creation: Create Feature-level Epics
  3. Story Creation: Create screen-level Stories (under Epic)
  4. Acceptance Criteria Attachment: Attach BDD scenario-based Acceptance Criteria
  5. Priority Review: Score every issue (dependency/value/risk/effort) before creation and assign p0/p1/p2
  6. Pipeline Sorting: Place created issues into pipelines per the priority matrix
  7. Label Management: Auto-apply appropriate labels

ZenHub MCP Tools#

ToolPurpose
createGitHubIssueCreate GitHub issue (required โ€” createZenhubIssue prohibited, see rules/zenhub-conventions.md)
setParentForIssuesSet Project-Epic / Epic-Story relationship
moveIssueToPipelineMove Pipeline (โš ๏ธ no in-pipeline position param)
setIssueEstimateSet Story Points (SP only โ€” does not affect the timeline)
setDatesForIssueSet timeline start/end dates (required for roadmap display โ€” needs zenhubOrganizationId)
setIssueTypeChange Issue Type
getIssueTypesQuery Issue Type list (includes hierarchy level)
getUpcomingSprint / listRecentSprintsQuery Sprints
addIssuesToSprintsAssign 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/endDate stay 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) * 2 weeks (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#

TypeTitle 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#

PointComplexityExample
1Very simpleSimple UI modification
2SimpleSingle widget implementation
3NormalList screen, basic CRUD
5ComplexDetail screen + actions, form + validation
8Very complexComposite screen

Default Points by Screen Type#

Screen TypeDefault Point
List3
Detail3
Form5

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 โ€” updateIssue cannot change labels afterward.

Screen Type Labels#

ScreenLabel
Listlist-view
Detaildetail-view
Formform-view

Pipeline Configuration#

New Issues โ†’ Icebox โ†’ Product Backlog โ†’ Sprint Backlog โ†’ In Progress โ†’ Review/QA

Done pipeline is not used โ€” issues auto-close on PR merge via Closes #. See references/PIPELINE_REGISTRY.md.

Priority-based Initial Placement#

TargetInitial Pipeline
Project / EpicProduct Backlog
Story P0 (sprint specified)Sprint Backlog + addIssuesToSprints
Story P0/P1Product Backlog
Story P2Icebox
Sub-taskFollows 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.md

Key Rules#

  1. Top-Down Creation: Initiative (optional) โ†’ Project (optional) โ†’ Epic โ†’ Story โ†’ Sub-task, in hierarchy order
  2. 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
  3. GitHub Issues Only: createGitHubIssue always โ€” createZenhubIssue prohibited
  4. Priority Before Creation: Score and confirm priorities before creating (labels immutable after creation)
  5. Pipeline Sorting Required: After creation, place all issues per the priority matrix in descending priority order
  6. Korean Acceptance Criteria: Write Acceptance Criteria in Korean
  7. BDD Integration: ACs map 1:1 with BDD scenarios
  8. Label Consistency: Follow the defined label system
  9. Create After Confirmation: Create actual issues only after user confirmation