LogoSkills

zenhub:manage

ZenHub PR linking and pipeline state management

ํ•ญ๋ชฉ๋‚ด์šฉ
Invoke/zenhub:manage
Categorykobic-workflow
Complexitysimple
MCP Serverszenhub

/zenhub:manage โ€” ZenHub ์ด์ŠˆยทPR ์ƒํƒœ ์ •๋ฆฌ ๋„์šฐ๋ฏธ#

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

์ž‘์—… ์ง„ํ–‰ ์ƒํ™ฉ์— ๋งž์ถฐ ZenHub ๋ณด๋“œ์˜ ์นด๋“œ(์ด์Šˆ)๋ฅผ ์•Œ๋งž์€ ์นธ์œผ๋กœ ์˜ฎ๊ธฐ๊ณ , ์ฝ”๋“œ ๋ณ€๊ฒฝ(PR)๊ณผ ์ด์Šˆ๋ฅผ ์„œ๋กœ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์นธ๋ฐ˜ ๋ณด๋“œ์—์„œ ํฌ์ŠคํŠธ์ž‡์„ "์ง„ํ–‰ ์ค‘ โ†’ ๊ฒ€ํ†  ์ค‘ โ†’ ์™„๋ฃŒ"๋กœ ์˜ฎ๊ฒจ ๋ถ™์ด๋Š” ์ผ์„ ๋Œ€์‹  ํ•ด ์ค€๋‹ค๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

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

  • PR(์ฝ”๋“œ ๋ณ€๊ฒฝ ๋ฌถ์Œ)์„ ๋งŒ๋“  ๋’ค, ๊ทธ PR์„ ๊ด€๋ จ ์ด์Šˆ์™€ ์—ฐ๊ฒฐํ•ด์•ผ ํ•  ๋•Œ
  • ์ž‘์—… ๋‹จ๊ณ„๊ฐ€ ๋ฐ”๋€Œ์–ด์„œ ๋ณด๋“œ์˜ ์ด์Šˆ ์œ„์น˜(ํŒŒ์ดํ”„๋ผ์ธ)๋ฅผ ์˜ฎ๊ฒจ์•ผ ํ•  ๋•Œ
  • ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ, ๋ฆฌ๋ทฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ, ๋ณ‘ํ•ฉ(merge)์ด ๋๋‚ฌ์„ ๋•Œ

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

  • PR๊ณผ ์ด์Šˆ๋ฅผ ์—ฐ๊ฒฐํ•ด ์ค๋‹ˆ๋‹ค (GitHub์˜ Closes #์ด์Šˆ๋ฒˆํ˜ธ ํ‚ค์›Œ๋“œ ํ™œ์šฉ)
  • ์ด์Šˆ๋ฅผ ์ ์ ˆํ•œ ๋ณด๋“œ ์นธ์œผ๋กœ ์ด๋™์‹œ์ผœ ์ค๋‹ˆ๋‹ค โ€” ์˜ˆ: In Progress, Review/QA
  • ์ด์Šˆ์™€ PR์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ด ์ค๋‹ˆ๋‹ค
  • ๋ณ‘ํ•ฉ ํ›„์—๋Š” ์ด์Šˆ๊ฐ€ ์ž๋™์œผ๋กœ ๋‹ซํ˜”๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์•ˆ ๋‹ซํ˜”์œผ๋ฉด ๋Œ€์‹  ๋‹ซ์•„ ์ค๋‹ˆ๋‹ค
  • ๋ณด๋“œ์˜ ์นธ ๋ชฉ๋ก์€ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ๋‹ค๋ฅด๋ฏ€๋กœ, ์ฒ˜์Œ ์‹คํ–‰ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค (๋Œ€ํ‘œ ์นธ: New Issues, Icebox, Product Backlog, Sprint Backlog, In Progress, Review/QA โ€” Done/Closed ์นธ์€ ์—†์Œ, ๋‹ซํž˜์€ GitHub state)

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

# PR์„ ์ด์Šˆ์— ์—ฐ๊ฒฐ
/zenhub:manage link-pr --pr 1627 --issue 1413

# ์ด์Šˆ๋ฅผ ํŠน์ • ๋ณด๋“œ ์นธ์œผ๋กœ ์ด๋™
/zenhub:manage move --issue 1413 --to  " Review/QA " 

 # ์ด์ŠˆยทPR ์ƒํƒœ ํ™•์ธ
/zenhub:manage status --issue 1413
  • link-pr โ€” PR๊ณผ ์ด์Šˆ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค
  • move --to "์นธ ์ด๋ฆ„" โ€” ์ด์Šˆ๋ฅผ ํ•ด๋‹น ๋ณด๋“œ ์นธ์œผ๋กœ ์˜ฎ๊น๋‹ˆ๋‹ค (์˜ˆ: "In Progress", "Review/QA")
  • status โ€” ์ด์Šˆ๋‚˜ PR์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค

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

์ž‘์—… ํ๋ฆ„์— ๋งž์ถฐ ๋ณดํ†ต ๋‹ค์Œ ์ˆœ์„œ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

  1. ์ž‘์—… ์‹œ์ž‘ โ€” ์ด์Šˆ๋ฅผ In Progress ์นธ์œผ๋กœ ์˜ฎ๊น๋‹ˆ๋‹ค.
  2. PR ์ƒ์„ฑ ํ›„ โ€” PR ๋ณธ๋ฌธ์— Closes #์ด์Šˆ๋ฒˆํ˜ธ๋ฅผ ๋„ฃ์–ด GitHub๊ฐ€ ์ž๋™ ์—ฐ๊ฒฐํ•˜๊ฒŒ ํ•˜๊ณ , ์ด์Šˆ๋ฅผ Review/QA ์นธ์œผ๋กœ ์˜ฎ๊น๋‹ˆ๋‹ค.
  3. ๋ณ‘ํ•ฉ ํ›„ โ€” Closes # ํ‚ค์›Œ๋“œ ๋•๋ถ„์— GitHub ์ด์Šˆ๊ฐ€ ์ž๋™์œผ๋กœ ๋‹ซํžˆ๊ณ  ZenHub๋„ Closed๋กœ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. (Done ์นธ์œผ๋กœ๋Š” ์˜ฎ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” Done์€ "๋‹ซํž˜"๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.) ์ž๋™์œผ๋กœ ๋‹ซํžˆ์ง€ ์•Š์•˜์œผ๋ฉด ์ง์ ‘ ๋‹ซ์•„ ๋งˆ๋ฌด๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ZenHub์—์„œ๋Š” PR์„ ์ด์Šˆ์˜ ํ•˜์œ„ ํ•ญ๋ชฉ์œผ๋กœ ๋‘˜ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ GitHub์˜ Closes # ํ‚ค์›Œ๋“œ๋กœ ์—ฐ๊ฒฐํ•˜๊ณ , ์ƒํƒœ ๊ด€๋ฆฌ๋Š” ๋ณด๋“œ ์นธ ์ด๋™์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Epic > Story > Sub-task ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.


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

Triggers#

  • When issue linking is needed after PR creation
  • When pipeline state updates are needed
  • On work progress state changes

Context Trigger Pattern#

/zenhub:manage {action} [--options]

Actions#

ActionDescriptionExample
link-prLink PR to issue/zenhub:manage link-pr --pr 1627 --issue 1413
moveMove issue to pipeline/zenhub:manage move --issue 1413 --to "Review/QA"
statusCheck issue/PR status/zenhub:manage status --issue 1413

Pipeline Query#

Pipeline IDs differ per project workspace. Dynamically queried on first call:

const workspace = await mcp__zenhub__getWorkspacePipelinesAndRepositories();
// workspace.pipelines โ†’ [{ id, name }, ...]
// Live pipelines (6): New Issues, Icebox, Product Backlog, Sprint Backlog, In Progress, Review/QA
// (no  " Done " / " Closed "   column โ€” close via gh issue close + updateIssue state:CLOSED)

Workflow Patterns#

1. On Work Start#

# Move issue to In Progress
/zenhub:manage move --issue {issue_number} --to  " In Progress "

2. After PR Creation#

# Include  " Closes #{issue_number} "   in PR body (GitHub auto-link)
# Move issue to Review/QA
/zenhub:manage move --issue {issue_number} --to  " Review/QA "

3. After Merge (merge = Close)#

# Issue auto-closes via  " Closes # "   keyword in PR body โ†’ ZenHub syncs to Closed.
# Never move to Done (Done โ‰  closed). Verify + fallback:
#   gh issue view {n} --json state  โ†’ if not CLOSED: gh issue close {n} --reason completed
#   searchClosedIssues  " #{n} "         โ†’ if missing:    updateIssue state:CLOSED

PR Linking Best Practices#

Include the following keywords in PR body for GitHub auto-linking:

## Related Issue
- Closes #1413
- Fixes #1413
- Resolves #1413

ZenHub Linking Limitations#

  • PRs cannot be set as children of issues in ZenHub
  • Using GitHub's "Closes #" keyword is recommended
  • In ZenHub, manage state via pipeline moves

MCP Tool Usage#

mcp__zenhub__searchLatestIssues({ query:  " 1413 "   })

Pipeline Move#

// Query workspace info (on first call)
const workspace = await mcp__zenhub__getWorkspacePipelinesAndRepositories();
const reviewPipeline = workspace.pipelines.find(p = >   p.name ===  " Review/QA " );
// fail-closed: ๋ชป ์ฐพ์œผ๋ฉด throw (์ด๋ฆ„ ๋ถˆ์ผ์น˜ ์‹œ undefined.id ๋ฌด์Œ ๋ˆ„๋ฝ ๋ฐฉ์ง€)
if (!reviewPipeline) throw new Error(` ' Review/QA '   ํŒŒ์ดํ”„๋ผ์ธ ์—†์Œ. ๋ผ์ด๋ธŒ: ${workspace.pipelines.map(p = >   p.name).join( " ,  " )}`);

mcp__zenhub__moveIssueToPipeline({
  issueId:  " {issue_graphql_id} " ,
  pipelineId: reviewPipeline.id
})

Repository / Issue Type / Organization Query#

All IDs differ per project workspace. Dynamically query based on the X-zh-workspace header configured in .mcp.json:

// Repository ID + Pipeline ID
const workspace = await mcp__zenhub__getWorkspacePipelinesAndRepositories();

// Issue Type ID
const issueTypes = await mcp__zenhub__getIssueTypes();

Key Rules#

  1. On PR Creation: Include Closes #{issue} in body
  2. On Work Start: Move to In Progress
  3. On Review Request: Move to Review/QA
  4. After Merge (merge = Close): Closes # auto-closes GitHub โ†’ ZenHub syncs to Closed. Never use Done (Done โ‰  closed); verify GitHub closed + ZenHub Closed and fall back to gh issue close / updateIssue state:CLOSED
  5. Epic Structure: Maintain Epic > Story > Sub-task hierarchy