@scenerok/cli 1.0.4 → 1.0.6

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 (72) hide show
  1. package/README.md +6 -3
  2. package/dist/commands/auth.d.ts.map +1 -1
  3. package/dist/commands/auth.js +17 -1
  4. package/dist/commands/project.d.ts.map +1 -1
  5. package/dist/commands/project.js +16 -2
  6. package/dist/commands/render.d.ts.map +1 -1
  7. package/dist/commands/render.js +14 -0
  8. package/dist/commands/skills.d.ts.map +1 -1
  9. package/dist/commands/skills.js +42 -1
  10. package/dist/commands/validate.d.ts.map +1 -1
  11. package/dist/commands/validate.js +38 -9
  12. package/dist/index.js +3 -1
  13. package/dist/lib/api.d.ts +14 -0
  14. package/dist/lib/api.d.ts.map +1 -1
  15. package/dist/lib/api.js +38 -4
  16. package/dist/lib/format-api-error.d.ts +2 -0
  17. package/dist/lib/format-api-error.d.ts.map +1 -0
  18. package/dist/lib/format-api-error.js +24 -0
  19. package/dist/lib/logger.d.ts +8 -0
  20. package/dist/lib/logger.d.ts.map +1 -0
  21. package/dist/lib/logger.js +51 -0
  22. package/examples/system/3-tips-fitness.vid +45 -0
  23. package/examples/system/ecom-product-launch.vid +31 -0
  24. package/examples/system/glitch-title.vid +17 -0
  25. package/examples/system/meme-remix.vid +15 -0
  26. package/examples/system/minimal-text-reel.vid +11 -0
  27. package/examples/system/product-launch.vid +18 -0
  28. package/examples/system/rokmilk-chocolate-promo.vid +25 -0
  29. package/examples/system/testimonial-cut.vid +16 -0
  30. package/examples/system/ugc-testimonial-voiceover.vid +33 -0
  31. package/examples/system/voice-visual-promo.vid +21 -0
  32. package/package.json +2 -1
  33. package/skills/aider/SKILL.md +27 -22
  34. package/skills/aider/vidscript-guide.md +62 -39
  35. package/skills/aider/vidscript-sample.md +23 -14
  36. package/skills/aider/vidscript-strict.md +113 -0
  37. package/skills/claude/SKILL.md +27 -22
  38. package/skills/claude/vidscript-guide.md +59 -37
  39. package/skills/claude/vidscript-sample.md +23 -14
  40. package/skills/claude/vidscript-strict.md +113 -0
  41. package/skills/codex/SKILL.md +27 -22
  42. package/skills/codex/vidscript-guide.md +62 -39
  43. package/skills/codex/vidscript-sample.md +23 -14
  44. package/skills/codex/vidscript-strict.md +113 -0
  45. package/skills/cursor/SKILL.md +27 -22
  46. package/skills/cursor/vidscript-guide.md +62 -39
  47. package/skills/cursor/vidscript-sample.md +23 -14
  48. package/skills/cursor/vidscript-strict.md +113 -0
  49. package/skills/opencode/SKILL.md +27 -22
  50. package/skills/opencode/vidscript-guide.md +62 -39
  51. package/skills/opencode/vidscript-sample.md +23 -14
  52. package/skills/opencode/vidscript-strict.md +113 -0
  53. package/skills/skills/aider/SKILL.md +185 -0
  54. package/skills/skills/aider/vidscript-guide.md +378 -0
  55. package/skills/skills/aider/vidscript-sample.md +30 -0
  56. package/skills/skills/aider/vidscript-strict.md +113 -0
  57. package/skills/skills/claude/SKILL.md +185 -0
  58. package/skills/skills/claude/vidscript-guide.md +378 -0
  59. package/skills/skills/claude/vidscript-sample.md +30 -0
  60. package/skills/skills/claude/vidscript-strict.md +113 -0
  61. package/skills/skills/codex/SKILL.md +185 -0
  62. package/skills/skills/codex/vidscript-guide.md +378 -0
  63. package/skills/skills/codex/vidscript-sample.md +30 -0
  64. package/skills/skills/codex/vidscript-strict.md +113 -0
  65. package/skills/skills/cursor/SKILL.md +185 -0
  66. package/skills/skills/cursor/vidscript-guide.md +378 -0
  67. package/skills/skills/cursor/vidscript-sample.md +30 -0
  68. package/skills/skills/cursor/vidscript-strict.md +113 -0
  69. package/skills/skills/opencode/SKILL.md +185 -0
  70. package/skills/skills/opencode/vidscript-guide.md +378 -0
  71. package/skills/skills/opencode/vidscript-sample.md +30 -0
  72. package/skills/skills/opencode/vidscript-strict.md +113 -0
