@mevdragon/vidfarm-devcli 0.20.4 → 0.20.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.
package/SKILL.director.md CHANGED
@@ -249,6 +249,41 @@ Read-only state (does **not** advance the job or bill): `GET /api/v1/composition
249
249
  "delivery": "flat VO cadence, hold the beat before the punch, beat drop lands on the reveal",
250
250
  "preserve": ["keep the beat drop on the reveal cut", "keep the flat unbothered delivery"]
251
251
  },
252
+ "static_vs_pivot": {
253
+ "summary": "Keep the reveal structure and audio swagger; swap the subject-specific visuals and copy.",
254
+ "scene_replacement": {
255
+ "overall": "replace_some",
256
+ "reason": "the proof/reveal beats are load-bearing, but the subject matter can pivot",
257
+ "must_keep": ["final reveal beat", "setup-to-payoff contrast"],
258
+ "should_replace": ["subject-specific graphics", "brand-specific screenshots"],
259
+ "load_bearing_scenes": ["hook setup", "payoff reveal"]
260
+ },
261
+ "narration": {
262
+ "overall": "customize_script",
263
+ "reason": "the spoken words are source-specific and stop making sense after a subject swap",
264
+ "same_timing_required": true,
265
+ "use_premium_tts_when_customizing": true
266
+ },
267
+ "music": {
268
+ "overall": "recreate_under_narration",
269
+ "reason": "the music energy matters, but the original combined track should not stay under a rewritten script",
270
+ "volume_guidance": "keep low under VO unless the beat-drop is the joke engine"
271
+ },
272
+ "captions": {
273
+ "overall": "retime_to_new_narration",
274
+ "reason": "caption animation is tied to the spoken words",
275
+ "animation_dependency": "word-by-word timing follows narration cadence"
276
+ },
277
+ "visual_rebuild": {
278
+ "default_strategy": "ai_images_with_ken_burns",
279
+ "reason": "most replacement scenes are graphic/still-like and do not need expensive motion video"
280
+ },
281
+ "viral_dna": {
282
+ "must_keep": ["hook structure", "payoff timing", "audio attitude"],
283
+ "flexible": ["subject matter", "product imagery", "copy details"],
284
+ "do_not_change": ["core reveal mechanic", "caption cadence"]
285
+ }
286
+ },
252
287
  "preserve": ["..."], "avoid": ["..."], "promotions": ["..."], "keywords": ["..."]
253
288
  }
254
289
  }
@@ -258,6 +293,15 @@ Read-only state (does **not** advance the job or bill): `GET /api/v1/composition
258
293
 
259
294
  **`viral_dna.emotional_punch`** is the FEELING of the format and what makes it land — the part a remix most often flattens. Where hook/retention/payoff are the mechanical structure, this captures the vibe, the joke, and the intonation. It is now **audio-aware**: the decompose feeds the transcript into the reasoning, so `mechanism`/`delivery` account for the trending sound, the music-bed drop, and vocal cadence (on short-form the sound is frequently the biggest driver of the punch). When you re-theme or remix, rebuild `humor`'s joke around the new subject rather than dropping it, match `tone`/`delivery` so intonation and comedic timing survive, and never trade the `peak_moment` payoff for a flat product plug.
260
295
 
296
+ **`viral_dna.static_vs_pivot`** is the first-class lazy-prompt playbook. It tells you what must stay versus what can pivot when the user gives a thin prompt like "recreate this for my business" and little else. Use it to decide:
297
+
298
+ - whether most scenes should be replaced or only some
299
+ - whether narration must be customized or the original audio should stay
300
+ - whether background music must be recreated under a new voice
301
+ - whether animated captions need fresh timing against new narration
302
+ - whether cheap AI images + Ken Burns are sufficient, or whether real/AI motion footage is required
303
+ - which beats are load-bearing viral DNA versus merely subject-specific dressing
304
+
261
305
  Use it whenever you need to know what the video says or shows: writing/translating captions, matching hooks or dubs to spoken audio, or planning scene-level edits.
262
306
 
263
307
  - **Editor chat (frontend AI)** exposes this as the optional `video_context` tool — the copilot calls it on demand.
@@ -287,10 +331,10 @@ Use it whenever you need to know what the video says or shows: writing/translati
287
331
  }
