Group Items to Milestone

SkillFiles & storage

Assign backlog items to a GitHub milestone by bridging per-item files to GitHub Issues. Use when populating a sprint or release milestone, after create-milestone, or when a milestone number is specified with optional P0/P1/P2 or title filter. Creates missing GitHub Issues for selected P0/P1 items, assigns all selected items to the milestone, and updates Project V2 Status to Backlog.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Group Items to Milestone skill

What this skill tells your AI

The instructions your AI receives, as published by jamie-bitflight/claude_skills in .claude/skills/group-items-to-milestone/SKILL.md and read by ahel’s review.

Assign backlog items to a GitHub milestone. Bridges .claude/backlog/ per-item files → GitHub Issues → milestone assignment.

API references: milestones.md | issue-stories.md | projects-v2.md

Arguments

  • {milestone-number} — required
  • Optional filter: P0, P1, P2, or title substring to pre-filter the list
/group-items-to-milestone 3
/group-items-to-milestone 3 P1
/group-items-to-milestone 3 github

Workflow

Step 1: Resolve Milestone

Call backlog_list_milestones(state="open") and filter the returned list for the entry where number == {number}. If not found, call backlog_list_milestones(state="all") and filter again. Extract title, state, open_issues, closed_issues from the matching entry.

If milestone not found or closed, report and stop.

Step 2: Load Backlog Items

Call the mcp__plugin_dh_backlog__backlog_list tool. Parse the returned dict — each entry in items has title, priority, issue, plan, status, milestone, file_path, groomed. Filter items by section (P0, P1, P2, Ideas). Apply any title filter.

For each item determine status:

  • Has issue**Issue**: #N field present → verify state via backlog_list_issues(state="open") — check if issue number appears in the returned list
  • No issue — P0/P1 item without issue → flagged for creation offer
  • Already in milestone — issue already assigned to this milestone → shown pre-checked

Step 3: Present Selection

Milestone #{N}: {title}

P0
  1. [✓] SAM: Error Recovery — Issue #12 (open)
  2. [ ] bash-development: Fix inaccuracies — no issue yet

P1
  3. [✓] gitlab-skill: Remove URL — Issue #8 (open)
  4. [ ] create-backlog-item skill — no issue yet
  5. [~] commitlint verify flag — Issue #5 (already in this milestone)

Legend: [✓] has issue  [ ] needs issue created  [~] already assigned

Use AskUserQuestion: "Which items to add? (comma-separated numbers, or 'all', or 'P0', 'P1')"

Step 4: Create Missing Issues

For each selected item with no **Issue**: #N:

Build story-format body (Story / Description / Acceptance Criteria / Context). Create issue using the Python script (preferred — handles label creation automatically):

uv run .claude/skills/gh/scripts/github_project_setup.py issue create \
  --title "{type}: {title}" \
  --body "{story body}" \
  --priority-label "priority:{p0|p1|p2|idea}" \
  --type-label "type:{feature|bug|refactor|docs|chore}" \
  --milestone {number}

The backlog script automatically writes issue: '#N' back to the item's metadata.

Skip issue creation for P2/Ideas items — assign by milestone number only if they already have an issue.

Step 5: Assign Existing Issues

For selected items that already have issues but are not yet in this milestone:

uv run .claude/skills/gh/scripts/github_project_setup.py issue set-milestone \
  --issue {issue_number} \
  --milestone {milestone_number}

Step 6: Update Project V2 Status

Set Status = Backlog for each newly assigned item:

uv run .claude/skills/gh/scripts/github_project_setup.py project update-status \
  --issue {issue_number} \
  --status Backlog

Step 7: Report

Milestone #{N}: {title}

Assigned {count} items:
  Issue #12: SAM: Error Recovery (existing issue)
  Issue #14: create-backlog-item skill (new issue created)
  Issue #5:  commitlint verify flag (already assigned — skipped)

Per-item files updated with {created_count} new issue numbers.

Next step: /dh:groom-milestone {number}

Error Handling

  • Milestone not found: call backlog_list_milestones(state="open") and list available milestones, then stop.
  • Issue creation fails: log error per item, continue with remaining.
  • No items match filter: report and show available sections.
  • Label not found: github_project_setup.py issue create handles label creation automatically via _ensure_label().

Signals

GitHub stars
66
Forks
10
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
group-items-to-milestone
Source
github.com/jamie-bitflight/claude_skills