@vibeframe/cli 0.113.10 → 0.113.24

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 (36) hide show
  1. package/CONTEXT.md +12 -11
  2. package/dist/commands/_shared/build-plan.d.ts +8 -1
  3. package/dist/commands/_shared/compose-aivideo.d.ts +82 -0
  4. package/dist/commands/_shared/compose-aivideo.test.d.ts +1 -0
  5. package/dist/commands/_shared/compose-prompts.d.ts +15 -0
  6. package/dist/commands/_shared/compose-scenes-skills.d.ts +46 -3
  7. package/dist/commands/_shared/design-parse.d.ts +26 -0
  8. package/dist/commands/_shared/design-parse.test.d.ts +1 -0
  9. package/dist/commands/_shared/hf-skill-bundle/bundle.d.ts +8 -2
  10. package/dist/commands/_shared/init-templates.d.ts +2 -2
  11. package/dist/commands/_shared/install-skill.d.ts +47 -6
  12. package/dist/commands/_shared/project-config.d.ts +5 -1
  13. package/dist/commands/_shared/project-config.test.d.ts +1 -0
  14. package/dist/commands/_shared/root-sync.d.ts +25 -0
  15. package/dist/commands/_shared/scene-assemble.d.ts +47 -0
  16. package/dist/commands/_shared/scene-assemble.test.d.ts +1 -0
  17. package/dist/commands/_shared/scene-build.d.ts +26 -5
  18. package/dist/commands/_shared/scene-project.d.ts +47 -13
  19. package/dist/commands/_shared/scene-render.d.ts +6 -0
  20. package/dist/commands/_shared/storyboard-edit.d.ts +1 -1
  21. package/dist/commands/_shared/storyboard-parse.d.ts +6 -0
  22. package/dist/commands/_shared/transcribe-narration.d.ts +23 -0
  23. package/dist/commands/_shared/transcribe-narration.test.d.ts +1 -0
  24. package/dist/commands/assemble.d.ts +2 -0
  25. package/dist/commands/design.d.ts +2 -0
  26. package/dist/commands/export.d.ts +0 -2
  27. package/dist/commands/init.d.ts +1 -1
  28. package/dist/commands/preview.d.ts +2 -0
  29. package/dist/commands/preview.test.d.ts +1 -0
  30. package/dist/index.js +2482 -1480
  31. package/dist/tools/define-tool.js +3 -0
  32. package/dist/tools/manifest/design.d.ts +10 -0
  33. package/dist/tools/manifest/design.test.d.ts +1 -0
  34. package/dist/tools/manifest/index.d.ts +2 -1
  35. package/dist/tools/manifest/index.js +2178 -1521
  36. package/package.json +3 -3
