@lalalic/markcut 2.1.0 → 2.2.1

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 (46) hide show
  1. package/package.json +3 -2
  2. package/{SKILL.md → skills/markcut/SKILL.md} +8 -2
  3. package/skills/markcut/docs/template.md +213 -0
  4. package/{templates → skills/markcut/docs/templates}/courseware/TEMPLATE.md +220 -10
  5. package/{templates → skills/markcut/docs/templates}/courseware/prompts/outline.md +5 -0
  6. package/{templates → skills/markcut/docs/templates}/courseware/prompts/scene.md +6 -0
  7. package/skills/markcut/docs/templates/deep-dive/TEMPLATE.md +355 -0
  8. package/skills/markcut/docs/templates/deep-dive/agents/researcher.md +69 -0
  9. package/skills/markcut/docs/templates/deep-dive/agents/reviewer.md +108 -0
  10. package/skills/markcut/docs/templates/deep-dive/prompts/fix.md +28 -0
  11. package/skills/markcut/docs/templates/deep-dive/prompts/outline.md +102 -0
  12. package/skills/markcut/docs/templates/deep-dive/prompts/script.md +64 -0
  13. package/skills/markcut/docs/templates/illustrated-book/TEMPLATE.md +360 -0
  14. package/skills/markcut/docs/templates/illustrated-book/agents/reviewer.md +115 -0
  15. package/skills/markcut/docs/templates/illustrated-book/prompts/fix.md +29 -0
  16. package/skills/markcut/docs/templates/illustrated-book/prompts/illustration.md +35 -0
  17. package/skills/markcut/docs/templates/illustrated-book/prompts/story.md +69 -0
  18. package/skills/markcut/docs/templates/short-film/TEMPLATE.md +387 -0
  19. package/skills/markcut/docs/templates/short-film/agents/reviewer.md +115 -0
  20. package/skills/markcut/docs/templates/short-film/prompts/fix.md +29 -0
  21. package/skills/markcut/docs/templates/short-film/prompts/screenplay.md +101 -0
  22. package/skills/markcut/docs/templates/short-film/prompts/storyboard.md +54 -0
  23. package/skills/markcut/docs/templates/short-video/TEMPLATE.md +302 -0
  24. package/skills/markcut/docs/templates/short-video/agents/reviewer.md +94 -0
  25. package/skills/markcut/docs/templates/short-video/prompts/fix.md +27 -0
  26. package/skills/markcut/docs/templates/short-video/prompts/script.md +65 -0
  27. package/skills/markcut/docs/templates/vlog/TEMPLATE.md +405 -0
  28. package/skills/markcut/docs/templates/vlog/agents/reviewer.md +89 -0
  29. package/skills/markcut/docs/templates/vlog/agents/story-writer.md +100 -0
  30. package/skills/markcut/docs/templates/vlog/prompts/bgm-select.md +38 -0
  31. package/skills/markcut/docs/templates/vlog/prompts/group-clips.md +93 -0
  32. package/skills/markcut/docs/templates/vlog/prompts/local-context.md +59 -0
  33. package/skills/markcut/docs/templates/vlog/prompts/outline.md +56 -0
  34. package/skills/markcut/docs/templates/vlog/prompts/review-fix.md +27 -0
  35. package/skills/markcut/docs/templates/vlog/prompts/storyboard.md +41 -0
  36. package/src/config.mjs +11 -3
  37. package/src/player/bundle/player.js +793 -545
  38. package/src/player/pipeline.mjs +1 -0
  39. package/src/player/server.mjs +3 -5
  40. /package/{docs → skills/markcut/docs}/edit-mode.md +0 -0
  41. /package/{docs → skills/markcut/docs}/json-descriptive.md +0 -0
  42. /package/{docs → skills/markcut/docs}/label-mode.md +0 -0
  43. /package/{docs → skills/markcut/docs}/markdown-descriptive.md +0 -0
  44. /package/{docs → skills/markcut/docs}/system-prompt-edit.md +0 -0
  45. /package/{templates → skills/markcut/docs/templates}/courseware/agents/reviewer.md +0 -0
  46. /package/{templates → skills/markcut/docs/templates}/courseware/prompts/fix.md +0 -0
