@lalalic/markcut 2.2.4 → 2.2.5

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lalalic/markcut",
3
- "version": "2.2.4",
3
+ "version": "2.2.5",
4
4
  "description": "Markdown-to-video engine. Describe scenes in markdown, get a rendered video.",
5
5
  "bin": {
6
6
  "markcut": "bin/markcut"
@@ -28,6 +28,14 @@ see [docs/markdown-descriptive.md](docs/markdown-descriptive.md) for full detail
28
28
  - Templates in ``docs/templates/`` provide ready-to-use video structures for `orchestrator` agents, use them as starting point to create your own videos.
29
29
 
30
30
 
31
+ ### Viral Story requires
32
+ - **Hooks** : why should the viewer watch this?
33
+ - **Conflict** : what challenges or obstacles do the characters face?
34
+ - **Resolution** : how are the conflicts resolved?
35
+ - **Emotion** : what feelings are evoked in the viewer?
36
+ - **Call to action** : what should the viewer do next?
37
+ - **Open ending** : does the story leave room for interpretation or continuation?
38
+
31
39
  ## 3. CLI
32
40
 
33
41
  ```bash
@@ -757,45 +757,49 @@ markcut verify courseware.md
757
757
  - `@remotion/shapes` — render shapes like arrows, circles, rectangles, etc
758
758
  - `@remotion/starburst` — render starburst animations
759
759
 
760
- ## Example
761
-
762
- ```md
763
- ---
764
- width: 1080
765
- height: 1920
766
- fps: 30
767
- ---
768
- # video
769
- layout:series
770
- ~~~js imports
771
- export { StatCounter } from "stat-counter"
772
- export { Logo } from "github:myorg/design-system#Logo"
773
-
774
- export function Greeting({ name }) {
775
- return <div style={{color: '#fff', fontSize: 28, textAlign: 'center'}}>Hello {name}!</div>
776
- }
760
+ # best practices
761
+ ~~~ example - avoid audio cut
762
+ - parallel
763
+ - image|video background:true
764
+ - audio|script
777
765
  ~~~
778
766
 
779
- ## Hook
780
- layout:parallel
781
- - script "Set location and emotional tone"
782
- - image src:cover.jpg duration:2
767
+ ~~~ example - global streams
768
+ #video
769
+ - audio background:true loop:true src:bgm.mp3
770
+ - component background:true loop:true jsx:"<Logo />" style:"position:fixed;top:10px;left:10px;width:100px;height:100px;"
771
+ - parallel title:"lip sync" style:"position:fixed;bottom:100px;right:100px;width:100px;height:100px;"
772
+ - video src:background.mp4 loop:true background:true
773
+ - video src:lip_sync.mp4
774
+ ~~~
783
775
 
784
- ## Journey
785
- layout:transitionSeries transition:fade transitionTime:0.4
786
- - script "Move through moments"
787
- - video src:clips/arrival.mp4 startFrom:0 endAt:3.5
788
- - video src:clips/fire.mp4 startFrom:1 endAt:4
776
+ ~~~ example - styling VTT captions
777
+ ```vtt
778
+ 000:00:00.000 --> 00:00:05.000
779
+ It's a <span style="color:#ff6b6b;font-weight:bold">Bear</span>.
789
780
 
790
- ## Stat
791
- layout:parallel
792
- - component duration:2 jsx:"<StatCounter value={42} label='S-mores' />"
781
+ 000:00:05.000 --> 00:00:10.000
782
+ And now it's <span class="emoji-dead">dead</span>.
793
783
 
794
- ## Logo
795
- layout:parallel
796
- - component duration:1 jsx:"<Logo />"
784
+ 000:00:10.000 --> 00:00:15.000
785
+ <span class="bong">Bong!</span>
786
+ ```
797
787
 
798
- ## Route
799
- layout:parallel
800
- - map duration:3 travelMode:DRIVING waypoints:[37.7749,-122.4194,"SF";34.0522,-118.2437,"LA"]
788
+ #root
789
+ ```css stylesheet
790
+ .emoji-dead {
791
+ font-family: "Funny Emoji", sans-serif;
792
+ font-size: 48px;
793
+ }
794
+ .bong {
795
+ color: #ff6b6b;
796
+ font-weight: bold;
797
+ position: absolute;
798
+ top: 50%;
799
+ left: 50%;
800
+ transform: translate(-50%, -50%);
801
+ animation: bong 1s ease-in-out infinite;
802
+ }
801
803
  ```
804
+ ~~~
805
+
@@ -42,6 +42,13 @@ Follow this file top to bottom. Read the markcut skill (`SKILL.md` → `docs/mar
42
42
  ### Overview
43
43
 
44
44
  ```
45
+ ---
46
+ storyoutline: # it's your logic to design story.
47
+ hook:
48
+ confliction:
49
+ emotion:
50
+ open-ending:
51
+ ---
45
52
  # video ← root: width:1920 height:1080 fps:30 layout:series
46
53
  │ tts:"<edge-tts CLI template>"
47
54
  ├── ## Route ← (only if GPS data available)
@@ -77,9 +84,11 @@ width:1920 height:1080 fps:30 layout:series
77
84
  - Volume: 0.10–0.20 for ambient BGM; 0.05–0.10 for lyrical music.
78
85
  - Source BGM from royalty-free libraries (see `prompts/bgm-select.md`).
79
86
 
80
- ### Core design: one scene per story beat, media + narration as parallel
87
+ ### Core design: one scene per story beat
88
+ - determine **Hook**, **Confliction**, **Emotion**, **Open-ending**
89
+ - the vlog's story arc: hook → chronological story beats → close.
81
90
 
82
- Each scene is a **story beat** — a single moment or idea that stands on its own. Inside a scene, `layout:parallel` means all media and the subtitle narration play simultaneously.
91
+ - Each scene is a **story beat** — a single moment or idea that stands on its own. Inside a scene, `layout:parallel` means all media and the subtitle narration play simultaneously.
83
92
 
84
93
  ```
85
94
  ## Into the Woods
@@ -90,7 +99,7 @@ layout:parallel
90
99
  ```
91
100
 
92
101
  **Rules:**
93
-
102
+ - determine story arc first, then group clips into scenes. Each scene is a single story beat.
94
103
  - **Scene count**: 5–12 scenes. Each 3–20 seconds. Total duration matches target ±15%.
95
104
  - **Hook → Core → Vibe → Close arc**: The first scene hooks the viewer (best visual + intriguing line). Middle scenes are chronological story beats. The final scene provides emotional/humorous closure.
96
105
  - **Transition between scenes**: The root `layout:series` plays scenes sequentially. For smooth transitions, add `transition:fade(0.5)` to the root config line.
@@ -100,19 +109,6 @@ layout:parallel
100
109
  - **BGM is mandatory**: Always add an `- audio isBackground:true foreground:true` at root level (see BGM section above).
101
110
  - **No bullet-reveal** — vlogs are linear media, not slides. No `current`/`on:` events needed.
102
111
 
103
- ### Scene media node style
104
-
105
- For images:
106
- ```markdown
107
- - image src:<relative-path> duration:<s> start:<s>
108
- ```
109
-
110
- For video clips (trimmed):
111
- ```markdown
112
- - video src:<relative-path> startFrom:<s> endAt:<s> start:<s>
113
- ```
114
-
115
- The `src` path is relative to the media folder. During assembly, media is symlinked/copied into the markcut project so `npx markcut render` can serve it.
116
112
 
117
113
  ## 2.b Production polish — route sync, overlays, effects
118
114
 
@@ -154,14 +150,14 @@ Use per-scene map overlays when GPS data is available for that specific clip. Us
154
150
 
155
151
  ## 3. Authoring rules — the professional bar
156
152
 
157
- ### Filter rules (see `prompts/group-clips.md`)
153
+ ### Filter rules (use `prompts/group-clips.md`)
158
154
 
159
- - Keep all clips unless: aesthetic score < 0.4, near-duplicate of a better clip, or off-topic.
155
+ - Keep all clips unless: near-duplicate of a better clip, or off-topic.
160
156
  - Always keep clips with a positive user label from the interactive labeling step.
161
157
  - Max ~20% drops. Never drop below 5 clips total.
162
158
  - List every dropped clip with a reason.
163
159
 
164
- ### Grouping rules (see `prompts/group-clips.md`)
160
+ ### Grouping rules (use `prompts/group-clips.md`)
165
161
 
166
162
  - **Visual continuity rule**: clips sharing the same background/outfit/subject-state form one scene. Exhaust one scene before moving to the next. No jumping A→B→A.
167
163
  - 1–4 clips per scene (a single long take >10s may be its own scene).
@@ -187,7 +183,7 @@ Before writing narration, search for local news, events, or weather for the vlog
187
183
  - **Local event**: "Turns out the Gatineau Park was running the fall colours festival that weekend."
188
184
  - **Seasonal context**: "Full moon that night, so the trail was brighter than usual."
189
185
 
190
- Rules:
186
+ **Rules:**
191
187
  - Only use facts confirmed by at least one search result. Never invent weather/events.
192
188
  - Keep it to 1–2 local-context references per vlog. Don't overwhelm the narration.
193
189
  - The context should **amplify** the story, not replace it. "Drove up during the fall colours festival so the park was packed" tells us more than just the festival fact.
@@ -207,7 +203,7 @@ Rules:
207
203
  - Keep references brief (one line per vlog max). The story should stand alone.
208
204
  - Never fabricate a past event. Only what exists in the history file.
209
205
 
210
- ### Creator profile
206
+ ### User profile
211
207
 
212
208
  Read `~/.pi/agent/user.md` at the start and weave the creator's identity into narration naturally:
213
209
 
@@ -226,44 +222,6 @@ One title, 3–15 words, poetic/suspenseful/summarizing, social-media friendly.
226
222
  - Same pattern as courseware: `# <lang>` variant block at file end with per-language TTS voice.
227
223
  - Every `script`/`subtitle` node gets a `<lang>:"..."` twin.
228
224
 
229
- ## 4. Components & styles
230
-
231
- Vlogs don't need custom JSX components — they use markcut's built-in `image`, `video`, `audio`, `subtitle`, and `map` nodes. However, you may add these optional enhancements:
232
-
233
- ### Optional: NarratorBox component
234
-
235
- If adding a narrator overlay with name label, include this in the `~~~js imports` block:
236
-
237
- ```jsx
238
- import { delayRender, continueRender } from 'remotion'
239
-
240
- export function NarratorBox({ src, name = '', size = 100 }) {
241
- return (
242
- <div style={{
243
- position: 'absolute', bottom: 40, left: 40,
244
- display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 6,
245
- }}>
246
- <div style={{
247
- width: size, height: size, borderRadius: '50%', overflow: 'hidden',
248
- border: '3px solid rgba(255,255,255,.6)',
249
- boxShadow: '0 0 20px rgba(0,0,0,.4)',
250
- }}>
251
- <img src={src} style={{ width: '100%', height: '100%', objectFit: 'cover' }} />
252
- </div>
253
- {name && (
254
- <span style={{
255
- fontSize: 14, color: '#fff', textShadow: '0 2px 8px rgba(0,0,0,.6)',
256
- whiteSpace: 'nowrap', fontWeight: 500,
257
- }}>{name}</span>
258
- )}
259
- </div>
260
- )
261
- }
262
- ```
263
-
264
- ### Stylesheet
265
-
266
- No stylesheet needed for standard vlogs. The built-in markcut rendering handles video/image filling, subtitle positioning, and audio mixing. Add one only if you need custom overlays.
267
225
 
268
226
  ## 5. Workflow
269
227
 
@@ -284,7 +242,7 @@ No stylesheet needed for standard vlogs. The built-in markcut rendering handles
284
242
  }
285
243
  ]