@@ -0,0 +1,113 @@
1
+ # VidScript v2 — Strict Agent Reference
2
+
3
+ Follow these rules exactly. When in doubt, copy a file from `examples/system/` (installed with `scenerok skills install`).
4
+
5
+ ## Rule 1: Package imports are mandatory
6
+
7
+ ```vidscript
8
+ import xai from "@scenerok/xai"
9
+ import eleven from "@elevenlabs/music"
10
+ import motion from "@scenerok/basic-animations"
11
+ ```
12
+
13
+ Without the owning import, calls like `xai.imagine`, `xai.tts`, `eleven.music`, and `motion.fadeIn` fail validation.
14
+
15
+ **Never** call package functions without importing the package alias first.
16
+
17
+ ## Rule 2: Use registered plugin surfaces
18
+
19
+ ```vidscript
20
+ import xai from "@scenerok/xai"
21
+ import eleven from "@elevenlabs/music"
22
+
23
+ [-] = video xai.imagine("Prompt here", aspect_ratio: "9:16", duration: 5)
24
+ [-] = audio xai.tts("Voiceover line", voice: "eve")
25
+ [0s .. 15s] = audio eleven.music("Warm premium music bed", duration: 15, instrumental: true)
26
+ ```
27
+
28
+ For ElevenLabs music, import `@elevenlabs/music` and use `eleven.music(...)`, `eleven.generateMusic(...)`, or `eleven.composeMusic(...)`.
29
+
30
+ ## Rule 3: Time ranges use `..`
31
+
32
+ ```vidscript
33
+ [0s .. 5s] = text "Hello"
34
+ ```
35
+
36
+ Not `[0s - 5s]`.
37
+
38
+ ## Rule 4: Text params stay on one line
39
+
40
+ ```vidscript
41
+ [0.5s .. 3s] = text "Headline", font: "Inter", size: 64, color: "#FFFFFF", x: "50%", y: "30%", align: center
42
+ ```
43
+
44
+ ## Rule 5: Quote safety in prompts
45
+
46
+ Use only straight `"` inside `xai.imagine("...")`. Do not nest quotes inside the prompt string (e.g. avoid `"RokMilk"` inside the prompt — say `labeled RokMilk` without extra quotes).
47
+
48
+ ## Rule 6: Audio syntax
49
+
50
+ ```vidscript
51
+ import xai from "@scenerok/xai"
52
+ import eleven from "@elevenlabs/music"
53
+
54
+ [-] = audio xai.tts("Spoken line", voice: "eve", speed: 1.0)
55
+
56
+ # Direct music call, no trailing audio params.
57
+ [0s .. 15s] = audio eleven.music("Soft premium ad music", duration: 15, instrumental: true)
58
+
59
+ # Use a binding when you need volume or fades.
60
+ let bed = eleven.music("Soft premium ad music", duration: 15, instrumental: true)
61
+ [0s .. 15s] = audio bed, volume: 0.35, fade_out: 2s
62
+ ```
63
+
64
+ **Invalid:** `audio eleven.music("...", duration: 15), volume: 0.35` — trailing `, volume` after a direct plugin call is a parse error.
65
+
66
+ **Invalid:** `eleven.generateMusic(...)` without `import eleven from "@elevenlabs/music"`.
67
+
68
+ ## Rule 7: Filters
69
+
70
+ ```vidscript
71
+ [0s .. 15s] = filter "vignette", intensity: 0.3
72
+ [0s .. 15s] = filter "saturation", value: 1.12
73
+ ```
74
+
75
+ `saturation` uses `value`, not `intensity`.
76
+
77
+ ## Rule 8: Always end with output
78
+
79
+ ```vidscript
80
+ output to "video.mp4", resolution: "1080x1920", fps: 30
81
+ ```
82
+
83
+ Do **not** use legacy `config { }` blocks — they are not part of VidScript v2.
84
+
85
+ ## Animations (after import)
86
+
87
+ ```vidscript
88
+ import motion from "@scenerok/basic-animations"
89
+
90
+ [0s .. 2s] = text "Launch", x: "50%", y: "50%", animate: motion.popIn(0.7s)
91
+ ```
92
+
93
+ Available: `fadeIn`, `fadeOut`, `slideX`, `slideY`, `popIn`, `riseIn`, `swingIn`, `glitchIn`, `float`, `typewriter`.
94
+
95
+ ## Validate before render
96
+
97
+ ```bash
98
+ scenerok validate my-video.vid
99
+ ```
100
+
101
+ Each error line includes `Line N:C — message` when the server returns location info.
102
+
103
+ ## Bundled examples
104
+
105
+ | File | Use case |
106
+ |------|----------|
107
+ | `minimal-text-reel.vid` | Text-only, no API keys |
108
+ | `product-launch.vid` | User video input + text + vignette |
109
+ | `ecom-product-launch.vid` | xAI product visuals + CTA |
110
+ | `3-tips-fitness.vid` | Multiple `[-]` blocks + xAI per segment |
111
+ | `rokmilk-chocolate-promo.vid` | 15s generated-video promo pattern |
112
+
113
+ Full grammar: https://scenerok.com/docs/vidscript
@@ -67,37 +67,34 @@ Built-in filters: `monochrome`, `sepia`, `blur`, `chromatic`, `glitch`, `vignett
67
67
  output to "video.mp4", resolution: "1080x1920", fps: 30
68
68
  ```
