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.
Scanned 9/12/2026
Install to Claude Code
npx -y skills add Jamie-BitFlight/claude_skills --skill group-items-to-milestone --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Group Items To Milestone?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/jamie-bitflight-group-items-to-milestone)More formats (shields.io, HTML) on the badges page.
---
name: group-items-to-milestone
description: '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.'
argument-hint: '{milestone-number} [P0|P1|P2|title-filter]'
user-invocable: true
---
# Group Items to Milestone
Assign backlog items to a GitHub milestone. Bridges .claude/backlog/ per-item files → GitHub Issues → milestone assignment.
API references: [milestones.md](../gh/references/milestones.md) | [issue-stories.md](../gh/references/issue-stories.md) | [projects-v2.md](../gh/references/projects-v2.md)
## Arguments
- `{milestone-number}` — required
- Optional filter: `P0`, `P1`, `P2`, or title substring to pre-filter the list
```text
/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
```text
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):
```bash
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:
```bash
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:
```bash
uv run .claude/skills/gh/scripts/github_project_setup.py project update-status \
--issue {issue_number} \
--status Backlog
```
### Step 7: Report
```text
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()`.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!