286
244
  ```
287
- If the file doesn't exist, start fresh.
245
+ If the file doesn't exist, try to extract for project folder.
288
246
 
289
247
  ### Phase 1: Prepare media
290
248
 
@@ -303,7 +261,7 @@ No stylesheet needed for standard vlogs. The built-in markcut rendering handles
303
261
  5. **Search local news/events** — Fill `prompts/local-context.md` with the vlog's location, date range, and theme. This searches for relevant weather, events, news, or seasonal information. The result feeds into narration with 1–2 natural references.
304
262
 
305
263
  6. **Group and filter clips** — Fill `prompts/group-clips.md` with clip data from `metadata.json`. This produces:
306
- - Dropped clips with reasons
264
+ - Speed up less-interesting clips vs Dropped clips
307
265
  - Visual-continuity scene groups
308
266
  - Trim boundaries for video clips
309
267
  - GPS waypoints for per-scene map overlays
@@ -325,16 +283,7 @@ No stylesheet needed for standard vlogs. The built-in markcut rendering handles
325
283
 
326
284
  8. **Select BGM** — Choose background music that matches the vlog's mood. Fill `prompts/bgm-select.md` or search using the `audio-sourcing` skill. Download the track and reference it as `src:bgm.mp3` in the root-level audio node.
327
285
 
328
- 9. **Assemble course.md** — Write the markcut markdown file using §2 grammar. The root config line includes TTS voice. BGM is at root level (`- audio isBackground:true foreground:true src:bgm.mp3 volume:0.15`). For scenes with GPS data, add per-scene map overlays (see §2.b).
329
-
330
- **Media staging**: Make media accessible to the renderer:
331
- ```
332
- mkdir -p .markcut/generated/media/
333
- cp <media-folder>/clips_normalized/*.mp4 .markcut/generated/media/
334
- cp <media-folder>/*.jpg .markcut/generated/media/
335
- cp /path/to/bgm.mp3 .markcut/generated/media/bgm.mp3
336
- ```
337
- Reference as `src:.markcut/generated/media/<file>` in the markdown.
286
+ 9. **Assemble .md** — Write the markcut markdown file using §2 grammar. For scenes with GPS data, add per-scene map overlays (see §2.b).
338
287
 
339
288
  10. **Render** — `npx @lalalic/markcut render course.md`. On engine errors: fix and re-render, max 3 attempts per error, then ask the user.
340
289
 
@@ -371,12 +320,7 @@ Done only when ALL hold:
371
320
  - [ ] BGM is **present** (ffprobe confirms audio stream or mixed track) and audible (not silent, not clipping)
372
321
  - [ ] BGM ducked under voice — TTS audible above music in ≥90% of spoken segments
373
322
  - [ ] local context references (if any) verified against search results — no invented weather/events
374
- - [ ] history references (if any) match actual entries in `vlog_history.json` — no fabricated past events
323
+ - [ ] history references — no fabricated past events
375
324
  - [ ] media `src` paths resolve correctly (no broken links in rendered output)
376
325
  - [ ] profile used: narration tone matches creator personality, family names from profile appear correctly
377
- - [ ] per-scene map overlays (if GPS available) positioned without obstructing main content
378
-
379
- ## 7. Reference — worked examples
380
-
381
- - Golden example: See `tests/fixtures/templates/courseware.md` for the template format.
382
- - Reference vlog storyboard: The bullx vlog project at `free2/bullx/packages/vlog/storyboard.md` shows a real vlog (birthday camping at Lac Philippe) with 13 chronological scenes, route map, clip trimming, and first-person narration. The project's `.pi/agents/story-writer.md` and `.pi/prompts/vlog-storyboard.md` contain the source of truth for the story-writing methodology documented here.
326
+ - [ ] per-scene map overlays (if GPS available) positioned without obstructing main conten