@facelessad/cli 2.1.2 → 2.2.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.
Files changed (4) hide show
  1. package/README.md +14 -0
  2. package/SKILL.md +33 -0
  3. package/index.js +23 -1
  4. package/package.json +1 -1
package/README.md CHANGED
@@ -109,11 +109,25 @@ These are not alternative spellings but forms of their own, and they stay:
109
109
  | `--no-voice` | no narration |
110
110
  | `--no-brand-kit` | build without the Brand Kit |
111
111
  | `--no-refine-style` | use the custom style text verbatim |
112
+ | `--visual-direction-refine "<preset\|text>"` | how the story is told, not how it looks (2.2.0) |
113
+ | `--layout <A\|HA\|AC\|HAC\|AIA\|HAIA\|AIAC\|HAIAC>` | card layout; data card drops if too short, hook/CTA stay (2.2.0) |
112
114
 
113
115
  `--no-brand-kit` now works; before 1.0.1 it was accepted on the command line
114
116
  and silently dropped, so the video was built with the Brand Kit anyway. **An unknown flag is now an error** rather than
115
117
  something quietly ignored — that silence is what hid the whole problem.
116
118
 
119
+ ## 2.2.0 — `--visual-direction-refine`
120
+
121
+ Animated Ad and Music Video: a preset id (`metaphoric`, `realistic`,
122
+ `dramatic`, `calm`, `playful`, `dark`, `bright`, `magical` — `facelessad tools`
123
+ lists them) or your own instruction up to 300 characters. Reshapes how the
124
+ visual story is told, not how it looks; applied on top of `--visual-direction`
125
+ or the generated one. Free.
126
+
127
+ `--layout` (same two tools) picks the card layout. Too short for the data
128
+ card? It is dropped, the hook/CTA you chose stay, and the output says so.
129
+ `facelessad tools` lists the layouts and what each becomes per duration.
130
+
117
131
  ## 1.3.0 — turn any text file into a video
118
132
 
119
133
  **Agent skill included.** The package ships `SKILL.md` — drop it where your
package/SKILL.md CHANGED
@@ -140,6 +140,8 @@ you leave out is chosen for you** from the materials.
140
140
  | `--voice-over` / `--no-voice` | force narration on or off, where the tool allows a choice |
141
141
  | `--voiceover-text "<script>"` / `--voiceover-file <path>` | your own narration (see below) |
142
142
  | `--visual-direction "<...>"` | how it should look and what happens, max 600 |
143
+ | `--visual-direction-refine "<preset\|text>"` | how the story is TOLD, not how it looks: preset id or your own instruction, max 300. Animated Ad, Music Video. Free |
144
+ | `--layout <A\|HA\|AC\|HAC\|AIA\|HAIA\|AIAC\|HAIAC>` | card layout — hook/CTA stay, data card drops if too short. Animated Ad, Music Video |
143
145
  | `--hook-text "<...>"` | your own first-frame card text, max 120 |
144
146
  | `--cta "<...>"` | the call to action it ends on |
145
147
  | `--brand-name "<...>"` / `--brand-color "#RRGGBB"` | brand as said and shown, and its colour |
@@ -170,6 +172,35 @@ before sending. Not on music-video (its script is sung) or video-banner.
170
172
  `--visual-direction` steers the storyboard and `--hook-text` the first frame.
171
173
  Neither replaces the style: the look still comes from `--style`.
172
174
 
175
+ ## Refining the visual story (optional)
176
+
177
+ `--visual-direction-refine` reshapes **how the visual story is told** — its
178
+ narrative device, scale, tempo, mood, what the product's effect leads to — not
179
+ how it looks. It is applied on top of `--visual-direction` if you gave one,
180
+ and otherwise on the visual direction the script writer generates, so an
181
+ intent is enough.
182
+
183
+ Two forms: a preset id (`metaphoric`, `realistic`, `dramatic`, `calm`,
184
+ `playful`, `dark`, `bright`, `magical` — `facelessad tools` lists them under
185
+ `visual_direction_refine.presets`) or any other text, max 300 characters,
186
+ used as your own instruction. Animated Ad and Music Video only; elsewhere it
187
+ is an error, not ignored. Free. Art-style words belong in `--custom-style`.
188
+
189
+ ## Card layout (optional)
190
+
191
+ `--layout` picks the card layout on Animated Ad and Music Video: `A` (scenes
192
+ only), `HA` (hook card + scenes), `AC` (scenes + CTA card), `HAC`, `AIA`
193
+ (scenes + data card + scenes), `HAIA`, `AIAC`, `HAIAC`. `facelessad tools`
194
+ lists them under `layouts` with a name and, per duration, what each becomes.
195
+
196
+ Length is never an error. The hook and CTA cards you chose always stay; the
197
+ data card is dropped when the video is too short for it — `HAIAC` at 30 s
198
+ becomes `HAC`, `AIA` at 15 s becomes `A`. The create response reports
199
+ `layout.applied` and a `layout.notice` when it was reduced. Omit `--layout` to
200
+ let the ad structure decide (its own layout, fitted to the duration the same
201
+ way).
202
+
203
+
173
204
  ## Captions
174
205
 
175
206
  On by default, outline style, no dark box over the visuals.
@@ -308,6 +339,8 @@ names the offending field and usually the valid values.
308
339
  - `custom_style_without_custom` — `--custom-style` without `--style custom`.
309
340
  - `custom_style_not_supported` — that tool's styles are fixed presets.
310
341
  - `custom_script_too_long` / `custom_script_too_short` — `--voiceover-text` does not fit the duration.