69
69
 
70
- ### Module System
70
+ ### Package Imports
71
71
 
72
72
  ```vidscript
73
- export const BRAND_COLOR = "#FF5733"
74
- export timeline intro(clip: string, headline: string) {
75
- [-] = clip # auto-append
76
- clip.Trim(start: 0s, end: 3s)
77
- [- 2s] = text headline, style: title # auto-start, 2s duration
78
- }
79
- ```
80
-
81
- ```vidscript
82
- import { intro } from "./timelines.vid"
83
- import * as pack from "./effects.vid"
84
- import eleven from "@elevenlabs/tts" # future scoped package # from npm registry
85
- import music from "@elevenlabs/music" # generative music
86
- use intro at [-] with { clip: main, headline: "Welcome" }
73
+ import xai from "@scenerok/xai" # xAI image/video/tts
74
+ import eleven from "@elevenlabs/music" # ElevenLabs generative music
75
+ import motion from "@scenerok/basic-animations" # text/video animation helpers
87
76
  ```
88
77
 
89
78
  ### Plugin Calls
90
79
 
91
80
  ```vidscript
92
- import eleven from "/tts"
81
+ import xai from "@scenerok/xai"
82
+ import eleven from "@elevenlabs/music"
83
+ import motion from "@scenerok/basic-animations"
84
+
85
+ [-] = video xai.imagine("Cinematic product shot", aspect_ratio: "9:16", duration: 5)
86
+ [-] = audio xai.tts("Welcome to SceneRok", voice: "eve")
93
87
 
94
- [-] = audio eleven.tts("Welcome to SceneRok", voice: "Rachel")
95
- [-] = video xai.imagine("Cinematic product shot", aspect_ratio: "9:16")
96
- [-] = audio music("upbeat launch soundtrack", duration: 12, instrumental: true)
97
- [-] = audio xai.tts("Next line", voice: "eve")
88
+ # ElevenLabs music package functions require an import alias.
89
+ let bed = eleven.music("Warm premium launch bed", duration: 15, instrumental: true)
90
+ [0s .. 15s] = audio bed, volume: 0.35, fade_out: 2s
98
91
  ```
99
92
 
100
- Package-style plugin calls are supported inside time blocks. Use `video ...` for generated visual clips and `audio ...` for generated speech, music, and other generated audio.
93
+ **Always** import the package that owns the function: `xai.*` from `@scenerok/xai`, `eleven.*` from `@elevenlabs/music`, and `motion.*` from `@scenerok/basic-animations`. Calls without import fail validation with `Unknown function 'xai.imagine'`.
94
+
95
+ For ElevenLabs music, import `@elevenlabs/music` and call `eleven.music(...)`, `eleven.generateMusic(...)`, or `eleven.composeMusic(...)`. Use `let bed = eleven.music(...)` followed by `audio bed, volume: ...` when you need volume or fades.
96
+
97
+ Read `vidscript-strict.md` for anti-patterns and `examples/system/*.vid` for copy-paste templates (installed with `scenerok skills install`).
101
98
 
102
99
  ### Placeholders
103
100
 
