github-issue-analysis · git:20260424.d50cf5a · 2026-04-24 · sha256 8d22b0d248c56ddd

github-issue-analysis git:20260424.d50cf5aA

Immutable. This exact content never changes and is served at /api/v1/blob/8d22b0d248c56ddd.

---
name: github-issue-analysis
description: Analyze GitHub issues for a date range, counting totals, bug reports (by label substring), and closed bug reports.
---

# GitHub Issue Analysis

## Overview

Fetch issues created in a date range and compute:
- Total issue count (excluding PRs)
- Bug reports: issues with at least one label containing substring `bug`
- Resolved bugs: bug report issues closed during the same month

## Fetching Issues

```bash
# Using gh issue list with search
gh issue list -R cli/cli \
  --search "created:2024-12-01..2024-12-31" \
  --state all \
  --limit 500 \
  --json number,title,labels,state,createdAt,closedAt
```

> Note: `gh issue list` automatically excludes PRs.

## Python: Identify Bug Reports

```python
import json

with open('issues.json') as f:
    issues = json.load(f)

def is_bug(issue):
    """Returns True if any label contains 'bug' as substring (case-insensitive)."""
    return any('bug' in label['name'].lower() for label in issue.get('labels', []))

total = len(issues)
bugs = [i for i in issues if is_bug(i)]

# Closed bugs: bug issues that were closed during the month
# closedAt is within Dec 2024
def closed_in_month(issue, year=2024, month=12):
    if not issue.get('closedAt'):
        return False
    from datetime import datetime, timezone
    dt = datetime.fromisoformat(issue['closedAt'].replace('Z', '+00:00'))
    return dt.year == year and dt.month == month

resolved_bugs = [i for i in bugs if closed_in_month(i)]

print(json.dumps({
    "total": total,
    "bug": len(bugs),
    "resolved_bugs": len(resolved_bugs)
}, indent=2))
```

## Label Matching Examples

Labels that match `bug` substring:
- `bug` ✓
- `type: bug` ✓
- `kind/bug` ✓
- `bug-report` ✓
- `debug` — contains `bug` as substring ✓ (be aware)

For stricter matching (word boundary), use regex:
```python
import re
def is_bug(issue):
    return any(re.search(r'bug', label['name'], re.IGNORECASE)
               for label in issue.get('labels', []))
```

## Important: `closedAt` vs `state`

- `closedAt` is set when an issue is closed (regardless of month)
- To find bugs *closed during December*, filter `closedAt` to be within Dec 2024
- An issue created in Dec but closed in Jan would NOT count as `resolved_bugs`