@lalalic/markcut 2.2.8 → 2.3.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.
- package/package.json +2 -1
- package/skills/markcut/SKILL.md +11 -9
- package/skills/markcut/docs/markdown-descriptive.md +1 -1
- package/src/config.mjs +60 -63
- package/src/descriptive/resolve.ts +3 -2
- package/src/player/pipeline.mjs +64 -21
- package/src/render/cli.mjs +42 -69
- package/src/vision/cli.mjs +21 -45
- package/skills/markcut/docs/edit-mode.md +0 -220
- package/skills/markcut/docs/label-mode.md +0 -112
- package/skills/markcut/docs/template.md +0 -212
- package/skills/markcut/docs/templates/courseware/TEMPLATE.md +0 -526
- package/skills/markcut/docs/templates/courseware/agents/reviewer.md +0 -84
- package/skills/markcut/docs/templates/courseware/prompts/fix.md +0 -30
- package/skills/markcut/docs/templates/courseware/prompts/outline.md +0 -58
- package/skills/markcut/docs/templates/courseware/prompts/scene.md +0 -70
- package/skills/markcut/docs/templates/deep-dive/TEMPLATE.md +0 -354
- package/skills/markcut/docs/templates/deep-dive/agents/researcher.md +0 -69
- package/skills/markcut/docs/templates/deep-dive/agents/reviewer.md +0 -108
- package/skills/markcut/docs/templates/deep-dive/prompts/fix.md +0 -28
- package/skills/markcut/docs/templates/deep-dive/prompts/outline.md +0 -102
- package/skills/markcut/docs/templates/deep-dive/prompts/script.md +0 -64
- package/skills/markcut/docs/templates/illustrated-book/TEMPLATE.md +0 -356
- package/skills/markcut/docs/templates/illustrated-book/agents/reviewer.md +0 -115
- package/skills/markcut/docs/templates/illustrated-book/prompts/fix.md +0 -29
- package/skills/markcut/docs/templates/illustrated-book/prompts/illustration.md +0 -35
- package/skills/markcut/docs/templates/illustrated-book/prompts/story.md +0 -69
- package/skills/markcut/docs/templates/short-film/TEMPLATE.md +0 -385
- package/skills/markcut/docs/templates/short-film/agents/reviewer.md +0 -115
- package/skills/markcut/docs/templates/short-film/prompts/fix.md +0 -29
- package/skills/markcut/docs/templates/short-film/prompts/screenplay.md +0 -101
- package/skills/markcut/docs/templates/short-film/prompts/storyboard.md +0 -54
- package/skills/markcut/docs/templates/short-video/TEMPLATE.md +0 -301
- package/skills/markcut/docs/templates/short-video/agents/reviewer.md +0 -94
- package/skills/markcut/docs/templates/short-video/prompts/fix.md +0 -27
- package/skills/markcut/docs/templates/short-video/prompts/script.md +0 -65
- package/skills/markcut/docs/templates/vlog/TEMPLATE.md +0 -326
- package/skills/markcut/docs/templates/vlog/agents/reviewer.md +0 -89
- package/skills/markcut/docs/templates/vlog/agents/story-writer.md +0 -100
- package/skills/markcut/docs/templates/vlog/prompts/bgm-select.md +0 -38
- package/skills/markcut/docs/templates/vlog/prompts/group-clips.md +0 -93
- package/skills/markcut/docs/templates/vlog/prompts/local-context.md +0 -59
- package/skills/markcut/docs/templates/vlog/prompts/outline.md +0 -56
- package/skills/markcut/docs/templates/vlog/prompts/review-fix.md +0 -27
- package/skills/markcut/docs/templates/vlog/prompts/storyboard.md +0 -41
- 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
|
-
```
|