@@ -165,7 +162,15 @@ Always ask clarifying questions about:
165
162
  - Desired duration and style
166
163
  - Whether they want to start from a template or from scratch
167
164
 
165
+ ## Reference files (in this skill folder)
166
+
167
+ | File | Purpose |
168
+ |------|---------|
169
+ | `vidscript-guide.md` | Full grammar reference |
170
+ | `vidscript-strict.md` | **Read first** — rules that prevent common agent mistakes |
171
+ | `vidscript-sample.md` | Minimal promo with xAI import |
172
+ | `examples/system/*.vid` | Official SceneRok templates (text-only, product launch, xAI reels) |
173
+
168
174
  ## Full Reference
169
175
 
170
- For exhaustive grammar documentation, visit:
171
176
  https://scenerok.com/docs/vidscript
@@ -2,6 +2,24 @@
2
2
 
3
3
  VidScript is a declarative DSL for composing short-form videos. Write a script, render an MP4.
4
4
 
5
+ ## Agent quick start (read before composing)
6
+
7
+ 1. **Import every package function** — use `import xai from "@scenerok/xai"`, `import eleven from "@elevenlabs/music"`, and `import motion from "@scenerok/basic-animations"` before calling `xai.*`, `eleven.*`, or `motion.*`.
8
+ 2. **Validate early** — `scenerok validate file.vid` (errors show as `Line N:C — message`).
9
+ 3. **Music package syntax** — `import eleven from "@elevenlabs/music"`, then call `eleven.music(...)`, `eleven.generateMusic(...)`, or `eleven.composeMusic(...)`.
10
+ 4. **Copy working examples** — see `examples/system/` in this skill folder (e.g. `minimal-text-reel.vid`, `ecom-product-launch.vid`, `rokmilk-chocolate-promo.vid`).
11
+ 5. **Strict rules** — see `vidscript-strict.md` for invalid patterns (bare `xai.imagine`, bare `eleven.music(...)` without import, trailing params after direct plugin calls, nested quotes in prompts).
12
+
13
+ ### Common validation failures
14
+
15
+ | Symptom | Fix |
16
+ |---------|-----|
17
+ | `Unknown function 'xai.imagine'` | Add `import xai from "@scenerok/xai"` at top |
18
+ | `Unknown function 'fadeIn'` | Use `import motion from "@scenerok/basic-animations"` and call `motion.fadeIn(...)` |
19
+ | `Expected ... but "," found` | Do not put `, volume:` after a direct plugin call. Use `let bed = eleven.music(...)`, then `audio bed, volume: ...` |
20
+ | `Unknown function 'eleven.generateMusic'` | Add `import eleven from "@elevenlabs/music"` before calling `eleven.generateMusic(...)` |
21
+ | Parse error on imagine prompt | Remove nested `"` quotes inside the prompt string |
22
+
5
23
  ## Program Structure
6
24
 
7
25
  A VidScript program is a sequence of statements separated by newlines.
@@ -50,28 +68,18 @@ let clipName = "hero"
50
68
 
51
69
  Variables can hold strings, numbers, time literals, and object expressions. Variables are evaluated at compile time.
52
70
 
53
- ### Import / Export (Module System)
54
-
55
- ```vidscript
56
- # Export a constant
57
- export const BRAND_COLOR = "#FF5733"
58
-
59
- # Export a timeline
60
- export timeline intro(clip: string, title_text: string) {
61
- [-] = clip
62
- [- 2s] = text title_text, size: 72
63
- }
71
+ ### Package Imports
64
72
 
65
- # Import from another file
66
- import { intro, BRAND_COLOR } from "./timelines.vid"
73
+ Only default package imports are supported for callable packages. Call functions through the imported alias.
67
74
 
68
- # Import namespace
69
- import * as transitions from "@scenerok/transitions"
70
-
71
- # Use a timeline
72
- use intro at 0s .. 5s with { clip: hero, title_text: "Hello" }
75
+ ```vidscript
76
+ import xai from "@scenerok/xai"
77
+ import eleven from "@elevenlabs/music"
78
+ import motion from "@scenerok/basic-animations"
73
79
  ```
74
80
 
81
+ Named imports (`import { fn } ...`) and namespace imports (`import * as ...`) are not supported.
82
+
75
83
  ## Time Blocks
76
84
 
77
85
  Time blocks are the core of VidScript. They define when instructions execute on the timeline.
@@ -221,17 +229,30 @@ Audio sources can be MP3 inputs, audio plugin results, or the embedded audio str
221
229
  ### Plugin Calls
222
230
 
223
231
  ```vidscript
