@lalalic/markcut 2.2.7 → 2.2.9

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 (48) hide show
  1. package/package.json +2 -1
  2. package/skills/markcut/SKILL.md +0 -2
  3. package/skills/markcut/docs/markdown-descriptive.md +1 -1
  4. package/src/config.mjs +60 -63
  5. package/src/descriptive/resolve.ts +3 -2
  6. package/src/player/browser.tsx +3 -1
  7. package/src/player/bundle/player.js +7 -2
  8. package/src/player/components/SceneThumbnails.tsx +3 -1
  9. package/src/player/pipeline.mjs +64 -21
  10. package/src/player/server.mjs +11 -2
  11. package/src/render/cli.mjs +42 -69
  12. package/src/vision/cli.mjs +21 -45
  13. package/skills/markcut/docs/template.md +0 -212
  14. package/skills/markcut/docs/templates/courseware/TEMPLATE.md +0 -526
  15. package/skills/markcut/docs/templates/courseware/agents/reviewer.md +0 -84
  16. package/skills/markcut/docs/templates/courseware/prompts/fix.md +0 -30
  17. package/skills/markcut/docs/templates/courseware/prompts/outline.md +0 -58
  18. package/skills/markcut/docs/templates/courseware/prompts/scene.md +0 -70
  19. package/skills/markcut/docs/templates/deep-dive/TEMPLATE.md +0 -354
  20. package/skills/markcut/docs/templates/deep-dive/agents/researcher.md +0 -69
  21. package/skills/markcut/docs/templates/deep-dive/agents/reviewer.md +0 -108
  22. package/skills/markcut/docs/templates/deep-dive/prompts/fix.md +0 -28
  23. package/skills/markcut/docs/templates/deep-dive/prompts/outline.md +0 -102
  24. package/skills/markcut/docs/templates/deep-dive/prompts/script.md +0 -64
  25. package/skills/markcut/docs/templates/illustrated-book/TEMPLATE.md +0 -356
  26. package/skills/markcut/docs/templates/illustrated-book/agents/reviewer.md +0 -115
  27. package/skills/markcut/docs/templates/illustrated-book/prompts/fix.md +0 -29
  28. package/skills/markcut/docs/templates/illustrated-book/prompts/illustration.md +0 -35
  29. package/skills/markcut/docs/templates/illustrated-book/prompts/story.md +0 -69
  30. package/skills/markcut/docs/templates/short-film/TEMPLATE.md +0 -385
  31. package/skills/markcut/docs/templates/short-film/agents/reviewer.md +0 -115
  32. package/skills/markcut/docs/templates/short-film/prompts/fix.md +0 -29
  33. package/skills/markcut/docs/templates/short-film/prompts/screenplay.md +0 -101
  34. package/skills/markcut/docs/templates/short-film/prompts/storyboard.md +0 -54
  35. package/skills/markcut/docs/templates/short-video/TEMPLATE.md +0 -301
  36. package/skills/markcut/docs/templates/short-video/agents/reviewer.md +0 -94
  37. package/skills/markcut/docs/templates/short-video/prompts/fix.md +0 -27
  38. package/skills/markcut/docs/templates/short-video/prompts/script.md +0 -65
  39. package/skills/markcut/docs/templates/vlog/TEMPLATE.md +0 -326
  40. package/skills/markcut/docs/templates/vlog/agents/reviewer.md +0 -89
  41. package/skills/markcut/docs/templates/vlog/agents/story-writer.md +0 -100
  42. package/skills/markcut/docs/templates/vlog/prompts/bgm-select.md +0 -38
  43. package/skills/markcut/docs/templates/vlog/prompts/group-clips.md +0 -93
  44. package/skills/markcut/docs/templates/vlog/prompts/local-context.md +0 -59
  45. package/skills/markcut/docs/templates/vlog/prompts/outline.md +0 -56
  46. package/skills/markcut/docs/templates/vlog/prompts/review-fix.md +0 -27
  47. package/skills/markcut/docs/templates/vlog/prompts/storyboard.md +0 -41
  48. package/src/render/cli.test.ts +0 -13
