一键导入
github-metrics-processing
Process GitHub API data to calculate PR/issue metrics including merge time averages, author rankings, and bug categorization.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Process GitHub API data to calculate PR/issue metrics including merge time averages, author rankings, and bug categorization.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Handles reading, populating, and saving .docx files using the python-docx library. Use this skill for any tasks involving template filling or modifying Word documents.
Perform various data analysis on SEC 13-F and obtain some insights of fund activities such as number of holdings, AUM, and change of holdings between two quarters.
This skill includes search capability in 13F, such as fuzzy search a fund information using possibly inaccurate name, or fuzzy search a stock cusip info using its name.
A comprehensive PDF toolkit for advanced data extraction and document analysis. Beyond text and table extraction, this tool is optimized for visual layout reasoning: it can map graphical elements to coordinates (such as determining appointment times based on their position on a calendar timeline) and identify color-coded features (e.g., distinguishing high-priority blocks from flexible blue-colored entries). Use this skill when the task requires interpreting schedule layouts, calculating durations from visual spans, or resolving scheduling conflicts based on the spatial and color properties of a PDF document.
Build deterministic, verifiable data visualizations with D3.js (v6). Generate standalone HTML/SVG (and optional PNG) from local data files without external network dependencies. Use when tasks require charts, plots, axes/scales, legends, tooltips, or data-driven SVG output.
invoke this skill when you need to perform database search for travel planning. This skill provides some useful pre-packaged tools to look up accommodations, attractions, cities, driving distance, flights, and restaurants from the bundled dataset.
| name | github-metrics-processing |
| description | Process GitHub API data to calculate PR/issue metrics including merge time averages, author rankings, and bug categorization. |
Process JSON data from GitHub queries to calculate publication metrics, including PR merge times, issue categorization, and contributor analysis.
json and datetime modules (standard library)total_prs = len(prs_data)
merged_prs = [pr for pr in prs_data if pr.get('mergedAt') is not None]
closed_prs = [pr for pr in prs_data if pr.get('closedAt') is not None and pr.get('mergedAt') is None]
merged_count = len(merged_prs)
closed_count = len(closed_prs)
from datetime import datetime
def parse_iso8601(timestamp_str):
"""Parse ISO 8601 timestamp to datetime object"""
return datetime.fromisoformat(timestamp_str.replace('Z', '+00:00'))
def calculate_merge_days(prs):
"""Calculate average days from creation to merge"""
merge_times = []
for pr in prs:
if pr.get('mergedAt'): # Only count merged PRs
created = parse_iso8601(pr['createdAt'])
merged = parse_iso8601(pr['mergedAt'])
days = (merged - created).days
merge_times.append(days)
if not merge_times:
return 0.0
avg = sum(merge_times) / len(merge_times)
return round(avg, 1) # Round to one decimal place
from collections import Counter
def get_top_contributor(prs):
"""Find author who opened the most PRs"""
authors = [pr['author']['login'] for pr in prs if pr.get('author')]
if not authors:
return None
author_counts = Counter(authors)
top_author, _ = author_counts.most_common(1)[0]
return top_author
total_issues = len(issues_data)
def count_bug_issues(issues):
"""Count issues with 'bug' in any label name"""
bug_count = 0
for issue in issues:
labels = issue.get('labels', [])
has_bug = any('bug' in label.get('name', '').lower() for label in labels)
if has_bug:
bug_count += 1
return bug_count
bug_count = count_bug_issues(issues_data)
def count_resolved_bugs(issues, period_end):
"""Count bugs that were closed during the specified month"""
resolved_count = 0
for issue in issues:
# Must have 'bug' in a label
labels = issue.get('labels', [])
has_bug = any('bug' in label.get('name', '').lower() for label in labels)
# Must be closed
closed_at = issue.get('closedAt')
if has_bug and closed_at:
resolved_count += 1
return resolved_count
import json
from datetime import datetime
from collections import Counter
def parse_iso8601(timestamp_str):
return datetime.fromisoformat(timestamp_str.replace('Z', '+00:00'))
def process_github_data(prs_json, issues_json):
"""Process GitHub data and return metrics"""
prs = json.loads(prs_json)
issues = json.loads(issues_json)
# PR Metrics
merged_prs = [pr for pr in prs if pr.get('mergedAt')]
closed_prs = [pr for pr in prs
if pr.get('closedAt') and not pr.get('mergedAt')]
merge_times = []
for pr in merged_prs:
created = parse_iso8601(pr['createdAt'])
merged = parse_iso8601(pr['mergedAt'])
days = (merged - created).days
merge_times.append(days)
avg_merge_days = round(sum(merge_times) / len(merge_times), 1) if merge_times else 0.0
authors = [pr['author']['login'] for pr in prs if pr.get('author')]
top_contributor = Counter(authors).most_common(1)[0][0] if authors else None
# Issue Metrics
bug_issues = []
for issue in issues:
labels = issue.get('labels', [])
if any('bug' in label.get('name', '').lower() for label in labels):
bug_issues.append(issue)
resolved_bugs = sum(1 for issue in bug_issues if issue.get('closedAt'))
return {
'pr': {
'total': len(prs),
'merged': len(merged_prs),
'closed': len(closed_prs),
'avg_merge_days': avg_merge_days,
'top_contributor': top_contributor
},
'issue': {
'total': len(issues),
'bug': len(bug_issues),
'resolved_bugs': resolved_bugs
}
}