224
- import eleven from "@elevenlabs/tts" # future scoped package
225
- import music from "@elevenlabs/music"
226
-
227
- [-] = audio tts("Welcome to SceneRok", voice: "Rachel")
228
- [-] = video xai.imagine("Cinematic product shot", aspect_ratio: "9:16")
229
- [-] = audio music("upbeat launch soundtrack", duration: 12, instrumental: true)
230
- [-] = audio xai.tts("Next line", voice: "eve")
231
- [-] = tts("Next line")
232
+ import xai from "@scenerok/xai"
233
+ import eleven from "@elevenlabs/music"
234
+ import motion from "@scenerok/basic-animations"
235
+
236
+ [-] = video xai.imagine("Cinematic product shot", aspect_ratio: "9:16", duration: 5)
237
+ [-] = audio xai.tts("Welcome to SceneRok", voice: "eve")
238
+
239
+ # ElevenLabs music package functions require an import alias.
240
+ [0s .. 15s] = audio eleven.music("Warm premium launch bed", duration: 15, instrumental: true)
241
+
242
+ # If you need volume or fades, store the generated audio first.
243
+ let bed = eleven.music("Warm premium launch bed", duration: 15, instrumental: true)
244
+ [0s .. 15s] = audio bed, volume: 0.35, fade_out: 2s
232
245
  ```
233
246
 
234
- Plugins are npm packages that add new function names. The built-in server registration includes xAI media/TTS and ElevenLabs music when the matching API keys are configured. They run at compile time and their outputs are baked into the final video. Package-style calls such as `video xai.imagine(...)` and qualified calls such as `audio xai.tts(...)` are supported inside time blocks.
247
+ `@scenerok/xai` requires an explicit default import. ElevenLabs music validates as `eleven.music(...)`, `eleven.generateMusic(...)`, or `eleven.composeMusic(...)` after `import eleven from "@elevenlabs/music"`. Plugin calls run at compile time; direct media plugin instructions cannot have trailing audio params, so use a `let` binding when you need `volume`, `fade_in`, or `fade_out`.
248
+
249
+ **Invalid (will not validate):**
250
+
251
+ ```vidscript
252
+ [-] = video xai.imagine("...") # missing xAI import
253
+ [0s .. 15s] = audio eleven.generateMusic("...") # missing `import eleven from "@elevenlabs/music"`
254
+ [0s .. 15s] = audio eleven.music("..."), volume: 0.5 # trailing params after direct plugin call
255
+ ```
235
256
 
236
257
  ## Animations, Effects & Plugins (v2 Extensibility)
237
258
 
@@ -249,9 +270,11 @@ These accept either plugin function calls or plain object descriptors.
249
270
  Attach animations to **any** text or video surface.
250
271
 
251
272
  ```vidscript
252
- text "Hello", animate: fadeIn(0.8s)
273
+ import motion from "@scenerok/basic-animations"
274
+
275
+ text "Hello", animate: motion.fadeIn(0.8s)
253
276
 
254
- video hero, animate: [fadeIn(0.5s), slideY(-40, 0, 1.2s)]
277
+ video hero, animate: [motion.fadeIn(0.5s), motion.slideY(-40, 0, 1.2s)]
255
278
 
