@vibeframe/cli 0.113.30 → 0.115.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.
- package/dist/commands/_shared/build-plan.d.ts +2 -1
- package/dist/commands/_shared/compose-prompts.d.ts +3 -2
- package/dist/commands/_shared/help-groups.d.ts +49 -0
- package/dist/commands/_shared/help-groups.test.d.ts +1 -0
- package/dist/commands/_shared/storyboard-edit.d.ts +12 -2
- package/dist/commands/_shared/storyboard-parse.d.ts +42 -10
- package/dist/commands/_shared/storyboard-source.d.ts +228 -0
- package/dist/commands/_shared/storyboard-source.test.d.ts +1 -0
- package/dist/commands/ai-motion.d.ts +1 -1
- package/dist/commands/ai-review.d.ts +0 -2
- package/dist/commands/generate/music-status.d.ts +0 -2
- package/dist/commands/generate/speech.d.ts +0 -1
- package/dist/commands/generate/storyboard.d.ts +0 -2
- package/dist/commands/generate.d.ts +0 -7
- package/dist/commands/inspect.d.ts +0 -2
- package/dist/commands/run.d.ts +1 -1
- package/dist/index.js +2737 -4440
- package/dist/tools/define-tool.js +0 -40
- package/dist/tools/manifest/edit.d.ts +2 -2
- package/dist/tools/manifest/generate.d.ts +2 -70
- package/dist/tools/manifest/index.js +7741 -9342
- package/dist/tools/manifest/inspect.d.ts +4 -51
- package/dist/tools/manifest/remix.d.ts +10 -44
- package/dist/tools/manifest/scene.d.ts +10 -10
- package/dist/tools/manifest/storyboard.d.ts +4 -4
- package/dist/utils/agent-host-detect.d.ts +7 -2
- package/package.json +3 -3
- package/dist/commands/ai-script-pipeline-cli.d.ts +0 -10
- package/dist/commands/ai-script-pipeline.d.ts +0 -74
- package/dist/commands/generate/background.d.ts +0 -22
- package/dist/commands/generate/video-status.d.ts +0 -8
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type BuildAssetKind } from "./build-cache.js";
|
|
2
2
|
import { type AssetFreshness } from "./build-asset-metadata.js";
|
|
3
|
+
import { type BeatCues } from "./storyboard-parse.js";
|
|
3
4
|
import { type LoadedProjectConfig } from "./project-config.js";
|
|
4
5
|
import { type StoryboardValidationIssue } from "./storyboard-edit.js";
|
|
5
6
|
export type BuildStage = "assets" | "transcript" | "compose" | "sync" | "render" | "all";
|
|
@@ -11,7 +12,7 @@ export interface BuildPlanBeat {
|
|
|
11
12
|
id: string;
|
|
12
13
|
heading: string;
|
|
13
14
|
durationSec: number | null;
|
|
14
|
-
cues:
|
|
15
|
+
cues: BeatCues;
|
|
15
16
|
assets: {
|
|
16
17
|
narration: AssetPlan | null;
|
|
17
18
|
backdrop: AssetPlan | null;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module _shared/compose-prompts
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Agentic compose primitive. Reads `STORYBOARD.md` + `DESIGN.md`
|
|
5
5
|
* from a scene project and emits a structured plan for the host agent
|
|
6
6
|
* (Claude Code, Cursor, Codex, Aider) to author per-beat HTML files
|
|
7
7
|
* itself. **No LLM call from inside the CLI** — that's the point. The
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
* This is the only model-authored compose path: the host agent writes each
|
|
32
32
|
* file. `--composer template` is the deterministic alternative.
|
|
33
33
|
*/
|
|
34
|
+
import { type BeatCues } from "./storyboard-parse.js";
|
|
34
35
|
export interface ComposePromptsBeat {
|
|
35
36
|
/** Stable beat id from `parseStoryboard().deriveBeatId()`. */
|
|
36
37
|
id: string;
|
|
@@ -48,7 +49,7 @@ export interface ComposePromptsBeat {
|
|
|
48
49
|
*/
|
|
49
50
|
finalDurationSec?: number;
|
|
50
51
|
/** Per-beat YAML cues parsed from the leading code block of the body. */
|
|
51
|
-
cues?:
|
|
52
|
+
cues?: BeatCues;
|
|
52
53
|
/** Beat body markdown (with the leading `\`\`\`yaml` cue block stripped). */
|
|
53
54
|
body: string;
|
|
54
55
|
/**
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module commands/_shared/help-groups
|
|
3
|
+
*
|
|
4
|
+
* Groups the root `vibe --help` command listing by use case instead of
|
|
5
|
+
* alphabetically.
|
|
6
|
+
*
|
|
7
|
+
* Before this, the root help printed the same commands twice: once as
|
|
8
|
+
* Commander's flat alphabetical `Commands:` block, then again under a
|
|
9
|
+
* "Common workflows" footer that re-listed most of them by use case. The
|
|
10
|
+
* footer's own preamble admitted it ("the alphabetical list above is the
|
|
11
|
+
* full command set; this section shows the typical entry points by use
|
|
12
|
+
* case"), which left the reader to map the two lists onto each other.
|
|
13
|
+
*
|
|
14
|
+
* Descriptions are read from the live command tree rather than restated
|
|
15
|
+
* here, so this file can only ever drift in *grouping*, never in wording.
|
|
16
|
+
* A command missing from {@link COMMAND_GROUPS} lands in a trailing
|
|
17
|
+
* "Other" group rather than disappearing; `help-groups.test.ts` asserts
|
|
18
|
+
* that group stays empty so adding a top-level command fails the test
|
|
19
|
+
* instead of silently degrading the help.
|
|
20
|
+
*/
|
|
21
|
+
import type { Command } from "commander";
|
|
22
|
+
/**
|
|
23
|
+
* Use-case groups for the root help listing, in display order.
|
|
24
|
+
*
|
|
25
|
+
* Ordered by the sequence a first-time reader needs them: build a project
|
|
26
|
+
* video, reach for a one-off asset, then wire up hosts and automation.
|
|
27
|
+
*/
|
|
28
|
+
export declare const COMMAND_GROUPS: ReadonlyArray<{
|
|
29
|
+
readonly title: string;
|
|
30
|
+
readonly commands: readonly string[];
|
|
31
|
+
}>;
|
|
32
|
+
/**
|
|
33
|
+
* Top-level commands that appear in help, excluding hidden ones and
|
|
34
|
+
* Commander's auto-generated `help` command.
|
|
35
|
+
*/
|
|
36
|
+
export declare function visibleTopLevelCommands(prog: Command): Command[];
|
|
37
|
+
/**
|
|
38
|
+
* Visible top-level command names that no group in {@link COMMAND_GROUPS}
|
|
39
|
+
* claims. Empty in a healthy tree; the test asserts that.
|
|
40
|
+
*/
|
|
41
|
+
export declare function ungroupedCommandNames(prog: Command): string[];
|
|
42
|
+
/**
|
|
43
|
+
* Render the grouped command listing for the root `vibe --help`.
|
|
44
|
+
*
|
|
45
|
+
* Returns the block that replaces Commander's flat `Commands:` section,
|
|
46
|
+
* already prefixed and suffixed with a blank line so it slots between the
|
|
47
|
+
* options block and the remaining help footers.
|
|
48
|
+
*/
|
|
49
|
+
export declare function renderCommandGroups(prog: Command): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { type Beat } from "./storyboard-parse.js";
|
|
2
|
-
export
|
|
3
|
-
export type StoryboardCueKey = (typeof STORYBOARD_CUE_KEYS)[number];
|
|
2
|
+
export { STORYBOARD_CUE_KEYS, type StoryboardCueKey } from "./storyboard-parse.js";
|
|
4
3
|
export interface StoryboardValidationIssue {
|
|
5
4
|
severity: "error" | "warning";
|
|
6
5
|
code: string;
|
|
@@ -40,3 +39,14 @@ export declare function moveStoryboardBeat(markdown: string, opts: {
|
|
|
40
39
|
beatId: string;
|
|
41
40
|
afterBeatId: string;
|
|
42
41
|
}): string;
|
|
42
|
+
/**
|
|
43
|
+
* True for the untouched three-beat scaffold. Exported so the bundle writer
|
|
44
|
+
* makes the same "this is still the starter, replace it" call as the
|
|
45
|
+
* single-document writer, off the same assembled markdown.
|
|
46
|
+
*/
|
|
47
|
+
export declare function isStarterStoryboard(markdown: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Coerce and validate one cue value. Shared with the bundle writer so both
|
|
50
|
+
* storage layouts reject the same bad input.
|
|
51
|
+
*/
|
|
52
|
+
export declare function normalizeCueValue(key: string, value: unknown): unknown;
|
|
@@ -94,25 +94,36 @@ export interface ResolvedCharacter {
|
|
|
94
94
|
* (generation skipped). Entries with neither are dropped.
|
|
95
95
|
*/
|
|
96
96
|
export declare function resolveCharacters(frontmatter: ProjectFrontmatter | undefined): ResolvedCharacter[];
|
|
97
|
+
/**
|
|
98
|
+
* The complete per-beat cue vocabulary, in the order it is presented to
|
|
99
|
+
* humans and agents.
|
|
100
|
+
*
|
|
101
|
+
* This is the single source of truth. {@link BeatCues} is derived from it,
|
|
102
|
+
* `validateStoryboardMarkdown` rejects anything outside it, `vibe storyboard
|
|
103
|
+
* set` refuses unlisted keys, and the compose and revise prompts render it
|
|
104
|
+
* rather than restating it - four surfaces had drifted to four different
|
|
105
|
+
* sub-lists before this became the one list.
|
|
106
|
+
*/
|
|
107
|
+
export declare const STORYBOARD_CUE_KEYS: readonly ["duration", "narration", "backdrop", "video", "keyframe", "motion", "voice", "music", "asset", "characters", "eyebrow", "title", "caption", "kicker", "sub"];
|
|
108
|
+
export type StoryboardCueKey = (typeof STORYBOARD_CUE_KEYS)[number];
|
|
97
109
|
/**
|
|
98
110
|
* Per-beat cues extracted from the first ```yaml fenced block inside a beat
|
|
99
111
|
* body. The driver passes these to TTS / image / compose calls so the
|
|
100
112
|
* storyboard alone is enough source for `vibe scene build`.
|
|
113
|
+
*
|
|
114
|
+
* Every key in {@link STORYBOARD_CUE_KEYS} is declared here. There is
|
|
115
|
+
* deliberately no index signature: an unlisted key is a validation warning at
|
|
116
|
+
* runtime, so letting it typecheck only hides the drift.
|
|
101
117
|
*/
|
|
102
118
|
export interface BeatCues {
|
|
119
|
+
/** Beat duration in seconds; overrides the `### Beat duration` subsection if both are present. */
|
|
120
|
+
duration?: number;
|
|
103
121
|
/** Narration text for this beat (drives TTS + scene `<audio>` element). */
|
|
104
122
|
narration?: string;
|
|
105
123
|
/** Image prompt for the backdrop generation (drives T2I). */
|
|
106
124
|
backdrop?: string;
|
|
107
|
-
/**
|
|
108
|
-
|
|
109
|
-
/** Voice override for this beat (overrides project frontmatter `voice`). */
|
|
110
|
-
voice?: string;
|
|
111
|
-
/**
|
|
112
|
-
* Character pool names whose reference sheets drive this beat's
|
|
113
|
-
* reference-to-video generation. A single name or a list.
|
|
114
|
-
*/
|
|
115
|
-
characters?: string | string[];
|
|
125
|
+
/** Motion prompt for video generation. Pairs with `keyframe` for image-to-video. */
|
|
126
|
+
video?: string;
|
|
116
127
|
/**
|
|
117
128
|
* Keyframe still prompt. When set, the build generates a keyframe image for
|
|
118
129
|
* this beat (using the character sheet as an edit reference when `characters`
|
|
@@ -120,13 +131,34 @@ export interface BeatCues {
|
|
|
120
131
|
* if present, supplies the motion prompt; otherwise this text is used.
|
|
121
132
|
*/
|
|
122
133
|
keyframe?: string;
|
|
134
|
+
/**
|
|
135
|
+
* Animation direction for the scene-authoring agent, e.g. "restrained camera
|
|
136
|
+
* push, headline settles first". Unlike the cues around it this drives no
|
|
137
|
+
* deterministic stage - it reaches the host agent through the compose plan
|
|
138
|
+
* and shapes the HTML that agent writes.
|
|
139
|
+
*/
|
|
140
|
+
motion?: string;
|
|
141
|
+
/** Voice override for this beat (overrides project frontmatter `voice`). */
|
|
142
|
+
voice?: string;
|
|
143
|
+
/** Music prompt or a project-relative path to an existing track. */
|
|
144
|
+
music?: string;
|
|
145
|
+
/** Project-relative path to a file this beat should reuse instead of generating. */
|
|
146
|
+
asset?: string;
|
|
147
|
+
/**
|
|
148
|
+
* Character pool names whose reference sheets drive this beat's
|
|
149
|
+
* reference-to-video generation. A single name or a list.
|
|
150
|
+
*/
|
|
151
|
+
characters?: string | string[];
|
|
123
152
|
/** Lower-third overlay eyebrow/kicker (read by the deterministic composer). */
|
|
124
153
|
eyebrow?: string;
|
|
125
154
|
/** Lower-third headline; falls back to the beat heading when absent. */
|
|
126
155
|
title?: string;
|
|
127
156
|
/** Lower-third sub-line / caption. */
|
|
128
157
|
caption?: string;
|
|
129
|
-
|
|
158
|
+
/** Alias for `eyebrow`; `eyebrow` wins when both are present. */
|
|
159
|
+
kicker?: string;
|
|
160
|
+
/** Alias for `caption`; `caption` wins when both are present. */
|
|
161
|
+
sub?: string;
|
|
130
162
|
}
|
|
131
163
|
/** Normalize a beat's `characters` cue to a clean string[] (single or list). */
|
|
132
164
|
export declare function beatCharacterNames(cues: BeatCues | undefined): string[];
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module _shared/storyboard-source
|
|
3
|
+
*
|
|
4
|
+
* Resolves where a project's storyboard actually lives and hands back one
|
|
5
|
+
* markdown document either way.
|
|
6
|
+
*
|
|
7
|
+
* Two on-disk layouts are supported:
|
|
8
|
+
*
|
|
9
|
+
* **bundle** (preferred) - `STORYBOARD.md` holds project frontmatter and
|
|
10
|
+
* direction prose, and `scenes/NN-<id>.md` holds one scene per file with its
|
|
11
|
+
* cues in real document frontmatter:
|
|
12
|
+
*
|
|
13
|
+
* ```text
|
|
14
|
+
* launch/
|
|
15
|
+
* STORYBOARD.md --- type/title/duration/aspect/providers/characters ---
|
|
16
|
+
* scenes/
|
|
17
|
+
* 01-hook.md --- duration/narration/backdrop/... --- + body
|
|
18
|
+
* 02-proof.md
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* **single** (legacy) - one `STORYBOARD.md` with `## Beat <id> - <title>`
|
|
22
|
+
* headings, each carrying a leading ```yaml cue block.
|
|
23
|
+
*
|
|
24
|
+
* The bundle layout exists because `---` frontmatter is a *document* level
|
|
25
|
+
* construct. Used mid-document it is not frontmatter at all: the opening
|
|
26
|
+
* `---` is a horizontal rule and the closing one turns the lines above it
|
|
27
|
+
* into a setext heading. One scene per file is the only way per-scene cues
|
|
28
|
+
* can be written as frontmatter and still render correctly.
|
|
29
|
+
*
|
|
30
|
+
* A bundle is assembled back into the single-document shape in memory, so
|
|
31
|
+
* every existing consumer of `parseStoryboard()` keeps working unchanged.
|
|
32
|
+
* That is deliberate: the on-disk format users edit is decoupled from the
|
|
33
|
+
* in-memory representation the build already understands.
|
|
34
|
+
*/
|
|
35
|
+
import { type Beat, type BeatCues } from "./storyboard-parse.js";
|
|
36
|
+
/** Directory, relative to the project root, that holds one file per scene. */
|
|
37
|
+
export declare const SCENES_DIRNAME = "scenes";
|
|
38
|
+
/** The project-level document, present in both layouts. */
|
|
39
|
+
export declare const STORYBOARD_FILENAME = "STORYBOARD.md";
|
|
40
|
+
export type StoryboardLayout = "bundle" | "single" | "missing";
|
|
41
|
+
export interface SceneFile {
|
|
42
|
+
/** Beat id derived from the filename, with any ordering prefix stripped. */
|
|
43
|
+
id: string;
|
|
44
|
+
/** Absolute path to the scene file. */
|
|
45
|
+
path: string;
|
|
46
|
+
/** Filename, e.g. `01-hook.md`. */
|
|
47
|
+
filename: string;
|
|
48
|
+
/** Numeric ordering prefix when present (`01-hook.md` -> 1). */
|
|
49
|
+
order: number | null;
|
|
50
|
+
}
|
|
51
|
+
export interface LoadedStoryboard {
|
|
52
|
+
layout: StoryboardLayout;
|
|
53
|
+
/** One markdown document in the legacy single-file shape. */
|
|
54
|
+
markdown: string;
|
|
55
|
+
/** Scene files, in play order. Empty for the single layout. */
|
|
56
|
+
scenes: SceneFile[];
|
|
57
|
+
/** Absolute path of the project-level document. */
|
|
58
|
+
storyboardPath: string;
|
|
59
|
+
/**
|
|
60
|
+
* Beat ids found as `## Beat ...` headings inside STORYBOARD.md while the
|
|
61
|
+
* project is a bundle. Those headings are ignored - `scenes/` is the only
|
|
62
|
+
* source of scenes - and reported so validation can say so out loud.
|
|
63
|
+
* Always empty for the single layout.
|
|
64
|
+
*/
|
|
65
|
+
strayBeatIds: string[];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Scene files in play order: numeric prefix first (ascending), then any
|
|
69
|
+
* unprefixed files in filename order. Mixing the two is legal but a lint
|
|
70
|
+
* elsewhere should discourage it.
|
|
71
|
+
*/
|
|
72
|
+
export declare function listSceneFiles(projectDir: string): Promise<SceneFile[]>;
|
|
73
|
+
export declare function detectStoryboardLayout(projectDir: string, sceneCount: number): StoryboardLayout;
|
|
74
|
+
/**
|
|
75
|
+
* Turn one scene file into the `## Beat <id> - <Title>` + cue-block section
|
|
76
|
+
* the single-document parser expects.
|
|
77
|
+
*
|
|
78
|
+
* `type:` is dropped: it is OKF bookkeeping identifying the file as a scene,
|
|
79
|
+
* not a cue, and passing it through would trip the unknown-cue warning.
|
|
80
|
+
* A `title:` in scene frontmatter is a lower-third cue, so the heading uses
|
|
81
|
+
* the humanised id and `title` stays in the cue block where it belongs.
|
|
82
|
+
*/
|
|
83
|
+
export declare function sceneToBeatSection(scene: SceneFile, contents: string): string;
|
|
84
|
+
/**
|
|
85
|
+
* Load a project's storyboard as a single markdown document, whichever
|
|
86
|
+
* layout it uses on disk.
|
|
87
|
+
*
|
|
88
|
+
* For a bundle, STORYBOARD.md contributes only its frontmatter and direction
|
|
89
|
+
* prose. Anything from its first `## ` heading onward is dropped and its beat
|
|
90
|
+
* ids returned in `strayBeatIds`.
|
|
91
|
+
*
|
|
92
|
+
* Concatenating instead would merge two sets of scenes into one timeline: a
|
|
93
|
+
* project that has both would silently render the STORYBOARD.md beats *and*
|
|
94
|
+
* the scene files, in that order. `scenes/` is the layout the project opted
|
|
95
|
+
* into, so it is the only source of scenes, and the leftovers are surfaced as
|
|
96
|
+
* a validation error rather than quietly obeyed or quietly discarded.
|
|
97
|
+
*/
|
|
98
|
+
export declare function loadStoryboard(projectDir: string): Promise<LoadedStoryboard>;
|
|
99
|
+
/** Convenience for the many call sites that only want the markdown. */
|
|
100
|
+
export declare function loadStoryboardMarkdown(projectDir: string): Promise<string>;
|
|
101
|
+
/** `01-hook.md` for order 1 and id `hook`. Two digits until a project needs three. */
|
|
102
|
+
export declare function sceneFilename(order: number, id: string): string;
|
|
103
|
+
export interface MigrationPlanFile {
|
|
104
|
+
/** Path relative to the project root, e.g. `scenes/01-hook.md`. */
|
|
105
|
+
path: string;
|
|
106
|
+
contents: string;
|
|
107
|
+
}
|
|
108
|
+
export interface MigrationPlan {
|
|
109
|
+
/** Files to create, in play order. */
|
|
110
|
+
scenes: MigrationPlanFile[];
|
|
111
|
+
/** What STORYBOARD.md becomes: frontmatter + direction prose, no beats. */
|
|
112
|
+
storyboard: MigrationPlanFile;
|
|
113
|
+
/** Beat ids in the order they will play. */
|
|
114
|
+
beatIds: string[];
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Render one beat as a standalone scene document.
|
|
118
|
+
*
|
|
119
|
+
* Cues become real frontmatter, which is the whole point of the bundle
|
|
120
|
+
* layout. `type: Scene` is added so the file is a valid OKF document; the
|
|
121
|
+
* loader strips it again on the way back in.
|
|
122
|
+
*/
|
|
123
|
+
export declare function beatToSceneFile(beat: Beat, order: number): MigrationPlanFile;
|
|
124
|
+
/**
|
|
125
|
+
* Plan the conversion of a single-document storyboard into a bundle.
|
|
126
|
+
*
|
|
127
|
+
* Pure: returns the files to write without touching disk, so the command can
|
|
128
|
+
* offer `--dry-run` and so the whole shape is testable.
|
|
129
|
+
*/
|
|
130
|
+
export declare function planMigration(markdown: string): MigrationPlan;
|
|
131
|
+
/**
|
|
132
|
+
* Set or unset one cue in a scene file, rewriting only that file's
|
|
133
|
+
* frontmatter and leaving its body untouched.
|
|
134
|
+
*
|
|
135
|
+
* Key validation and value coercion come from the same helpers the
|
|
136
|
+
* single-document writer uses, so `duration: "abc"` is rejected identically
|
|
137
|
+
* in both layouts.
|
|
138
|
+
*/
|
|
139
|
+
export declare function setSceneCue(projectDir: string, opts: {
|
|
140
|
+
beatId: string;
|
|
141
|
+
key: string;
|
|
142
|
+
value?: unknown;
|
|
143
|
+
unset?: boolean;
|
|
144
|
+
}): Promise<{
|
|
145
|
+
path: string;
|
|
146
|
+
cues: BeatCues;
|
|
147
|
+
}>;
|
|
148
|
+
/**
|
|
149
|
+
* Reorder scenes by renumbering their filename prefixes.
|
|
150
|
+
*
|
|
151
|
+
* Renames go through a temporary name first. Renaming `02 -> 01` while an
|
|
152
|
+
* `01` still exists would clobber it, and no ordering of direct renames is
|
|
153
|
+
* safe for an arbitrary permutation.
|
|
154
|
+
*/
|
|
155
|
+
export declare function moveScene(projectDir: string, opts: {
|
|
156
|
+
beatId: string;
|
|
157
|
+
afterBeatId: string;
|
|
158
|
+
}): Promise<string[]>;
|
|
159
|
+
/**
|
|
160
|
+
* Write a migration plan to disk.
|
|
161
|
+
*
|
|
162
|
+
* Scene files land before STORYBOARD.md is rewritten, so a failure part way
|
|
163
|
+
* through leaves the original single-file storyboard as the source of truth
|
|
164
|
+
* rather than a half-emptied document. Shared by `storyboard migrate` and by
|
|
165
|
+
* `vibe init`, which scaffolds straight into the bundle layout.
|
|
166
|
+
*/
|
|
167
|
+
export declare function writeMigration(projectDir: string, plan: MigrationPlan): Promise<void>;
|
|
168
|
+
/**
|
|
169
|
+
* Scaffold a bundle from a single-document storyboard string.
|
|
170
|
+
*
|
|
171
|
+
* `vibe init` builds its starter (and its `--from` draft) as one markdown
|
|
172
|
+
* document, then hands it here rather than writing it out. That keeps one
|
|
173
|
+
* generator for the content and one converter for the layout, instead of a
|
|
174
|
+
* second scaffolder that could drift from the first.
|
|
175
|
+
*/
|
|
176
|
+
export declare function writeStoryboardAsBundle(projectDir: string, markdown: string): Promise<MigrationPlan>;
|
|
177
|
+
/**
|
|
178
|
+
* Validation issues for beat headings left in STORYBOARD.md after a project
|
|
179
|
+
* became a bundle.
|
|
180
|
+
*
|
|
181
|
+
* An error, not a warning: the headings look like scenes and are not being
|
|
182
|
+
* rendered, so the project on disk does not describe the video that comes
|
|
183
|
+
* out. Anything less than an error lets that gap sit unnoticed.
|
|
184
|
+
*/
|
|
185
|
+
export declare function strayBeatIssues(strayBeatIds: string[]): Array<{
|
|
186
|
+
severity: "error";
|
|
187
|
+
code: "STRAY_BEATS_IN_STORYBOARD";
|
|
188
|
+
message: string;
|
|
189
|
+
beatId: string;
|
|
190
|
+
}>;
|
|
191
|
+
/**
|
|
192
|
+
* Create or update one scene file, mirroring `upsertStoryboardBeat`.
|
|
193
|
+
*
|
|
194
|
+
* The three actions match the single-document writer so `vibe scene add`
|
|
195
|
+
* reports the same thing either way:
|
|
196
|
+
*
|
|
197
|
+
* - `updated` - a scene with this id exists; its cues are merged and its
|
|
198
|
+
* body is left alone unless a new one is supplied.
|
|
199
|
+
* - `replaced-starter` - the bundle is still the untouched three-beat
|
|
200
|
+
* scaffold, so it is cleared rather than appended to.
|
|
201
|
+
* - `appended` - a new scene file after the current last one.
|
|
202
|
+
*/
|
|
203
|
+
export declare function upsertScene(projectDir: string, opts: {
|
|
204
|
+
beatId: string;
|
|
205
|
+
title?: string;
|
|
206
|
+
duration?: number;
|
|
207
|
+
narration?: string;
|
|
208
|
+
backdrop?: string;
|
|
209
|
+
body?: string;
|
|
210
|
+
}): Promise<{
|
|
211
|
+
action: "updated" | "replaced-starter" | "appended";
|
|
212
|
+
path: string;
|
|
213
|
+
}>;
|
|
214
|
+
/**
|
|
215
|
+
* Replace a bundle's scenes with the ones described by a single markdown
|
|
216
|
+
* document.
|
|
217
|
+
*
|
|
218
|
+
* Used when something produces a whole storyboard at once - today
|
|
219
|
+
* `vibe storyboard revise`, whose model returns one document. Writing that
|
|
220
|
+
* document to STORYBOARD.md would lose the revision: `scenes/` still wins, so
|
|
221
|
+
* the old scenes would keep rendering while the new beats sat in
|
|
222
|
+
* STORYBOARD.md being reported as stray.
|
|
223
|
+
*
|
|
224
|
+
* Scene files the new document does not name are deleted, so a revision that
|
|
225
|
+
* removes a beat actually removes it rather than leaving an orphan that keeps
|
|
226
|
+
* playing.
|
|
227
|
+
*/
|
|
228
|
+
export declare function rewriteBundleFromMarkdown(projectDir: string, markdown: string): Promise<MigrationPlan>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -21,7 +21,7 @@ export interface MotionCommandOptions {
|
|
|
21
21
|
render?: boolean;
|
|
22
22
|
/** Base video to composite the motion graphic onto */
|
|
23
23
|
video?: string;
|
|
24
|
-
/** Image to analyze with Gemini
|
|
24
|
+
/** Image to analyze with Gemini - color/mood/composition fed into Claude prompt */
|
|
25
25
|
image?: string;
|
|
26
26
|
/** Analyze base video before generating motion: auto | off | required */
|
|
27
27
|
understand?: "auto" | "off" | "required";
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
*
|
|
11
11
|
* @dependencies Gemini (Google), FFmpeg (auto-fix filters)
|
|
12
12
|
*/
|
|
13
|
-
import { Command } from "commander";
|
|
14
13
|
import type { VideoReviewFeedback } from "./ai-edit.js";
|
|
15
14
|
/** Options for {@link executeReview}. */
|
|
16
15
|
export interface ReviewOptions {
|
|
@@ -55,4 +54,3 @@ export interface ReviewResult {
|
|
|
55
54
|
* @returns Result with structured feedback and optional fix details
|
|
56
55
|
*/
|
|
57
56
|
export declare function executeReview(options: ReviewOptions): Promise<ReviewResult>;
|
|
58
|
-
export declare function registerReviewCommand(aiCommand: Command): void;
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
* generation status check. Split out of `generate.ts` in v0.69 (Plan G
|
|
5
5
|
* Phase 2).
|
|
6
6
|
*/
|
|
7
|
-
import type { Command } from "commander";
|
|
8
7
|
export interface ExecuteMusicStatusOptions {
|
|
9
8
|
taskId: string;
|
|
10
9
|
apiKey?: string;
|
|
@@ -17,4 +16,3 @@ export interface ExecuteMusicStatusResult {
|
|
|
17
16
|
error?: string;
|
|
18
17
|
}
|
|
19
18
|
export declare function executeMusicStatus(options: ExecuteMusicStatusOptions): Promise<ExecuteMusicStatusResult>;
|
|
20
|
-
export declare function registerMusicStatusCommand(parent: Command): void;
|
|
@@ -17,5 +17,4 @@ export interface ExecuteSpeechResult {
|
|
|
17
17
|
error?: string;
|
|
18
18
|
}
|
|
19
19
|
export declare function executeSpeech(options: ExecuteSpeechOptions): Promise<ExecuteSpeechResult>;
|
|
20
|
-
export declare function registerSpeechCommand(parent: Command): void;
|
|
21
20
|
export declare function registerNarrationCommand(parent: Command): void;
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
* @description `vibe generate storyboard` — Claude-powered script-to-
|
|
4
4
|
* storyboard analysis. Split out of `generate.ts` in v0.69 (Plan G Phase 2).
|
|
5
5
|
*/
|
|
6
|
-
import type { Command } from "commander";
|
|
7
6
|
export interface ExecuteStoryboardOptions {
|
|
8
7
|
content: string;
|
|
9
8
|
duration?: number;
|
|
@@ -24,4 +23,3 @@ export interface ExecuteStoryboardResult {
|
|
|
24
23
|
error?: string;
|
|
25
24
|
}
|
|
26
25
|
export declare function executeStoryboard(options: ExecuteStoryboardOptions): Promise<ExecuteStoryboardResult>;
|
|
27
|
-
export declare function registerStoryboardCommand(parent: Command): void;
|
|
@@ -6,15 +6,10 @@
|
|
|
6
6
|
* Commands:
|
|
7
7
|
* generate image - Generate image (Gemini, OpenAI, Grok, Runway)
|
|
8
8
|
* generate video - Generate video (Seedance, Grok, Kling, Runway, Veo)
|
|
9
|
-
* generate speech - Text-to-speech (ElevenLabs)
|
|
10
9
|
* generate sound-effect - Sound effects (ElevenLabs)
|
|
11
10
|
* generate music - Music generation (ElevenLabs default, Replicate MusicGen)
|
|
12
|
-
* generate music-status - Check music generation status
|
|
13
|
-
* generate storyboard - Script-to-storyboard (Claude)
|
|
14
11
|
* generate motion - Standalone motion assets (Claude/Gemini + Remotion)
|
|
15
12
|
* generate thumbnail - Thumbnail generation/extraction
|
|
16
|
-
* generate background - AI background generation (OpenAI)
|
|
17
|
-
* generate video-status - Check video generation status (Grok/Runway/Kling/Veo)
|
|
18
13
|
* generate video-cancel - Cancel video generation (Grok/Runway)
|
|
19
14
|
* generate video-extend - Extend video (Kling/Veo)
|
|
20
15
|
*
|
|
@@ -25,8 +20,6 @@ export { executeSoundEffect } from "./generate/sound-effect.js";
|
|
|
25
20
|
export type { ExecuteSoundEffectOptions, ExecuteSoundEffectResult, } from "./generate/sound-effect.js";
|
|
26
21
|
export { executeMusicStatus } from "./generate/music-status.js";
|
|
27
22
|
export type { ExecuteMusicStatusOptions, ExecuteMusicStatusResult, } from "./generate/music-status.js";
|
|
28
|
-
export { executeBackground } from "./generate/background.js";
|
|
29
|
-
export type { ExecuteBackgroundOptions, ExecuteBackgroundResult } from "./generate/background.js";
|
|
30
23
|
export { executeStoryboard } from "./generate/storyboard.js";
|
|
31
24
|
export type { ExecuteStoryboardOptions, ExecuteStoryboardResult } from "./generate/storyboard.js";
|
|
32
25
|
export { executeSpeech } from "./generate/speech.js";
|
|
@@ -10,8 +10,6 @@
|
|
|
10
10
|
* inspect project - Local project completeness and composition checks
|
|
11
11
|
* inspect render - Local rendered video checks plus optional Gemini review
|
|
12
12
|
* inspect media - Unified analysis for images, videos, and YouTube URLs (Gemini)
|
|
13
|
-
* inspect video - Analyze video files or YouTube URLs with Gemini
|
|
14
|
-
* inspect review - AI video quality review and auto-fix (Gemini)
|
|
15
13
|
* inspect suggest - Get AI edit suggestions using Gemini
|
|
16
14
|
*
|
|
17
15
|
* @dependencies Gemini (Google), FFmpeg (auto-fix filters)
|
package/dist/commands/run.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `vibe run` command
|
|
2
|
+
* `vibe run` command - Execute declarative YAML video pipelines.
|
|
3
3
|
*
|
|
4
4
|
* Video as Code: define reproducible, shareable video workflows in YAML.
|
|
5
5
|
* Each step maps to an existing CLI command's execute function.
|