@facelessad/cli 2.1.1 → 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 +40 -5
  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
@@ -14,10 +14,11 @@ facelessad login # API key from https://facelessad.com/develop
14
14
  facelessad balance # proves the key works
15
15
  ```
16
16
 
17
- **The API needs a paid plan.** Trial credits cover the web app but do not
18
- open API keys if a command answers `api_access_required`, the user has to
19
- subscribe first. That is a billing state, not a broken key, so say so rather
20
- than retrying.
17
+ **The API needs a paid plan or an active trial.** The $15 trial (300
18
+ credits, 7 days) opens API keys, the CLI and MCP for its duration. If a
19
+ command answers `api_access_required`, the subscription has ended or the
20
+ trial has expired or run out of credits — a billing state, not a broken
21
+ key, so say so rather than retrying.
21
22
 
22
23
  In CI, skip `login` and set `FACELESSAD_API_KEY`; the environment variable
23
24
  wins over the saved key.
@@ -139,6 +140,8 @@ you leave out is chosen for you** from the materials.
139
140
  | `--voice-over` / `--no-voice` | force narration on or off, where the tool allows a choice |
140
141
  | `--voiceover-text "<script>"` / `--voiceover-file <path>` | your own narration (see below) |
141
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 |
142
145
  | `--hook-text "<...>"` | your own first-frame card text, max 120 |
143
146
  | `--cta "<...>"` | the call to action it ends on |
144
147
  | `--brand-name "<...>"` / `--brand-color "#RRGGBB"` | brand as said and shown, and its colour |
@@ -169,6 +172,35 @@ before sending. Not on music-video (its script is sung) or video-banner.
169
172
  `--visual-direction` steers the storyboard and `--hook-text` the first frame.
170
173
  Neither replaces the style: the look still comes from `--style`.
171
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
+
172
204
  ## Captions
173
205
 
174
206
  On by default, outline style, no dark box over the visuals.
@@ -291,9 +323,10 @@ names the offending field and usually the valid values.
291
323
 
292
324
  **Access and capacity**
293
325
 
294
- - `api_access_required` — no active paid plan. Trial credits do not open the API.
326
+ - `api_access_required` — no active paid plan or live trial. An active $15 trial opens the API for its 7 days.
295
327
  - `insufficient_credits` — the body carries the estimate and the balance; nothing was spent.
296
328
  - `too_many_active` — the plan's queue is full (Starter 10, Growth 25, Scale 50; app and API share it). Wait for a build to finish, then retry.
329
+ - `test_quota_exceeded` — 100 test runs per day per account (`"test": true` only). Real runs are unaffected; the quota resets at 00:00 UTC and the body carries `retryAfter`.
297
330
  - `rate_limited` — over 300 POSTs this hour (`estimate` has its own 600). `retryAfter` gives the seconds until the counter resets on the hour.
298
331
  - `unauthorized` — the key is unknown or revoked.
299
332
 
@@ -306,6 +339,8 @@ names the offending field and usually the valid values.
306
339
  - `custom_style_without_custom` — `--custom-style` without `--style custom`.
307
340
  - `custom_style_not_supported` — that tool's styles are fixed presets.
308
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.
309
344
  - `voice_not_supported` / `voice_over_not_supported` / `speakers_not_supported` / `option_not_supported` — that tool does not have that setting.
310
345
  - `structure_speaker_mismatch` — a dialogue structure with `--speakers 1`, or the reverse.
311
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.1",
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",