プラグインインストール: セットアップやフレッシュネスコマンドの前に、このスキルがHyperFramesプラグイン内にある場合は、プラグイン実行ルールに従ってください。スタンドアロンインストールの場合は、以下の更新手順をそのまま使用します。
最初に、このスキルを最新の状態に保ってください — ユーザーに確認してから実行:
npx hyperframes skills update pr-to-video。すべてが最新の場合は高速なno-opです。そうでない場合は、このスキルと、それが依存するコアドメインスキルを、それらに依存する前に更新します。
media-use: オーディオ/画像/ロゴを調達する前に、
/media-useを呼び出して、HeyGenカタログからBGM/SFX/画像を、公式ソースからブランドロゴを解決します。最初に--adoptを実行して既存のアセットを登録します。/media-useスキルを参照してください。
PR to HyperFrames
このスキルを使用して、GitHubプルリクエストを取り込み、変更を理解し、コード変更の説明ビデオを計画し、HyperFramesでフレームごとに構築します。入力はコード変更(gh経由で読み取り)であり、ウェブサイトではありません — キャプチャステップはなく、コントリビューターのアバター以外に実際のアセットはありません。
正面玄関は
/hyperframesです。 あなたはオーケストレーターです。各ステップを実行し、そのゲートを確認し、その後にのみ続行します。このスキルはGitHubプルリクエスト(コード変更)用です。他の意図、単なる「ビデオを作成」、または不確かな場合は → 最初に/hyperframesを読んでください — インテントレイヤーがすべてのルート決定を所有しており、BRIEF.mdなしでここに到着した新しい作成は、とにかくそれを通過します(セットアップの開始ルール)。
あなたはオーケストレーターです。解決された外部のPROJECT_DIRで作業し、デフォルトでは呼び出し元リポジトリでは作業しません。ステップを順番に実行し、続行する前に各ゲートを通過します。ユーザーゲートのステップは、ステップ0、ステップ3、ステップ6です。ステップ0の前に../hyperframes/references/brief-contract.mdを読んでください — ゲートタイプと、BRIEF.mdのflow/storyboardがステップ3/4/6のゲートを管理するモードをどのように導出するかが定義されています。ステップ5を除くすべてのステップを自分で実行します。ステップ5では、制限付きのフレームワーカープールをディスパッチします。デザインやモーションのルールはここに配置しないでください。それらはフレームワーカーサブエージェント、このスキルのローカル../hyperframes-animation/rules/ + ../hyperframes-animation/blueprints/、およびhyperframes-creativeにあります。
ワークフロー: ステップ0 セットアップ → hyperframes.json; ステップ1 取り込み → capture/extracted/ + assets/<login>.png; ステップ2 デザインシステム → frame.md; ステップ3 ストーリーボード/スクリプト → STORYBOARD.md および SCRIPT.md; ステップ3.1 オーディオ → audio_meta.json; ステップ4 ビジュアルデザイン → 拡張された STORYBOARD.md; ステップ5 フレーム → compositions/frames/NN-*.html および index.html; ステップ6 最終レンダリング → renders/video.mp4。
ステップ 0: セットアップ
目標: 確認済みのブリーフ — PR参照(完全なURL、<owner>/<repo>#<N>形式の参照、またはチェックアウト済みリポジトリ内の「このPR」)を含む — を持って開始し、HyperFramesプロジェクトを作成し、ブリーフを永続化します。スタイルは常にコードエディトリアルです(ステップ2で固定され、質問されることはありません)。
ブリーフはここでの質問ではなく、インテントレイヤーによって確認されます。 開始ルール、順序: (1) BRIEF.mdが存在する → それを読み、何も質問しません — ブリーフは確定しており、そのflow/storyboardがモードを導出します(ブリーフ契約 § 1)。 (2) BRIEF.mdはないが、プロジェクトが存在する(ディスク上にhyperframes.json / STORYBOARD.mdがある) → ストーリーボードのフロントマターと記録されたプリファレンスから再開します。構築途中のプロジェクトに再び問い合わせることは決してしません。 (3) どちらでもない — ここに直接到着した新しい作成リクエスト → /hyperframesを読み、そのインテントレイヤー(references/intent-interview.md)を実行します: レシピと記憶されたデフォルトをチェックし、このルートの質問を実施します — PRサイズ→長さのドクトリンを含みます。これは../hyperframes/references/routes/pr-to-video.md全体に存在します — その後、ロックされたブリーフを返します。編集リクエストはこれらすべてをスキップします — 編集に進んでください。
他の作業を行う前に、プロジェクトディレクトリを解決します。ユーザーが指定したプロジェクトディレクトリを保持します。それ以外の場合は、リゾルバーによって出力される永続的な外部キャッシュロケーションを使用します。呼び出し元リポジトリにvideos/を作成しないでください:
PR="<url | owner/repo#N>"
if [ -n "${EXPLICIT_PROJECT_DIR:-}" ]; then
PROJECT_DIR="$(node <SKILL_DIR>/scripts/project-dir.mjs --pr "$PR" --project-dir "$EXPLICIT_PROJECT_DIR")"
else
PROJECT_DIR="$(node <SKILL_DIR>/scripts/project-dir.mjs --pr "$PR")"
fi
echo "PR-to-video project: $PROJECT_DIR"
node <SKILL_DIR>/scripts/preflight.mjs
機能のプリフライトは、フェッチ、ストーリー作業、オーディオ、またはフレームディスパッチの前に実行されます。インストールされたCLIがこのスキルに必要な検証コマンドを実行できない場合は、実行のコンテキストを最初に消費するのではなく、アップグレード手順で停止します。
$PROJECT_DIR/hyperframes.jsonがない場合にのみ初期化します。そのベース名はPRから派生します。例: acme-sdk-pr-1842。ワークスペース名やタイムスタンプは絶対に使用しないでください。
npx hyperframes init "$PROJECT_DIR" --non-interactive --example=blank --skill=pr-to-video — initはインストールされたスキルをGitHub上の最新のものと比較し、いずれかが古い場合はグローバルセットを更新します。
以下のすべての相対パスコマンドは、$PROJECT_DIRを作業ディレクトリとして実行されます。明示的なサブシェルのない例は (cd "$PROJECT_DIR" && …) を意味します。呼び出し元リポジトリの作業ツリーを変更することは決してありません。
initの直後にBRIEF.mdを書き込みます(それより前では決してありません — initは空でないディレクトリを拒否します): インテントレイヤーのロックされたブリーフ、形状は../hyperframes/references/brief-format.mdに従います。<MEDIA_DIR>をインストールされた/media-useスキルディレクトリとして解決します。次に、node <MEDIA_DIR>/scripts/prefs.mjs record --hyperframes .で各プリファレンスバックアップされた回答を記録します(brief-format.mdがサブセットを指定します)。インテントレイヤーがレシピを採用した場合は、node <MEDIA_DIR>/scripts/recipe.mjs use --hyperframes . --name <name>を実行します。これにより、そのframe.mdがプロジェクトにコピーされ(ステップ2はスキップされます)、ステップ3のドラフトの基となるスケルトンが返されます。レシピは回答を埋めますが、承認は埋めません。レビューゲートは引き続き実行されます。
セットアップを通過する前にサインインステータスを表示します — npx hyperframes auth statusを実行し、その出力をそのまま中継します。これにより、音声/BGMがHeyGenエンジンとローカルエンジンのどちらを使用するか、およびサインアウトしている場合のサインイン方法が報告されます。1つのブランチを適用します:
- 協調: ユーザーがサインインするか、明示的に
offline/goを選択するのを待ちます。 - 自律: ステータスを表示し、利用可能なローカルエンジンで続行します。
オフラインプロバイダーが存在しない場合に必要な機能を黙って省略しないでください。ブロッカーを表面化させます。この決定を別の質問に折り込んだり、リポジトリごとの.envにキーを書き込んだりしないでください。認証の所有権とオフラインフォールバック: /media-use references/setup-providers.md § プロバイダー。
ゲート: hyperframes.jsonとBRIEF.mdが存在する。PR参照がブリーフにキャプチャされている。プリファレンスバックアップされた回答が記録されている(ブリーフ契約 § 2)。サインインステータスが表示された(サインイン済み、またはオフラインで続行)。
ステップ 1: PRの取り込み(キャプチャなし)
目標: PRの事実を取得し、情報源としてプロジェクトに取り込みます。ウェブサイトのキャプチャはありません。fetch-pr.mjsはghを決定論的に実行します — ページネーションされたgh apiを介してファイルリストを完成させるため、大規模なPRでも約100ファイルで切り詰められることはなく、capture/pr.json + capture/diff.patchのみを書き込みます(スクラッチディレクトリはありません)。MERGEされたPRの場合は、pr.jsonにベストエフォートのshipped_version(+ version_source)も解決するため、エンドカードで実際のバージョンを引用でき、発明する必要はありません。次にingest.mjsがそれをオフラインで合成キャプチャパッケージに取り込みます。
PR="<url | owner/repo#N | N>"
# PRを決定論的にフェッチ: ghを実行し、ページネーションされたgh apiを介してファイルリストを完成させ
# (大きなPRでも約100ファイルで切り詰められない)、capture/pr.json + capture/diff.patchのみを書き込む
# — スクラッチディレクトリはなし。gh認証/未検出/プライベートエラーはここでexit 1。
(cd "$PROJECT_DIR" && node <SKILL_DIR>/scripts/fetch-pr.mjs --pr "$PR" --out-dir ./capture)
# オフライン変換 → capture/extracted/{tokens.json (colors:[] → code-editorialパレット)、
# visible-text.txt(ブリーフ)、people.json(コントリビューター、ボットフィルター済み、name+login、
# avatarFile=assets/<login>.png)}。
(cd "$PROJECT_DIR" && node <SKILL_DIR>/scripts/ingest.mjs \
--pr-json ./capture/pr.json --diff ./capture/diff.patch --out-dir ./capture/extracted)
# 人物フロントの1つのネットワークステップ — 各コントリビューターのGitHubアバターをassets/<login>.pngに
# ダウンロード(クレジットクローズ用)。ベストエフォート。常にexit 0。
(cd "$PROJECT_DIR" && node <SKILL_DIR>/scripts/fetch-people-avatars.mjs \
--people ./capture/extracted/people.json)
fetch-pr.mjsがexit 1の場合(gh認証/未検出/プライベート)、そのstderrを報告して停止します — PRコンテンツを捏造しないでください。ingest.mjsがexit 1の場合、そのstderrを読み(通常は不正なpr.json)、修正して再実行します(決定論的)。fetch-people-avatars.mjsは常にexit 0。アバターがない場合は、作成者へのクレジットクローズがないことを意味するだけです。
people.jsonは、ghがすでに名前を付けているコントリビューター(PR作成者、コミット作成者、mergedBy)のnameを保持します。残り(レビュアー/コメンター/アサイン、gh pr viewが常にベアloginのみを与える)はnullです。ステップ3でクレジットクローズを書き込む前に、そのフレームに実際に表示される1〜6人のnullの名前を自分で解決します: gh api users/<login> --jq .name(すでにghがあるため、これをスクリプト化する必要はありません)。GitHubがそのユーザーの公開名も持っていない場合は、画面上でログインにフォールバックし、その人を音声ラインから削除します(story-design.mdのクレジットセクションを参照 — ナレーションは名前を言う必要があり、生のハンドルは決して使用しないでください)。
ゲート: capture/pr.json、capture/diff.patch、capture/extracted/tokens.json、capture/extracted/visible-text.txt、capture/extracted/people.jsonが存在する。PRの変更を1つの明確な文で説明できる。assets/<login>.pngはベストエフォート — その欠如は失敗ではありません。
ステップ 2: デザインシステム
目標: コードエディトリアルフレームプリセットを採用する。スクリプトがこれをこのビデオのframe.md + キャプションスキンに変換します。
スタイルは固定 — コードエディトリアル(ウォームなエディトリアル。差分用に作られたネイビーのコードサーフェス)。実行:
node <SKILL_DIR>/scripts/build-frame.mjs --preset code-editorial --hyperframes .
スクリプトはコードエディトリアルプリセットのFRAME.mdをframe.mdにコピーし、capture/extracted/tokens.json内のブランドトークンにリミックスします(PRにはないため → colors:[]/fonts:[]はコードエディトリアル自身のパレット(完全なデザイン)を保持します)、プリセットのキャプションスキンを.hyperframes/caption-skin.htmlにコピーし、自己検証します(壊れたマッピングでexit 1)。exit 0になったらすぐに進みます — 手動編集はしません。
ゲート: build-frame.mjsがexit 0で終了した — frame.mdがコードエディトリアルプリセットから存在し、.hyperframes/caption-skin.htmlがキャプションスキンソースとして存在する。
ステップ 3: ストーリーボードとスクリプト
目標: PRを承認されたフレームごとの説明計画に変換します。
../hyperframes-creative/references/story-spine.md(フック言語、証拠より先に価値、提案としてのストーリーボード、ソーストレーサブルなビジュアル)、references/story-design.md、../hyperframes-animation/blueprints-index.md、../hyperframes/references/storyboard-format.md、../hyperframes/references/script-format.mdを読んでください。それらを使用してSTORYBOARD.mdを作成し、ナレーションが必要な場合はSCRIPT.mdも作成します。フロントマターのduration:をブリーフのlengthから設定します — 大まかな期待値。アセンブリがカットがそれに対してどこに着地するかを報告します。
PRのアーキタイプ(changelog / feature-reveal / fix-explainer / refactor-walkthrough)、PRネイティブのフレームタイプ、フック、説得、ビート、フレームごとの単語予算、クレジットクローズにはstory-design.mdを使用します。シーケンスはナラティブデザインから来ており、diffのファイル順ではありません — 変更を説明し、diffを声に出して読まないでください。ソフトガイドとして、../hyperframes-animation/blueprints-index.mdの役割→ブループリントメニューを参照してください: 各ビートについて、その候補ブループリントが暗示する形状でナレーションを書き、1つが適合する場合はその候補blueprint: idをタグ付けします(ストーリーの真実がどのビートが存在するかを決定します — 形状に合わせてビートを強制しないでください)。capture/diff.patchから実際のdiffハンクを2〜4つ特徴として含め、それぞれ小さな読みやすいスニペットにします。各フレームのsceneで各スニペットが必要とするcode-*ブロックを指定します。フレームは、creditsクローズ(1〜6個のassets/<login>.pngアバター)を除いて、asset_candidatesを持ちません。ストーリーボードおよびスクリプトリファレンスの正確な必須フィールドを使用します。
ドラフト後、レビューループのプランパスを実行します — ../hyperframes/references/review-loop.md § 1: プランを提案として提示し、2つの質問をします — 承認するか変更するか、およびスケッチを先に(推奨)するかスキップするか。フィードバックはチャット返信として届きます。承認されるまでループします。これはチェックポイントゲートです(ブリーフ契約 § 1): 自律モードでは、質問することは何もありません — 同じ要約をヘッズアップとして投稿し、進みます。スケッチはビルドに折り込まれ、1つのプレビュー質問がステップ6で行われます。
ゲート: STORYBOARD.mdが存在し、すべてのフレームに必要なナラティブフィールドがある。ナレーションが必要な場合、SCRIPT.mdが存在する。ユーザーがプランを承認した(自律: 要約がヘッズアップとして投稿された)。
ステップ 3.1: オーディオ
目標: 承認されたスクリプトからナレーション、単語タイミング、音楽、オーディオメタデータを生成します。
ステップ3の承認後にオーディオを開始します。バックグラウンドで実行し、ステップ4に進みます。
呼び出す前に、ユーザーの要求からナレーションボイスを選択します。 リクエストがボイス、性別、またはトーンを指定した場合は、一致するボイスIDを選択し、--voice <id>で渡します。パイプラインデフォルトはそれ以外の場合Marcia(女性)(HeyGen)/ am_michael(Kokoro)です — そのため、「男性の声」のようなリクエストは、フラグを渡さない限り黙って無視されます。ボイスIDはプロバイダー固有です。ステップ0のサインインステータスが選択したプロバイダーに対して解決します: HeyGen(サインイン済み)は node <MEDIA_DIR>/audio/scripts/heygen-tts.mjs --list(またはGET /v3/voices?engine=starfish)経由。Kokoro(オフライン)は <MEDIA_DIR>/audio/references/tts.mdのボイステーブル(接頭辞 am_/bm_ が男性、af_/bf_ が女性)経由。ユーザーが特に希望を述べていない場合は、パイプラインデフォルトの前に記憶されたボイス(ブリーフ契約 § 2)にフォールバックします。
...