jpskill.com
🛠️ 開発・MCP コミュニティ

github-wrapped

GitHubの利用状況を、Bilibili風の演出やスムーズな画面遷移、スマホ対応のページ表示で、1枚のHTMLにまとめ、実績を振り返る年次レビューを生成するSkill。

📜 元の英語説明(参考)

Generate a verifiable GitHub Wrapped year-in-review as a single-file HTML (raw gh API JSON saved, Python-built dataset embedded), with a Bilibili-style narrative, smooth transitions, and mobile-friendly paged mode. Requires gh CLI to be authenticated.

🇯🇵 日本人クリエイター向け解説

一言でいうと

GitHubの利用状況を、Bilibili風の演出やスムーズな画面遷移、スマホ対応のページ表示で、1枚のHTMLにまとめ、実績を振り返る年次レビューを生成するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o github-wrapped.zip https://jpskill.com/download/9211.zip && unzip -o github-wrapped.zip && rm github-wrapped.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/9211.zip -OutFile "$d\github-wrapped.zip"; Expand-Archive "$d\github-wrapped.zip" -DestinationPath $d -Force; ri "$d\github-wrapped.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して github-wrapped.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → github-wrapped フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

GitHub Wrapped (単一ファイル HTML, 検証可能なデータ)

このスキルは、GitHub の「Year in Review / Wrapped」を、単一の自己完結型 HTML ファイルとして、Bilibili スタイルのナラティブ(スクロール/ページシーン、映画のようなトランジション、シェアカード)で生成します。譲れない要件は検証可能性です。すべての数値は、レポートとともにコミットされた保存済みの gh api 生のレスポンスに遡れる必要があります。

譲れないこと

  • 捏造されたデータは使用しない: GitHub API がメトリックを提供できない場合は、 を表示し、ページ内で制限事項を説明します。
  • 生の API レスポンスを保存する: レポートは、元の JSON (および使用された GraphQL クエリ) を含む raw/ フォルダがないと無効です。
  • 1 つの .html を提供する: ランタイムの gh 呼び出しは行わず、データセットを HTML に埋め込みます。
  • 外部 CDN はオプション (フォント/アイコン/スクリーンショットライブラリ/音楽) ですが、ロードに失敗した場合でも、コアのナビゲーション/レンダリングを中断してはなりません。
  • 段階的に構築する: 小さなスケルトン (≤ ~400 LOC) から始めて、5k–10k LOC の完成したレポートに向けて反復します。一度に完全な「最終」ファイルをリリースしようとしないでください。

最初にユーザーに尋ねるべきこと

  • YEAR (デフォルト: 現在の年)
  • USER (デフォルト: gh api user --jq .login)
  • ページコピーの出力言語 (通常、中国のユーザーには中国語が推奨されます。このドキュメントは英語のままです)
  • タイムゾーン (デフォルト: 中国のユーザーには Asia/Shanghai)
  • 音楽ウィジェットを有効にするかどうか (自動再生がブロックされる可能性があります。ユーザー操作によるフォールバックが必要です)

推奨されるレイアウト

data/github-wrapped-$YEAR/
  raw/                  # 検証可能な gh API レスポンス (JSON)
  processed/             # raw/ から派生した dataset.json
frontend/standalone/
  github-wrapped-$YEAR.html

パイプライン (raw → dataset → 単一 HTML)

1) gh api で生の JSON を収集する (常にページネーションを使用)

ページネーションのルール:

  • GraphQL: --paginate --slurp
  • REST: --paginate

最小限の生のセット (推奨されるファイル名):

  • raw/user.json (プロフィール、createdAt)
  • raw/contributions.json (GraphQL contributionsCollection(from,to))
  • raw/user_repos.json (REST リポジトリリスト。スター/フォークはスナップショット)
  • raw/starred_repos_pages.json (GraphQL STARRED_AT でソートされたスター付きリポジトリ。トピック/言語を含む)
  • raw/prs_${YEAR}_pages.json (GraphQL Search: その年にマージされた PR。追加/削除)
  • raw/contributed_repos_pages.json (GraphQL repositoriesContributedTo)
  • raw/events_90d.json (オプション。REST イベント。90 日の制限。ベストエフォートのおまけのみ)

