[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KFS8K453YSD3J7QEW8GAM3":3,"skill-same:01M6KFS8K453YSD3J7QEW8GAM3":61},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":34,"linkOnly":35,"markdownContent":36,"markdownBody":37,"frontMatter":38,"refName":39,"commitSha":40,"skillDirectory":41,"forksCount":42,"repositoryHtmlUrl":43,"repositoryHomepageUrl":44,"ownerHtmlUrl":45,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":46,"install":47,"resources":60},"01M6KFS8K453YSD3J7QEW8GAM3","run2_gh-pr-analysis",null,"How to compute PR statistics (merged, closed, avg_merge_days, top_contributor) from GitHub Search API items using Python.","cxcscmu\u002FSkillLearnBench","cxcscmu","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F142838272?v=4","01M6KCQDFQWPDSN0MKZY96MSQP","01M6KCQDM7G70TKJ28NTSQC0RZ",93,"MIT","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fb2-self-feedback-claude-sonnet-4-6\u002Fgithub-repo-analytics\u002Frun2_gh-pr-analysis\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33],"pr","analysis","gh pr","gh","run2 gh pr analysis","python","github","merge","search","api","how","compute","statistics","how to","top","github search api","2026-11-10 10:12:30",false,"---\nname: run2_gh-pr-analysis\ndescription: How to compute PR statistics (merged, closed, avg_merge_days, top_contributor) from GitHub Search API items using Python.\n---\n\n# GitHub PR Analysis from Search API Results\n\n## Input Format\nEach PR item from `\u002Fsearch\u002Fissues` has:\n- `state`: `\"open\"` or `\"closed\"` (merged PRs are also `\"closed\"`)\n- `created_at`: ISO 8601 string e.g. `\"2024-12-05T10:00:00Z\"`\n- `pull_request.merged_at`: timestamp string or `null`\n- `user.login`: author username\n\n## Classifying PRs\n\n```python\ndef classify_prs(prs):\n    merged, closed, open_prs = [], [], []\n    for pr in prs:\n        pr_field = pr.get(\"pull_request\") or {}\n        merged_at = pr_field.get(\"merged_at\")\n        if merged_at:\n            merged.append({**pr, \"_merged_at\": merged_at})\n        elif pr[\"state\"] == \"closed\":\n            closed.append(pr)\n        else:\n            open_prs.append(pr)\n    return merged, closed, open_prs\n```\n\n## Average Merge Time (days, rounded to 1 decimal)\n\n```python\nfrom datetime import datetime, timezone\n\ndef parse_dt(s):\n    return datetime.strptime(s, \"%Y-%m-%dT%H:%M:%SZ\").replace(tzinfo=timezone.utc)\n\ndef avg_merge_days(merged_prs):\n    if not merged_prs:\n        return 0.0\n    diffs = []\n    for pr in merged_prs:\n        pr_field = pr.get(\"pull_request\") or {}\n        merged_at = pr_field.get(\"merged_at\")\n        created_at = pr.get(\"created_at\")\n        if merged_at and created_at:\n            delta = (parse_dt(merged_at) - parse_dt(created_at)).total_seconds() \u002F 86400\n            diffs.append(delta)\n    return round(sum(diffs) \u002F len(diffs), 1) if diffs else 0.0\n```\n\n## Top Contributor\n\n```python\nfrom collections import Counter\n\ndef top_contributor(prs):\n    authors = Counter(pr[\"user\"][\"login\"] for pr in prs if pr.get(\"user\"))\n    return authors.most_common(1)[0][0] if authors else \"unknown\"\n```\n\n## Key Distinction: \"closed\" means unmerged+closed\n- `merged`: `pull_request.merged_at is not null`\n- `closed`: `state == \"closed\"` AND `pull_request.merged_at is null`\n- These two are mutually exclusive and exhaustive for closed PRs.\n","# GitHub PR Analysis from Search API Results\n\n## Input Format\nEach PR item from `\u002Fsearch\u002Fissues` has:\n- `state`: `\"open\"` or `\"closed\"` (merged PRs are also `\"closed\"`)\n- `created_at`: ISO 8601 string e.g. `\"2024-12-05T10:00:00Z\"`\n- `pull_request.merged_at`: timestamp string or `null`\n- `user.login`: author username\n\n## Classifying PRs\n\n```python\ndef classify_prs(prs):\n    merged, closed, open_prs = [], [], []\n    for pr in prs:\n        pr_field = pr.get(\"pull_request\") or {}\n        merged_at = pr_field.get(\"merged_at\")\n        if merged_at:\n            merged.append({**pr, \"_merged_at\": merged_at})\n        elif pr[\"state\"] == \"closed\":\n            closed.append(pr)\n        else:\n            open_prs.append(pr)\n    return merged, closed, open_prs\n```\n\n## Average Merge Time (days, rounded to 1 decimal)\n\n```python\nfrom datetime import datetime, timezone\n\ndef parse_dt(s):\n    return datetime.strptime(s, \"%Y-%m-%dT%H:%M:%SZ\").replace(tzinfo=timezone.utc)\n\ndef avg_merge_days(merged_prs):\n    if not merged_prs:\n        return 0.0\n    diffs = []\n    for pr in merged_prs:\n        pr_field = pr.get(\"pull_request\") or {}\n        merged_at = pr_field.get(\"merged_at\")\n        created_at = pr.get(\"created_at\")\n        if merged_at and created_at:\n            delta = (parse_dt(merged_at) - parse_dt(created_at)).total_seconds() \u002F 86400\n            diffs.append(delta)\n    return round(sum(diffs) \u002F len(diffs), 1) if diffs else 0.0\n```\n\n## Top Contributor\n\n```python\nfrom collections import Counter\n\ndef top_contributor(prs):\n    authors = Counter(pr[\"user\"][\"login\"] for pr in prs if pr.get(\"user\"))\n    return authors.most_common(1)[0][0] if authors else \"unknown\"\n```\n\n## Key Distinction: \"closed\" means unmerged+closed\n- `merged`: `pull_request.merged_at is not null`\n- `closed`: `state == \"closed\"` AND `pull_request.merged_at is null`\n- These two are mutually exclusive and exhaustive for closed PRs.\n",{"name":5,"description":7},"main","726e1f79b96b0cb3d729d0e55a1c847e0b5353ae","skills\u002Fb2-self-feedback-claude-sonnet-4-6\u002Fgithub-repo-analytics\u002Frun2_gh-pr-analysis",8,"https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench","https:\u002F\u002Fcxcscmu.github.io\u002FSkillLearnBench","https:\u002F\u002Fgithub.com\u002Fcxcscmu","2026-10-02 22:55:36",{"source":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add cxcscmu\u002FSkillLearnBench --skill run2_gh-pr-analysis",{"tool":53,"command":54},"bunx","bunx skills add cxcscmu\u002FSkillLearnBench --skill run2_gh-pr-analysis",{"tool":56,"command":57},"pnpm","pnpm dlx skills add cxcscmu\u002FSkillLearnBench --skill run2_gh-pr-analysis","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fb2-self-feedback-claude-sonnet-4-6\u002Fgithub-repo-analytics\u002Frun2_gh-pr-analysis\u002FSKILL.md",true,[],[62,80,105,122,142,154],{"skillNo":63,"name":64,"nameZh":6,"description":65,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":73,"publishedAt":34},"01M6KM5KH175P5ABP5JMX2SBDQ","object_counter","Count occurrences of an object in the image using computer vision algorithm.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Fvideo-object-counting\u002Fobject_counter\u002FSKILL.md",[68],{"categoryNo":69,"categoryName":70,"taxonomyType":71,"taxonomyTypeDesc":72},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[74,75,76,77,78,79],"object counter","object","vision","computer","Computer Vision","image",{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":89,"publishedAt":34},"01M6KM51TMVXG79MMPCS6Y8G86","travel-planning-workflow","Invoke this skill when performing travel planning. It defines a structured workflow for generating itineraries. Following this workflow is essential to ensure the final plan satisfies user requirements.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftravel-planning\u002Ftravel-planning-workflow\u002FSKILL.md",[86],{"categoryNo":87,"categoryName":88,"taxonomyType":71,"taxonomyTypeDesc":72},"01JBSEEDCAT000000000000023","Skill与智能体开发",[90,91,92,93,94,95,96,97,98,99,100,101,102,103,104],"workflow","planning","planning workflow","travel","travel planning","travel planning workflow","structured","performing","plan","for","user","it","requirements","essential","itineraries",{"skillNo":106,"name":107,"nameZh":6,"description":108,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":109,"categories":110,"keywords":111,"publishedAt":34},"01M6KM4DY820XHS9YTSK5QP5HD","bundled-dataset-search-tool","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.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftravel-planning\u002Fbundled-dataset-search-tool\u002FSKILL.md",[],[26,112,113,114,115,116,117,93,118,119,94,120,99,121,91],"tool","dataset","bundled dataset search tool","restaurants","Tools","up","look","flights","you","database",{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":128,"publishedAt":34},"01M6KM465BB9PQ0B548HQSVAWZ","glm-output","Output-processing guidance for GLM tasks. Especially useful after glm-basics and glm-calibration when you need verifier-matching metrics from output.nc and a final \u002Froot\u002Fmetrics.json.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftemperature-simulation\u002Fglm-output\u002FSKILL.md",[],[129,130,131,99,132,133,134,135,136,137,138,139,120,140,141],"glm output","output","glm","tasks","metrics","json","basics","guidance","matching","verifier","processing","root","calibration",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":149,"publishedAt":34},"01M6KM40KY3QWDW5W97S39R2BC","glm-calibration","Calibration guidance for GLM tasks. Often most effective after glm-basics has clarified the setup; glm-output is the companion skill for exact final metric computation.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftemperature-simulation\u002Fglm-calibration\u002FSKILL.md",[148],{"categoryNo":87,"categoryName":88,"taxonomyType":71,"taxonomyTypeDesc":72},[150,141,131,130,136,135,132,151,152,99,153],"glm calibration","setup","companion","metric",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":160,"publishedAt":34},"01M6KM3VHHVSGMGHJQB3PPT6YG","glm-basics","A good starting point for GLM calibration tasks. Use to inspect glm3.nml, confirm how GLM runs, and identify the relevant files before moving on to calibration and output evaluation.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftemperature-simulation\u002Fglm-basics\u002FSKILL.md",[],[161,131,135,162,150,141,99,130,163,164,165,166,28,167,132],"glm basics","inspect","relevant","files","good","use","Evaluation"]