256
279
  text "Title", animate: {
257
280
  type: "fade",
@@ -279,16 +302,16 @@ video hero, effects: [{
279
302
 
280
303
  | Function | Description |
281
304
  |---------------------------|------------------------------|
282
- | `fadeIn(duration?)` | Opacity 0 → 1 |
283
- | `fadeOut(duration?)` | Opacity 1 → 0 |
284
- | `slideX(from, to, dur?)` | Horizontal slide |
285
- | `slideY(from, to, dur?)` | Vertical slide |
286
- | `popIn(duration?)` | Scale + fade entrance |
287
- | `riseIn(duration?, dist?)` | Upward fade entrance |
288
- | `swingIn(duration?)` | Rotating slide/fade |
289
- | `glitchIn(duration?)` | Jitter + flash entrance |
290
- | `float(duration?, amp?)` | Gentle vertical bob |
291
- | `typewriter(duration?)` | Character reveal |
305
+ | `motion.fadeIn(duration?)` | Opacity 0 → 1 |
306
+ | `motion.fadeOut(duration?)` | Opacity 1 → 0 |
307
+ | `motion.slideX(from, to, dur?)` | Horizontal slide |
308
+ | `motion.slideY(from, to, dur?)` | Vertical slide |
309
+ | `motion.popIn(duration?)` | Scale + fade entrance |
310
+ | `motion.riseIn(duration?, dist?)` | Upward fade entrance |
311
+ | `motion.swingIn(duration?)` | Rotating slide/fade |
312
+ | `motion.glitchIn(duration?)` | Jitter + flash entrance |
313
+ | `motion.float(duration?, amp?)` | Gentle vertical bob |
314
+ | `motion.typewriter(duration?)` | Character reveal |
292
315
 
293
316
  More plugins (advanced text animations, pixel effects, 3D, etc.) are planned.
294
317
 
@@ -1,21 +1,30 @@
1
- # VidScript v2 Sample — Product Launch Promo
2
- # A 6-second vertical video for TikTok / Instagram Reels
3
- # Demonstrates dynamic timeblocks, video shorthand, named args, expressions, and filters
1
+ # VidScript v2 Sample — Product promo with generated video
4
2
 
5
- input hero = "{{hero_clip}}"
3
+ Copy this shape for promos that use xAI-generated clips. Run `scenerok validate` before `scenerok render`.
6
4
 
7
- # Auto-append: cursor starts at 0, each [-] advances automatically
8
- [-] = video hero
9
- hero.Trim(start: 0s, end: 6s)
5
+ ```vidscript
6
+ import xai from "@scenerok/xai"
7
+ import motion from "@scenerok/basic-animations"
10
8
 
11
- # Text overlays with comma-separated named params
12
- [0.3s .. 2.3s] = text "NEW DROP", style: title, position: top, color: "#FFFFFF", size: 64, stroke: "#000000", stroke_width: 3
9
+ input product_name = "{{product_name | RokMilk}}"
10
+ input hook_text = "{{hook_text | Chocolate Milkshake}}"
11
+ input cta_text = "{{cta_text | visit your nearest grocery store}}"
13
12
 
14
- [2.5s .. 4.5s] = text "The most anticipated release of the season", style: caption, position: center, color: "#F3F4F6", size: 36, stroke: "#000000", stroke_width: 2
13
+ [0s .. 2.5s] = text product_name, font: "Bebas Neue", size: 80, color: "#FFD700", x: "50%", y: "20%", align: center, stroke: "#3E1C00", stroke_width: 4, animate: motion.fadeIn(0.6s)
15
14
 
16
- [4.5s .. 5.8s] = text "SHOP NOW", style: title, position: bottom, color: "#F59E0B", size: 52, stroke: "#000000", stroke_width: 3
15
+ [2s .. 4.5s] = text hook_text, font: "Outfit", size: 52, color: "#FFFFFF", x: "50%", y: "45%", align: center, stroke: "#3E1C00", stroke_width: 3, animate: motion.riseIn(0.8s)
17
16
 
18
- # Filter applied from start to end of the clip
19
- [0s .. 6s] = filter "vignette", intensity: 0.35
17
+ [-] = video xai.imagine(
18
+ "Premium lifestyle product shot of " + product_name + " chocolate milk in 250ml carton, cinematic lighting, 9:16 vertical",
19
+ aspect_ratio: "9:16",
20
+ duration: 6
21
+ )
20
22
 
21
- output to "product-launch.mp4", resolution: "1080x1920", fps: 30
23
+ [8s .. 11s] = text cta_text, font: "Bebas Neue", size: 48, color: "#FFD700", x: "50%", y: "80%", align: center, stroke: "#3E1C00", stroke_width: 4, animate: motion.fadeIn(0.8s)
24
+
25
+ [0s .. 12s] = filter "vignette", intensity: 0.3
26
+
27
+ output to "product-promo.mp4", resolution: "1080x1920", fps: 30
28
+ ```
29
+
30
+ For clips you already have (no xAI), start from `examples/system/product-launch.vid` instead.
@@ -0,0 +1,113 @@
1
+ # VidScript v2 — Strict Agent Reference
2
+
3
+ Follow these rules exactly. When in doubt, copy a file from `examples/system/` (installed with `scenerok skills install`).
4
+
5
+ ## Rule 1: Package imports are mandatory
6
+
7
+ ```vidscript
8
+ import xai from "@scenerok/xai"
9
+ import eleven from "@elevenlabs/music"
10
+ import motion from "@scenerok/basic-animations"
11
+ ```
12
+
13
+ Without the owning import, calls like `xai.imagine`, `xai.tts`, `eleven.music`, and `motion.fadeIn` fail validation.
14
+
15
+ **Never** call package functions without importing the package alias first.
16
+
17
+ ## Rule 2: Use registered plugin surfaces
18
+
19
+ ```vidscript
20
+ import xai from "@scenerok/xai"
21
+ import eleven from "@elevenlabs/music"
22
+
23
+ [-] = video xai.imagine("Prompt here", aspect_ratio: "9:16", duration: 5)
24
+ [-] = audio xai.tts("Voiceover line", voice: "eve")
25
+ [0s .. 15s] = audio eleven.music("Warm premium music bed", duration: 15, instrumental: true)
26
+ ```
27
+
28
+ For ElevenLabs music, import `@elevenlabs/music` and use `eleven.music(...)`, `eleven.generateMusic(...)`, or `eleven.composeMusic(...)`.
29
+
30
+ ## Rule 3: Time ranges use `..`
31
+
32
+ ```vidscript
33
+ [0s .. 5s] = text "Hello"
34
+ ```
35
+
36
+ Not `[0s - 5s]`.
37
+
38
+ ## Rule 4: Text params stay on one line
39
+
40
+ ```vidscript
41
+ [0.5s .. 3s] = text "Headline", font: "Inter", size: 64, color: "#FFFFFF", x: "50%", y: "30%", align: center
42
+ ```
43
+
44
+ ## Rule 5: Quote safety in prompts
45
+
46
+ Use only straight `"` inside `xai.imagine("...")`. Do not nest quotes inside the prompt string (e.g. avoid `"RokMilk"` inside the prompt — say `labeled RokMilk` without extra quotes).
47
+
48
+ ## Rule 6: Audio syntax
49
+
50
+ ```vidscript
51
+ import xai from "@scenerok/xai"
52
+ import eleven from "@elevenlabs/music"
53
+
54
+ [-] = audio xai.tts("Spoken line", voice: "eve", speed: 1.0)
55
+
56
+ # Direct music call, no trailing audio params.
57
+ [0s .. 15s] = audio eleven.music("Soft premium ad music", duration: 15, instrumental: true)
58
+
59
+ # Use a binding when you need volume or fades.
60
+ let bed = eleven.music("Soft premium ad music", duration: 15, instrumental: true)
61
+ [0s .. 15s] = audio bed, volume: 0.35, fade_out: 2s
62
+ ```
63
+
64
+ **Invalid:** `audio eleven.music("...", duration: 15), volume: 0.35` — trailing `, volume` after a direct plugin call is a parse error.
65
+
66
+ **Invalid:** `eleven.generateMusic(...)` without `import eleven from "@elevenlabs/music"`.
67
+
68
+ ## Rule 7: Filters
69
+
70
+ ```vidscript
71
+ [0s .. 15s] = filter "vignette", intensity: 0.3
72
+ [0s .. 15s] = filter "saturation", value: 1.12
73
+ ```
74
+
75
+ `saturation` uses `value`, not `intensity`.
76
+
77
+ ## Rule 8: Always end with output
78
+
79
+ ```vidscript
80
+ output to "video.mp4", resolution: "1080x1920", fps: 30
81
+ ```
82
+
83
+ Do **not** use legacy `config { }` blocks — they are not part of VidScript v2.
84
+
85
+ ## Animations (after import)
86
+
87
+ ```vidscript
88
+ import motion from "@scenerok/basic-animations"
89
+
90
+ [0s .. 2s] = text "Launch", x: "50%", y: "50%", animate: motion.popIn(0.7s)
91
+ ```
92
+
93
+ Available: `fadeIn`, `fadeOut`, `slideX`, `slideY`, `popIn`, `riseIn`, `swingIn`, `glitchIn`, `float`, `typewriter`.
94
+
95
+ ## Validate before render
96
+
97
+ ```bash
98
+ scenerok validate my-video.vid
99
+ ```
100
+
101
+ Each error line includes `Line N:C — message` when the server returns location info.
102
+
103
+ ## Bundled examples
104
+
105
+ | File | Use case |
106
+ |------|----------|
107
+ | `minimal-text-reel.vid` | Text-only, no API keys |
108
+ | `product-launch.vid` | User video input + text + vignette |
109
+ | `ecom-product-launch.vid` | xAI product visuals + CTA |
110
+ | `3-tips-fitness.vid` | Multiple `[-]` blocks + xAI per segment |
111
+ | `rokmilk-chocolate-promo.vid` | 15s generated-video promo pattern |
112
+
113
+ Full grammar: https://scenerok.com/docs/vidscript
@@ -67,37 +67,34 @@ Built-in filters: `monochrome`, `sepia`, `blur`, `chromatic`, `glitch`, `vignett
67
67
  output to "video.mp4", resolution: "1080x1920", fps: 30
68
68
  ```
69
69
 
70
- ### Module System
70
+ ### Package Imports
71
71
 
72
72
  ```vidscript
73
- export const BRAND_COLOR = "#FF5733"
74
- export timeline intro(clip: string, headline: string) {
75
- [-] = clip # auto-append
76
- clip.Trim(start: 0s, end: 3s)
77
- [- 2s] = text headline, style: title # auto-start, 2s duration
78
- }
79
- ```
80
-
81
- ```vidscript
82
- import { intro } from "./timelines.vid"
83
- import * as pack from "./effects.vid"
84
- import eleven from "@elevenlabs/tts" # future scoped package # from npm registry
85
- import music from "@elevenlabs/music" # generative music
86
- use intro at [-] with { clip: main, headline: "Welcome" }
73
+ import xai from "@scenerok/xai" # xAI image/video/tts
74
+ import eleven from "@elevenlabs/music" # ElevenLabs generative music
75
+ import motion from "@scenerok/basic-animations" # text/video animation helpers
87
76
  ```
88
77
 
89
78
  ### Plugin Calls
90
79
 
91
80
  ```vidscript
92
- import eleven from "/tts"
81
+ import xai from "@scenerok/xai"
82
+ import eleven from "@elevenlabs/music"
83
+ import motion from "@scenerok/basic-animations"
84
+
85
+ [-] = video xai.imagine("Cinematic product shot", aspect_ratio: "9:16", duration: 5)
86
+ [-] = audio xai.tts("Welcome to SceneRok", voice: "eve")
93
87
 
94
- [-] = audio eleven.tts("Welcome to SceneRok", voice: "Rachel")
95
- [-] = video xai.imagine("Cinematic product shot", aspect_ratio: "9:16")
96
- [-] = audio music("upbeat launch soundtrack", duration: 12, instrumental: true)
97
- [-] = audio xai.tts("Next line", voice: "eve")
88
+ # ElevenLabs music package functions require an import alias.
89
+ let bed = eleven.music("Warm premium launch bed", duration: 15, instrumental: true)
90
+ [0s .. 15s] = audio bed, volume: 0.35, fade_out: 2s
98
91
  ```
99
92
 
100
- Package-style plugin calls are supported inside time blocks. Use `video ...` for generated visual clips and `audio ...` for generated speech, music, and other generated audio.
93
+ **Always** import the package that owns the function: `xai.*` from `@scenerok/xai`, `eleven.*` from `@elevenlabs/music`, and `motion.*` from `@scenerok/basic-animations`. Calls without import fail validation with `Unknown function 'xai.imagine'`.
94
+
95
+ For ElevenLabs music, import `@elevenlabs/music` and call `eleven.music(...)`, `eleven.generateMusic(...)`, or `eleven.composeMusic(...)`. Use `let bed = eleven.music(...)` followed by `audio bed, volume: ...` when you need volume or fades.
96
+
97
+ Read `vidscript-strict.md` for anti-patterns and `examples/system/*.vid` for copy-paste templates (installed with `scenerok skills install`).
101
98
 
102
99
  ### Placeholders
103
100
 
@@ -165,7 +162,15 @@ Always ask clarifying questions about:
165
162
  - Desired duration and style
166
163
  - Whether they want to start from a template or from scratch
167
164
 
165
+ ## Reference files (in this skill folder)
166
+
167
+ | File | Purpose |
168
+ |------|---------|
169
+ | `vidscript-guide.md` | Full grammar reference |
170
+ | `vidscript-strict.md` | **Read first** — rules that prevent common agent mistakes |
171
+ | `vidscript-sample.md` | Minimal promo with xAI import |
172
+ | `examples/system/*.vid` | Official SceneRok templates (text-only, product launch, xAI reels) |
173
+
168
174
  ## Full Reference
169
175
 
170
- For exhaustive grammar documentation, visit:
171
176
  https://scenerok.com/docs/vidscript