LogoSkills

ZenHub Conventions

Issue management rules using ZenHub.

Issue management rules using ZenHub.

Per-Project Configuration#

ZenHub workspace information is managed in .mcp.json at the project root. Pipeline ID, Repository ID, Issue Type ID, and Organization ID are not hardcoded but dynamically queried via MCP tools.

Workspace Info Query (required on first call)#

// 1. Pipeline ID + Repository ID query
const workspace = await mcp__zenhub__getWorkspacePipelinesAndRepositories();
// โ†’ pipelines[]: { id, name }  (New Issues, Icebox, Product Backlog, ...)
// โ†’ repositories[]: { id, name }

// 2. Issue Type ID query
const issueTypes = await mcp__zenhub__getIssueTypes();
// โ†’ issueTypes[]: { id, name }  (Epic, Feature, Bug, Task, Sub-task, ...)

Rule: Always query the current workspace IDs via the above two calls before creating/moving ZenHub issues. IDs can be cached and reused within the same session.


Issue Creation Rules#

Use GitHub Issues (required)#

All issues must be created as GitHub issues (ZenHub issues are prohibited)

// โœ… CORRECT: Create GitHub issue
mcp__zenhub__createGitHubIssue({
  title:  " Feature development " ,
  repositoryId: repositoryId, // From getWorkspacePipelinesAndRepositories()
  issueTypeId: epicTypeId,    // From getIssueTypes()
})

// โŒ WRONG: Create ZenHub issue (prohibited)
mcp__zenhub__createZenhubIssue({...})

Reasons:

  • GitHub issues support pipeline moves
  • Timeline settings work correctly
  • Auto-link with GitHub PRs
  • Easy search and filtering

ID Query Patterns#

Finding Pipeline ID#

const workspace = await mcp__zenhub__getWorkspacePipelinesAndRepositories();
const pipelines = workspace.pipelines;

// Find by name
const inProgress = pipelines.find(p = >   p.name ===  " In Progress " );
const reviewQA = pipelines.find(p = >   p.name ===  " Review/QA " );
const done = pipelines.find(p = >   p.name ===  " Done " );

Finding Issue Type ID#

const types = await mcp__zenhub__getIssueTypes();

// Find by name
const epicType = types.find(t = >   t.name ===  " Epic " );
const featureType = types.find(t = >   t.name ===  " Feature " );
const bugType = types.find(t = >   t.name ===  " Bug " );
const subtaskType = types.find(t = >   t.name ===  " Sub-task " );

Finding Repository ID#

const workspace = await mcp__zenhub__getWorkspacePipelinesAndRepositories();
const repos = workspace.repositories;

// Find GitHub repo (by name)
const githubRepo = repos.find(r = >   r.name ===  " my-repo " );

Issue Creation Examples#

Epic Creation#

// 1. Dynamic ID query
const workspace = await mcp__zenhub__getWorkspacePipelinesAndRepositories();
const issueTypes = await mcp__zenhub__getIssueTypes();

const repoId = workspace.repositories[0].id; // Or find by name
const epicTypeId = issueTypes.find(t = >   t.name ===  " Epic " ).id;
const orgId = workspace.organizationId; // Organization ID

// 2. Create Epic (GitHub issue)
const epic = await mcp__zenhub__createGitHubIssue({
  title:  " Feature name " ,
  body:  " Epic description... " ,
  repositoryId: repoId,
  issueTypeId: epicTypeId,
});

// 3. Set timeline
await mcp__zenhub__setDatesForIssue({
  issueId: epic.id,
  startDate:  " 2026-01-27 " ,
  endDate:  " 2026-02-17 " ,
  zenhubOrganizationId: orgId,
});

// 4. Move pipeline
const backlogPipeline = workspace.pipelines.find(p = >   p.name ===  " Product Backlog " );
await mcp__zenhub__moveIssueToPipeline({
  issueId: epic.id,
  pipelineId: backlogPipeline.id,
});

Story Creation#

const featureTypeId = issueTypes.find(t = >   t.name ===  " Feature " ).id;

// Create Story (under Epic)
const story = await mcp__zenhub__createGitHubIssue({
  title:  " Feature name " ,
  body:  " Story description... " ,
  repositoryId: repoId,
  issueTypeId: featureTypeId,
  parentIssueId: epic.id, // Link to Epic
});

// Set Story Points
await mcp__zenhub__setIssueEstimate({
  issueId: story.id,
  estimate: 5,
});

Issue Title Conventions#

TypePrefixExample
Epic (์—†์Œ โ€” Issue Type์œผ๋กœ ๊ตฌ๋ถ„) API integration and SWR caching strategy
Story(์—†์Œ โ€” Issue Type์œผ๋กœ ๊ตฌ๋ถ„)classroom API integration
Bugfix:fix: Login token refresh error
Featurefeat:feat: Add user profile page
Taskchore:chore: Dependency update

Note: Epic/Story๋Š” ZenHub Issue Type์œผ๋กœ ์ด๋ฏธ ๊ตฌ๋ถ„๋˜๋ฏ€๋กœ ์ œ๋ชฉ์— [Epic], [Story] ์ ‘๋‘์‚ฌ๋ฅผ ๋ถ™์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


Notes#

  1. ZenHub Issues vs GitHub Issues

    • ZenHub issues: Cannot move pipelines/set timelines
    • GitHub issues: All ZenHub features work correctly
  2. Parent-Child Relationships

    • Link on creation via parentIssueId parameter
    • Or link later with setParentForIssues
  3. Search

    • searchLatestIssues: Only searches GitHub issues
    • ZenHub issues are not searchable