GitHub 助手
- 作者仓库星标 0
- 作者仓库 skills-registry
GitHub PR Statistics
Overview
After fetching PR data from the GitHub API, use Python or jq to compute:
- Total PR count
- Merged vs closed counts
- Average time-to-merge (days)
- Top contributor by PR count
Fetching PRs for a Date Range
# Using gh search (handles pagination, date filtering)
gh pr list -R cli/cli \
--search "created:2024-12-01..2024-12-31" \
--state all \
--limit 500 \
--json number,author,createdAt,mergedAt,closedAt,state
Python: Compute Stats from JSON
import json
from datetime import datetime, timezone
from collections import Counter
# Load PR data (from gh pr list --json output)
with open('prs.json') as f:
prs = json.load(f)
total = len(prs)
# Count merged vs closed-but-not-merged
merged = [pr for pr in prs if pr['mergedAt']]
closed = [pr for pr in prs if not pr['mergedAt'] and pr['state'] == 'CLOSED']
# Average time to merge (creation -> mergedAt), in days
def parse_dt(s):
return datetime.fromisoformat(s.replace('Z', '+00:00'))
merge_days = []
for pr in merged:
created = parse_dt(pr['createdAt'])
merged_at = parse_dt(pr['mergedAt'])
delta = (merged_at - created).total_seconds() / 86400
merge_days.append(delta)
avg_merge_days = round(sum(merge_days) / len(merge_days), 1) if merge_days else 0.0
# Top contributor
authors = Counter(pr['author']['login'] for pr in prs)
top_contributor = authors.most_common(1)[0][0]
print(json.dumps({
"total": total,
"merged": len(merged),
"closed": len(closed),
"avg_merge_days": avg_merge_days,
"top_contributor": top_contributor
}, indent=2))
Notes on State Values
gh pr list --jsonreturnsstateas"OPEN","CLOSED", or"MERGED"mergedAtis non-null only for merged PRs- A PR with
state == "CLOSED"andmergedAt == nullis truly closed (not merged)
Notes on the Search API
created:2024-12-01..2024-12-31is inclusive on both ends- Dec 31 means up to
2024-12-31T23:59:59Z - Use
--limit 500to avoid truncation for active repos
<!-- tomevault:4.0:skill_md:2026-05-22 -->Source: cxcscmu/SkillLearnBench — distributed by TomeVault.
- 流狐分类
- 数据
- 作者声明 Agent
- 未找到明确声明;不据此推断已兼容或已测试
- 静态检查
- 88 / 100 · 启发式扫描,不代表运行安全
- 作者 / 版本 / 许可
- @tomevault-io · 未声明 license
- 流狐 Token 估算
- 低消耗
- 流狐接入估算
- 即装即用
- 是否需要外部 API Key
- 未发现要求
- 检测到的系统要求
- 未声明
- 底层运行要求
- Python
- 检测到的文件与系统行为
-
- 只读
- 允许写入 / 修改
- 检测到的网络行为
- 仅限本地
- 安装命令数
- 无(仅作为资料)
档案由构建时根据 SKILL.md 与安装命令自动衍生,可能与作者实际意图存在差异。
需要注意: 未限定 allowed-tools,默认拥有全部工具权限。
作者没有在当前 SKILL.md 中定义固定输出样例。 After fetching PR data from the GitHub API, use Python or jq to compute: Total PR count Merged vs closed counts
Fetching PRs for a Date Range
Python: Compute Stats from JSON
gh pr list --json returns state as "OPEN", "CLOSED", or "MERGED" mergedAt is non-null only for merged PRs A PR with state == "CLOSED" and mergedAt == null is truly closed (not merged)
created:2024-12-01..2024-12-31 is inclusive on both ends Dec 31 means up to 2024-12-31T23:59:59Z Use --limit 500 to avoid truncation for active repos
# GitHub PR Statistics
## Overview
After fetching PR data from the GitHub API, use Python or jq to compute:
- Total PR count
- Merged vs closed counts
- Average time-to-merge (days)
- Top contributor by PR count
## Fetching PRs for a Date Range
```bash
# Using gh search (handles pagination, date filtering)
gh pr list -R cli/cli \
--search "created:2024-12-01..2024-12-31" \
--state all \
--limit 500 \
--json number,author,createdAt,mergedAt,closedAt,state
```
## Python: Compute Stats from JSON
```python
import json
from datetime import datetime, timezone
from collections import Counter
# Load PR data (from gh pr list --json output)
with open('prs.json') as f:
prs = json.load(f)
total = len(prs)
# Count merged vs closed-but-not-merged
merged = [pr for pr in prs if pr['mergedAt']]
closed = [pr for pr in prs if not pr['mergedAt'] and pr['state'] == 'CLOSED']
# Average time to merge (creation -> mergedAt), in days
def parse_dt(s):
return datetime.fromisoformat(s.replace('Z', '+00:00'))
merge_days = []
for pr in merged:
created = parse_dt(pr['createdAt'])
merged_at = parse_dt(pr['mergedAt'])
delta = (merged_at - created).total_seconds() / 86400
merge_days.append(delta)
avg_merge_days = round(sum(merge_days) / len(merge_days), 1) if merge_days else 0.0
# Top contributor
authors = Counter(pr['author']['login'] for pr in prs)
top_contributor = authors.most_common(1)[0][0]
print(json.dumps({
"total": total,
"merged": len(merged),
"closed": len(closed),
"avg_merge_days": avg_merge_days,
"top_contributor": top_contributor
}, indent=2))
```
## Notes on State Values
- `gh pr list --json` returns `state` as `"OPEN"`, `"CLOSED"`, or `"MERGED"`
- `mergedAt` is non-null only for merged PRs
… 作者原文负责流程事实;流狐只索引当前章节、要点、文件与命令。
章节 -> Overview → Fetching PRs for a Date Range → Python: Compute Stats from JSON → Notes on State Values → Notes on the Search API
要点 -> --- > Source: [cxcscmu/SkillLearnBench](https://github.com/cxcscmu/SkillLearnBench) — distributed by [TomeVault](https://tomevault.io).
文件/命令 -> gh pr list --json · state · "OPEN" · "CLOSED" · "MERGED" · mergedAt · state == "CLOSED" · mergedAt == null
内容 SHA-256 -> 8ccfebd8b45d
原文结构
适用与边界
原文中的明确线索
gh pr list --json、state、"OPEN"、"CLOSED"、"MERGED"、mergedAt、state == "CLOSED"、mergedAt == null