@@ -64,6 +64,19 @@ export type SceneBuildProgressEvent = {
64
64
  type: "narration-skipped";
65
65
  beatId: string;
66
66
  reason: string;
67
+ } | {
68
+ type: "transcript-generated";
69
+ beatId: string;
70
+ path: string;
71
+ wordCount: number;
72
+ } | {
73
+ type: "transcript-cached";
74
+ beatId: string;
75
+ path: string;
76
+ } | {
77
+ type: "transcript-skipped";
78
+ beatId: string;
79
+ reason: string;
67
80
  } | {
68
81
  type: "backdrop-cached";
69
82
  beatId: string;
@@ -234,7 +247,7 @@ export interface SceneBuildOptions {
234
247
  * based on env keys (claude > gemini > openai). Pass an explicit value
235
248
  * to require that provider's key.
236
249
  */
237
- composer?: ComposerProvider;
250
+ composer?: ComposerProvider | "template";
238
251
  skipNarration?: boolean;
239
252
  skipBackdrop?: boolean;
240
253
  skipRender?: boolean;
@@ -254,6 +267,13 @@ export interface SceneBuildOptions {
254
267
  skipKeyframe?: boolean;
255
268
  /** Skip music generation even when beats declare music cues. */
256
269
  skipMusic?: boolean;
270
+ /**
271
+ * Skip Whisper word-level transcription of generated narration. Default is
272
+ * to transcribe whenever narration exists and an OpenAI key is configured,
273
+ * writing `assets/transcript-<beat>.json` so the composer can sync caption /
274
+ * kinetic-type reveals to speech. Pass true to opt out (no transcribe cost).
275
+ */
276
+ skipTranscript?: boolean;
257
277
  /** OpenAI image quality — see `vibe generate image --quality`. */
258
278
  imageQuality?: "standard" | "hd";
259
279
  /** OpenAI image size. Default 1536x1024 for cinematic 16:9-ish framing. */
@@ -282,9 +302,9 @@ export interface SceneBuildOptions {
282
302
  * - `failed` — primitives, compose, or render errored. {@link error}
283
303
  * carries the message; {@link beats} reflects partial state.
284
304
  */
285
- export type SceneBuildPhase = "done" | "assets-only" | "pending-jobs" | "compose-only" | "sync-only" | "render-only" | "needs-author" | "failed";
305
+ export type SceneBuildPhase = "done" | "assets-only" | "transcript-only" | "pending-jobs" | "compose-only" | "sync-only" | "render-only" | "needs-author" | "failed";
286
306
  export type BuildWorkflowStatus = "done" | "running" | "needs-author" | "failed" | "ready";
287
- export type BuildCurrentStage = "assets" | "compose" | "sync" | "render" | "done";
307
+ export type BuildCurrentStage = "assets" | "transcript" | "compose" | "sync" | "render" | "done";
288
308
  export interface BuildBeatSummary {
289
309
  total: number;
290
310
  assetsReady: number;
@@ -333,6 +353,7 @@ export interface SceneBuildResult {
333
353
  composePrompts?: {
334
354
  skillReference: string | null;
335
355
  designReference: string;
356
+ compositionReference: string | null;
336
357
  storyboardReference: string;
337
358
  compositionsDir: string;
338
359
  instructions: string[];
@@ -346,7 +367,7 @@ export interface SceneBuildResult {
346
367
  beatSummary?: BuildBeatSummary;
347
368
  estimatedCostUsd?: number;
348
369
  costUsd?: number;
349
- stageReports?: Record<"assets" | "compose" | "sync" | "render", StageReport>;
370
+ stageReports?: Record<"assets" | "transcript" | "compose" | "sync" | "render", StageReport>;
350
371
  sceneRepair?: BuildSceneRepairSummary;
351
372
  jobs?: JobRecord[];
352
373
  warnings?: string[];
@@ -479,7 +500,7 @@ declare function toBuildReport(projectDir: string, result: SceneBuildResult): {
479
500
  }[];
480
501
  outputPath: string | undefined;
481
502
  sceneRepair: BuildSceneRepairSummary;
482
- stageReports: Record<"assets" | "compose" | "sync" | "render", StageReport> | undefined;
503
+ stageReports: Record<"assets" | "compose" | "sync" | "render" | "transcript", StageReport> | undefined;
483
504
  warnings: string[];
484
505
  retryWith: string[];
485
506
  totalLatencyMs: number;
@@ -2,7 +2,7 @@
2
2
  * @module _shared/scene-project
3
3
  *
4
4
  * Helpers for scaffolding a "scene project" — a directory that works as both
5
- * a VibeFrame project (via `vibe.project.yaml`) AND a HeyGen Hyperframes
5
+ * a VibeFrame project (via `vibe.config.json`) AND a HeyGen Hyperframes
6
6
  * project (via `hyperframes.json` + `meta.json` + `index.html`). Either
7
7
  * toolchain can be run inside the directory.
8
8
  *
@@ -14,6 +14,37 @@ import type { VisualStyle } from "./visual-styles.js";
14
14
  /** Supported aspect ratios for scene projects (maps to CSS canvas dims). */
15
15
  export type SceneAspect = "16:9" | "9:16" | "1:1" | "4:5";
16
16
  export type SceneScaffoldProfile = "minimal" | "agent" | "full";
17
+ /**
18
+ * Project KIND — orthogonal to {@link SceneScaffoldProfile} (which decides which
19
+ * files exist). Kind decides which pipeline STAGES run and which composer is the
20
+ * default:
21
+ * - `cinema` / `story` — directed, character-driven; keyframe→i2v, LLM composer.
22
+ * - `aivideo` — character + i2v, the deterministic `template` composer.
23
+ * - `product` — backdrop/asset-centric (no i2v keyframes).
24
+ * - `motion` — pure HTML/CSS/GSAP graphics (no AI image/video assets).
25
+ */
26
+ export type SceneKind = "cinema" | "product" | "aivideo" | "story" | "motion";
27
+ export declare const VALID_SCENE_KINDS: readonly SceneKind[];
28
+ /** Default kind preserves today's behavior (LLM composer, cue-driven assets). */
29
+ export declare const DEFAULT_SCENE_KIND: SceneKind;
30
+ export declare function isSceneKind(value: string): value is SceneKind;
31
+ /**
32
+ * Per-kind default asset skips, OR'd with the explicit `--skip-*` flags. Returns
33
+ * only the skips a kind forces; `cinema`/`story`/`aivideo` add none (assets run
34
+ * from their cues).
35
+ */
36
+ export declare function kindAssetPolicy(kind: SceneKind): {
37
+ skipKeyframe?: boolean;
38
+ skipVideo?: boolean;
39
+ skipBackdrop?: boolean;
40
+ };
41
+ /** The composer a kind defaults to when `--composer` is not given. */
42
+ export declare function composerDefaultForKind(kind: SceneKind): "template" | undefined;
43
+ /**
44
+ * Whether a kind has a recurring cast worth a `CHARACTERS.md` bible. Character-
45
+ * driven kinds (cinema/story/aivideo) do; product/motion do not.
46
+ */
47
+ export declare function kindHasCast(kind: SceneKind): boolean;
17
48
  export declare function aspectToDims(aspect: SceneAspect): {
18
49
  width: number;
19
50
  height: number;
@@ -80,22 +111,22 @@ export declare function buildEmptyRootHtml(opts: {
80
111
  aspect: SceneAspect;
81
112
  duration: number;
82
113
  }): string;
83
- /**
84
- * Project-local `DESIGN.md` template — the visual-identity hard-gate.
85
- *
86
- * Hyperframes' `hyperframes` skill teaches: "no scene HTML before DESIGN.md is
87
- * authored." This template seeds that contract so the project never opens
88
- * with a blank slate. When `style` is provided, the rules are pre-filled
89
- * from the vendored named-style data (`visual-styles.ts`); otherwise the
90
- * user (or agent) fills the placeholders.
91
- *
92
- * The agent-driven craft path expects this file as input — see
93
- * `.claude/skills/vibe-scene/SKILL.md`.
94
- */
95
114
  export declare function buildDesignMd(opts: {
96
115
  name: string;
97
116
  style?: VisualStyle;
98
117
  }): string;
118
+ /**
119
+ * Always-on `SCRIPT.md` — the narrative spine authored before the beat-level
120
+ * STORYBOARD.md. Kind tailors the guidance (a `motion`/`product` script is a
121
+ * shot/asset list; a `story`/`cinema` script is a scene-by-scene narrative).
122
+ */
123
+ export declare function buildScriptMd(name: string, kind?: SceneKind): string;
124
+ /**
125
+ * Kind-gated `CHARACTERS.md` — the cast bible. Promotes today's STORYBOARD
126
+ * \`characters:\` frontmatter into first-class identity blocks (reference sheet
127
+ * path + an identity-lock description used to keep keyframes/i2v on-model).
128
+ */
129
+ export declare function buildCharactersMd(name: string): string;
99
130
  /** Starter `STORYBOARD.md` for the one-shot `vibe build` flow. */
100
131
  export declare function buildStoryboardMd(name: string, duration?: number): string;
101
132
  /** Project-local AGENTS.md that orients every agent host to both toolchains. */
@@ -118,6 +149,8 @@ export interface ScaffoldOptions {
118
149
  visualStyle?: VisualStyle;
119
150
  /** Scaffold shape. Defaults to "full" for backward-compatible programmatic use. */
120
151
  profile?: SceneScaffoldProfile;
152
+ /** Project kind — drives which pipeline stages run + the default composer. */
153
+ kind?: SceneKind;
121
154
  }
122
155
  export interface ScaffoldResult {
123
156
  /** Files written (absolute paths). */
@@ -138,6 +171,7 @@ export declare function isSceneScaffoldProfile(value: string): value is SceneSca
138
171
  export declare function describeSceneScaffold(opts: {
139
172
  dir: string;
140
173
  profile?: SceneScaffoldProfile;
174
+ kind?: SceneKind;
141
175
  }): SceneScaffoldGroups;
142
176
  /**
143
177
  * Scaffold (or update) a scene project at `dir`. Idempotent: running twice is
@@ -38,6 +38,12 @@ export interface SceneRenderOptions {
38
38
  openAfterRender?: boolean;
39
39
  /** Reveal the rendered media in Finder/file manager after a successful render. */
40
40
  revealInFinder?: boolean;
41
+ /**
42
+ * Skip the audio-mux pass and emit silent video. The audio is added later by
43
+ * the `assemble` stage (`executeSceneAssemble` / `vibe assemble`). Default
44
+ * `vibe render` keeps the render+assemble single-shot behavior.
45
+ */
46
+ silent?: boolean;
41
47
  signal?: AbortSignal;
42
48
  onProgress?: (pct: number, stage: string) => void;
43
49
  }
@@ -1,5 +1,5 @@
1
1
  import { type Beat } from "./storyboard-parse.js";
2
- export declare const STORYBOARD_CUE_KEYS: readonly ["duration", "narration", "backdrop", "video", "keyframe", "motion", "voice", "music", "asset", "characters"];
2
+ export declare const STORYBOARD_CUE_KEYS: readonly ["duration", "narration", "backdrop", "video", "keyframe", "motion", "voice", "music", "asset", "characters", "eyebrow", "title", "caption", "kicker", "sub"];
3
3
  export type StoryboardCueKey = (typeof STORYBOARD_CUE_KEYS)[number];
4
4
  export interface StoryboardValidationIssue {
5
5
  severity: "error" | "warning";
@@ -120,6 +120,12 @@ export interface BeatCues {
120
120
  * if present, supplies the motion prompt; otherwise this text is used.
121
121
  */
122
122
  keyframe?: string;
123
+ /** Lower-third overlay eyebrow/kicker (read by the deterministic composer). */
124
+ eyebrow?: string;
125
+ /** Lower-third headline; falls back to the beat heading when absent. */
126
+ title?: string;
127
+ /** Lower-third sub-line / caption. */
128
+ caption?: string;
123
129
  [key: string]: unknown;
124
130
  }
125
131
  /** Normalize a beat's `characters` cue to a clean string[] (single or list). */
@@ -0,0 +1,23 @@
1
+ import type { SceneTranscriptWord } from "./scene-html-emit.js";
2
+ export interface TranscribeNarrationOptions {
3
+ /** OpenAI API key for Whisper. */
4
+ apiKey: string;
5
+ /** Optional BCP-47 language hint passed to Whisper (auto-detect when unset). */
6
+ language?: string;
7
+ }
8
+ /**
9
+ * Transcribe a narration audio file to word-level timings. Returns an empty
10
+ * array on ANY failure (no words, API error, bad audio) so callers can treat
11
+ * the absence of timings as "no word-sync available" rather than abort.
12
+ */
13
+ export declare function transcribeNarrationWords(audioAbsPath: string, opts: TranscribeNarrationOptions): Promise<SceneTranscriptWord[]>;
14
+ /** Canonical per-beat transcript path, relative to the project root. */
15
+ export declare function beatTranscriptRelPath(beatId: string): string;
16
+ /**
17
+ * Read a previously generated `assets/transcript-<beatId>.json` from disk.
18
+ * Returns `undefined` when the file is missing or malformed — compose then
19
+ * proceeds without word timings (identical to a project that never
20
+ * transcribed). Validates each entry's shape so a hand-edited or partial file
21
+ * can't inject `NaN`/`undefined` timings into the prompt.
22
+ */
23
+ export declare function readBeatTranscript(projectDir: string, beatId: string): Promise<SceneTranscriptWord[] | undefined>;
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const assembleCommand: Command;
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const designCommand: Command;
@@ -1,4 +1,3 @@
1
- import { Command } from "commander";
2
1
  /**
3
2
  * Get the duration of a media file using ffprobe
4
3
  * For images, returns a default duration since they have no inherent time
@@ -50,7 +49,6 @@ export declare function validateOverrides(overrides: CustomOverrides): string |
50
49
  * Reusable export function for programmatic usage
51
50
  */
52
51
  export declare function runExport(projectPath: string, outputPath: string, options?: ExportOptions): Promise<ExportResult>;
53
- export declare const exportCommand: Command;
54
52
  export interface PresetSettings {
55
53
  resolution: string;
56
54
  videoBitrate: string;
@@ -7,7 +7,7 @@
7
7
  * machine-wide config (`~/.vibeframe/config.yaml`), init writes
8
8
  * project-local files: `AGENTS.md` (cross-tool), `CLAUDE.md` (Claude
9
9
  * Code, imports `@AGENTS.md`), `.env.example`, `.gitignore` additions,
10
- * and an optional `vibe.project.yaml`.
10
+ * and `vibe.config.json` (the canonical project contract).
11
11
  *
12
12
  * Scaffolding decision tree:
13
13
  * - Always: `.gitignore` additions, `.env.example`
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const previewCommand: Command;
@@ -0,0 +1 @@
1
+ export {};