342
+ - `visual_direction_refine_too_long` / `visual_direction_refine_not_supported` — free-text instruction over 300, or a tool other than animated-ad / music-video.
343
+ - `unknown_layout` / `layout_not_supported` — a layout id not in the list, or a tool other than animated-ad / music-video. Length never errors: the data card is dropped and the response says so.
311
344
  - `voice_not_supported` / `voice_over_not_supported` / `speakers_not_supported` / `option_not_supported` — that tool does not have that setting.
312
345
  - `structure_speaker_mismatch` — a dialogue structure with `--speakers 1`, or the reverse.
313
346
  - `product_image_required` — product-showcase cannot start without one.
package/index.js CHANGED
@@ -157,6 +157,10 @@ const KNOWN_FLAGS = new Set([
157
157
  'no-captions', 'no-music', 'no-sfx',
158
158
  // 1.4.0 (§799): oma kasikirjoitus ja visuaalinen ohjaus createssa.
159
159
  'voiceover-text', 'voiceover-file', 'visual-direction', 'hook-text',
160
+ // 2.2.0 (§903): kerronnan esitystavan jalostus (preset-id tai vapaa ohje).
161
+ 'visual-direction-refine',
162
+ // 2.2.0 (§912): H/I/C-layout (A, HA, AC, HAC, AIA, HAIA, AIAC, HAIAC).
163
+ 'layout',
160
164
  ]);
161
165
  const unknownFlags = Object.keys(flags).filter((f) => !KNOWN_FLAGS.has(f)).map((f) => '--' + f).concat(badShort);
162
166
 
@@ -395,6 +399,8 @@ function buildBody() {
395
399
  body.voiceover_text = vo;
396
400
  }
397
401
  set('visual_direction', flags['visual-direction'] !== undefined ? String(flags['visual-direction']) : undefined);
402
+ set('visual_direction_refine', flags['visual-direction-refine'] !== undefined ? String(flags['visual-direction-refine']) : undefined); // 2.2.0 (§903)
403
+ set('layout', flags['layout'] !== undefined ? String(flags['layout']).toUpperCase() : undefined); // 2.2.0 (§912)
398
404
  // 1.5.0 (§806): tekstitysten ulkoasu — samat arvot kuin appissa.
399
405
  set('caption_style', flags['caption-style'] !== undefined ? String(flags['caption-style']) : undefined);
400
406
  set('caption_color', flags['caption-color'] !== undefined ? String(flags['caption-color']) : undefined);
@@ -567,6 +573,10 @@ const commands = {
567
573
  } else if (t.adStructures?.length) {
568
574
  lines.push(' ad structures: ' + t.adStructures.map((s) => s.id).join(', '));
569
575
  }
576
+ // 2.2.0 (§912): layoutit + mihin ne tippuvat pituuksittain.
577
+ if (t.layouts?.length) {
578
+ lines.push(' layouts (15s / 30s / 50s): ' + t.layouts.map((l) => l.id + ' → ' + l.at.quick + '/' + l.at.medium + '/' + l.at.long).join(', '));
579
+ }
570
580
  // Tyylit joilla on OMA rakennepooli — valinta riippuu tyylistä, ja
571
581
  // yleisen listan rakenne hylätään niillä (structure_style_mismatch).
572
582
  // §708: characterin rakenteet ovat kaksi poolia puhujamäärän mukaan.
@@ -711,7 +721,9 @@ const commands = {
711
721
  if (flags['dry-run'] === true) { out({ ok: true, body }, JSON.stringify(body, null, 2)); return; }
712
722
  const d = await call('POST', '/api/v1/videos', body);
713
723
  if (!(flags.wait === true)) {
714
- out(d, 'Queued. id=' + d.id + ' (estimate: up to ~' + d.estimate + ' credits)\nFollow it: facelessad status ' + d.id + ' --wait');
724
+ // 2.2.0 (§912): layout-kuittaus mitä käytetään ja miksi se tippui.
725
+ const layoutLine = d.layout ? ('\nLayout: ' + d.layout.applied + (d.layout.notice ? ' — ' + d.layout.notice : '')) : '';
726
+ out(d, 'Queued. id=' + d.id + ' (estimate: up to ~' + d.estimate + ' credits)' + layoutLine + '\nFollow it: facelessad status ' + d.id + ' --wait');
715
727
  return;
716
728
  }
717
729
  await waitFor(d.id);
@@ -866,6 +878,16 @@ Create flags:
866
878
  --voiceover-file <path> (same, read from a local text file)
867
879
  --visual-direction "<...>" (how the video should LOOK and what happens
868
880
  visually, max 600 chars — steers the storyboard, not the art style)
881
+ --visual-direction-refine "<preset|text>"
882
+ (how the story is TOLD, not how it looks: a preset id — metaphoric,
883
+ realistic, dramatic, calm, playful, dark, bright, magical — or your own
884
+ instruction, max 300 chars. Applied on top of --visual-direction or the
885
+ generated one. animated-ad and music-video only. Free.)
886
+ --layout <A|HA|AC|HAC|AIA|HAIA|AIAC|HAIAC>
887
+ (card layout, animated-ad and music-video only. H = hook card, I = data
888
+ card, C = CTA card, A = scenes. Too short for the data card? It is
889
+ dropped and the hook/CTA you chose stay — e.g. HAIAC at 30s becomes
890
+ HAC; the response says so. "facelessad tools" lists the layouts.)
869
891
  --hook-text "<...>" (your own first-frame card text, max 120)
870
892
  --voice --gender --no-voice --voice-over --music --sfx --captions
871
893
  (leave --voice out and the voice is cast from the finished script;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@facelessad/cli",
3
- "version": "2.1.2",
3
+ "version": "2.2.0",
4
4
  "description": "Create faceless video ads from your terminal or build scripts \u2014 the FacelessAd command line.",
5
5
  "license": "MIT",
6
6
  "type": "module",