| name | make-cover-art |
| description | トラックのカバーアート(ジャケット画像)を生成する。歌詞とキャラクター設定を読み込み、対話的にシーンを決めて、Gemini 3.1 Flash Imageで画像を生成する。カバーアート、ジャケット、アートワーク、サムネイル画像の生成に使う。 |
| argument-hint | ["トラックディレクトリのパス"] |
| allowed-tools | Bash(bun *) |
カバーアート生成
トラック $ARGUMENTS のカバーアートを生成する。
前提
ディレクトリ構造
<トラック>/source/lyrics.txt — 歌詞
<トラック>/artwork/ — 生成した画像を保存
content/artists/<キャラ>/images/reference.jpg — キャラクター参照画像
content/artists/<キャラ>/images/base-prompt.md — キャラクターのベースプロンプト
content/artists/<キャラ>/images/graffiti_symbol.jpg — グラフィティシンボル
キャラクター判別
claude-code/ 配下のトラック → content/artists/claude-code/
codex/ 配下のトラック → content/artists/codex/
手順
1. 素材を読み込む
source/lyrics.txt を読む
- 該当キャラクターの
content/artists/<キャラ>/images/base-prompt.md を読む
- 該当キャラクターの
content/artists/<キャラ>/profile.md(設定シート)を読む
2. シーンを対話的に決める
まず composition-reference.md を読み、構図テクニックとアンチパターンを把握すること。
歌詞のテーマ、ムード、キーフレーズを分析し、カバーアートのシーン案を3つ提案する。
各案には以下を含める:
- シーンの描写(どんな場面か)
- 使用する構図テクニック(composition-reference.md から選択。名前と理由)
- 歌詞との接点(どのフレーズがビジュアルに反映されるか)
既存のカバーアートとの差別化を必ず確認する。 他トラックのカバーアートを読み込み、構図・色味・ロケーションが被らないようにする。
ユーザーが案を選ぶか、方向性をフィードバックしたら、それに基づいてプロンプトを作成する。
3. プロンプトを作成する
核心原則
- 「シーンを描写せよ、キーワードを並べるな」 — 説明的な文章(ナラティブ)で書く。キーワードの羅列より一貫性のある画像になる
- 地名を直接書かない — 「Roppongi」と書くと看板に「六本木」と貼られるだけ。実際の路地裏の視覚的特徴を描写する(配管、室外機、小さなバーのドア、etc)
- プロンプトはシンプルに — 複雑にするほど不安定になる。過剰な指示は逆効果
- キャラの身体的特徴はプロンプトに含めない — 参照画像が担う。シーンと行動だけを指示する
プロンプトテンプレート(参考)
A photorealistic [ショットタイプ] of this person, [アクション/表情],
set in [環境の視覚的描写]. Illuminated by [ライティング],
creating [ムード] atmosphere. [カメラ/レンズの指定].
No text, no watermarks.
写真用語を使うと精密にコントロールできる:
- ショットタイプ: close-up, medium shot, wide establishing shot
- レンズ: 85mm portrait lens, 35mm wide angle
- ライティング: single amber streetlight, neon glow, backlit silhouette
ラッパーの世界観で見立てる(重要)
テック要素(ターミナル、コード、モニター)を直接見せない。ラッパーの世界観に翻訳する:
- ターミナル → レコーディングスタジオ、路地裏(一人で向き合う場所)
- コードを書く → リリックを書く、マイクの前に立つ
- 深夜のコーディング → 深夜のストリート、スタジオ
- テック要素を直接見せるとラッパーとしてのリアリティが崩れる
路線の選択(象徴系 vs 世界観の一シーン系)
カバーアートには大きく2つの路線がある。曲やユーザーの意向に応じて選ぶ:
象徴系(シンボリック)
- 曲のテーマやアーティストの立ち位置を1枚の絵で凝縮する
- 構図・小道具・ライティングが全部メタファーとして機能する
- ポスター/ジャケット的な強さ。サムネイル映えする
- 例: 01(グラフィティの壁と手のシルエット)、02(路地裏の正面ポートレート)、03(枯れ枝の巨木と路地)
世界観の一シーン系(ドキュメンタリー・スチル)
- 「この世界でありうる一瞬」を切り取る。劇中スチル、ドキュメンタリー写真のような距離感
- ラッパーらしいポーズ(腕組み・カメラ目線・チェーンを見せる等)を全部抜く
- グラフィティ・路地裏のようなジャンル記号からも離れてよい
- 舞台はプライベート空間や生活の風景でもOK(ペントハウス、ベランダ、ホテル、etc.)
- 曲との関係は「メタファー」から「この世界で実在しうる行動」に弱める
- 過去トラックが象徴系で固まっているときに強い差別化になる
- 例: 04(ペントハウスから東京夜景を見下ろす後ろ姿)
どちらが合うかの判断:
- ユーザーが「曲を象徴する」「アーティストの強さを見せる」系の言葉を使う → 象徴系
- ユーザーが「世界観」「シーン」「日常」「ドキュメンタリー」系の言葉を使う → 世界観系
- 提案は両路線を混ぜて3案出し、方向性を決めてもらう
ビジュアルのデフォルト
以下はシリーズの基本トーンだが、曲の方向性に合わせて大胆に変えてよい。ユーザーに確認して決める。
- デフォルト: モノクロベース + アクセント1色(Claude Code: アンバー/オレンジ、Codex: 赤)
- デフォルト: ストリートの質感(コンクリート、グラフィティ、濡れた路面)、夜・暗所のライティング
- スプリットライティング(顔の半分だけ照らす)が強いインパクトを出す
- 例外: チルな曲なら暖色のゴールデンアワー、自然光、河川敷などストリートから離れた舞台もあり(03「ログだけ」参照)
アクセント色縛りからの脱却
キャラのデフォルトアクセント色(Claude Code: アンバー、Codex: 赤)に毎回頼ると単調になる。ユーザーから「アンバーにこだわりすぎる。つまらん」等のフィードバックがあったら、曲の解釈から色を引き出す:
- 04 では「アンバーの路地」「ネオンピンク」を避け、タングステン(室内)+ウイスキー琥珀+東京タワーのライトアップ+首都高のテールランプの赤で、暖色を複数の光源に分散した
- 配色のアクセントを「1点の看板色」から「複数の自然光・人工光の集積」に変えると、世界観の一シーン系と相性がいい
- アクセント色を完全に抜いた純モノクロ(02 参照)もあり
貧乏臭さに注意(成功したラッパーの世界観)
キャラクターが「成功したラッパー/その世界の王」である場合、生活感が強すぎる記号は世界観を崩す:
- 低層アパート・鉄格子の小さなベランダ → 中層・高層マンション or ペントハウスに格上げ
- ハーフパンツ・素足にスリッパ → スリムパンツ・黒い上質なロングスリーブ
- ペットボトル・灰皿・コンビニ弁当 → ロックグラス・ウイスキーボトル・モダンなテーブルウェア
- 「何もしてない人」の時間ではなく、「自分の時間を持っている人」の静けさを出す
ユーザーから「貧乏臭い」「生活感が出すぎ」と言われたら、舞台・服装・小道具を1段〜2段格上げして再提案する。
歌詞からのシンボル埋め込み
歌詞に出てくる場所やオブジェクトをさりげなく配置する。直接的でなく、わかる人にはわかるレベルで。
サムネイル映え
SpotifyやXでは小さく表示される。シンプルな構図、コントラストの強い配色を意識する。
4. 画像を生成する
中間ファイルはすべて artwork/drafts/ に保存する。 最終ディレクトリを散らかさないため。
mkdir -p <トラック>/artwork/drafts
scripts/generate-cover.ts を使う。マルチターン会話、thought_signature、グラウンディングを自動処理する。
新規生成(Turn 1 ベースショット + Turn 2 シーン派生)
bun scripts/generate-cover.ts <character> "<シーンプロンプト>" <出力パス>
例:
bun scripts/generate-cover.ts claude-code \
"This person standing in a dark narrow alley at night, body facing forward. Hard split lighting, half face lit, half in shadow. Monochrome. Graffiti on wall." \
claude_code/02_ターミナルの誇り/artwork/drafts/01.jpg
generate-image.ts で直接生成する場合(キャラなし等)
bun scripts/generate-image.ts "<プロンプト>" <トラック>/artwork/drafts/01.jpg --aspect-ratio 1:1
既存画像の編集
bun scripts/generate-cover.ts <character> --edit "<編集指示>" <画像パス>
例:
bun scripts/generate-cover.ts claude-code \
--edit "Apply extreme split lighting. Only left half of face lit." \
claude_code/02_ターミナルの誇り/artwork/drafts/01.jpg
ファイル命名規則(drafts内)
- 連番で
01.jpg, 02.jpg, ... と名前をつける
- ワイド版は
01_wide.jpg, 02_wide.jpg, ...
- グラフィティシンボル生成時は
content/artists/<キャラ>/images/drafts/ を使う
ワイド版(16:9)の生成
顔・読める文字・建築が絡む写真系は「方法0(16:9を先に作って1:1を切り出す)」を第一選択にする。 情景がシンプルで顔が小さい場合のみ outpaint(方法1)でよい。
方法0: 16:9 を先に生成 → 1:1 を切り出す(写真系の推奨・最優先)
cover.jpg を先に作って outpaint で広げる従来手順は、顔・ポスター等の文字・建築が絡むと破綻しやすい(07「またかよ」で顕在化)。アウトペイントや部分エディットを重ねると副作用が連鎖する:
- outpaint/再レンダリングは ポスター等の文字を化けさせる("HELD OVER"→"HELO OVER" 等)
- 追加した建物が AI 歪み(細い三角ビル・溶けた壁面・窓が揃わない)
- 全画面再レンダリングを繰り返すと 顔が劣化(猿っぽく崩れる)、質感も HDR/イラスト調に劣化
対策は、16:9 を一枚ちゃんと作ってから 1:1 を切り出すこと。同じ一枚から作るので cover と wide で顔・質感・建物が完全一致し、顔もキャラ参照から一発で出る。
bun scripts/generate-cover.ts <character> "<シーンプロンプト。下記の頑丈化フレーズを含める>" \
<トラック>/artwork/drafts/w01.jpg --aspect-ratio 16:9
cp <トラック>/artwork/drafts/w02.jpg <トラック>/artwork/cover_wide.jpg
uv run scripts/crop-square.py <トラック>/artwork/cover_wide.jpg <トラック>/artwork/cover.jpg --hpos right
プロンプトの頑丈化フレーズ(写真系で毎回入れる):
- 質感:
PHOTOREALISTIC natural photographic look, 35mm, heavy natural film grain — NOT an illustration, NOT HDR, NOT oversaturated, NOT painterly
- ロゴ/記号の文字化け対策: 記号は「文字ではない」と明示(例:
a pure infinity figure-eight ∞ made of one continuous neon tube — NOT letters, NOT the letters N A O, NOT a wordmark)
- 建築の歪み対策:
rectangular BOX shapes with straight vertical walls, flat rooftops, windows in aligned rows. NO thin wedge/triangular sliver buildings, NO tapering, NO melting/warped facades
- 車・小物のスケール:
at correct realistic scale
- 1:1 兼用:
group the person, entrance and key props in the right-center so it also works as a square crop
鉄則: 一度良い顔が出た画像を、文字・建物直しのために全画面再レンダリングしない。 直すなら生成し直してベストを選ぶ。どうしても部分修正するなら、顔から離れた要素だけを対象にし、直後に顔・文字が劣化してないか必ず見比べる。
方法1: outpaint(情景がシンプル・顔が小さい場合のみ)
generate-image.ts --input でスクエア版を入力し、左右を拡張する。同じ画像をベースにするため構図の一貫性が高い。ただし顔・文字・建築が絡むと破綻するので、その場合は方法0を使う。
generate-image.ts --input でスクエア版を入力し、左右を拡張する。同じ画像をベースにするため構図の一貫性が高い。
必ず GENIMG_MODEL=gemini-3.1-flash-image を付けること。 デフォルトの flash-lite-image は 4K 非対応で Image size 4K is not supported (400) になる(2026-07-07 に確認)。
GENIMG_MODEL=gemini-3.1-flash-image bun scripts/generate-image.ts \
"Outpaint this image to 16:9 widescreen by adding more environment on the left and right sides only. Do not stretch, resize, or modify the original image content in any way. The person's face and body proportions must remain exactly as they are. [環境の描写]. Match the existing lighting and atmosphere." \
<トラック>/artwork/drafts/01_wide.jpg \
--aspect-ratio 16:9 \
--input <トラック>/artwork/cover.jpg
- 明るい画像(昼間・自然光)は歪みが目立ちにくく成功しやすい
- 暗い画像(夜・ハードライト)は顔のプロポーションが崩れやすい
- 生成後、必ず顔が縦長/横長に歪んでいないか確認する
- 「シーンを広げる」ではなく「既存の要素の隣に同種の要素を足す」と指示する — 「extend the alley」のような抽象的な指示だと新しい構造物(道、交差点等)が生成されて不自然になる。「add more [具体的な要素] adjacent to the existing ones」のように、今ある物の延長を具体的に指示する
- 構造物の二重化バグに注意 — 湾曲した手すり、柵、カウンターのような 片側で終わる構造物 は、単に「左右に拡張して」と指示すると右側にも複製されて建築的に破綻する(04制作時に発生)。対策:
- 「the [構造物] must NOT be extended or duplicated — it is the only one in the image, and it ends naturally where the balcony/counter terminates」のように 絶対に延長しないことを明示
- 左側・右側で追加するものを 別々に具体的に書き分ける(例: 左は室内の壁と引き戸、右は街の夜景のみ)
- 「The balcony/counter/railing itself stays exactly as in the original」を入れる
方法2: マルチターン再生成(outpaintで顔が歪んだ場合のフォールバック)
スクエア版と同じプロンプトをベースに、最初から16:9で生成する。顔の一貫性は高いが、構図が変わる。
bun scripts/generate-cover.ts <character> "<シーンプロンプト>" <出力パス> --aspect-ratio 16:9
- プロンプトに「A wide 16:9 cinematic composition」等のワイド構図指示を追加する
- マルチターンなので毎回異なる画像になる点に注意
使ってはいけない方法
generate-cover.ts --edit でのアスペクト比変更 — editモードはアスペクト比がハードコードされており変更できない
設定(スクリプトに組み込み済み)
- アスペクト比: 1:1(スクエア)、
--aspect-ratio 16:9 でワイド指定可能
- 解像度: 4K
- Thinking: High(品質重視)
- グラウンディング: Turn 2で
googleSearch:{} を付与。searchTypes を含めると API が 404 を返すため外した(2026-07-14)。失敗時は grounding なしで自動リトライするフォールバック入り。Turn 2 の 404 NOT_FOUND は一時的なことも多く、同じコマンドを再実行すると通る(2026-07-14)
- 5ターンの壁: 5ターン超えると顔が崩れる。長くなったらスクリプトを再実行してTurn 1からやり直す
注意点
- AIに「モノクロにして」と編集を重ねるとカラーに戻ることがある。最初からプロンプトに「full black and white monochrome」と入れる方が確実
- 編集はJPEG再圧縮で画質劣化する。できるだけ少ない編集回数で仕上げる
- outpaintは明るい画像では成功しやすいが、暗い画像では顔が歪みやすい。歪んだらマルチターンで再生成する
顔一貫性のポイント(マルチターン方式)
- ベースプロンプトは一切改変しない
- Turn 2の派生プロンプトには3要素を必ず含める:
- 同一人物の明示(Same person, identical face)
- 固有特徴のリマインド(base-prompt.mdの派生ターン用テンプレートを使う)
- 変更点のみ記述
- 一度に大きく変えない。背景だけ、ポーズだけ、と段階的に
- 「CRITICAL: MAINTAIN EXACT SAME FACE」のような強調指示は逆効果
- 顔が大きく映る構図を優先。全身ショットは一貫性が落ちる
5. 確認と改善
画像を生成したら、ユーザーに見せる前に自分で客観的に評価する。 以下のチェックリストを使い、問題点を正直に伝えること。良い点だけ挙げて問題を隠さない。
生成後セルフレビュー(必須)
画像を Read ツールで表示し、以下を確認してからユーザーに所見を伝える:
- 物理的整合性 — 反射、影、光源の方向、人体のプロポーションが物理的に正しいか
- 意図との一致 — プロンプトで指示した構図・ポーズ・表情が実現されているか
- ロケーションの正確性 — 特定の場所を指定した場合、実際のその場所に見えるか(見えないなら正直に「○○には見えない」と言う)
- キャラクター設定の一致 — 服装、タトゥーの位置(左前腕内側のみ)、ヒゲ(2mmの均一なスタブル)、首のタトゥーなど
- 既存カバーアートとの差別化 — 構図・色味・ロケーションが他トラックと被っていないか
- カバーアートとしての強さ — サムネイルで小さく表示されたとき目を引くか。ただの写真になっていないか
- テキスト・看板 — 読める日本語テキストが生成されていないか(野暮になる)
評価テンプレート:
[良い点] ○○が効いている
[問題点] ○○が意図と違う / ○○が物理的におかしい / ○○に見えない
[判定] このまま進める / 修正が必要 / 作り直し
問題があるなら「いい感じ」とは言わない。問題を先に伝えてからユーザーに判断を仰ぐ。
改善サイクル
open コマンドで画像を自動的に開く
- フィードバックを受けて修正。一度に一つだけ変える
- editは画質劣化するので最大2回まで。それ以上必要なら新規生成し直す
- 確定したら
artwork/drafts/ から artwork/cover.jpg にコピー
- ワイド版も確定したら
artwork/cover_wide.jpg にコピー
- 使用したプロンプトを
artwork/prompt.txt に保存
- 確定後、
artwork/drafts/ ディレクトリを削除してクリーンアップする
6. 既存のカバーアートがある場合
既存の artwork/cover.* がある場合、ユーザーにバックアップが必要か確認する。必要なら artwork/cover_backup.* として保存してから差し替える。