バンドルされたテンプレート (必要なものだけを開く):

  • scripts/collect_raw.sh
  • scripts/queries/*.graphql
  • references/data_sources.md
  • references/single_file_engineering.md

2) 決定論的なデータセットを構築する (Python, 推測はしない)

raw/*.json のみを読み取り、processed/dataset.json を出力するビルダーを作成します。

  • 決定論的: 同じ生の入力 → 同じデータセット出力。
  • 透明性: 制限事項を meta.dataProvenance.notes[] に書き込みます。
  • レンダリングの安定性: オプションのフィールドは nullable のままにし、破壊的な変更を避けます。

テンプレート: scripts/build_dataset_template.py スキーマガイダンス: references/dataset_schema.md

より大規模な分析レシピ (月ごとのスターの散布図、タイムゾーンセーフな時間バケット、祝日の検出、カテゴリのヒューリスティック) については、cookbook/python/ を参照してください。

3) dataset.json を HTML に埋め込む (ランタイムフェッチは行わない)

HTML には安定したアンカーが含まれている必要があります。

<script id="dataset" type="application/json">{}</script>

埋め込みルール:

  • HTML に書き込む前に、常に <\u003c としてエスケープします。
  • データセットブロックがない/破損している場合、埋め込みスクリプトは大きな音を立てて失敗する (または修復する) 必要があります。
  • データセットの解析に失敗した場合、ページに目に見えるオーバーレイを表示する必要があります ("カバーのみ、ボタンは無効" を避ける)。

テンプレート: scripts/embed_dataset_into_html_template.py

段階的なデリバリー (400 LOC → 10k LOC)

単一ファイルの映画のようなレポートはすぐに長くなります。正しく、保守しやすい状態を保つために、反復的にリリースします:

  • イテレーション 0 (契約): 最小限の dataset.json スキーマに同意し、プレースホルダーをレンダリングします (欠落しているフィールドには を表示します)。
  • イテレーション 1 (≤ 400 LOC): スケルトンを構築します: カバー + "Start"、2〜3 のシーン、ナビゲーションモードの切り替えスタブ、目に見える失敗オーバーレイによるデータセットの解析。
  • イテレーション 2 (≤ 1.5k LOC): ナビゲーションエンジン (ページ/フリー)、リビールシステム、および基本的なカード/リストシステムを実装します。
  • イテレーション 3 (≤ 4k LOC): コアチャート (ヒートマップ、タワー、レーダー) を追加しますが、シンプルで検証可能な状態に保ちます。
  • イテレーション 4 (≤ 7k LOC): モバイルページモード戦略を追加します (data-mhide="paged" を介して重いブロックを非表示にし、DOM ノードを移動するボトムシートを追加します)。
  • イテレーション 5 (≤ 10k LOC): 磨き上げ (モーショントークン、フルスクリーン HUD、シェアカード、オプションの音楽/花火) を行い、デスクトップ + モバイルの回帰テストを行います。

このファイル (SKILL.md) をハイレベルに保ちます。プロンプトの肥大化を避けるために、長いコードサンプルと分析レシピを cookbook/ に、実装ノートを references/ に記述します。

単一ファイル HTML エンジニアリングノート (実戦テスト済み)

  • ブートレイヤー: 常に明示的な "Start" ボタンを含めます。スクロールのみの開始に依存しないでください。
  • 2 つのナビゲーションモード: paged (ホイール/キー、およびモバイルでのタッチスワイプ) と free (通常のスクロール)。
  • モバイルページモード: 各シーンは 1 つのビューポートに収まる必要があります。data-mhide="paged" を介して重いブロックを非表示にし、既存の DOM ノードを移動するボトムシートで開きます (重複する ID を避けます)。
  • タッチアフォーダンス: ヒートマップタップ → トースト。レーダーtouchstart → ポイントリフト + ツールチップ。

より深いパターンについては、references/single_file_engineering.md を参照してください。

レスポンシブ UX (デスクトップ + モバイル) — 苦労して得た教訓

ページは 1 つのファイルですが、事実上 2 つの製品です: デスクトップシネマティックモバイルスライドデッキ。回帰を防ぐために、レスポンシブ作業を外科的に分離された変更として扱います。

デスクトップ (フルスクリーンなしで読みやすい)

  • 幅が広く、境界のあるコンテンツ列 (--maxwclamp() として) を優先し、タイポグラフィを縮小する代わりに、短いビューポート (例: 高さ 768px) で --gutter をわずかに小さくします。
  • コンテンツを切り捨てるのではなく、密度バリアントを使用します。
    • 長いリーダーボードの複数列リスト (メタデータを表示したままにします)。

(原文はここで切り詰められています)

📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

GitHub Wrapped (Single-file HTML, Verifiable Data)

This skill generates a GitHub “Year in Review / Wrapped” as a single self-contained HTML file with a Bilibili-style narrative (scroll/page scenes, cinematic transitions, share card). The non-negotiable requirement is verifiability: every number must be traceable to saved gh api raw responses committed alongside the report.

Non-negotiables

  • No fabricated data: if GitHub APIs cannot provide a metric, show and explain the limitation in-page.
  • Save raw API responses: the report is invalid without a raw/ folder containing the original JSON (and the GraphQL queries used).
  • Ship one .html: no runtime gh calls; embed a dataset into the HTML.
  • External CDNs are optional (fonts/icons/screenshot libs/music) but must never break core navigation/rendering if they fail to load.
  • Build step-by-step: start with a tiny scaffold (≤ ~400 LOC) and iterate towards a 5k–10k LOC finished report; never try to ship the full “final” file in one pass.

What to ask the user first

  • YEAR (default: current year)
  • USER (default: gh api user --jq .login)
  • Output language for the page copy (Chinese is usually preferred for CN users; this doc stays English)
  • Timezone (default: Asia/Shanghai for CN users)
  • Whether to enable a music widget (autoplay may be blocked; must have a user-gesture fallback)

Recommended layout

data/github-wrapped-$YEAR/
  raw/                  # verifiable gh API responses (JSON)
  processed/             # dataset.json derived from raw/
frontend/standalone/
  github-wrapped-$YEAR.html

Pipeline (raw → dataset → single HTML)

1) Collect raw JSON with gh api (always paginate)

Pagination rules:

  • GraphQL: --paginate --slurp
  • REST: --paginate

Minimum raw set (recommended filenames):

  • raw/user.json (profile, createdAt)
  • raw/contributions.json (GraphQL contributionsCollection(from,to))
  • raw/user_repos.json (REST repos list; stars/forks are snapshots)
  • raw/starred_repos_pages.json (GraphQL starred repos ordered by STARRED_AT, includes topics/language)
  • raw/prs_${YEAR}_pages.json (GraphQL Search: merged PRs in the year; additions/deletions)
  • raw/contributed_repos_pages.json (GraphQL repositoriesContributedTo)
  • raw/events_90d.json (optional; REST events; 90-day limit; only for best-effort easter eggs)

Bundled templates (open only what you need):

  • scripts/collect_raw.sh
  • scripts/queries/*.graphql
  • references/data_sources.md
  • references/single_file_engineering.md

2) Build a deterministic dataset (Python, no guessing)

Write a builder that reads only raw/*.json and outputs processed/dataset.json:

  • Deterministic: same raw input → same dataset output.
  • Transparent: write limitations into meta.dataProvenance.notes[].
  • Stable for rendering: keep optional fields nullable; avoid breaking changes.

Template: scripts/build_dataset_template.py Schema guidance: references/dataset_schema.md

For larger analysis recipes (stars-by-month scatter points, timezone-safe hour buckets, holiday detection, category heuristics), see cookbook/python/.

3) Embed dataset.json into the HTML (no runtime fetch)

Your HTML must contain a stable anchor:

<script id="dataset" type="application/json">{}</script>

Embed rules:

  • Always escape < as \u003c before writing into the HTML.
  • If the dataset block is missing/corrupted, the embed script should fail loudly (or repair it).
  • The page must show a visible overlay if dataset parsing fails (avoid “cover only, buttons dead”).

Template: scripts/embed_dataset_into_html_template.py

Step-by-step delivery (400 LOC → 10k LOC)

Single-file cinematic reports get long fast. To stay correct and maintainable, ship in iterations:

  • Iteration 0 (contract): agree on a minimal dataset.json schema and render placeholders (show for missing fields).
  • Iteration 1 (≤ 400 LOC): build the skeleton: cover + “Start”, 2–3 scenes, nav mode toggle stub, dataset parse with a visible failure overlay.
  • Iteration 2 (≤ 1.5k LOC): implement the navigation engine (paged/free), reveal system, and a basic card/list system.
  • Iteration 3 (≤ 4k LOC): add core charts (heatmap, tower, radar), but keep them simple and verifiable.
  • Iteration 4 (≤ 7k LOC): add mobile paged-mode strategy (hide heavy blocks via data-mhide="paged" + bottom-sheet that moves DOM nodes).
  • Iteration 5 (≤ 10k LOC): polish (motion tokens, full-screen HUD, share card, optional music/fireworks), and do a regression pass for desktop + mobile.

Keep this file (SKILL.md) high-level. Put long code samples and analysis recipes into cookbook/ and implementation notes into references/ to avoid prompt bloat.

Single-file HTML engineering notes (battle-tested)

  • Boot layer: always include an explicit “Start” button; do not rely on scroll-only starts.
  • Two navigation modes: paged (wheel/keys, plus touch swipe on mobile) and free (normal scroll).
  • Mobile paged mode: each scene must fit one viewport; hide heavy blocks via data-mhide="paged" and open them in a bottom-sheet that moves existing DOM nodes (avoid duplicate IDs).
  • Touch affordances: heatmap tap → toast; radar touchstart → point lift + tooltip.

See references/single_file_engineering.md for deeper patterns.

Responsive UX (Desktop + Mobile) — hard-won lessons

The page is one file, but it’s effectively two products: desktop cinematic and mobile slide deck. Treat responsive work as surgically isolated changes to avoid regressions.

Desktop (readable without full-screen)

  • Prefer a wide-but-bounded content column (--maxw as a clamp()), and reduce --gutter slightly on short viewports (e.g. 768px height) instead of shrinking typography.
  • Use density variants rather than truncating content:
    • Multi-column lists for long leaderboards (keep metadata visible).
    • “Dense” list styling (tighter padding/gaps) for better above-the-fold readability.
  • Avoid CSS-stretching canvases (radar charts): size canvas from its rendered rect and DPR, or enforce an aspect-ratio and draw in CSS pixels.
  • If a 3D/transform section makes buttons unclickable, assume a stacking-context problem first (z-index + transforms + pointer-events).

Mobile (paged-mode = slide deck)

  • Gate layout changes with @media (max-width: 620px) and (pointer: coarse) (width-only rules can accidentally affect small desktop windows).
  • In mobile paged mode, avoid inner scrolling in scenes; hide heavy blocks with data-mhide="paged" and expose them via a bottom-sheet modal that moves the existing DOM node (so IDs and event listeners remain valid).
  • Use touch-first affordances: tap feedback (toast), big hit targets, and optionally draggable floating controls (mode toggle / music) respecting safe-area insets.

For implementation patterns (bottom sheet node-moving, draggable HUD controls, canvas DPR sizing, and stacking-context pitfalls), see references/responsive_ui_patterns.md.

Narrative + UI quality bar (Bilibili-style pacing)

Design as a storyboard: each scene answers one question, then transitions.

Suggested pacing:

  1. Grand cover + “Start” (cinematic; optional fireworks)
  2. “How long since we met GitHub” (account createdAt → years)
  3. “Your 2025 pulse” (activity tier + distribution)
  4. Heatmap/city + streak + craziest day
  5. “Time Tower” (12 months; month selector + star-time scatter points)
  6. “Radar / hexagon” (categories; points lift/glow on hover or touch)
  7. “New interests unlocked” (2025 stars vs previous years)
  8. “Extreme moments” (night-owl / holidays; clearly mark best-effort)
  9. “Open Source Award” (external contribution highlight; award ceremony feel)
  10. Finale share card (screenshot-friendly; optional fireworks)

Interaction rules:

  • Every button/card should be clickable with feedback (links when available; otherwise micro-interaction/toast).
  • “Free scroll” vs “Page mode” must behave differently (page mode should snap/lock navigation by wheel/keys, and support touch swipe on mobile).
  • Unify motion tokens (duration/easing) across scenes; prefer transform/opacity.

Known data limits (must disclose)

  • Contribution calendar provides day-level counts, not a complete commit list per day.
  • Events API keeps only ~90 days of history.
  • Repo stargazers_count/forks_count are current snapshots, not year-increment.
  • Private contributions / hidden settings can skew the public view.

Debug checklist

See references/debug_checklist.md for the full checklist. Common root causes:

  • A JS parse error stops all handlers (duplicate const, missing ))
  • A broken embedded dataset block breaks JSON parsing
  • A blocked external script was treated as required instead of optional

Bundled resources (progressive disclosure)

  • scripts/: reusable collection/build/embed templates (execute without loading into context)
  • cookbook/: analysis recipes and larger Python snippets (open only what you need)
  • references/: schema + storyboard + debugging notes (open only the specific file you need)