github-repo-stats
- Repo stars 0
- Author repo skills-registry
GitHub Repository Stats via REST API
Overview
Use the GitHub REST API (no SDK needed) with curl + python3 to pull PR and
issue data for a given repo and date range. The unauthenticated rate limit is 60
requests/hour; set GITHUB_TOKEN in the environment for 5000/hour.
Base URL pattern
https://api.github.com/repos/{owner}/{repo}/pulls # PRs
https://api.github.com/repos/{owner}/{repo}/issues # Issues (includes PRs!)
https://api.github.com/search/issues # Search endpoint
Issues endpoint returns both issues AND pull requests. Filter with
"pull_request" in itemto separate them.
Authenticated header (use when token available)
AUTH_HEADER="-H \"Authorization: token $GITHUB_TOKEN\""
Pagination pattern
GitHub paginates at 100 items max per page. Always loop until an empty page:
import requests, time
def fetch_all(url, params, token=None):
headers = {"Authorization": f"token {token}"} if token else {}
headers["Accept"] = "application/vnd.github+json"
results = []
page = 1
while True:
params["page"] = page
params["per_page"] = 100
r = requests.get(url, headers=headers, params=params)
if r.status_code == 403:
time.sleep(60) # rate-limited, back off
continue
data = r.json()
if not data:
break
results.extend(data)
if len(data) < 100:
break
page += 1
return results
Date filtering
GitHub REST API supports since parameter (ISO 8601) for issues/PRs but NOT
until. Filter the until boundary in Python after fetching:
from datetime import datetime, timezone
def parse_dt(s):
return datetime.fromisoformat(s.replace("Z", "+00:00"))
start = datetime(2024, 12, 1, tzinfo=timezone.utc)
end = datetime(2024, 12, 31, 23, 59, 59, tzinfo=timezone.utc)
created_in_range = [i for i in items
if start <= parse_dt(i["created_at"]) <= end]
Key fields
| Field | Description |
|---|---|
number |
PR/issue number |
state |
"open" or "closed" |
created_at |
ISO 8601 creation timestamp |
closed_at |
ISO 8601 close timestamp (null if open) |
merged_at |
ISO 8601 merge timestamp (PRs only, null if unmerged) |
pull_request.merged_at |
In issue-endpoint results; same as above |
user.login |
Author login |
labels |
List of {"name": "..."} objects |
Detecting merged PRs
Via /pulls endpoint, merged_at is present and non-null.
Via /issues endpoint, check item.get("pull_request", {}).get("merged_at").
Computing average time-to-merge
from datetime import datetime, timezone
def days_between(a, b):
da = datetime.fromisoformat(a.replace("Z", "+00:00"))
db = datetime.fromisoformat(b.replace("Z", "+00:00"))
return (db - da).total_seconds() / 86400
merged = [p for p in prs if p.get("merged_at")]
avg = sum(days_between(p["created_at"], p["merged_at"]) for p in merged) / len(merged)
avg_rounded = round(avg, 1)
Finding top contributor
from collections import Counter
logins = [p["user"]["login"] for p in prs]
top = Counter(logins).most_common(1)[0][0]
Output: write report.json
import json, pathlib
report = {
"pr": {
"total": total_prs,
"merged": merged_count,
"closed": closed_count,
"avg_merge_days": avg_merge_days,
"top_contributor": top_contributor,
},
"issue": {
"total": total_issues,
"bug": bug_count,
"resolved_bugs": resolved_bugs,
}
}
pathlib.Path("/app/report.json").write_text(json.dumps(report, indent=2))
<!-- tomevault:4.0:skill_md:2026-05-22 -->Source: cxcscmu/SkillLearnBench — distributed by TomeVault.
- Fluxly category
- Engineering
- Author-declared agents
- No explicit declaration found; this is not inferred or tested compatibility
- Static check
- 88 / 100 · heuristic scan, not runtime safety proof
- Author / version / license
- @tomevault-io · no license declared
- Fluxly token estimate
- Lean
- Fluxly setup estimate
- Guided setup
- External API key
- Required · GitHub
- Detected OS requirements
- Unspecified
- Runtime requirements
- Python
- Detected file/system behavior
-
- Read-only
- Write / modify
- Detected network behavior
- External requests
- Install commands
- None (reference only)
Profile is derived at build time from SKILL.md and install vectors. Subject to drift from author intent.
Heads up: 未限定 allowed-tools,默认拥有全部工具权限。
The current SKILL.md does not define a fixed output example. Use the GitHub REST API (no SDK needed) with curl + python3 to pull PR and issue data for a given repo and date range. The unauthenticated rate limit is 60 requests/hour; set GITHUBTOKEN in the environment for 5000/hour.
Issues endpoint returns both issues AND pull requests. Filter with "pullrequest" in item to separate them.
Authenticated header (use when token available)
GitHub paginates at 100 items max per page. Always loop until an empty page:
GitHub REST API supports since parameter (ISO 8601) for issues/PRs but NOT until. Filter the until boundary in Python after fetching:
Field · Description number · PR/issue number state · "open" or "closed"
# GitHub Repository Stats via REST API
## Overview
Use the GitHub REST API (no SDK needed) with `curl` + `python3` to pull PR and
issue data for a given repo and date range. The unauthenticated rate limit is 60
requests/hour; set `GITHUB_TOKEN` in the environment for 5000/hour.
## Base URL pattern
```
https://api.github.com/repos/{owner}/{repo}/pulls # PRs
https://api.github.com/repos/{owner}/{repo}/issues # Issues (includes PRs!)
https://api.github.com/search/issues # Search endpoint
```
> Issues endpoint returns both issues AND pull requests. Filter with
> `"pull_request" in item` to separate them.
## Authenticated header (use when token available)
```bash
AUTH_HEADER="-H \"Authorization: token $GITHUB_TOKEN\""
```
## Pagination pattern
GitHub paginates at 100 items max per page. Always loop until an empty page:
```python
import requests, time
def fetch_all(url, params, token=None):
headers = {"Authorization": f"token {token}"} if token else {}
headers["Accept"] = "application/vnd.github+json"
results = []
page = 1
while True:
params["page"] = page
params["per_page"] = 100
r = requests.get(url, headers=headers, params=params)
if r.status_code == 403:
time.sleep(60) # rate-limited, back off
continue
data = r.json()
if not data:
break
results.extend(data)
if len(data) < 100:
break
page += 1
return results
```
## Date filtering
GitHub REST API supports `since` parameter (ISO 8601) for issues/PRs but NOT
`until`. Filter the `until` boundary in Python after fetching:
```python
from datetime import datetime, timezone
def parse_dt(s):
return datetime.fromisoformat(s.replace("Z", "+00:00"))
… Author text anchors workflow facts; Fluxly only indexes current sections, terms, files, and commands.
sections -> Overview → Base URL pattern → Authenticated header (use when token available) → Pagination pattern → Date filtering → Key fields
terms -> Use the GitHub REST API (no SDK needed) with curl + python3 to pull PR and issue data for a given repo and date range. · > Issues endpoint returns both issues AND pull requests. · GitHub paginates at 100 items max per page. · GitHub REST API supports since parameter (ISO 8601) for issues/PRs but NOT until. · Via /pulls endpoint, mergedat is present and non-null. · --- > Source: [cxcscmu/SkillLearnBench](https://github.com/cxcscmu/SkillLearnBench) — distributed by [TomeVault](https://tomevault.io).
files/cmd -> curl · python3 · GITHUBTOKEN · "pullrequest" in item · since · until · number · state
body sha256 -> 315549f2ca2c
Decide Fit First
Design Intent
How To Use It
Boundaries And Review