Create GitHub Issues
Findings → grouped GitHub issues w/ labels + acceptance criteria + cross-refs.
Use When
- Codebase review → findings table → track
- Planning session → work items → issues
- TODO / backlog → trackable issues
- Batch-create related issues, consistent fmt
In
- Required:
findings — items w/ title + desc. Ideally: severity, files, labels
- Optional:
group_by — batch: severity, file, theme (def: theme)
label_prefix — auto-label prefix (def: none)
create_labels — create missing (def: true)
dry_run — preview no create (def: false)
Do
Step 1: Prep Labels
Needed labels exist in repo.
- List:
gh label list --limit 100
- Identify labels from findings (severity, phase, label fields)
- Severity map:
critical, high-priority, medium-priority, low-priority
- Phase/theme:
security, architecture, code-quality, accessibility, testing, performance
create_labels = true → gh label create "name" --color "hex" --description "desc"
- Colors: red=crit/sec, orange=high, yellow=med, blue=arch, green=test
Got: All label refs exist. No dup.
If err: gh not auth → gh auth login. Create denied → skip, note missing.
Step 2: Group
Batch → logical issues, no sprawl.
theme → phase/category (sec → 1-2 issues, a11y → 1)
severity → level (CRIT → 1, HIGH → 1)
file → primary file
- Within group: severity order (CRIT first)
8 findings → split by sub-theme
- Each group → 1 issue
Got: Groups w/ 1-8 findings each. Total: 5-15 for full review.
If err: No grouping metadata → 1 issue per finding (OK for <10, bad for larger).
Step 3: Compose
Std template.
- Title:
[Severity] Theme: Brief description — [HIGH] Security: Eliminate innerHTML injection in panel.js
- Body:
## Summary
One-paragraph overview of what this issue addresses and why it matters.
## Findings
1. **[SEVERITY]** Finding description (`file.js:line`) — brief explanation
2. **[SEVERITY]** Finding description (`file.js:line`) — brief explanation
## Acceptance Criteria
- [ ] Criterion derived from finding 1
- [ ] Criterion derived from finding 2
- [ ] All changes pass existing tests
## Context
Generated from codebase review on YYYY-MM-DD.
Related: #issue_numbers (if applicable)
- Labels: severity + theme + custom
- File refs → body mention (not assignee)
Got: Title + numbered findings + checkbox criteria + labels.
If err: Body > 65536 chars → split + cross-ref.
Step 4: Create
Use gh CLI.
dry_run = true → print + stop
- Create each:
gh issue create --title "title" --body "$(cat <<'EOF'
body content
EOF
)" --label "label1,label2"
- Record URLs
- Summary table:
#number | Title | Labels | Findings count
- Sequence → edit first issue: "Blocked by #X" / "See also #Y"
Got: All created. Summary table w/ URLs.
If err: Individual fail → log + continue. Report end. Common: auth expired, label not found (create_labels=false), network timeout.
Check
Traps
- Sprawl: 1-per-finding → 20+ issues. Group aggressive → 5-10 ideal
- Missing criteria: No checkboxes → no verify. Every finding → ≥1 checkbox
- Label chaos: Too many → filter useless. Stick severity + theme
- Stale refs: Old review → verify findings still apply
- No dry run: Large sets → always
dry_run: true first. Easier edit plan vs close 15 bad issues
→
review-codebase — findings source
review-pull-request — PR findings → issues
manage-backlog — sprints + priorities
create-pull-request — PRs close issues
commit-changes — fix commits
1---2name: create-github-issues-103description: Structured GitHub issue creation from review findings or task breakdowns. Groups related findings into logical issues, applies labels, and produces issues with standard templates including summary, findings, and acceptance criteria. Designed to consume output from review-codebase or similar review skills.4license: MIT5---67# Create GitHub Issues89Findings → grouped GitHub issues w/ labels + acceptance criteria + cross-refs.1011## Use When1213- Codebase review → findings table → track14- Planning session → work items → issues15- TODO / backlog → trackable issues16- Batch-create related issues, consistent fmt1718## In1920- **Required**: `findings` — items w/ title + desc. Ideally: severity, files, labels21- **Optional**:22 - `group_by` — batch: `severity`, `file`, `theme` (def: `theme`)23 - `label_prefix` — auto-label prefix (def: none)24 - `create_labels` — create missing (def: `true`)25 - `dry_run` — preview no create (def: `false`)2627## Do2829### Step 1: Prep Labels3031Needed labels exist in repo.32331. List: `gh label list --limit 100`342. Identify labels from findings (severity, phase, label fields)353. Severity map: `critical`, `high-priority`, `medium-priority`, `low-priority`364. Phase/theme: `security`, `architecture`, `code-quality`, `accessibility`, `testing`, `performance`375. `create_labels` = true → `gh label create "name" --color "hex" --description "desc"`386. Colors: red=crit/sec, orange=high, yellow=med, blue=arch, green=test3940**Got:** All label refs exist. No dup.4142**If err:** `gh` not auth → `gh auth login`. Create denied → skip, note missing.4344### Step 2: Group4546Batch → logical issues, no sprawl.47481. `theme` → phase/category (sec → 1-2 issues, a11y → 1)492. `severity` → level (CRIT → 1, HIGH → 1)503. `file` → primary file514. Within group: severity order (CRIT first)525. >8 findings → split by sub-theme536. Each group → 1 issue5455**Got:** Groups w/ 1-8 findings each. Total: 5-15 for full review.5657**If err:** No grouping metadata → 1 issue per finding (OK for <10, bad for larger).5859### Step 3: Compose6061Std template.62631. **Title**: `[Severity] Theme: Brief description` — `[HIGH] Security: Eliminate innerHTML injection in panel.js`642. **Body**:65 ```text66 ## Summary67 One-paragraph overview of what this issue addresses and why it matters.6869 ## Findings70 1. **[SEVERITY]** Finding description (`file.js:line`) — brief explanation71 2. **[SEVERITY]** Finding description (`file.js:line`) — brief explanation7273 ## Acceptance Criteria74 - [ ] Criterion derived from finding 175 - [ ] Criterion derived from finding 276 - [ ] All changes pass existing tests7778 ## Context79 Generated from codebase review on YYYY-MM-DD.80 Related: #issue_numbers (if applicable)81 ```823. Labels: severity + theme + custom834. File refs → body mention (not assignee)8485**Got:** Title + numbered findings + checkbox criteria + labels.8687**If err:** Body > 65536 chars → split + cross-ref.8889### Step 4: Create9091Use `gh` CLI.92931. `dry_run` = true → print + stop942. Create each:95 ```bash96 gh issue create --title "title" --body "$(cat <<'EOF'97 body content98 EOF99 )" --label "label1,label2"100 ```1013. Record URLs1024. Summary table: `#number | Title | Labels | Findings count`1035. Sequence → edit first issue: "Blocked by #X" / "See also #Y"104105**Got:** All created. Summary table w/ URLs.106107**If err:** Individual fail → log + continue. Report end. Common: auth expired, label not found (`create_labels`=false), network timeout.108109## Check110111- [ ] All findings in ≥1 issue112- [ ] Each issue ≥1 label113- [ ] Each issue has checkbox criteria114- [ ] No dup (check titles vs open)115- [ ] Issue count reasonable (not 1:1 for large)116- [ ] Summary table printed w/ URLs117118## Traps119120- **Sprawl**: 1-per-finding → 20+ issues. Group aggressive → 5-10 ideal121- **Missing criteria**: No checkboxes → no verify. Every finding → ≥1 checkbox122- **Label chaos**: Too many → filter useless. Stick severity + theme123- **Stale refs**: Old review → verify findings still apply124- **No dry run**: Large sets → always `dry_run: true` first. Easier edit plan vs close 15 bad issues125126## →127128- `review-codebase` — findings source129- `review-pull-request` — PR findings → issues130- `manage-backlog` — sprints + priorities131- `create-pull-request` — PRs close issues132- `commit-changes` — fix commits