@@ -1,101 +0,0 @@
1
- # Prompt: Screenplay — Three-Act Structure
2
-
3
- > Fill every `{placeholder}`, then execute in your own context.
4
- > Produces a scene-by-scene narrative plan with character arc, shot suggestions, and VO lines.
5
-
6
- ---
7
-
8
- You are writing a {duration_min}-minute {film_type} short film in a {tone} tone.
9
-
10
- Concept: **{concept}**
11
-
12
- Source material: {source_material}
13
- Language: {language}
14
- Voice(s): {voices}
15
-
16
- ## Requirements
17
-
18
- ### Three-act structure
19
-
20
- | Act | Function | Duration | Scenes |
21
- |---|---|---|---|
22
- | Teaser | Mood establisher, no context | 30–90s | 1 |
23
- | Act 1 — Setup | Character, world, inciting incident | 90s–2min | 3 |
24
- | Act 2 — Confrontation | Rising action, midpoint, darkest moment | 3–5min | 4–5 |
25
- | Act 3 — Resolution | Climax, falling action, resolution | 90s–2min | 3 |
26
- | Epilogue | Emotional close | 30–60s | 1 |
27
-
28
- ### Protagonist rules
29
- - The protagonist must have a **desire** that drives the plot.
30
- - The **inciting incident** must happen by the end of Act 1.
31
- - The **midpoint** in Act 2 must shift the protagonist from reacting to acting.
32
- - The **darkest moment** must occur just before the climax.
33
- - The **climax** is where the protagonist confronts the central conflict — emotionally, not necessarily physically.
34
- - The **resolution** shows the new ordinary — how the protagonist has changed.
35
-
36
- ### Scene format
37
- For each scene, provide:
38
-
39
- ```
40
- ### Act X.Y — Scene Title (INT/EXT. LOCATION - TIME)
41
- - Shot type: <wide/medium/close-up/POV/etc>
42
- - Camera movement: <static/push-in/handheld/etc>
43
- - Lighting: <golden hour/moonlight/neon/etc>
44
- - Mood: <one word>
45
- - Color palette: <cool/warm/desaturated/etc>
46
- - Visual prompt: <one-sentence TTI prompt with shot, subject, lighting, mood>
47
- - VO/Dialogue: <narration line or character dialogue>
48
- - Duration: <seconds>
49
- - Sound: <score/ambient/silence>
50
- ```
51
-
52
- ### VO rules
53
- - VO is minimal. The story is told through images.
54
- - One VO line per scene (max two). Each 10–30 words.
55
- - For dialogue, mark speaker: "JOHN: I never thought..."
56
- - No exposition dumps. Show, don't tell.
57
-
58
- ## Output format
59
-
60
- ```
61
- Title: <title>
62
-
63
- Logline: <one sentence>
64
-
65
- ### Synopsis (3 sentences)
66
- 1. <Beginning>
67
- 2. <Middle>
68
- 3. <End>
69
-
70
- ### Teaser
71
- - Scene: <description>
72
- - Visual: <prompt>
73
- - VO: <line>
74
- - Duration: <s>
75
-
76
- ### Act 1 — <title>
77
-
78
- #### Scene 1.1 — <name> (<location>)
79
- - Shot: <type>
80
- - Camera: <movement>
81
- - Lighting: <description>
82
- - Color: <palette>
83
- - Visual: <prompt>
84
- - VO: <line>
85
- - Duration: <s>
86
- - Sound: <note>
87
-
88
- #### Scene 1.2 ...
89
- ...
90
-
91
- ### Act 2 ...
92
-
93
- ### Act 3 ...
94
-
95
- ### Epilogue
96
- - Visual: <prompt>
97
- - VO: <line>
98
- - Duration: <s>
99
-
100
- Total estimated duration: <sum>
101
- ```
@@ -1,54 +0,0 @@
1
- # Prompt: Scene → Markcut Shot
2
-
3
- > Fill every `{placeholder}`, then execute in your own context.
4
- > Run once per scene from the screenplay. Produces the exact markcut markdown for ONE scene.
5
-
6
- ---
7
-
8
- You are turning one scene of a {tone} short film into markcut markdown.
9
-
10
- Film: {film_title}
11
- Scene from screenplay:
12
-
13
- {screenplay_scene}
14
-
15
- ## Rules
16
-
17
- ### Visual prompt
18
- Write a detailed TTI prompt with ALL of these elements:
19
- 1. **Shot type**: wide, medium, close-up, POV, over-the-shoulder, Dutch angle, establishing
20
- 2. **Subject**: who or what is in the frame, what are they doing, what emotion
21
- 3. **Composition**: where is the subject in the frame, foreground/background
22
- 4. **Lighting**: specific light source and quality
23
- 5. **Camera movement**: static, push-in, handheld, tracking, pan, tilt
24
- 6. **Color palette**: warm, cool, desaturated, high contrast, etc.
25
- 7. **Mood**: one word or short phrase
26
- 8. **End with**: ", cinematic, film still, 4K, highly detailed"
27
-
28
- ### Narration / dialogue
29
- - One `- script "..."` node containing the VO or dialogue line.
30
- - For dialogue: `"CHARACTER: line"`
31
- - Match the exact text from the screenplay.
32
-
33
- ### Duration
34
- Match the screenplay's specified duration ±2s. Adjust if the VO line is longer/shorter.
35
-
36
- ### Effect
37
- - `effect:fadeIn` for soft opens
38
- - `effect:zoomIn` for dramatic reveals or tension building
39
- - `effect:zoomOut` for reveals of context
40
- - No effect for static, contemplative scenes
41
-
42
- ### Sound note (optional)
43
- Add a comment in the script or a separate note about sound design for this scene.
44
-
45
- ## Output format for ONE scene
46
-
47
- ```
48
- ### <Act>.<Scene> — <Title> (<Location>)
49
- layout:parallel
50
- - image src:auto
51
- prompt:"<SHOT TYPE> of <SUBJECT>, <COMPOSITION>, <LIGHTING>, <CAMERA MOVEMENT>, <COLOR>, <MOOD>, cinematic, film still, 4K"
52
- duration:<s> effect:<effect>
53
- - script "<VO or dialogue>" duration:<s>
54
- ```
@@ -1,301 +0,0 @@
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
- - `ffmpeg`/`ffprobe` on PATH
38
- - ITT/TTV CLI (for `src:auto` background generation) — optional but recommended
39
- - For reviewer: image-understanding capability, STT CLI
40
-
41
- ## 1. Inputs — collect before starting
42
-
43
- | Input | Required | Default | Notes |
44
- |---|---|---|---|
45
- | Topic / source material | **yes** | — | a topic to explain, a quote, an article, a story, or a URL to summarize |
46
- | Source media | no | — | optional: image file path, video file path, or folder of media to turn into a short |
47
- | Format | no | `explainer` | `explainer` (topic→text), `quote` (quote+background), `showcase` (image→narrated), `highlight` (video→best moments), `storytime` (short story) |
48
- | Language | no | en | narration language |
49
- | Style | no | `cinematic` | `cinematic` (dramatic), `energetic` (fast cuts, bright), `minimal` (clean, slow), `trendy` (meme-aware, casual) |
50
- | Target duration | no | 30s | 15–60s |
51
- | Voice | no | | mlx-audio voice |
52
- | BGM mood | no | `upbeat` | mood for background music. BGM is **mandatory**. |
53
-
54
- **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.
55
-
56
- ## 2. Scene grammar — mandatory structure
57
-
58
- ### Overview
59
-
60
- ```
61
- # video ← root: width:1080 height:1920 fps:30 layout:series
62
- │ subtitle:{fontSize:"56px",type:"Typewriter",fontFamily:"Arial Black"}
63
-
64
- │ transition:fade(0.3)
65
- ├── - audio isBackground:true foreground:true src:bgm.mp3 volume:0.1
66
-
67
- ├── ## Hook ← 1–3s, FIRST FRAME HOOKS THE VIEWER
68
- │ layout:parallel
69
- │ - image/video src:auto prompt:"<arresting visual>" effect:zoomIn
70
- │ - subtitle src:"<hook line — one punchy sentence>" duration:3 type:Bounce
71
- │ - script "<hook narration>" (optional)
72
-
73
- ├── ## Body1 ← each body scene = one key point
74
- │ layout:parallel
75
- │ - image/video src:auto prompt:"<scene visual>" effect:slideInRight
76
- │ - subtitle src:"<key point — short, scannable>" duration:5 type:Typewriter
77
- │ - script "<narration for this point>"
78
-
79
- ├── ## Body2 ← 3–7 body scenes total
80
- │ ... ← each 3–8 seconds, fast-paced
81
-
82
- └── ## CTA ← 3–5s, call to action
83
- layout:parallel
84
- - image/video src:auto prompt:"<closing visual>" effect:zoomIn
85
- - subtitle src:"<CTA — like/subscribe/follow>" duration:4 type:Bounce
86
- - script "<final words>"
87
- ```
88
-
89
- ### The Hook rule — first 2 seconds decide everything
90
-
91
- 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:
92
-
93
- - **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.").
94
- - **Hook visual**: arresting, high-impact image/video that matches the hook line. Use `effect:zoomIn` for dramatic entrance.
95
- - **Hook duration**: 1–3 seconds max. Get to the content fast.
96
- - **No slow fade-ins, no logo animations, no intro music swell** — straight into the hook.
97
-
98
- ### Body scenes — rapid, scannable
99
-
100
- - **3–7 body scenes**, each 3–8 seconds. Total body duration = target − hook − CTA.
101
- - **One key point per scene**. A single idea, fact, step, or argument.
102
- - **Text overlay (`subtitle`) is the star**: short, scannable, large font (48–64px). Use `type:Typewriter` or `type:Fade` for animated entrance.
103
- - **Visual background**: full-screen image/video that's relevant, cinematic, or metaphorical. Use `effect:slideInRight` or `effect:zoomIn` for scene transitions.
104
- - **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).
105
-
106
- ### CTA scene
107
-
108
- - 3–5 seconds.
109
- - Clear call to action: "Follow for more", "Like if you agree", "Share this with someone who needs to hear it".
110
- - Visual: inviting, positive, or memorable.
111
- - Subtitle: `type:Bounce` for energetic CTA.
112
-
113
- ### Scene timing template
114
-
115
- | Scene | Duration | Subtitle type | Effect | Visual |
116
- |---|---|---|---|---|
117
- | Hook | 1–3s | `Bounce` | `zoomIn` | arresting, high-impact |
118
- | Body×N | 3–8s each | `Typewriter` or `Fade` | `slideInRight` | scene-relevant, cinematic |
119
- | CTA | 3–5s | `Bounce` | `zoomIn` | closing, positive |
120
-
121
- ## 3. Authoring rules — the short-form bar
122
-
123
- ### Script writing
124
-
125
- - **Hook script**: 5–15 words. One sentence. Creates curiosity. No filler.
126
- - **Body scripts**: 5–15 words per scene. One idea per scene. Conversational, punchy.
127
- - **Total words**: target duration × 3 words/second (shorter-than-speech pace). A 30s video ≈ 90 words total.
128
- - **No introductions**: no "today I'm going to tell you about..." Get into the content immediately.
129
- - **Voice**: match the style. Cinematic = authoritative, confident. Energetic = fast, excited. Minimal = calm, slow. Trendy = casual, relatable.
130
-
131
- ### Subtitle / caption text
132
-
133
- - **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.
134
- - **Font size**: 48–64px. Short videos are watched on mobile — text must be large and legible.
135
- - **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.
136
- - **Animated caption types**: `Typewriter` for reveal (most popular), `Bounce` for emphasis (hook, CTA), `Fade` for transitions, `Colorful` for energetic/fun content.
137
- - **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.
138
-
139
- ### Visuals (images/video backgrounds)
140
-
141
- - **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").
142
- - **Showcase**: use the source image as the background. If it's not full-screen, add a dark gradient overlay or blur.
143
- - **Highlights**: use trimmed segments from the source video as background, with overlay text.
144
- - **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").
145
- - **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.
146
-
147
- ### BGM — mandatory
148
-
149
- Always add a root-level audio node:
150
- ```markdown
151
- - audio isBackground:true foreground:true src:bgm.mp3 volume:0.1
152
- ```
153
-
154
- Choose BGM that matches the style:
155
- - Cinematic: ambient, orchestral pads, tension builders
156
- - Energetic: upbeat electronic, lo-fi beats, pop
157
- - Minimal: soft piano, field recordings, sparse ambient
158
- - Trendy: viral audio snippets, trending beats
159
-
160
- Volume: 0.08–0.15 (lower than vlog BGM — short video TTS should be very clear).
161
-
162
- ### Effects
163
-
164
- - **Hook**: `effect:zoomIn` — dramatic entrance
165
- - **Body**: `effect:slideInRight` — forward momentum
166
- - **Body transitions**: `effect:fadeIn` for calm scenes
167
- - **Key visual reveal**: `effect:bounceIn` for emphasis
168
- - **CTA**: `effect:zoomIn` or `effect:bounceIn`
169
-
170
- ### Style-specific rules
171
-
172
- | Style | Pace | Voice | Visuals | BGM |
173
- |---|---|---|---|---|
174
- | **cinematic** | 4–7s per scene | authoritative, deep | dramatic lighting, nature, architecture | orchestral, ambient |
175
- | **energetic** | 2–4s per scene | fast, excited, high energy | bright colors, motion blur, urban | upbeat electronic, pop |
176
- | **minimal** | 5–8s per scene | calm, slow, thoughtful | clean backgrounds, negative space | soft piano, sparse |
177
- | **trendy** | 2–5s per scene | casual, relatable, meme-aware | dynamic, text-heavy, greenscreen | viral audio, trending |
178
-
179
- ### Multi-language (variants)
180
-
181
- - Same pattern as courseware: `# <lang>` variant block at file end with per-language TTS voice.
182
- - Subtitle text and script both need `<lang>:"..."` twins.
183
-
184
- ### Format-specific structure
185
-
186
- | Format | Hook angle | Body structure | Visual style |
187
- |---|---|---|---|
188
- | **explainer** | "Most people don't know..." | 3–7 facts/steps | metaphorical/abstract backgrounds |
189
- | **quote** | "This quote changed how I think..." | 1 scene: the quote. Optional: context | minimal, text-focused |
190
- | **showcase** | "Look at this..." | 3–5 scenes describing aspects of the image | the image itself, zoom/pan details |
191
- | **highlight** | "The best part was..." | 3–5 key moments from the source | trimmed video segments |
192
- | **storytime** | "So this happened..." | 3–5 story beats | atmospheric, story-relevant |
193
-
194
- ## 4. Components & styles
195
-
196
- Short videos use markcut's built-in nodes: `image`, `video`, `audio`, `subtitle`, `script`, `effect`. No custom JSX components are required.
197
-
198
- ### Subtitle configuration (root config line)
199
-
200
- ```markdown
201
- # video
202
- width:1080 height:1920 fps:30 layout:series
203
- subtitle:{fontSize:"56px",type:"Typewriter",fontFamily:"Arial Black,Impact"}
204
- ```
205
-
206
- The subtitle config sets defaults. Per-scene overrides are done via `style:` on the subtitle node.
207
-
208
- ### Per-scene subtitle override example
209
-
210
- For a hook scene that needs a bigger, bouncy caption:
211
- ```markdown
212
- - subtitle src:"THIS WILL BLOW YOUR MIND" duration:3 type:Bounce
213
- fontSize:"72px" style:"color:#ff6b6b;text-shadow:0 4px 20px rgba(0,0,0,.8)"
214
- ```
215
-
216
- ### Dark overlay (for text legibility on bright backgrounds)
217
-
218
- If the background image is bright, add a gradient overlay using an image with `mix-blend-mode`:
219
- ```markdown
220
- - image isBackground:true src:gradient-overlay.png
221
- style:position:absolute;inset:0;width:100%;height:100%;object-fit:fill
222
- ```
223
-
224
- Generate a linear-gradient PNG during assembly, or use a CSS gradient in the stylesheet.
225
-
226
- ### Stylesheet (optional — add if gradients needed)
227
-
228
- If you want a built-in dark overlay without a separate image:
229
- ```css
230
- ~~~css stylesheet
231
- .overlay {
232
- position: absolute;
233
- inset: 0;
234
- background: linear-gradient(180deg, rgba(0,0,0,.1) 0%, rgba(0,0,0,.6) 100%);
235
- pointer-events: none;
236
- }
237
- ~~~
238
- ```
239
-
240
- Then use `- component isBackground:true jsx:"<div className='overlay' />"` at root level.
241
-
242
- ## 5. Workflow
243
-
244
- ### Phase 0: Understand input
245
-
246
- 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.
247
-
248
- 2. **Collect inputs** — Fill §1 inputs table from user conversation. Determine format (explainer/quote/showcase/highlight/storytime) and style (cinematic/energetic/minimal/trendy).
249
-
250
- ### Phase 1: Script
251
-
252
- 3. **Write the script** — Fill `prompts/script.md` with the topic, format, and style. This produces a timed scene breakdown:
253
- - Hook line + visual idea
254
- - Body: 3–7 key points, each with subtitle text + narration + visual prompt
255
- - CTA line + visual idea
256
- - Total word count within target duration
257
-
258
- **Review the script**: does the hook grab? Is it scannable? Does each scene have one clear idea?
259
-
260
- ### Phase 2: Storyboard
261
-
262
- 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:
263
- - Showcase: source image as-is
264
- - Highlight: trim source video segments using `startFrom`/`endAt`
265
-
266
- 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.
267
-
268
- ### Phase 3: Render & Review
269
-
270
- 6. **Render** — `npx @lalalic/markcut render short.md`. On errors: fix and re-render, max 3 attempts per error, then ask.
271
-
272
- 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[]}`.
273
-
274
- 8. **Fix loop** — On FAIL: fill `prompts/fix.md` with findings, edit, re-render, re-review. Max 3 iterations, then escalate.
275
-
276
- ## 6. Quality gate — exit criteria
277
-
278
- Done only when ALL hold:
279
-
280
- - [ ] reviewer verdict = `PASS` (zero blocker/major findings)
281
- - [ ] total duration within ±15% of target
282
- - [ ] structure matches §2 (hook → body×N → CTA)
283
- - [ ] hook ≤ 3 seconds and creates curiosity/surprise (reviewer checks first frame + first subtitle)
284
- - [ ] no blank/black frames; all `src:auto` prompts generated usable media
285
- - [ ] STT transcript matches script lines (≥90% content match)
286
- - [ ] subtitle text is scannable (≤10 words per scene, ≥48px readable at 1080p)
287
- - [ ] BGM present, ducked under voice (TTS clearly audible over music)
288
- - [ ] total scene count 5–9 (1 hook + 3–7 body + 1 CTA)
289
- - [ ] effects applied: hook has `effect:zoomIn` or equivalent, body scenes have entrance transitions
290
- - [ ] format-specific check:
291
- - explainer: every body scene teaches one distinct point
292
- - quote: subtitle shows the quote text, script provides context
293
- - showcase: source image is visible and well-framed
294
- - highlight: source video segments play correctly with startFrom/endAt
295
- - storytime: narrative arc with clear beginning, middle, end
296
-
297
- ## 7. Reference
298
-
299
- - Golden example: See `tests/fixtures/templates/courseware.md` for the template format.
300
- - Markcut subtitle types: `docs/markdown-descriptive.md` §§ "Subtitle" and "Caption animations" for all available `type:` values.
301
- - Effects reference: `docs/markdown-descriptive.md` for `effect:` values (`fadeIn`, `zoomIn`, `bounceIn`, `slideInLeft`, `slideInRight`, `flipIn`).
@@ -1,94 +0,0 @@
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
- ```
@@ -1,27 +0,0 @@
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.
@@ -1,65 +0,0 @@
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
- ```