@@ -0,0 +1,302 @@
1
+ ---
2
+ name: short-video
3
+ description: Turn a topic, text, image, or video into a punchy short-form vertical video (TikTok/Reels/Shorts) with animated captions, fast cuts, and BGM.
4
+ when-to-use: explainers, listicles, quote videos, image showcases, highlight reels, faceless channels — 15–60s vertical videos
5
+ engine: "@lalalic/markcut — run via `npx @lalalic/markcut`"
6
+ aspect: "9:16 (1080×1920)"
7
+ ---
8
+
9
+ # Short Video Template
10
+
11
+ Follow this file top to bottom. Read the markcut skill (`SKILL.md` → `docs/markdown-descriptive.md`) first if you have not.
12
+
13
+ ```mermaid
14
+ flowchart LR
15
+ Input[📥 topic / text / image / video] --> Script[✍️ script.md<br/>hook + body + CTA]
16
+ Script --> Board[📋 scene breakdown]
17
+ Board --> Storyboard[📄 short.md]
18
+ BGM[🎵 bgm select] --> Storyboard
19
+ Media[🖼️ src:auto / source media] --> Storyboard
20
+ Storyboard --> Render[🎬 npx markcut render]
21
+ Render --> MP4[📺 final.mp4]
22
+ MP4 --> Reviewer[🔍 reviewer agent]
23
+ Reviewer -->|FAIL| Fix[🔧 fix]
24
+ Fix --> Storyboard
25
+ Reviewer -->|PASS| Done[✅ Done]
26
+ ```
27
+
28
+ | Path | Runs in | Purpose |
29
+ |---|---|---|
30
+ | `TEMPLATE.md` | your context | everything |
31
+ | `prompts/*.md` | your context | fill-in prompts you execute |
32
+ | `agents/*.md` | separate session | subagent definitions |
33
+
34
+ ## 0. Prerequisites
35
+
36
+ - `npx @lalalic/markcut` runnable
37
+ - TTS CLI (default: `edge-tts`)
38
+ - `ffmpeg`/`ffprobe` on PATH
39
+ - ITT/TTV CLI (for `src:auto` background generation) — optional but recommended
40
+ - For reviewer: image-understanding capability, STT CLI
41
+
42
+ ## 1. Inputs — collect before starting
43
+
44
+ | Input | Required | Default | Notes |
45
+ |---|---|---|---|
46
+ | Topic / source material | **yes** | — | a topic to explain, a quote, an article, a story, or a URL to summarize |
47
+ | Source media | no | — | optional: image file path, video file path, or folder of media to turn into a short |
48
+ | Format | no | `explainer` | `explainer` (topic→text), `quote` (quote+background), `showcase` (image→narrated), `highlight` (video→best moments), `storytime` (short story) |
49
+ | Language | no | en | narration language |
50
+ | Style | no | `cinematic` | `cinematic` (dramatic), `energetic` (fast cuts, bright), `minimal` (clean, slow), `trendy` (meme-aware, casual) |
51
+ | Target duration | no | 30s | 15–60s |
52
+ | Voice | no | en: `en-US-GuyNeural` | edge-tts voice |
53
+ | BGM mood | no | `upbeat` | mood for background music. BGM is **mandatory**. |
54
+
55
+ **Rule:** For explainer/quote/storytime formats, generate all visuals via `src:auto prompt:"..."` — describe vivid, cinematic scenes. For showcase/highlight formats, use the provided source media and let the narration describe it.
56
+
57
+ ## 2. Scene grammar — mandatory structure
58
+
59
+ ### Overview
60
+
61
+ ```
62
+ # video ← root: width:1080 height:1920 fps:30 layout:series
63
+ │ subtitle:{fontSize:"56px",type:"Typewriter",fontFamily:"Arial Black"}
64
+ │ tts:"<edge-tts CLI>"
65
+ │ transition:fade(0.3)
66
+ ├── - audio isBackground:true foreground:true src:bgm.mp3 volume:0.1
67
+
68
+ ├── ## Hook ← 1–3s, FIRST FRAME HOOKS THE VIEWER
69
+ │ layout:parallel
70
+ │ - image/video src:auto prompt:"<arresting visual>" effect:zoomIn
71
+ │ - subtitle src:"<hook line — one punchy sentence>" duration:3 type:Bounce
72
+ │ - script "<hook narration>" (optional)
73
+
74
+ ├── ## Body1 ← each body scene = one key point
75
+ │ layout:parallel
76
+ │ - image/video src:auto prompt:"<scene visual>" effect:slideInRight
77
+ │ - subtitle src:"<key point — short, scannable>" duration:5 type:Typewriter
78
+ │ - script "<narration for this point>"
79
+
80
+ ├── ## Body2 ← 3–7 body scenes total
81
+ │ ... ← each 3–8 seconds, fast-paced
82
+
83
+ └── ## CTA ← 3–5s, call to action
84
+ layout:parallel
85
+ - image/video src:auto prompt:"<closing visual>" effect:zoomIn
86
+ - subtitle src:"<CTA — like/subscribe/follow>" duration:4 type:Bounce
87
+ - script "<final words>"
88
+ ```
89
+
90
+ ### The Hook rule — first 2 seconds decide everything
91
+
92
+ The hook is **the most important part of a short video**. If it doesn't grab attention in the first 2 seconds, the viewer scrolls past. Rules:
93
+
94
+ - **Hook line**: one short, punchy sentence that creates curiosity, surprise, or emotional connection. Use questions ("Ever wondered why..."), bold claims ("Most people get this wrong"), or intriguing statements ("I tried X for 30 days.").
95
+ - **Hook visual**: arresting, high-impact image/video that matches the hook line. Use `effect:zoomIn` for dramatic entrance.
96
+ - **Hook duration**: 1–3 seconds max. Get to the content fast.
97
+ - **No slow fade-ins, no logo animations, no intro music swell** — straight into the hook.
98
+
99
+ ### Body scenes — rapid, scannable
100
+
101
+ - **3–7 body scenes**, each 3–8 seconds. Total body duration = target − hook − CTA.
102
+ - **One key point per scene**. A single idea, fact, step, or argument.
103
+ - **Text overlay (`subtitle`) is the star**: short, scannable, large font (48–64px). Use `type:Typewriter` or `type:Fade` for animated entrance.
104
+ - **Visual background**: full-screen image/video that's relevant, cinematic, or metaphorical. Use `effect:slideInRight` or `effect:zoomIn` for scene transitions.
105
+ - **Narration (`script`)**: optional but recommended. If used, keep it tight (5–15 words per scene). The subtitle text and narration should match closely but the subtitle is more scannable (shorter).
106
+
107
+ ### CTA scene
108
+
109
+ - 3–5 seconds.
110
+ - Clear call to action: "Follow for more", "Like if you agree", "Share this with someone who needs to hear it".
111
+ - Visual: inviting, positive, or memorable.
112
+ - Subtitle: `type:Bounce` for energetic CTA.
113
+
114
+ ### Scene timing template
115
+
116
+ | Scene | Duration | Subtitle type | Effect | Visual |
117
+ |---|---|---|---|---|
118
+ | Hook | 1–3s | `Bounce` | `zoomIn` | arresting, high-impact |
119
+ | Body×N | 3–8s each | `Typewriter` or `Fade` | `slideInRight` | scene-relevant, cinematic |
120
+ | CTA | 3–5s | `Bounce` | `zoomIn` | closing, positive |
121
+
122
+ ## 3. Authoring rules — the short-form bar
123
+
124
+ ### Script writing
125
+
126
+ - **Hook script**: 5–15 words. One sentence. Creates curiosity. No filler.
127
+ - **Body scripts**: 5–15 words per scene. One idea per scene. Conversational, punchy.
128
+ - **Total words**: target duration × 3 words/second (shorter-than-speech pace). A 30s video ≈ 90 words total.
129
+ - **No introductions**: no "today I'm going to tell you about..." Get into the content immediately.
130
+ - **Voice**: match the style. Cinematic = authoritative, confident. Energetic = fast, excited. Minimal = calm, slow. Trendy = casual, relatable.
131
+
132
+ ### Subtitle / caption text
133
+
134
+ - **Subtitle is separate from script**: subtitle text is what appears on screen (scannable, shorter). Script is what TTS speaks (can be slightly longer). They should convey the same idea.
135
+ - **Font size**: 48–64px. Short videos are watched on mobile — text must be large and legible.
136
+ - **Max 10 words per subtitle frame**. If a script has more words, split into multiple subtitle scenes or keep the subtitle terse and let the script elaborate.
137
+ - **Animated caption types**: `Typewriter` for reveal (most popular), `Bounce` for emphasis (hook, CTA), `Fade` for transitions, `Colorful` for energetic/fun content.
138
+ - **Position**: subtitles auto-center by default. For safety (not covering faces), use `style:bottom:20%` on the subtitle node to push captions to the lower third.
139
+
140
+ ### Visuals (images/video backgrounds)
141
+
142
+ - **Explainers & quotes**: use `src:auto prompt:"<vivid scene description>"` to generate backgrounds. Describe the mood, lighting, and composition (e.g., "cinematic shot of a library at twilight, warm lighting, shallow depth of field").
143
+ - **Showcase**: use the source image as the background. If it's not full-screen, add a dark gradient overlay or blur.
144
+ - **Highlights**: use trimmed segments from the source video as background, with overlay text.
145
+ - **Consistent aesthetic**: all scenes should feel like they belong together — similar color palette, lighting, or style. Specify this in prompts (e.g., "consistent cinematic style, warm tones").
146
+ - **Text legibility**: ensure the background has enough contrast with the subtitle text. If the background is bright, use dark subtitle text or add a semi-transparent overlay.
147
+
148
+ ### BGM — mandatory
149
+
150
+ Always add a root-level audio node:
151
+ ```markdown
152
+ - audio isBackground:true foreground:true src:bgm.mp3 volume:0.1
153
+ ```
154
+
155
+ Choose BGM that matches the style:
156
+ - Cinematic: ambient, orchestral pads, tension builders
157
+ - Energetic: upbeat electronic, lo-fi beats, pop
158
+ - Minimal: soft piano, field recordings, sparse ambient
159
+ - Trendy: viral audio snippets, trending beats
160
+
161
+ Volume: 0.08–0.15 (lower than vlog BGM — short video TTS should be very clear).
162
+
163
+ ### Effects
164
+
165
+ - **Hook**: `effect:zoomIn` — dramatic entrance
166
+ - **Body**: `effect:slideInRight` — forward momentum
167
+ - **Body transitions**: `effect:fadeIn` for calm scenes
168
+ - **Key visual reveal**: `effect:bounceIn` for emphasis
169
+ - **CTA**: `effect:zoomIn` or `effect:bounceIn`
170
+
171
+ ### Style-specific rules
172
+
173
+ | Style | Pace | Voice | Visuals | BGM |
174
+ |---|---|---|---|---|
175
+ | **cinematic** | 4–7s per scene | authoritative, deep | dramatic lighting, nature, architecture | orchestral, ambient |
176
+ | **energetic** | 2–4s per scene | fast, excited, high energy | bright colors, motion blur, urban | upbeat electronic, pop |
177
+ | **minimal** | 5–8s per scene | calm, slow, thoughtful | clean backgrounds, negative space | soft piano, sparse |
178
+ | **trendy** | 2–5s per scene | casual, relatable, meme-aware | dynamic, text-heavy, greenscreen | viral audio, trending |
179
+
180
+ ### Multi-language (variants)
181
+
182
+ - Same pattern as courseware: `# <lang>` variant block at file end with per-language TTS voice.
183
+ - Subtitle text and script both need `<lang>:"..."` twins.
184
+
185
+ ### Format-specific structure
186
+
187
+ | Format | Hook angle | Body structure | Visual style |
188
+ |---|---|---|---|
189
+ | **explainer** | "Most people don't know..." | 3–7 facts/steps | metaphorical/abstract backgrounds |
190
+ | **quote** | "This quote changed how I think..." | 1 scene: the quote. Optional: context | minimal, text-focused |
191
+ | **showcase** | "Look at this..." | 3–5 scenes describing aspects of the image | the image itself, zoom/pan details |
192
+ | **highlight** | "The best part was..." | 3–5 key moments from the source | trimmed video segments |
193
+ | **storytime** | "So this happened..." | 3–5 story beats | atmospheric, story-relevant |
194
+
195
+ ## 4. Components & styles
196
+
197
+ Short videos use markcut's built-in nodes: `image`, `video`, `audio`, `subtitle`, `script`, `effect`. No custom JSX components are required.
198
+
199
+ ### Subtitle configuration (root config line)
200
+
201
+ ```markdown
202
+ # video
203
+ width:1080 height:1920 fps:30 layout:series
204
+ subtitle:{fontSize:"56px",type:"Typewriter",fontFamily:"Arial Black,Impact"}
205
+ ```
206
+
207
+ The subtitle config sets defaults. Per-scene overrides are done via `style:` on the subtitle node.
208
+
209
+ ### Per-scene subtitle override example
210
+
211
+ For a hook scene that needs a bigger, bouncy caption:
212
+ ```markdown
213
+ - subtitle src:"THIS WILL BLOW YOUR MIND" duration:3 type:Bounce
214
+ fontSize:"72px" style:"color:#ff6b6b;text-shadow:0 4px 20px rgba(0,0,0,.8)"
215
+ ```
216
+
217
+ ### Dark overlay (for text legibility on bright backgrounds)
218
+
219
+ If the background image is bright, add a gradient overlay using an image with `mix-blend-mode`:
220
+ ```markdown
221
+ - image isBackground:true src:gradient-overlay.png
222
+ style:position:absolute;inset:0;width:100%;height:100%;object-fit:fill
223
+ ```
224
+
225
+ Generate a linear-gradient PNG during assembly, or use a CSS gradient in the stylesheet.
226
+
227
+ ### Stylesheet (optional — add if gradients needed)
228
+
229
+ If you want a built-in dark overlay without a separate image:
230
+ ```css
231
+ ~~~css stylesheet
232
+ .overlay {
233
+ position: absolute;
234
+ inset: 0;
235
+ background: linear-gradient(180deg, rgba(0,0,0,.1) 0%, rgba(0,0,0,.6) 100%);
236
+ pointer-events: none;
237
+ }
238
+ ~~~
239
+ ```
240
+
241
+ Then use `- component isBackground:true jsx:"<div className='overlay' />"` at root level.
242
+
243
+ ## 5. Workflow
244
+
245
+ ### Phase 0: Understand input
246
+
247
+ 1. **Determine input type** — Is the source a topic/text, an image, a video, or a URL? Read/analyze the source material. For URLs or articles, extract the core message. For images, understand what it shows. For videos, extract key moments or transcribe with STT.
248
+
249
+ 2. **Collect inputs** — Fill §1 inputs table from user conversation. Determine format (explainer/quote/showcase/highlight/storytime) and style (cinematic/energetic/minimal/trendy).
250
+
251
+ ### Phase 1: Script
252
+
253
+ 3. **Write the script** — Fill `prompts/script.md` with the topic, format, and style. This produces a timed scene breakdown:
254
+ - Hook line + visual idea
255
+ - Body: 3–7 key points, each with subtitle text + narration + visual prompt
256
+ - CTA line + visual idea
257
+ - Total word count within target duration
258
+
259
+ **Review the script**: does the hook grab? Is it scannable? Does each scene have one clear idea?
260
+
261
+ ### Phase 2: Storyboard
262
+
263
+ 4. **Generate backgrounds** — For scenes using `src:auto`, run the ITT/TTV CLI for each prompt. For source-media formats (showcase/highlight), extract or prepare the source visuals:
264
+ - Showcase: source image as-is
265
+ - Highlight: trim source video segments using `startFrom`/`endAt`
266
+
267
+ 5. **Assemble short.md** — Write the markcut markdown file using §2 grammar. Root config: 1080×1920, `subtitle:{"fontSize":"56px"}`, TTS voice. BGM at root level. Each scene: background media + subtitle + optional script.
268
+
269
+ ### Phase 3: Render & Review
270
+
271
+ 6. **Render** — `npx @lalalic/markcut render short.md`. On errors: fix and re-render, max 3 attempts per error, then ask.
272
+
273
+ 7. **Review (quality gate)** — Run `agents/reviewer.md` in a fresh separate session. Pass: `short.md`, rendered MP4, `TEMPLATE.md`, target duration, language, format, style. Returns `{verdict, findings[]}`.
274
+
275
+ 8. **Fix loop** — On FAIL: fill `prompts/fix.md` with findings, edit, re-render, re-review. Max 3 iterations, then escalate.
276
+
277
+ ## 6. Quality gate — exit criteria
278
+
279
+ Done only when ALL hold:
280
+
281
+ - [ ] reviewer verdict = `PASS` (zero blocker/major findings)
282
+ - [ ] total duration within ±15% of target
283
+ - [ ] structure matches §2 (hook → body×N → CTA)
284
+ - [ ] hook ≤ 3 seconds and creates curiosity/surprise (reviewer checks first frame + first subtitle)
285
+ - [ ] no blank/black frames; all `src:auto` prompts generated usable media
286
+ - [ ] STT transcript matches script lines (≥90% content match)
287
+ - [ ] subtitle text is scannable (≤10 words per scene, ≥48px readable at 1080p)
288
+ - [ ] BGM present, ducked under voice (TTS clearly audible over music)
289
+ - [ ] total scene count 5–9 (1 hook + 3–7 body + 1 CTA)
290
+ - [ ] effects applied: hook has `effect:zoomIn` or equivalent, body scenes have entrance transitions
291
+ - [ ] format-specific check:
292
+ - explainer: every body scene teaches one distinct point
293
+ - quote: subtitle shows the quote text, script provides context
294
+ - showcase: source image is visible and well-framed
295
+ - highlight: source video segments play correctly with startFrom/endAt
296
+ - storytime: narrative arc with clear beginning, middle, end
297
+
298
+ ## 7. Reference
299
+
300
+ - Golden example: See `tests/fixtures/templates/courseware.md` for the template format.
301
+ - Markcut subtitle types: `docs/markdown-descriptive.md` §§ "Subtitle" and "Caption animations" for all available `type:` values.
302
+ - Effects reference: `docs/markdown-descriptive.md` for `effect:` values (`fadeIn`, `zoomIn`, `bounceIn`, `slideInLeft`, `slideInRight`, `flipIn`).
@@ -0,0 +1,94 @@
1
+ ---
2
+ name: short-video-reviewer
3
+ description: Read-only quality gate for short-form vertical videos. Checks hook effectiveness, subtitle legibility, pacing, BGM, and format-specific rules.
4
+ context: fresh
5
+ mode: read-only
6
+ tools: read file, bash (ffmpeg/ffprobe, STT CLI), image understanding
7
+ ---
8
+
9
+ # System prompt
10
+
11
+ You are a strict, evidence-based QA reviewer for short-form vertical videos (TikTok/Reels/Shorts). You review; you **never edit** any file.
12
+
13
+ ## Inputs (provided in the task)
14
+ - `short_md` — absolute path to the generated short video markdown
15
+ - `mp4` — absolute path to the rendered video
16
+ - `template_md` — absolute path to this `TEMPLATE.md`
17
+ - `duration_min` — target duration in seconds
18
+ - `language` — expected language
19
+ - `format` — explainer | quote | showcase | highlight | storytime
20
+ - `style` — cinematic | energetic | minimal | trendy
21
+
22
+ ## Procedure
23
+
24
+ ### 1. Static review (source vs rulebook)
25
+ - Structure: hook → body×N → CTA. Hook first, CTA last.
26
+ - Scene count: 5–9 total (1 hook + 3–7 body + 1 CTA).
27
+ - Root config: `width:1080 height:1920` (9:16). If not, blocker.
28
+ - BGM: `- audio isBackground:true` present at root level. If missing, blocker.
29
+ - Each scene has: subtitle text, background image/video, duration. Body scenes have `effect:`.
30
+ - Subtitle text ≤ 10 words per scene. If >10, minor finding.
31
+ - Hook subtitle ≤ 15 words, punchy/curious. If dull, major finding.
32
+ - Format-specific:
33
+ - explainer: body scenes teach distinct facts.
34
+ - quote: one scene shows the quote as subtitle, script provides attribution/context.
35
+ - showcase: source image referenced in src.
36
+ - highlight: source video with `startFrom`/`endAt` trimming.
37
+ - `src:auto prompt:"..."` present on image/video nodes for explainer/quote/storytime formats.
38
+
39
+ ### 2. Dynamic review
40
+ - `ffprobe`: duration (compare to target ±15%), resolution (should be 1080×1920 or close), audio streams (≥1 for BGM).
41
+ - Extract 6 frames evenly spaced. For each frame:
42
+ - not blank/black
43
+ - subtitle text visible and legible (font large enough, contrast good)
44
+ - background image/video rendered (no broken/placeholder icons)
45
+ - Extract audio → transcribe with STT CLI. Compare against all `script` lines in order. ≥85% match.
46
+ - Spot-check BGM audibility: is the music present but not drowning the TTS?
47
+
48
+ ### 3. Report
49
+
50
+ Severity: `blocker` (wrong aspect, no BGM, blank frames) · `major` (hook too slow, illegible text, no effects, duration off >20%) · `minor` (font size slightly small, subtitle >10 words, minor timing)
51
+
52
+ Output exactly this JSON:
53
+
54
+ ```json
55
+ {
56
+ "verdict": "PASS | FAIL",
57
+ "measured": {
58
+ "duration_s": 0,
59
+ "target_s": 0,
60
+ "resolution": "",
61
+ "stt_match_pct": 0,
62
+ "scene_count": 0
63
+ },
64
+ "findings": [
65
+ {
66
+ "id": "F1",
67
+ "severity": "blocker | major | minor",
68
+ "scene": "<scene name or 'global'>",
69
+ "check": "<which rule>",
70
+ "issue": "<what is wrong>",
71
+ "evidence": "<frame path / STT excerpt / source line>",
72
+ "fix_hint": "<one-line suggestion>"
73
+ }
74
+ ]
75
+ }
76
+ ```
77
+
78
+ `PASS` requires zero `blocker` and zero `major` findings.
79
+
80
+ # Task template
81
+
82
+ ```
83
+ Review a short-form vertical video against its template and format/style rules.
84
+
85
+ short_md: {short_md}
86
+ mp4: {mp4}
87
+ template_md: {template_md}
88
+ duration_min: {duration_min}
89
+ language: {language}
90
+ format: {format}
91
+ style: {style}
92
+
93
+ Follow your procedure. Use whisper-cli (whisper.cpp) for STT if python whisper is unavailable. Save frames under a review directory. Output the verdict JSON only.
94
+ ```
@@ -0,0 +1,27 @@
1
+ # Prompt: Apply Reviewer Findings
2
+
3
+ > Fill every `{placeholder}`, then execute in your own context.
4
+
5
+ ---
6
+
7
+ Apply the reviewer findings below to `{short_md_path}` with minimal, targeted edits.
8
+
9
+ Reviewer findings (JSON):
10
+
11
+ {findings_json}
12
+
13
+ Rules:
14
+ - Address every `blocker` and `major` finding. Minor findings only when trivially fixable.
15
+ - Hook too slow → shorten hook duration, make text more punchy, use `effect:zoomIn`.
16
+ - Subtitle too small → increase `fontSize` in root config or per-scene.
17
+ - Missing BGM → add `- audio isBackground:true foreground:true src:bgm.mp3 volume:0.1` at root level.
18
+ - Missing effects → add `effect:zoomIn` to hook/CTA, `effect:slideInRight` to body scenes.
19
+ - Blank frames → check `src:auto` prompts generated usable media; if not, add fallback prompts.
20
+ - Wrong aspect → ensure root config is `width:1080 height:1920`.
21
+
22
+ After editing, list what changed:
23
+ ```
24
+ - <finding id>: <scene> — <one-line description>
25
+ ```
26
+
27
+ Then re-render and re-review.
@@ -0,0 +1,65 @@
1
+ # Prompt: Short Video Script
2
+
3
+ > Fill every `{placeholder}`, then execute in your own context.
4
+ > Produces a timed scene breakdown: hook + body×N + CTA.
5
+
6
+ ---
7
+
8
+ You are writing a {duration}s {format} short video in {style} style.
9
+
10
+ Topic / source material:
11
+
12
+ {material}
13
+
14
+ Source media (if any): {source_media_description}
15
+
16
+ ## Rules
17
+
18
+ ### Hook (scenes[0])
19
+ - One punchy sentence, 5–15 words. Creates curiosity, surprise, or emotional connection.
20
+ - No filler. No introductions. Straight into the hook.
21
+ - Visual idea: one sentence describing an arresting image that matches the hook.
22
+
23
+ ### Body (scenes[1..N])
24
+ - 3–7 scenes. Each 3–8 seconds. One clear idea per scene.
25
+ - Each scene has:
26
+ - **subtitle**: text shown on screen — ≤10 words, large, scannable
27
+ - **script**: what TTS says — 5–15 words, conversational, matches the subtitle idea
28
+ - **visual**: one sentence prompt for the background image (`src:auto prompt:"..."`)
29
+ - **effect**: entrance animation (`slideInRight`, `zoomIn`, `fadeIn`, `bounceIn`)
30
+ - **duration**: 3–8 seconds
31
+ - Total body words = {total_words_available} (target_duration × 3)
32
+
33
+ ### CTA (scenes[N+1])
34
+ - One scene, 3–5 seconds.
35
+ - CTA line: call to action (follow, like, share, subscribe).
36
+ - Visual: positive, inviting, memorable.
37
+
38
+ ### Total word budget: {word_budget} words (target duration × 3 w/s)
39
+
40
+ ## Output format
41
+
42
+ ```
43
+ Hook:
44
+ subtitle: "<hook text>"
45
+ script: "<optional narration>"
46
+ visual: "<visual prompt for src:auto>"
47
+ effect: zoomIn
48
+ duration: 2
49
+
50
+ Body 1:
51
+ subtitle: "<key point 1>"
52
+ script: "<narration for point 1>"
53
+ visual: "<visual prompt>"
54
+ effect: slideInRight
55
+ duration: 5
56
+
57
+ Body 2: ...
58
+
59
+ CTA:
60
+ subtitle: "<call to action>"
61
+ script: "<final words>"
62
+ visual: "<visual prompt>"
63
+ effect: zoomIn
64
+ duration: 4
65
+ ```