288
332
  ```
289
333
 
290
- **Use it to pick concrete moves:** `typography.caption_style` maps to a `set_captions` preset; `transitions.*` to a `set_transitions` call; keep `pacing` (cut rhythm / avg_scene_seconds) when adding or splitting scenes; follow `broll.reliance`/`sourcing` to decide HUNT raws (`/raws/scan`) vs generate; lay `audio.*`. **`emotional`** is HOW to keep the FEELING while you swap the subject — the vibe/joke/intonation/sound are the first things a remix flattens, so honor `emotional.comedic_timing` (the held beat / hard cut that sells the joke), preserve `emotional.intonation` when you re-voice narration, and treat every `emotional.vibe_anchors` entry as a must-do (on short-form the trending sound / beat drop is often the biggest carrier of the punch — keep it and land it on the same cut). **Protect** any beat in `important_scenes` or with `must_keep:true` / `importance:"critical"` — swap the subject but preserve its timing, role, and caption cadence. Treat `editing_bias`/`do`/`dont` as hard constraints; an explicit user instruction still wins. `status:"none"` → run `POST /auto-decompose` first.
334
+ **Use it to pick concrete moves:** `typography.caption_style` maps to a `set_captions` preset; `transitions.*` to a `set_transitions` call; keep `pacing` (cut rhythm / avg_scene_seconds) when adding or splitting scenes; follow `broll.reliance`/`sourcing` to decide HUNT raws (`/raws/scan`) vs generate; lay `audio.*`. **`emotional`** is HOW to keep the FEELING while you swap the subject — the vibe/joke/intonation/sound are the first things a remix flattens, so honor `emotional.comedic_timing` (the held beat / hard cut that sells the joke), preserve `emotional.intonation` when you re-voice narration, and treat every `emotional.vibe_anchors` entry as a must-do (on short-form the trending sound / beat drop is often the biggest carrier of the punch — keep it and land it on the same cut). Pair that with `viral_dna.static_vs_pivot`: if narration is `customize_script`, revoice and then retime captions/scenes that depend on the old VO; if visual_rebuild is `ai_images_with_ken_burns`, do the cheap still+motion path before reaching for AI video; if a scene is listed under `load_bearing_scenes`, preserve its beat even when you swap the subject. **Protect** any beat in `important_scenes` or with `must_keep:true` / `importance:"critical"` — swap the subject but preserve its timing, role, and caption cadence. Treat `editing_bias`/`do`/`dont` as hard constraints; an explicit user instruction still wins. `status:"none"` → run `POST /auto-decompose` first.
291
335
 
292
336
  - **Editor chat (frontend AI)** already receives the harness inline in `editor_context.editor_harness` (no tool call needed); it can also fetch this route via `http_request`.
293
- - **Desktop agents (Claude Code / Codex)**: `vidfarm pull` writes `editor-harness.json` to the fork dir (the brief is under `.harness`) alongside `video-context.json`; read it before a big edit. The `pull` grounding line reports whether it's present.
337
+ - **Desktop agents (Claude Code / Codex)**: `vidfarm pull` writes `editor-harness.json` to the fork dir alongside `video-context.json`, and also materializes a merged agent bundle at `.harness/context.json` plus `.harness/agent-guide.md`. This deliberately does **not** write a top-level `AGENTS.md`, because many user repos already own that file. For local scripting or agentic edits, read `.harness/agent-guide.md` and `.harness/context.json` FIRST; do not freestyle from `composition.html` alone. The `pull` grounding line reports the generated brief paths.
294
338
 
295
339
  ## Raws (long-form → short-form raws)
296
340
 
@@ -696,6 +740,23 @@ If you need many variants, keep the base fork fixed and fan out by cloning that
696
740
  - `POST /api/v1/compositions/:forkId/render` with a stable `tracer`, or `vidfarm render <forkId> --dir ./work --wait` for the same composed flow
697
741
  - `render_target: "cloud"` when you want cloud handoff from a local `vidfarm serve` box, or the default local renderer when you want free in-process output
698
742
 
743
+ **Required grounding for AI-authored scripts.** If an AI agent is going to WRITE or MODIFY a local Vidfarm script for a user, the safe default is:
744
+
745
+ 1. `vidfarm pull <forkId> --dir ./work`
746
+ 2. Read `./work/.harness/agent-guide.md`
747
+ 3. Read `./work/.harness/context.json`
748
+ 4. Only then read/edit `composition.html`, `composition.json`, and write the automation logic
749
+
750
+ That is the canonical local scripting path because the pull step now packages:
751
+
752
+ - `video-context.json`: transcript, scene descriptions, viral DNA
753
+ - `editor-harness.json`: technical editing brief
754
+ - `scene-annotations.json`: per-scene replacement/recreation DNA
755
+ - `.harness/context.json`: merged agent-facing snapshot
756
+ - `.harness/agent-guide.md`: Vidfarm-specific instruction file telling a generic agent how to use the above without conflicting with any repo-owned `AGENTS.md`
757
+
758
+ If a local AI script rewrites text or scenes without consuming those files first, treat that as a bug in the script/agent flow.
759
+
699
760
  | Command | REST route | Flow step |
700
761
  |---|---|---|
701
762
  | `vidfarm discover [query]` | `GET /discover/feed[?q=]` | browse/search templates |
@@ -704,7 +765,7 @@ If you need many variants, keep the base fork fixed and fan out by cloning that
704
765
  | `vidfarm inspiration-rm <id>` | `DELETE /discover/templates/:id` | remove a private one |
705
766
  | `vidfarm inspiration-decompose <id>` | `POST /api/v1/inspirations/:id/decompose` | AI-decompose an inspiration |
706
767
  | `vidfarm fork <template_id>` | `POST /api/v1/compositions` | fork a template |
707
- | `vidfarm pull <forkId> [--dir <p>]` | `GET .../compositions/:forkId/{composition.html,json,video-context.json,cast.json,scene-annotations.json,editor-harness.json}` | sync a fork to disk + print gaps/scene keys + grounding (incl. editor-harness style brief) |
768
+ | `vidfarm pull <forkId> [--dir <p>]` | `GET .../compositions/:forkId/{composition.html,json,video-context.json,cast.json,scene-annotations.json,editor-harness.json}` | sync a fork to disk + generate `.harness/context.json` and `.harness/agent-guide.md` + print gaps/scene keys + grounding |
708
769
  | `vidfarm generate <image\|video> --prompt "…"` | `POST /api/v1/primitives/{images,videos}/generate` (polls job) | generate AI media → finished URL |
709
770
  | `vidfarm inpaint <image> --mask <png> --prompt "…" [--region "label=…"] [--ref …] [--out <f>]` | `POST /api/v1/primitives/images/inpaint` (polls job) | masked image EDIT — replace ONLY the transparent-mask region, keep everything else (devcli twin of the /inpaint page) |
710
771
  | `vidfarm create-overlay "<subject>" [--key-color #00FF00] [--aspect-ratio 1:1] [--place <dir>] [--out <f>]` | `POST /api/v1/primitives/images/create-overlay` (polls job) | **Vox-style** transparent OVERLAY — AI image on a forced key-color background, chroma-keyed out in one job → ready-to-composite transparent PNG |