@renoise/video-maker 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/.claude-plugin/plugin.json +5 -0
  2. package/README.md +50 -0
  3. package/hooks/hooks.json +16 -0
  4. package/hooks/session-start.sh +17 -0
  5. package/lib/gemini.ts +49 -0
  6. package/package.json +22 -0
  7. package/skills/director/SKILL.md +272 -0
  8. package/skills/director/references/narrative-pacing.md +257 -0
  9. package/skills/director/references/style-library.md +179 -0
  10. package/skills/product-sheet-generate/SKILL.md +75 -0
  11. package/skills/renoise-gen/SKILL.md +362 -0
  12. package/skills/renoise-gen/references/api-endpoints.md +138 -0
  13. package/skills/renoise-gen/references/video-capabilities.md +524 -0
  14. package/skills/renoise-gen/renoise-cli.mjs +723 -0
  15. package/skills/scene-generate/SKILL.md +52 -0
  16. package/skills/short-film-editor/SKILL.md +479 -0
  17. package/skills/short-film-editor/examples/mystery-package-4shot.md +260 -0
  18. package/skills/short-film-editor/references/continuity-guide.md +170 -0
  19. package/skills/short-film-editor/scripts/analyze-beats.py +271 -0
  20. package/skills/short-film-editor/scripts/batch-generate.sh +150 -0
  21. package/skills/short-film-editor/scripts/generate-storyboard-html.ts +714 -0
  22. package/skills/short-film-editor/scripts/split-grid.sh +70 -0
  23. package/skills/tiktok-content-maker/SKILL.md +143 -0
  24. package/skills/tiktok-content-maker/examples/dress-demo.md +86 -0
  25. package/skills/tiktok-content-maker/references/ecom-prompt-guide.md +261 -0
  26. package/skills/tiktok-content-maker/scripts/analyze-images.ts +122 -0
  27. package/skills/video-download/SKILL.md +161 -0
  28. package/skills/video-download/scripts/download-video.sh +91 -0
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: scene-generate
3
+ description: >
4
+ Generates realistic scene and background images using Renoise nano-banana-2
5
+ for video production. Use when user says "generate background", "create scene
6
+ image", "I need a background for my video", or when a video workflow needs
7
+ custom environment images. Do NOT use for product photos or design sheets.
8
+ allowed-tools: Bash, Read
9
+ metadata:
10
+ author: renoise
11
+ version: 0.2.0
12
+ category: video-production
13
+ tags: [scene, background, renoise]
14
+ ---
15
+
16
+ # Scene / Background Image Generation
17
+
18
+ Generate realistic background/scene images via Renoise `nano-banana-2` model for use as video environment references.
19
+
20
+ ## Arguments
21
+
22
+ - First argument — Scene description in natural language (required)
23
+ - Second argument — Output directory (required)
24
+
25
+ ## Instructions
26
+
27
+ 1. Write an English prompt describing the scene. The prompt should specify:
28
+ - Environment and setting details
29
+ - Lighting conditions
30
+ - Perspective (e.g. "shot from a natural handheld perspective")
31
+ - "No people, no hands, no products — just the empty environment"
32
+ - "Photorealistic, like a real photograph. Sharp focus on the main surface area."
33
+
34
+ 2. Generate the image using the renoise-gen CLI:
35
+
36
+ ```bash
37
+ node ${CLAUDE_SKILL_DIR}/../renoise-gen/renoise-cli.mjs task generate \
38
+ --model nano-banana-2 \
39
+ --prompt "<english_prompt>" \
40
+ --resolution 2k \
41
+ --ratio 9:16
42
+ ```
43
+
44
+ 3. The command will output an `imageUrl` when complete. Download the image to the output directory:
45
+
46
+ ```bash
47
+ curl -sL "<imageUrl>" -o "<output_dir>/scene.png"
48
+ ```
49
+
50
+ 4. Verify the file was created and print file size.
51
+
52
+ 5. Show the generated image to the user for approval. If not satisfactory, adjust the prompt and regenerate.
@@ -0,0 +1,479 @@
1
+ ---
2
+ name: short-film-editor
3
+ description: >
4
+ 短片剪辑师:音乐先行,按节拍卡点拆分故事为多段(5-15s不等),
5
+ 生成HTML分镜预览供确认,维护角色/画风一致性,批量生成并输出组装指南。
6
+ 触发词:short film, multi-clip, 短片, 1分钟视频, story video, 多段视频
7
+ allowed-tools: Bash, Read
8
+ metadata:
9
+ author: renoise
10
+ version: 0.1.0
11
+ category: video-production
12
+ tags: [short-film, multi-clip, narrative, story, 短片]
13
+ ---
14
+
15
+ # Short Film Editor
16
+
17
+ You are a short film editor specializing in multi-clip AI video production. You guide users through a 6-phase workflow: from story concept to assembled short film, maintaining character/style consistency across all clips. Default language: English. Adapt to the user's language if they use another.
18
+
19
+ ## Core Principles
20
+
21
+ 1. **Music-First (when available)**: If music exists, start with music → beat analysis → shot timing. If no music, use narrative rhythm to determine shot pacing.
22
+ 2. **Storyboard Preview**: Before batch generation, produce an HTML preview page for visual confirmation.
23
+ 3. **Character Consistency**: Character Bible entries must be copied verbatim into every prompt — never abbreviate.
24
+ 4. **Continuity Bridging**: Every shot (except S1) opens with `Continuing from the previous shot:` referencing the previous shot's ending state.
25
+ 5. **Narrative Rhythm over Equal Splits**: Never divide total duration equally. Each shot's length should follow the story's emotional pacing — slow for atmosphere, short for impact.
26
+
27
+ ## Critical Rules
28
+
29
+ - **Seedance prompts must be in English** — the model understands English best.
30
+ - **Each clip: 5-15s** — Seedance 2.0 maximum is 15s per generation.
31
+ - **NEVER upload images containing realistic human faces** — Seedance privacy detection will block them.
32
+ - **BGM/sound effects are NOT included in Seedance prompts** — real BGM is overlaid in post-production.
33
+ - All project data accumulates in `${PROJECT_DIR}/project.json` throughout the phases.
34
+
35
+ ## Phase 1 — Story & Character Bible
36
+
37
+ 1. **Receive story concept** — text, script, or even a single sentence.
38
+
39
+ 2. **Break story structure**: Beginning → Development → Climax → Resolution. Confirm total duration (default 60s).
40
+
41
+ 3. **Build Character Bible** — JSON array, one entry per character:
42
+ ```json
43
+ {
44
+ "id": "CHAR_MAYA",
45
+ "name": "Maya",
46
+ "appearance": "East Asian woman, late 20s, shoulder-length black hair with subtle auburn highlights, warm ivory skin, almond-shaped dark brown eyes",
47
+ "wardrobe": "Oversized cream-colored chunky-knit wool cardigan over a fitted charcoal cotton turtleneck, high-waisted dark indigo straight-leg jeans, brown leather ankle boots",
48
+ "signature_details": "Small gold hoop earrings, thin gold chain bracelet on left wrist, no rings",
49
+ "voice_tone": "Warm, curious, slightly husky"
50
+ }
51
+ ```
52
+ Key rules for character descriptions:
53
+ - `appearance`: age, ethnicity, hair (style + color + length), skin tone, eye shape/color, body type
54
+ - `wardrobe`: texture + cut + color (never just "blue dress" — say "navy blue A-line silk midi dress")
55
+ - `signature_details`: jewelry, tattoos, scars — visual anchors that reinforce identity
56
+
57
+ 4. **Build Style Guide** — global keywords locked for ALL shots:
58
+ ```json
59
+ {
60
+ "visual_style": "Cinematic drama, shallow depth of field, film grain",
61
+ "color_palette": "Warm amber tones with cool blue shadows, muted saturation",
62
+ "lighting": "Soft golden hour side-lighting through large windows, practical lamps as secondary fill",
63
+ "camera_language": "Slow deliberate movements, lingering close-ups, occasional wide establishing shots",
64
+ "negative_prompts": "No cartoon, no anime, no oversaturated colors, no dutch angles, no text overlays, no watermarks"
65
+ }
66
+ ```
67
+
68
+ 5. **Present summary** for user confirmation before proceeding.
69
+
70
+ 6. **Initialize project.json**:
71
+ ```bash
72
+ mkdir -p "${PROJECT_DIR}/storyboard"
73
+ ```
74
+ Write `${PROJECT_DIR}/project.json` with:
75
+ ```json
76
+ {
77
+ "project": { "id": "<slug>", "title": "<title>", "total_duration_s": 60, "ratio": "16:9" },
78
+ "characters": [ ... ],
79
+ "style_guide": { ... },
80
+ "music": null,
81
+ "shots": []
82
+ }
83
+ ```
84
+
85
+ ## Phase 2 — Music & Beat Analysis (or Narrative Rhythm)
86
+
87
+ **If user has or wants music**, follow Steps 1-3 below.
88
+
89
+ **If user skips music** (e.g. "先不用音乐" / "no music for now"), skip to **Step 4 — Manual Rhythm**:
90
+ - Define segments based on narrative pacing, not equal splits.
91
+ - Vary durations: establishing shots 7-10s, action bursts 5-6s, aftermath/resolution 5-7s.
92
+ - Aim for 4-7 segments depending on total duration.
93
+ - Write a manual `music` section in project.json with `bpm: 0` and narrative-labeled sections (e.g. "buildup", "chase", "climax", "aftermath").
94
+ - Proceed directly to Phase 3.
95
+
96
+ ### Step 1 — Obtain Music
97
+
98
+ Three paths (ask user which applies):
99
+
100
+ | Path | When | How |
101
+ |------|------|-----|
102
+ | **Extract from reference** | User has a reference video | `ffmpeg -i ref.mp4 -vn -acodec copy "${PROJECT_DIR}/bgm.aac"` |
103
+ | **User-provided** | User has a BGM file | Copy to `${PROJECT_DIR}/bgm.<ext>` |
104
+ | **AI-generated** | Starting from scratch | Suggest a Suno/Udio prompt based on the story mood, tempo, and genre. User generates externally and provides the file. |
105
+
106
+ ### Step 2 — Beat Analysis
107
+
108
+ ```bash
109
+ python3 ${CLAUDE_SKILL_DIR}/scripts/analyze-beats.py "${PROJECT_DIR}/bgm.<ext>"
110
+ ```
111
+
112
+ Output JSON:
113
+ ```json
114
+ {
115
+ "bpm": 92,
116
+ "total_duration_s": 63.5,
117
+ "beats": [0.65, 1.30, 1.96, ...],
118
+ "sections": [
119
+ { "start": 0, "end": 16.2, "label": "intro" },
120
+ { "start": 16.2, "end": 32.8, "label": "verse" },
121
+ ...
122
+ ],
123
+ "suggested_cuts": [
124
+ { "time": 0, "end": 8.0, "duration": 8.0, "section": "intro" },
125
+ { "time": 8.0, "end": 21.2, "duration": 13.2, "section": "verse" },
126
+ ...
127
+ ]
128
+ }
129
+ ```
130
+
131
+ ### Step 3 — Finalize Shot Durations
132
+
133
+ - Use `suggested_cuts` as the starting point.
134
+ - Segments > 15s → split at the nearest interior beat point.
135
+ - Segments < 5s → merge with the adjacent segment.
136
+ - Update `project.json` with music analysis results.
137
+
138
+ ## Phase 3 — Shot Table
139
+
140
+ ### Narrative Rhythm Guidelines
141
+
142
+ **NEVER divide total duration equally.** Each shot's length should follow the story's emotional arc:
143
+
144
+ | Narrative Purpose | Typical Duration | Pacing |
145
+ |-------------------|-----------------|--------|
146
+ | Establishing / atmosphere | 7-10s | Slow, breathing room |
147
+ | Buildup / transition | 5-7s | Medium |
148
+ | Action / impact | 5-6s | Fast, punchy |
149
+ | Climax / collision | 6-8s | Intense, dense |
150
+ | Aftermath / resolution | 5-7s | Slow, lingering |
151
+
152
+ **In-clip cutting (镜内切换)**:
153
+ Real films average 2-4s per camera angle (action films: 1-2s). Seedance minimum is 5s per clip, so use **time-annotated camera changes within each clip** to simulate fast cutting:
154
+
155
+ ```
156
+ [0-1.5s] Extreme close-up of character's face screaming
157
+ [1.5-3s] Hard cut — wide shot of shockwave tearing across intersection
158
+ [3-5s] Hard cut — another character dodges debris, combat roll
159
+ ```
160
+
161
+ A 7s clip with 3-4 internal "cuts" feels like 3-4 separate shots to the viewer. Target **2-4 visual angle changes per clip** for action sequences, 1-2 for atmospheric shots.
162
+
163
+ ### Building the Shot Table
164
+
165
+ Based on Phase 2 durations, build the shot table. Each shot entry in `project.json`:
166
+
167
+ ```json
168
+ {
169
+ "shot_id": "S1",
170
+ "duration_s": 8,
171
+ "music_section": "intro",
172
+ "beat_sync_notes": "Beat 4 (3.2s) = Maya picks up package; Beat 8 (6.5s) = she looks up surprised",
173
+ "scene": "Dimly lit apartment hallway, warm overhead pendant light, mailboxes on the left wall",
174
+ "characters": ["CHAR_MAYA"],
175
+ "action": "Maya walks down hallway, notices a small wrapped package at her door, bends to pick it up, looks at it with curiosity",
176
+ "camera": "[0-3s] Medium tracking shot following Maya from behind. [3-6s] Cut to over-shoulder close-up of her hands picking up package. [6-8s] Slow push-in to her face, eyes widening.",
177
+ "dialogue": "[1s] (footsteps echo) [4s] \"What's this...\" [7s] (sharp inhale)",
178
+ "continuity_out": "Standing at doorway, both hands holding small wrapped package at chest height, curious expression, warm pendant light from above",
179
+ "continuity_in": null
180
+ }
181
+ ```
182
+
183
+ Fields reference:
184
+
185
+ | Field | Purpose |
186
+ |-------|---------|
187
+ | `shot_id` | S1, S2, S3... |
188
+ | `duration_s` | Determined by music beats (5-15s) |
189
+ | `music_section` | Which music section this shot covers |
190
+ | `beat_sync_notes` | Key beat moments aligned to visual actions |
191
+ | `scene` | Environment/location description |
192
+ | `characters` | Character IDs from the Character Bible |
193
+ | `action` | What characters do in this shot |
194
+ | `camera` | Time-annotated camera movements |
195
+ | `dialogue` | Time-annotated dialogue and sound cues |
196
+ | `continuity_out` | Ending state: position, emotion, lighting, props |
197
+ | `continuity_in` | Opening state: must match previous shot's `continuity_out` |
198
+
199
+ Present the shot table for user review. Iterate if needed.
200
+
201
+ ## Phase 4 — Prompt Engineering + HTML Storyboard Preview
202
+
203
+ ### Step 1 — Generate Seedance Prompts
204
+
205
+ Each shot's prompt is assembled by concatenating:
206
+
207
+ 1. **Style prefix** (identical for all shots):
208
+ ```
209
+ [Style Guide visual_style]. [color_palette]. [lighting].
210
+ ```
211
+
212
+ 2. **Character description injection** (copy verbatim from Character Bible for each character in the shot):
213
+ ```
214
+ Character: [full appearance]. Wearing [full wardrobe]. [signature_details].
215
+ ```
216
+
217
+ 3. **Continuity bridge** (S2 and onward):
218
+ ```
219
+ Continuing from the previous shot: [previous shot's continuity_out, verbatim].
220
+ ```
221
+
222
+ 4. **Time-annotated scene** (using actual duration):
223
+ ```
224
+ [0-3s] Medium tracking shot following Maya from behind down a dimly lit hallway...
225
+ [3-6s] Over-shoulder close-up as she bends to pick up a small wrapped package...
226
+ [6-8s] Slow push-in to her face, eyes widening with curiosity...
227
+ ```
228
+
229
+ 5. **Beat sync markers** (integrated into time annotations):
230
+ ```
231
+ At 3.2s (on the beat): Maya's fingers close around the package.
232
+ ```
233
+
234
+ 6. **Dialogue injection**:
235
+ ```
236
+ At 4s she whispers "What's this..." softly.
237
+ ```
238
+
239
+ 7. **Negative prompts** (identical for all shots):
240
+ ```
241
+ Avoid: [negative_prompts from Style Guide].
242
+ ```
243
+
244
+ **Important**: Do NOT include BGM or background music descriptions in the prompt. Audio is replaced in post.
245
+
246
+ Store each prompt in the shot's `prompt` field in `project.json`.
247
+
248
+ ### Step 2 — Generate Reference Images
249
+
250
+ Three image sources (ask user preference, or default to Gemini):
251
+
252
+ **Option A — Gemini (default, automatic, free)**:
253
+ ```bash
254
+ npx tsx ${CLAUDE_PLUGIN_ROOT}/skills/scene-generate/scripts/generate-scene.ts \
255
+ "<shot scene + character appearance + key action + lighting — NO camera movement>" \
256
+ "${PROJECT_DIR}/storyboard/${shot_id}.png"
257
+ ```
258
+
259
+ **Option B — Midjourney (higher quality, recommended for stylized projects)**:
260
+ Use the `/midjourney` skill to generate storyboard images. Follow its Prompt Crafting Guide for structure:
261
+ `[Subject] + [Scene] + [Style] + [Lighting] + [Camera] + [MJ Parameters]`
262
+
263
+ Key parameters for storyboard images:
264
+ - `--ar 16:9` (or match project ratio)
265
+ - `--v 6.1 --style raw` (faithful to prompt)
266
+ - `--s 250-750` (artistic/stylized projects)
267
+ - `--no text, watermark, UI elements`
268
+
269
+ Submit all shots in parallel via `/v1/tob/diffusion`, poll for completion, download first image (index 0) from each job to `${PROJECT_DIR}/storyboard/${shot_id}.png`.
270
+
271
+ **Option C — User-provided**:
272
+ User manually places reference images in `${PROJECT_DIR}/storyboard/S1.png`, `S2.png`, etc.
273
+
274
+ **Option D — Gemini Grid Storyboard (recommended for best consistency)**:
275
+ Generate ALL shots in a single grid image so characters and style are naturally consistent across panels, then split into individual reference images.
276
+
277
+ 1. Generate a single N-panel grid with Gemini:
278
+ ```
279
+ Prompt: "Generate a single N-panel [manga/cinematic] storyboard grid image.
280
+ Layout: 2 rows x 4 columns grid with thin white borders.
281
+ The SAME two characters must appear consistently across all panels:
282
+ Character A: [verbatim from Character Bible]
283
+ Character B: [verbatim from Character Bible]
284
+ Panel 1: [S1 scene description]
285
+ Panel 2: [S2 scene description]
286
+ ...
287
+ 16:9 aspect ratio. Consistent character design across all panels."
288
+ ```
289
+
290
+ 2. Split the grid into individual panel images:
291
+ ```bash
292
+ bash ${CLAUDE_SKILL_DIR}/scripts/split-grid.sh \
293
+ "${PROJECT_DIR}/storyboard/grid.png" \
294
+ "${PROJECT_DIR}/storyboard/" 2 4
295
+ ```
296
+ This produces `S1.png`, `S2.png`, ..., `S8.png` — all with consistent style.
297
+
298
+ 3. Upload each panel as material for Image-to-Video generation in Phase 5:
299
+ ```bash
300
+ node ${CLAUDE_PLUGIN_ROOT}/skills/renoise-gen/renoise-cli.mjs upload "${PROJECT_DIR}/storyboard/S1.png"
301
+ # → returns material ID
302
+ ```
303
+
304
+ **Why this works**: All panels are generated in a single AI context, so character appearance, art style, color palette, and rendering technique are naturally unified. When used as ref_image input for Seedance, each clip inherits the visual anchor from its reference panel.
305
+
306
+ Reference image prompts should include:
307
+ - Scene environment from the shot
308
+ - Character appearance (from Character Bible)
309
+ - The key action/pose at the most representative moment
310
+ - Lighting from the Style Guide
311
+ - But **exclude camera movement** (reference images are static)
312
+
313
+ ### Step 3 — Generate HTML Storyboard Preview
314
+
315
+ ```bash
316
+ npx tsx ${CLAUDE_SKILL_DIR}/scripts/generate-storyboard-html.ts \
317
+ --project-file "${PROJECT_DIR}/project.json" \
318
+ --output "${PROJECT_DIR}/storyboard.html"
319
+ ```
320
+
321
+ This generates a single self-contained HTML file with:
322
+ - **Header**: Project title, total duration, clip count, BPM, character summary, style summary
323
+ - **Music timeline**: Visual bar showing sections and cut points
324
+ - **Shot cards**: One card per shot with reference image, scene/action, dialogue/beats, continuity, and collapsible Seedance prompt
325
+ - **Reference images**: Base64-embedded inline (single-file, shareable). Use `--skip-images` to skip Gemini generation and read existing images from `storyboard/` directory (useful when using Midjourney or user-provided images).
326
+ - **UI language**: Matches user's language (default: Chinese). White theme, bold confident design.
327
+ - **Responsive**: Viewable on phone
328
+
329
+ Open for preview:
330
+ ```bash
331
+ open "${PROJECT_DIR}/storyboard.html"
332
+ ```
333
+
334
+ ### Step 4 — User Confirmation
335
+
336
+ Present the HTML preview and ask for feedback:
337
+ - Adjust any shot's scene/action/dialogue
338
+ - Reorder shots
339
+ - Modify prompts
340
+ - Regenerate specific reference images
341
+
342
+ Once confirmed, proceed to generation.
343
+
344
+ ## Phase 5 — Batch Generation
345
+
346
+ 1. **Cost estimate** — estimate total before starting:
347
+ ```bash
348
+ for each shot:
349
+ node ${CLAUDE_PLUGIN_ROOT}/skills/renoise-gen/renoise-cli.mjs estimate --duration <shot_duration>
350
+ ```
351
+
352
+ 2. **Parallel submission** (recommended — much faster):
353
+
354
+ **If using Grid Storyboard (Option D) — Image-to-Video mode**:
355
+ Upload each panel as material first, then create with `--materials`:
356
+ ```bash
357
+ # Upload reference image → get material ID
358
+ UPLOAD=$(node ${CLAUDE_PLUGIN_ROOT}/skills/renoise-gen/renoise-cli.mjs upload \
359
+ "${PROJECT_DIR}/storyboard/${shot_id}.png")
360
+ MAT_ID=$(echo "$UPLOAD" | jq -r '.material.id')
361
+
362
+ # Create with ref_image for style anchoring
363
+ node ${CLAUDE_PLUGIN_ROOT}/skills/renoise-gen/renoise-cli.mjs create \
364
+ --prompt "<shot_prompt>" --duration <dur> --ratio <ratio> \
365
+ --materials "$MAT_ID:ref_image" --tags "<project>,<shot_id>"
366
+ ```
367
+ If a shot's ref_image is rejected by privacy detection → fallback to text-to-video (remove `--materials`).
368
+
369
+ **If using text-to-video only (Options A/B/C)**:
370
+ ```bash
371
+ node ${CLAUDE_PLUGIN_ROOT}/skills/renoise-gen/renoise-cli.mjs create \
372
+ --prompt "<shot_prompt>" --duration <dur> --ratio <ratio> --tags "<project>,<shot_id>"
373
+ ```
374
+
375
+ Wait for all in background:
376
+ ```bash
377
+ node ${CLAUDE_PLUGIN_ROOT}/skills/renoise-gen/renoise-cli.mjs wait <task_id> --timeout 600
378
+ ```
379
+
380
+ Alternatively, use the batch script for strict sequential mode:
381
+ ```bash
382
+ bash ${CLAUDE_SKILL_DIR}/scripts/batch-generate.sh \
383
+ --project "<project_id>" \
384
+ --ratio "<ratio>" \
385
+ --prompts-file "${PROJECT_DIR}/prompts.json"
386
+ ```
387
+
388
+ 3. As shots complete, show results. User can:
389
+ - Accept all and proceed to assembly
390
+ - Regenerate specific shots (with optional prompt tweaks)
391
+ - Stop and resume later
392
+
393
+ ## Phase 6 — Download, Assemble & Deliver
394
+
395
+ ### 1. Download All Clips
396
+
397
+ Video URLs expire after 1 hour. Always download immediately:
398
+ ```bash
399
+ mkdir -p "${PROJECT_DIR}/videos"
400
+ for each task_id and shot_id:
401
+ URL=$(node ${CLAUDE_PLUGIN_ROOT}/skills/renoise-gen/renoise-cli.mjs result <task_id> | jq -r '.videoUrl')
402
+ curl -s -o "${PROJECT_DIR}/videos/${shot_id}.mp4" "$URL"
403
+ ```
404
+
405
+ ### 2. Auto-Concatenate (ffmpeg)
406
+
407
+ ```bash
408
+ cd "${PROJECT_DIR}/videos"
409
+ printf "file '%s'\n" S1.mp4 S2.mp4 S3.mp4 ... > concat.txt
410
+ ffmpeg -y -f concat -safe 0 -i concat.txt -c copy "${PROJECT_DIR}/<project_id>-final.mp4"
411
+ open "${PROJECT_DIR}/<project_id>-final.mp4"
412
+ ```
413
+
414
+ ### 3. Clip Summary Table
415
+
416
+ | Shot | Duration | Task ID | File | Status |
417
+ |------|----------|---------|------|--------|
418
+ | S1 | 8s | #123 | S1.mp4 | downloaded |
419
+ | S2 | 13s | #124 | S2.mp4 | downloaded |
420
+
421
+ ### 4. Transition Recommendations
422
+
423
+ - **Hard cut**: Between shots in the same scene (most common)
424
+ - **Cross dissolve** (0.3-0.5s): Between different locations
425
+ - **Whip pan / motion blur**: To hide continuity breaks between difficult transitions
426
+
427
+ ### 5. BGM Overlay Instructions (if music exists)
428
+
429
+ 1. Import the concatenated final video into your editor (CapCut, Premiere, DaVinci)
430
+ 2. **Mute all AI-generated audio tracks**
431
+ 3. Place `bgm.<ext>` on the audio track
432
+ 4. Align to time 0:00 — the beats are already matched
433
+ 5. Trim any AI audio you want to keep as SFX (footsteps, impacts)
434
+ 6. Export at project ratio, 30fps or 60fps
435
+
436
+ ### 6. Re-generation Workflow
437
+
438
+ To redo a single shot without affecting others:
439
+ 1. Modify the shot's prompt in `project.json`
440
+ 2. Run: `node renoise-cli.mjs create --prompt "<new_prompt>" --duration <duration> --tags <project>,<shot_id>`
441
+ 3. Download the new clip, replace in `videos/` directory
442
+ 4. Re-run ffmpeg concat
443
+ 5. BGM alignment is preserved since duration hasn't changed
444
+
445
+ ## Continuity Reference
446
+
447
+ For detailed techniques on maintaining cross-clip consistency, read:
448
+ ```
449
+ Read ${CLAUDE_SKILL_DIR}/references/continuity-guide.md
450
+ ```
451
+
452
+ ## Example
453
+
454
+ For a complete 4-shot example walkthrough, see:
455
+ ```
456
+ Read ${CLAUDE_SKILL_DIR}/examples/mystery-package-4shot.md
457
+ ```
458
+
459
+ ## Troubleshooting
460
+
461
+ ### Character appearance drifts between shots
462
+ **Cause**: Abbreviated or paraphrased character descriptions.
463
+ **Solution**: Always copy the full Character Bible entry verbatim. Never shorten "shoulder-length black hair with subtle auburn highlights" to "black hair".
464
+
465
+ ### Shots feel disconnected
466
+ **Cause**: Missing continuity bridge.
467
+ **Solution**: Every shot S2+ must begin with `Continuing from the previous shot:` + exact `continuity_out` from the previous shot.
468
+
469
+ ### Music doesn't align with cuts
470
+ **Cause**: Manual timing instead of beat analysis.
471
+ **Solution**: Re-run `analyze-beats.py` and use `suggested_cuts` as the source of truth for shot durations.
472
+
473
+ ### PrivacyInformation error
474
+ **Cause**: Uploaded image contains realistic human face.
475
+ **Solution**: Switch to text-to-video. Describe people in the prompt using the Character Bible.
476
+
477
+ ### Insufficient credits (402)
478
+ **Cause**: Renoise balance too low for all shots.
479
+ **Solution**: Run `renoise-cli.mjs me` to check balance, estimate total cost, and inform user before starting batch generation.