recipes
レシピとは、公開されたローンチフィルムを解析し、エージェントがそのクラフトを別のプロダクト用に再構築できるように書き起こしたものです。
<studio>/src/recipes/<id>/ に配置されます:
| ファイル | 常に存在 | 提供するもの |
|---|---|---|
recipe.md | はい | いつ使うか、ビートシート(時間、フレーム、絵、カメラ、モーション、トランジション、サウンド)、クラフトに関連する技法、適応すべき点、落とし穴、欠落コンポーネント |
recipe.json | はい | 同じ内容をデータとして(スキーマ schemas/recipe.schema.json):structure[]、techniques、audio、inputs、components、source |
Recipe.tsx + index.tsx | status: "built"の場合のみ | すぐに使えるコード:brand + content でパラメータ化されたコンポーネント、デモブランドで登録済み |
ほとんどのレシピはテキストのみ(status: "studied")ですが、それでも構築には十分です。ビートシートからスタジオのプリセットとコンポーネントを使ってシーンを記述します。レシピは元のフィルム、そのフレーム、またはそのコピーを一切含みません。ソースリンクはユーザーが参考作品を視聴するためのものです。
コマンドは launch-video/(ユーザープロジェクト)または studio/(launchfilmリポジトリ)から実行します。recipes/ と schemas/ はハーネスのルート(ユーザープロジェクトでは launch-video/、launchfilmではリポジトリルート)にあります。
1. 必要なものを把握する(BRIEF.md / STORYBOARD.mdから)
検索する前に、以下を書き出します:プリセット(アスペクト比)、目標再生時間、モード(プロダクトフィルム / ローンチフィルム / ハイブリッド)、テーマ(brand.jsonからダーク/ライト)、VOの有無、カバーすべきビート(hook、feature、logo…)、ユーザーが実際に持っている入力(ロゴ、スクリーンショット、画面収録、再構築可能なUI、統計、URL)。
2. 検索
recipes/CATALOG.md をざっと見る(1行1レシピ、ファミリーごとにグループ化:フォーマット、主要技法、入力、ソース、テキスト/コード)、または検索:
npx launchfilm ref search "statement vertical dark" # タイトル、概要、タグ、技法を全文検索
npx launchfilm ref search "launch aspect:9:16 max:30 theme:dark" # フィルター:family: aspect: tech: theme: max: min: status:
または recipes/index.json を直接フィルターする(フィールド:references/index-format.md):
node -e '
const idx=JSON.parse(require("fs").readFileSync("recipes/index.json","utf8")).recipes;
const want={aspect:"9:16",dur:30,techniques:["statement-sequence","end-card"],theme:"dark"};
for(const r of idx){const t=r.techniques.filter(x=>want.techniques.includes(x)).length;
if(r.format.aspect===want.aspect||t>0) console.log(r.id,r.format.aspect,r.format.duration_s+"s",r.theme,r.vo?"vo":"-",t,r.code?"code":"text");}'
インデックスがない場合? src/recipes/*/recipe.json をグロブして読み込みます。
3. スコアリングと1~3件の選択
| 基準 | 点数 |
|---|---|
format.aspect がメインプリセットのアスペクト比と一致 | +3(再構成は可能だがコストがかかる) |
format.duration_s が目標の±30%以内(またはレシピが必要なビートをカバーしている) | +2 |
| 各技法がストーリーボードのニーズと重なる | +1(最大+4) |
必要なすべての inputs フィールドをユーザーが持っている | +2;不足している入力が作成不可能 |
theme が brand.json の theme と一致 | +1 |
vo が計画と一致 | +1 |
code: true(すぐに使える Recipe.tsx)でユーザーが急いでいる | +1;status: "reviewed" |
render_cost が高く、ユーザーがラップトップ使用中または急いでいる | -1 |
テキストかコードかはスピードのボーナスであり、品質のフィルターではありません。条件に合うテキトレシピは、合わないコードレシピよりも優先されます。フィルム全体には最高スコアの1つを、異なるビート(フックはAから、フィーチャーはBから、エンドカードはCから)には最大3つを選択します。
4. 選択結果を表示
各選択について、ユーザーに以下を表示します:
- タイトル(
id)とtextまたはcodeの区別; - なぜそのレシピが条件に合うか(アスペクト比、長さ、カバーするビート、持っている入力);
- ビートシートを3~6行の短い行で(
0–3.1 s hook: name blurs in word by word…)、recipe.mdから要約; - ソースリンク(
source.url)で、ユーザーが元の作品を視聴できるようにします。ホストされたプレビューはありません。
対話セッションではユーザーに選択させます。ユーザーが「自分で決めて」と言った場合は、最高スコアのものを選び、その旨を1行で伝えます。
5. レシピを読む
選択した recipe.md を全文読みます:ビートシート、フレームと名前付きスプリングによるモーション、トランジション、各イベントのサウンド、「適応すべき点」、「落とし穴」、「欠落コンポーネント」。recipe.json の structure[]、audio、inputs、components も読みます。これらの数値が再利用するクラフトであり、絵とコピーはユーザーのものになります。
6. スキャフォールド
npx launchfilm new <slug> --recipe <id> --preset x-16x9 [--title "Product"] [--dry-run]
- コード付きレシピ:
films/<slug>/Film.tsxに、デフォルトでレシピのコンポーネントをレンダリングする1つのrecipeシーンが生成されます。contentプロパティ(recipe.jsonのparams)を変更し、ブランドを渡します。 - テキストレシピ:
film.jsonにビートシートの各行に対応する1つのショット(レシピのタイミング、トランジション、SFXを含む)が生成され、Film.tsxには各行の絵、カメラ、モーション、サウンドをコメントとして持つ1つのTodoSceneが生成されます。CLIはTODOのリストを表示します。TodoSceneはラベル付きプレースホルダーをレンダリングし、未処理のTODOが残っているとnpx launchfilm qaが失敗します(B1)。 - どちらの場合も、
recipe.mdをfilms/<slug>/RECIPE.mdにコピーし、STORYBOARD.mdにレシピの行を事前入力します。 - レシピの組み合わせ:最もランタイムを占めるレシピからスキャフォールドし、他のレシピの行をショットとして追加します(コードがあればその
Recipeコンポーネントをシーンとして、なければTODOシーンとして)。
7. 構築(詳細:references/remix.md)
- まずスケルトンをユーザーの長さとビートグリッドに合わせて再タイミングします(remix.md §3):ビートの順序と比率を維持し、すべての境界をダウンビートまたはVOフレーズにスナップします。
film.jsonのショットとSTORYBOARDの行を更新し、シーン構築前にユーザーがストーリーボードを承認します(ゲート3)。 - ブランド:
brand.jsonをuseBrand()を通じてすべてのシーンに適用します(コードレシピの場合はbrandプロパティ)。レシピフォルダは決して編集しません。 - コンテンツ:ユーザーのプロダクト名、セリフ、統計、UI。元のフィルムのコピーやデモブランドのテキストは絶対に使用しません。
- テキストレシピのシーン:各
TodoSceneをsrc/presetsとsrc/componentsから構築したシーンに置き換えます(最初にAPI.mdを読んでください。scene-buildスキルがルールを管理します)。recipe.jsonがリストするコンポーネントを使用し、行の名前付きスプリング、フレーム数、スタガー、トランジションIDを正確に保持します。モーションの継続時間はフィルムの長さに応じてスケーリングしません。レシピが「欠落コンポーネント」としてリストするコンポーネントは、その仕様に従ってfilms/<slug>/scenes/に構築します。 - サウンド:
audio.sfxのすべてのイベントと各行のsfxは、新しいフレームでもそのサウンドを保持します(グルールール、craft/02)。 - レンダリング前にすべてのショットのスチルを生成し(scene-build ステップ4)、次に
film-qaを実行します。
ルール
- レシピは出発点であり、最終出力ではありません。フィルムはユーザーのストーリーを伝えるものです(STORYBOARDを最初に承認)。
- 元の作品の要素は一切フィルムに取り入れません:ソースのコピー、ブランド、フッテージは使用禁止。ソースリンクはユーザーが視聴するためのもので、
recipe.jsonとメッセージ内に留め、決してフィルムには含めません。 - 欠落コンポーネント → レシピフォルダや共有プリセットではなく、
films/<slug>/scenes/内に構築します。 - 再実行が再現可能になるよう、使用したレシピ、行、スケール係数、パラメータを
STORYBOARD.mdに記録します。