@vibeframe/cli 0.115.4 → 0.115.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/CONTEXT.md CHANGED
@@ -3,7 +3,7 @@
3
3
  ## Overview
4
4
 
5
5
  VibeFrame CLI (`vibe`) generates AI video on the user's own provider keys
6
- (Seedance, Runway, Veo, Kling), behind dry runs and a hard `--max-cost`
6
+ (Seedance, Runway, Kling, Gemini Omni), behind dry runs and a hard `--max-cost`
7
7
  ceiling, and edits the results. Every operation is
8
8
  a shell command. The same surface is exposed as MCP tools through
9
9
  [`@vibeframe/mcp-server`](https://www.npmjs.com/package/@vibeframe/mcp-server).
@@ -18,7 +18,7 @@
18
18
  * file. Keep this as the canonical source of truth for agent guidance -
19
19
  * \`CLAUDE.md\` and \`GEMINI.md\` just import it.
20
20
  */
21
- export declare const AGENTS_MD = "# AGENTS.md\n\nThis project uses [VibeFrame](https://github.com/vericontext/vibeframe) -\na CLI for AI video generation on the user's own provider keys (Seedance,\nRunway, Veo, Kling), behind dry runs and a hard `--max-cost` ceiling.\nThe `vibe` command provides 80+ subcommands for video generation,\nediting, and analysis. Cost tiers below - **always confirm with the user\nbefore running High / Very High tier commands**.\n\n## Agent host coverage\n\nVibeFrame's CLI works with any bash-capable AI coding agent. Six host\nfamilies have first-class auto-detection and scaffolds today:\n\n- **Claude Code** - `CLAUDE.md` (this file's import wrapper) +\n `AGENTS.md` + `/vibe-*` slash commands.\n- **OpenAI Codex** - reads `AGENTS.md` natively (agents.md spec).\n- **Cursor** - reads `AGENTS.md` plus `.cursor/rules/` for project\n rules; supports MCP via `.cursor/mcp.json`.\n- **Aider** - reads `AGENTS.md` (binary-only detection by VibeFrame).\n- **Gemini CLI** - primary context file is `GEMINI.md`; also reads\n `AGENTS.md` if present.\n- **OpenCode** - reads `AGENTS.md` (officially supported per\n `opencode.ai/docs/rules`); supports MCP via `.opencode/mcp.json`.\n\nRun `vibe doctor` to see which host(s) the CLI detects in your\nenvironment. Anyone running another bash-capable agent (Continue,\nSourcegraph Cody, etc.) still gets this `AGENTS.md` as the universal\nfallback.\n\n## Self-discovery\n\nDon't memorise the command surface - read it from the CLI:\n\n```bash\nvibe --help # command groups overview\nvibe schema --list # full machine-readable catalog (80+)\nvibe schema --list --surface public # small first-run/product command surface\nvibe schema generate.video # JSON Schema for any single command\nvibe doctor # available providers + system health\nvibe host setup all # print Codex/Claude/Cursor app integration snippets\nvibe host doctor all --json # verify project guidance + MCP config\nvibe guide motion # choose text-overlay vs motion-overlay vs generate motion\nvibe guide scene # step-by-step authoring guide (scene)\nvibe guide pipeline # step-by-step authoring guide (pipeline)\n```\n\n## Route by the user's actual request\n\nRouting the user's request correctly is the most important judgement call\nyou'll make. Do not force everything into a scene project.\n\n**ASSET - default for any single-asset request OR ambiguous prompt.**\nIf the user asks for a single image, single video clip, sound effect, music\nbed, or narration file - **OR pastes a visual/audio brief without explicit\nstoryboard / scene / multi-scene language** - treat it as ASSET. Use\n`vibe generate ...` directly. Do **not** edit `DESIGN.md`,\n`STORYBOARD.md`, run `vibe scene ...`, or auto-load the hyperframes\nskill until BUILD intent is explicit. The visual-identity hard-gate\napplies to BUILD only.\n\nExamples:\n- \"make this image\" \u2192 `vibe generate image \"...\" -o assets/name.png`\n- \"use this image to make a video\" \u2192 `vibe generate video \"...\" -i image.png -o renders/name.mp4`\n- \"add a lower-third/title/animated overlay/grain/vignette to this clip\" \u2192 prefer `vibe edit motion-overlay clip.mp4 \"...\" --understand auto -o out.mp4` when the request asks for designed or animated motion graphics.\n- \"please add visuals using OpenAI image gen\" \u2192 `vibe generate image \"...\" -p openai ...`\n- *(verb-less paste)* \"aerial view of a misty mountain peak at sunrise...\" \u2192 `vibe generate image \"<paste>\" -o assets/mountain-peak.png`. **Don't** read it as a brief for DESIGN.md.\n\nIf genuinely uncertain, ask one short question: *\"single asset or\nmulti-scene project?\"* before authoring DESIGN.md or loading the\nhyperframes skill.\n\n**BUILD - create new video from text intent.**\nUse `vibe build` with a STORYBOARD.md + DESIGN.md. The\nskills-driven pipeline (v0.60+) dispatches narration TTS + backdrop\nimage-gen per beat, composes scene HTML via the bundled composition rules\nbundle, then renders to MP4. Idempotent re-runs reuse cached assets.\n\n**REMIX - transform existing video / audio.**\nUse `vibe remix`, `vibe edit`, or `vibe audio`. One-shot,\nbatch-oriented operations on a file the user already has on disk.\n`vibe edit text-overlay` is the free deterministic path for simple static\ntext burn-in. If the user asks for motion design, animated lower-thirds,\ndesigned titles, grain/vignette as part of a graphic treatment, or says\n\"motion graphics\", use `vibe edit motion-overlay ... --understand auto` instead.\n\nDecision rule: if the user asks for one asset, it's ASSET. If the user asks\nfor a multi-scene/storyboard/composed video, it's BUILD. If the user is\nstarting from a media file and wants it transformed, it's REMIX.\n\n## Common workflows\n\n### BUILD (new video from text)\n\n| Task | Command |\n|---|---|\n| One-shot storyboard \u2192 video | `vibe build [project-dir]` |\n| Render an existing scene project | `vibe render [project-dir] -o out.mp4` |\n| Lint scene HTML | `vibe scene lint --json` |\n| Generate a single image | `vibe generate image \"prompt\" -o img.png --quality hd` |\n| Generate a single video | `vibe generate video \"prompt\" -i image.png -o clip.mp4` |\n| Generate narration | `vibe generate narration \"text\" -o voice.mp3` |\n\n### REMIX (transform existing media)\n\n| Task | Command |\n|---|---|\n| Extract highlights from a long video | `vibe remix highlights file.mp4 -d 60` |\n| Long video \u2192 vertical shorts | `vibe remix auto-shorts file.mp4 -n 3 --add-captions` |\n| Add animated word-by-word captions | `vibe remix animated-caption file.mp4 -s karaoke-sweep` |\n| Add designed motion graphics overlay | `vibe edit motion-overlay file.mp4 \"lower-third...\" --understand auto -o out.mp4` |\n| Remove silence | `vibe edit silence-cut in.mp4 -o out.mp4` |\n| Add static captions | `vibe edit caption in.mp4 -o out.mp4` |\n| Translate audio (transcribe \u2192 TTS) | `vibe audio dub file.mp4 -t ko` |\n| Transcribe (Whisper, word-level) | `vibe audio transcribe file.mp4 --granularity word` |\n| Inspect media with Gemini | `vibe inspect media file.mp4 \"summarise\" --json` |\n\n### Compose pipelines (Video as Code)\n\n| Task | Command |\n|---|---|\n| Run a YAML pipeline | `vibe run pipeline.yaml --dry-run` |\n| Resume from last checkpoint | `vibe run pipeline.yaml --resume` |\n\n## Cost tiers\n\n| Tier | Examples | Approx. per call |\n|---|---|---|\n| **Free** | `schema/context/doctor`, `detect *`, `status *`, `plan`, `storyboard validate`, `inspect project/render --cheap`, deterministic edits | $0 |\n| **Low** | `generate narration/sound-effect/music`, `audio transcribe`, `inspect media`, optional AI review | $0.01\u2013$0.10 |\n| **High** | `generate image/motion`, `edit image/reframe/grade/speed-ramp` | $1\u2013$5 |\n| **Very High** | `generate video`, `edit fill-gaps`, `remix highlights/auto-shorts`, `build` with generated assets | $5\u2013$50+ |\n\n## Agent invariants\n\nWhen you run vibe commands programmatically:\n\n1. **Always `--json`** for structured output you can parse without regex\n2. **Always `--dry-run` first** for any High/Very-High tier command - it returns\n the cost estimate without spending API budget\n3. **Use `vibe schema <command>`** to discover parameters; do not guess flags\n4. **Pass complex options via `--stdin`**:\n ```bash\n echo '{\"video\":\"long.mp4\",\"count\":3,\"aspect\":\"9:16\"}' | vibe remix auto-shorts --stdin --json\n ```\n\n## Provider keys and project scope\n\nPrefer `vibe setup --scope project` for project-local keys. It writes\n`.vibeframe/config.yaml` in the setup directory; when you work from a\nnested scene directory, the `vibe` CLI automatically searches parent\ndirectories and uses the nearest project config. Do not assume the config\nfile must exist in the current subdirectory.\n\nRun `vibe doctor --json` from the directory where you will run commands\nand check `data.scope.project.configPath` / `data.scope.activeScope` before\ndeciding keys are missing. Never print or copy config file contents.\n\nFor generated project assets, use VibeFrame commands such as\n`vibe generate image|video|speech ...` so these project-scope keys are\nused. Do not switch to a host agent's built-in image/audio generation tool\nunless the user explicitly asks for a non-VibeFrame asset.\n\n`.env` is still supported as a gitignored fallback. Copy `.env.example`\nto start if you prefer environment variables.\n\n## App host setup\n\nVibeFrame is CLI-first, not terminal-only. Codex, Claude Code, and Cursor can\ndrive the same project through shell commands, and app hosts can also use\nVibeFrame's MCP server as a typed tool surface.\n\n```bash\nvibe host setup all # print snippets only\nvibe host setup all --write # write project/app config\nvibe host doctor all --json # verify readiness\n```\n\nDefault setup is snippet-only; use `--write` when you want VibeFrame to merge\nthe generated config. Keep provider keys in `.vibeframe/config.yaml`, user\nconfig, or env files - not in app host config.\n\n## Host agent loop\n\nFor long-running work, use your host's agent loop (Claude Code, Codex, Cursor,\nor another coding-agent host) as the outer loop. VibeFrame should not own a\ncompeting project-level agent loop. It provides `--json` commands, dry runs,\nbudget caps, `build-report.json`, `review-report.json`, `nextActions`,\n`safeToAutoRun`, `requiresConfirmation`, `fixOwner`, deterministic repair,\nand render inspection for the host agent to decide what to do next.\n\nCopy-paste agent prompt (Codex) - a plain prompt, not a built-in command:\n\n```text\nBuild this VibeFrame project into renders/final.mp4. Use --json for every\nvibe command, run --dry-run before paid operations, use --max-cost 5 for builds\nunless the user gives another budget, read build-report.json and\nreview-report.json before deciding the next action, prefer nextActions before\nguessing, run only safeToAutoRun:true actions automatically, and ask before\nrequiresConfirmation:true actions. Treat retryWith as the compatibility\nfallback, fixOwner:\"vibe\" as CLI repair work, and fixOwner:\"host-agent\" as\nSTORYBOARD.md, DESIGN.md, or composition edits.\nStop only when renders/final.mp4 exists, target duration and aspect ratio are\nmet, inspect render --cheap has no errors, any AI review score is >= 90 when AI review is requested, and every\nremaining host-agent issue is fixed, accepted with rationale, or reported as\nblocked.\n```\n\nCopy-paste agent prompt (Claude Code) - a plain prompt, not a built-in command:\n\n```text\nFinish this VibeFrame render using your host's agent loop as the outer\nloop. Use vibe context/schema when unsure, --json everywhere, dry-run before\npaid operations, budget cap via --max-cost 5, nextActions before guessing,\nbuild-report.json/review-report.json as loop state, and safeToAutoRun,\nrequiresConfirmation, and fixOwner to decide between vibe scene repair and\nhost-agent edits. Stop only after final MP4,\ntarget duration/aspect ratio, clean render inspection, any AI review score >= 90 when AI review is requested, and\nno unresolved unacknowledged host-agent issues.\n```\n\n### Composition rules (scene HTML)\n\nComposition rules live in the **Hyperframes skill** - framework rules, motion\nprinciples, type system, and visual-identity hard-gate. **Load that skill\nbefore authoring any scene composition HTML under `compositions/`.** The same\nrules govern `vibe scene lint`, so your authored HTML and the linter stay in\nagreement.\n\nWhere the skill comes from depends on your setup:\n\n- If the `hyperframes` skill is installed globally (e.g. Claude Code), your\n agent already has it and nothing else is needed.\n- Otherwise install it into this project with `vibe scene install-skill`,\n which runs upstream's own installer and writes\n `.agents/skills/hyperframes/`.\n\n`vibe init` never copies the rules in. They come from upstream so they stay\ncurrent, and fetching them is a network call the scaffold does not make on\nyour behalf. `vibe doctor` reports whether your agent can read them.\n\nFor render-stable text, do not apply continuous `scale`, `x`, `y`,\n`filter`, or other transform tweens to `.scene-content` or any ancestor\ncontaining live text/cards. Put ambient zoom/parallax on background or media\nlayers only; text should enter briefly and then hold still at its final CSS\nposition.\n\n### Scene composer (non-agent fallback)\n\nScene HTML is authored by you, the host agent - the CLI makes no LLM call\nduring `vibe build`. When no agent is available to author scenes, pass\n`--composer template` for the deterministic no-model composer\n(concat background + lower-thirds).\n\n## Project conventions\n\n<!-- Edit this section with YOUR project's specifics. Examples below. -->\n\n- Default aspect ratio: `16:9`\n- Default scene duration: `3 seconds` (per beat)\n- Brand voice: <describe>\n- Output naming: `renders/<name>-<timestamp>.mp4`\n";
21
+ export declare const AGENTS_MD = "# AGENTS.md\n\nThis project uses [VibeFrame](https://github.com/vericontext/vibeframe) -\na CLI for AI video generation on the user's own provider keys (Seedance,\nRunway, Kling, Gemini Omni), behind dry runs and a hard `--max-cost` ceiling.\nThe `vibe` command provides 80+ subcommands for video generation,\nediting, and analysis. Cost tiers below - **always confirm with the user\nbefore running High / Very High tier commands**.\n\n## Agent host coverage\n\nVibeFrame's CLI works with any bash-capable AI coding agent. Six host\nfamilies have first-class auto-detection and scaffolds today:\n\n- **Claude Code** - `CLAUDE.md` (this file's import wrapper) +\n `AGENTS.md` + `/vibe-*` slash commands.\n- **OpenAI Codex** - reads `AGENTS.md` natively (agents.md spec).\n- **Cursor** - reads `AGENTS.md` plus `.cursor/rules/` for project\n rules; supports MCP via `.cursor/mcp.json`.\n- **Aider** - reads `AGENTS.md` (binary-only detection by VibeFrame).\n- **Gemini CLI** - primary context file is `GEMINI.md`; also reads\n `AGENTS.md` if present.\n- **OpenCode** - reads `AGENTS.md` (officially supported per\n `opencode.ai/docs/rules`); supports MCP via `.opencode/mcp.json`.\n\nRun `vibe doctor` to see which host(s) the CLI detects in your\nenvironment. Anyone running another bash-capable agent (Continue,\nSourcegraph Cody, etc.) still gets this `AGENTS.md` as the universal\nfallback.\n\n## Self-discovery\n\nDon't memorise the command surface - read it from the CLI:\n\n```bash\nvibe --help # command groups overview\nvibe schema --list # full machine-readable catalog (80+)\nvibe schema --list --surface public # small first-run/product command surface\nvibe schema generate.video # JSON Schema for any single command\nvibe doctor # available providers + system health\nvibe host setup all # print Codex/Claude/Cursor app integration snippets\nvibe host doctor all --json # verify project guidance + MCP config\nvibe guide motion # choose text-overlay vs motion-overlay vs generate motion\nvibe guide scene # step-by-step authoring guide (scene)\nvibe guide pipeline # step-by-step authoring guide (pipeline)\n```\n\n## Route by the user's actual request\n\nRouting the user's request correctly is the most important judgement call\nyou'll make. Do not force everything into a scene project.\n\n**ASSET - default for any single-asset request OR ambiguous prompt.**\nIf the user asks for a single image, single video clip, sound effect, music\nbed, or narration file - **OR pastes a visual/audio brief without explicit\nstoryboard / scene / multi-scene language** - treat it as ASSET. Use\n`vibe generate ...` directly. Do **not** edit `DESIGN.md`,\n`STORYBOARD.md`, run `vibe scene ...`, or auto-load the hyperframes\nskill until BUILD intent is explicit. The visual-identity hard-gate\napplies to BUILD only.\n\nExamples:\n- \"make this image\" \u2192 `vibe generate image \"...\" -o assets/name.png`\n- \"use this image to make a video\" \u2192 `vibe generate video \"...\" -i image.png -o renders/name.mp4`\n- \"add a lower-third/title/animated overlay/grain/vignette to this clip\" \u2192 prefer `vibe edit motion-overlay clip.mp4 \"...\" --understand auto -o out.mp4` when the request asks for designed or animated motion graphics.\n- \"please add visuals using OpenAI image gen\" \u2192 `vibe generate image \"...\" -p openai ...`\n- *(verb-less paste)* \"aerial view of a misty mountain peak at sunrise...\" \u2192 `vibe generate image \"<paste>\" -o assets/mountain-peak.png`. **Don't** read it as a brief for DESIGN.md.\n\nIf genuinely uncertain, ask one short question: *\"single asset or\nmulti-scene project?\"* before authoring DESIGN.md or loading the\nhyperframes skill.\n\n**BUILD - create new video from text intent.**\nUse `vibe build` with a STORYBOARD.md + DESIGN.md. The\nskills-driven pipeline (v0.60+) dispatches narration TTS + backdrop\nimage-gen per beat, composes scene HTML via the bundled composition rules\nbundle, then renders to MP4. Idempotent re-runs reuse cached assets.\n\n**REMIX - transform existing video / audio.**\nUse `vibe remix`, `vibe edit`, or `vibe audio`. One-shot,\nbatch-oriented operations on a file the user already has on disk.\n`vibe edit text-overlay` is the free deterministic path for simple static\ntext burn-in. If the user asks for motion design, animated lower-thirds,\ndesigned titles, grain/vignette as part of a graphic treatment, or says\n\"motion graphics\", use `vibe edit motion-overlay ... --understand auto` instead.\n\nDecision rule: if the user asks for one asset, it's ASSET. If the user asks\nfor a multi-scene/storyboard/composed video, it's BUILD. If the user is\nstarting from a media file and wants it transformed, it's REMIX.\n\n## Common workflows\n\n### BUILD (new video from text)\n\n| Task | Command |\n|---|---|\n| One-shot storyboard \u2192 video | `vibe build [project-dir]` |\n| Render an existing scene project | `vibe render [project-dir] -o out.mp4` |\n| Lint scene HTML | `vibe scene lint --json` |\n| Generate a single image | `vibe generate image \"prompt\" -o img.png --quality hd` |\n| Generate a single video | `vibe generate video \"prompt\" -i image.png -o clip.mp4` |\n| Generate narration | `vibe generate narration \"text\" -o voice.mp3` |\n\n### REMIX (transform existing media)\n\n| Task | Command |\n|---|---|\n| Extract highlights from a long video | `vibe remix highlights file.mp4 -d 60` |\n| Long video \u2192 vertical shorts | `vibe remix auto-shorts file.mp4 -n 3 --add-captions` |\n| Add animated word-by-word captions | `vibe remix animated-caption file.mp4 -s karaoke-sweep` |\n| Add designed motion graphics overlay | `vibe edit motion-overlay file.mp4 \"lower-third...\" --understand auto -o out.mp4` |\n| Remove silence | `vibe edit silence-cut in.mp4 -o out.mp4` |\n| Add static captions | `vibe edit caption in.mp4 -o out.mp4` |\n| Translate audio (transcribe \u2192 TTS) | `vibe audio dub file.mp4 -t ko` |\n| Transcribe (Whisper, word-level) | `vibe audio transcribe file.mp4 --granularity word` |\n| Inspect media with Gemini | `vibe inspect media file.mp4 \"summarise\" --json` |\n\n### Compose pipelines (Video as Code)\n\n| Task | Command |\n|---|---|\n| Run a YAML pipeline | `vibe run pipeline.yaml --dry-run` |\n| Resume from last checkpoint | `vibe run pipeline.yaml --resume` |\n\n## Cost tiers\n\n| Tier | Examples | Approx. per call |\n|---|---|---|\n| **Free** | `schema/context/doctor`, `detect *`, `status *`, `plan`, `storyboard validate`, `inspect project/render --cheap`, deterministic edits | $0 |\n| **Low** | `generate narration/sound-effect/music`, `audio transcribe`, `inspect media`, optional AI review | $0.01\u2013$0.10 |\n| **High** | `generate image/motion`, `edit image/reframe/grade/speed-ramp` | $1\u2013$5 |\n| **Very High** | `generate video`, `edit fill-gaps`, `remix highlights/auto-shorts`, `build` with generated assets | $5\u2013$50+ |\n\n## Agent invariants\n\nWhen you run vibe commands programmatically:\n\n1. **Always `--json`** for structured output you can parse without regex\n2. **Always `--dry-run` first** for any High/Very-High tier command - it returns\n the cost estimate without spending API budget\n3. **Use `vibe schema <command>`** to discover parameters; do not guess flags\n4. **Pass complex options via `--stdin`**:\n ```bash\n echo '{\"video\":\"long.mp4\",\"count\":3,\"aspect\":\"9:16\"}' | vibe remix auto-shorts --stdin --json\n ```\n\n## Provider keys and project scope\n\nPrefer `vibe setup --scope project` for project-local keys. It writes\n`.vibeframe/config.yaml` in the setup directory; when you work from a\nnested scene directory, the `vibe` CLI automatically searches parent\ndirectories and uses the nearest project config. Do not assume the config\nfile must exist in the current subdirectory.\n\nRun `vibe doctor --json` from the directory where you will run commands\nand check `data.scope.project.configPath` / `data.scope.activeScope` before\ndeciding keys are missing. Never print or copy config file contents.\n\nFor generated project assets, use VibeFrame commands such as\n`vibe generate image|video|speech ...` so these project-scope keys are\nused. Do not switch to a host agent's built-in image/audio generation tool\nunless the user explicitly asks for a non-VibeFrame asset.\n\n`.env` is still supported as a gitignored fallback. Copy `.env.example`\nto start if you prefer environment variables.\n\n## App host setup\n\nVibeFrame is CLI-first, not terminal-only. Codex, Claude Code, and Cursor can\ndrive the same project through shell commands, and app hosts can also use\nVibeFrame's MCP server as a typed tool surface.\n\n```bash\nvibe host setup all # print snippets only\nvibe host setup all --write # write project/app config\nvibe host doctor all --json # verify readiness\n```\n\nDefault setup is snippet-only; use `--write` when you want VibeFrame to merge\nthe generated config. Keep provider keys in `.vibeframe/config.yaml`, user\nconfig, or env files - not in app host config.\n\n## Host agent loop\n\nFor long-running work, use your host's agent loop (Claude Code, Codex, Cursor,\nor another coding-agent host) as the outer loop. VibeFrame should not own a\ncompeting project-level agent loop. It provides `--json` commands, dry runs,\nbudget caps, `build-report.json`, `review-report.json`, `nextActions`,\n`safeToAutoRun`, `requiresConfirmation`, `fixOwner`, deterministic repair,\nand render inspection for the host agent to decide what to do next.\n\nCopy-paste agent prompt (Codex) - a plain prompt, not a built-in command:\n\n```text\nBuild this VibeFrame project into renders/final.mp4. Use --json for every\nvibe command, run --dry-run before paid operations, use --max-cost 5 for builds\nunless the user gives another budget, read build-report.json and\nreview-report.json before deciding the next action, prefer nextActions before\nguessing, run only safeToAutoRun:true actions automatically, and ask before\nrequiresConfirmation:true actions. Treat retryWith as the compatibility\nfallback, fixOwner:\"vibe\" as CLI repair work, and fixOwner:\"host-agent\" as\nSTORYBOARD.md, DESIGN.md, or composition edits.\nStop only when renders/final.mp4 exists, target duration and aspect ratio are\nmet, inspect render --cheap has no errors, any AI review score is >= 90 when AI review is requested, and every\nremaining host-agent issue is fixed, accepted with rationale, or reported as\nblocked.\n```\n\nCopy-paste agent prompt (Claude Code) - a plain prompt, not a built-in command:\n\n```text\nFinish this VibeFrame render using your host's agent loop as the outer\nloop. Use vibe context/schema when unsure, --json everywhere, dry-run before\npaid operations, budget cap via --max-cost 5, nextActions before guessing,\nbuild-report.json/review-report.json as loop state, and safeToAutoRun,\nrequiresConfirmation, and fixOwner to decide between vibe scene repair and\nhost-agent edits. Stop only after final MP4,\ntarget duration/aspect ratio, clean render inspection, any AI review score >= 90 when AI review is requested, and\nno unresolved unacknowledged host-agent issues.\n```\n\n### Composition rules (scene HTML)\n\nComposition rules live in the **Hyperframes skill** - framework rules, motion\nprinciples, type system, and visual-identity hard-gate. **Load that skill\nbefore authoring any scene composition HTML under `compositions/`.** The same\nrules govern `vibe scene lint`, so your authored HTML and the linter stay in\nagreement.\n\nWhere the skill comes from depends on your setup:\n\n- If the `hyperframes` skill is installed globally (e.g. Claude Code), your\n agent already has it and nothing else is needed.\n- Otherwise install it into this project with `vibe scene install-skill`,\n which runs upstream's own installer and writes\n `.agents/skills/hyperframes/`.\n\n`vibe init` never copies the rules in. They come from upstream so they stay\ncurrent, and fetching them is a network call the scaffold does not make on\nyour behalf. `vibe doctor` reports whether your agent can read them.\n\nFor render-stable text, do not apply continuous `scale`, `x`, `y`,\n`filter`, or other transform tweens to `.scene-content` or any ancestor\ncontaining live text/cards. Put ambient zoom/parallax on background or media\nlayers only; text should enter briefly and then hold still at its final CSS\nposition.\n\n### Scene composer (non-agent fallback)\n\nScene HTML is authored by you, the host agent - the CLI makes no LLM call\nduring `vibe build`. When no agent is available to author scenes, pass\n`--composer template` for the deterministic no-model composer\n(concat background + lower-thirds).\n\n## Project conventions\n\n<!-- Edit this section with YOUR project's specifics. Examples below. -->\n\n- Default aspect ratio: `16:9`\n- Default scene duration: `3 seconds` (per beat)\n- Brand voice: <describe>\n- Output naming: `renders/<name>-<timestamp>.mp4`\n";
22
22
  /**
23
23
  * Claude Code project file. Imports AGENTS.md so guidance stays
24
24
  * single-sourced; adds Claude-specific overrides (slash commands, etc.).
@@ -1,3 +1,4 @@
1
+ import { type VideoJob } from "@vibeframe/ai-providers";
1
2
  import type { BuildAssetKind } from "./build-cache.js";
2
3
  import type { ReviewAction } from "./review-report.js";
3
4
  export type JobStatus = "queued" | "running" | "completed" | "failed" | "cancelled" | "unknown";
@@ -26,7 +27,10 @@ export interface JobRecord {
26
27
  command: string;
27
28
  provider: string;
28
29
  providerTaskId: string;
30
+ /** Kling task type; superseded by `providerJob` and kept for older records. */
29
31
  providerTaskType?: "text2video" | "image2video";
32
+ /** The provider's job handle, so a refresh polls exactly the job that was submitted. */
33
+ providerJob?: VideoJob;
30
34
  progress?: number;
31
35
  resultUrl?: string;
32
36
  beatId?: string;
@@ -60,6 +64,7 @@ export interface CreateJobRecordOptions {
60
64
  provider: string;
61
65
  providerTaskId: string;
62
66
  providerTaskType?: "text2video" | "image2video";
67
+ providerJob?: VideoJob;
63
68
  projectDir?: string;
64
69
  workingDirectory?: string;
65
70
  command: string;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * The CLI side of the video job contract: open a provider by name with the
3
+ * user's key, and turn local files into the image form it takes. Video
4
+ * executors, job records, and builds go through here instead of branching
5
+ * on provider names.
6
+ */
7
+ import { type VideoGenerator, type VideoJob } from "@vibeframe/ai-providers";
8
+ /** Env var holding each video provider's key. */
9
+ export declare const VIDEO_PROVIDER_ENV: Readonly<Record<string, string>>;
10
+ /** `fal` is the old name for `seedance`. */
11
+ export declare function canonicalVideoProvider(provider: string): string;
12
+ /** A video generator for `provider`, with the given key or the configured one. */
13
+ export declare function openVideoGenerator(provider: string, apiKey?: string): Promise<VideoGenerator>;
14
+ /**
15
+ * A job handle for a bare task ID (a user typed it, or an old job record
16
+ * predates stored handles). Providers that need more than the ID recover
17
+ * it themselves: Kling tries both task types, Seedance uses its model's app.
18
+ */
19
+ export declare function jobFromTaskId(provider: string, taskId: string, opts?: {
20
+ model?: string;
21
+ taskType?: string;
22
+ }): VideoJob;
23
+ export declare function mimeTypeForPath(path: string, fallback: string): string;
24
+ /** A local path, URL, or data URI as a URL or data URI (local files are inlined). */
25
+ export declare function fileToUrlOrDataUri(input: string, fallbackMimeType: string): Promise<string>;
26
+ /**
27
+ * An input image in the form `generator` takes: uploaded to the configured
28
+ * upload host for URL-only providers, inlined as a data URI otherwise.
29
+ *
30
+ * Remote URLs are never fetched here: an inline-only provider gets a usage
31
+ * error instead, so a tool call cannot make the CLI read an internal URL
32
+ * and forward its contents to a provider.
33
+ */
34
+ export declare function videoImageInput(generator: VideoGenerator, input: string): Promise<string>;
@@ -1,21 +1,21 @@
1
1
  /**
2
2
  * @module ai-video
3
- * @description Library functions for video generation, status, cancel, and
4
- * extension. Powers the manifest tools `generate_video`,
5
- * `generate_video_status`, `generate_video_cancel`, `generate_video_extend`
6
- * (the user reaches these via `vibe generate video[-...]`).
7
- *
8
- * The legacy `vibe ai video / video-status / video-cancel / kling / kling-status /
9
- * video-extend` Commander registrations were removed alongside the dead
10
- * `commands/ai.ts` orchestrator (the `vibe ai *` namespace was never
11
- * `addCommand`'d to `program`).
3
+ * @description Video generation, status, cancel, and extension on the video
4
+ * job contract. Powers the manifest tools `generate_video`,
5
+ * `generate_video_cancel`, `generate_video_extend`, and job refreshes in
6
+ * `vibe status`; every provider goes through `VideoGenerator`, so nothing
7
+ * here branches on provider names.
12
8
  *
13
9
  * @see MODELS.md for AI model configuration
14
10
  */
11
+ import { type ProviderErrorKind, type VideoJob, type VideoJobState } from "@vibeframe/ai-providers";
15
12
  export interface VideoGenerateOptions {
16
13
  prompt: string;
14
+ /** Default: the configured or first available video provider. */
17
15
  provider?: "grok" | "runway" | "kling" | "veo" | "seedance" | "fal" | "omni";
18
16
  image?: string;
17
+ /** Ending frame for providers that interpolate between two frames. */
18
+ endImage?: string;
19
19
  refImages?: string[];
20
20
  refVideos?: string[];
21
21
  refAudio?: string[];
@@ -34,21 +34,37 @@ export interface VideoGenerateOptions {
34
34
  output?: string;
35
35
  wait?: boolean;
36
36
  apiKey?: string;
37
+ /**
38
+ * Called as soon as the provider accepts the job, before waiting, so the
39
+ * caller can record it: a crash or timeout mid-wait then leaves a job that
40
+ * can still be polled and downloaded.
41
+ */
42
+ onSubmitted?: (job: VideoJob) => void | Promise<void>;
43
+ /** Called after every poll while waiting. */
44
+ onProgress?: (state: VideoJobState) => void;
45
+ /** Veo only: `allow_all` or `allow_adult`. */
46
+ personGeneration?: string;
37
47
  }
38
48
  export interface VideoGenerateResult {
39
49
  success: boolean;
40
50
  taskId?: string;
51
+ /** The provider job handle; store it to poll, cancel, or extend later. */
52
+ job?: VideoJob;
41
53
  status?: string;
42
54
  videoUrl?: string;
43
55
  duration?: number;
44
56
  outputPath?: string;
45
57
  provider?: string;
46
58
  error?: string;
59
+ errorKind?: ProviderErrorKind;
47
60
  }
48
61
  export declare function executeVideoGenerate(options: VideoGenerateOptions): Promise<VideoGenerateResult>;
49
62
  export interface VideoStatusOptions {
50
63
  taskId: string;
51
- provider?: "grok" | "runway" | "kling" | "veo";
64
+ provider?: string;
65
+ /** The stored job handle; preferred over `taskId` + `taskType`. */
66
+ job?: VideoJob;
67
+ /** Kling task type, for a bare task ID. */
52
68
  taskType?: "text2video" | "image2video";
53
69
  wait?: boolean;
54
70
  output?: string;
@@ -63,20 +79,28 @@ export interface VideoStatusResult {
63
79
  duration?: number;
64
80
  outputPath?: string;
65
81
  error?: string;
82
+ errorKind?: ProviderErrorKind;
66
83
  }
67
84
  export declare function executeVideoStatus(options: VideoStatusOptions): Promise<VideoStatusResult>;
68
85
  export interface VideoCancelOptions {
69
86
  taskId: string;
87
+ /** Default: runway. */
88
+ provider?: string;
89
+ job?: VideoJob;
70
90
  apiKey?: string;
71
91
  }
72
92
  export interface VideoCancelResult {
73
93
  success: boolean;
74
94
  error?: string;
95
+ errorKind?: ProviderErrorKind;
75
96
  }
76
97
  export declare function executeVideoCancel(options: VideoCancelOptions): Promise<VideoCancelResult>;
77
98
  export interface VideoExtendOptions {
99
+ /** The task ID of the video to extend (Veo: its operation name). */
78
100
  videoId: string;
79
- provider?: "kling" | "veo";
101
+ /** Default: kling. */
102
+ provider?: string;
103
+ job?: VideoJob;
80
104
  prompt?: string;
81
105
  duration?: number;
82
106
  negative?: string;
@@ -88,10 +112,12 @@ export interface VideoExtendOptions {
88
112
  export interface VideoExtendResult {
89
113
  success: boolean;
90
114
  taskId?: string;
115
+ job?: VideoJob;
91
116
  status?: string;
92
117
  videoUrl?: string;
93
118
  duration?: number;
94
119
  outputPath?: string;
95
120
  error?: string;
121
+ errorKind?: ProviderErrorKind;
96
122
  }
97
123
  export declare function executeVideoExtend(options: VideoExtendOptions): Promise<VideoExtendResult>;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,8 +1,7 @@
1
1
  /**
2
2
  * @module generate/video-cancel
3
- * @description `vibe generate video-cancel` (hidden) — cancel in-flight Grok
4
- * or Runway video generation. Split out of `generate.ts` in v0.69 (Plan G
5
- * Phase 2).
3
+ * @description `vibe generate video-cancel` (hidden) — cancel an in-flight
4
+ * video job on a provider with a cancel API (Runway, Seedance, Gemini Omni).
6
5
  */
7
6
  import type { Command } from "commander";
8
7
  export declare function registerVideoCancelCommand(parent: Command): void;
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * @module generate/video-extend
3
- * @description `vibe generate video-extend` (hidden) — extend video duration
4
- * via Kling or Veo (Gemini). Split out of `generate.ts` in v0.69 (Plan G
5
- * Phase 2).
3
+ * @description `vibe generate video-extend` (hidden) — extend a generated
4
+ * video from its last frame, on any provider that can (Kling, Grok classic,
5
+ * Gemini Omni, and Veo until 2026-10-22).
6
6
  */
7
7
  import type { Command } from "commander";
8
8
  export declare function registerVideoExtendCommand(parent: Command): void;
@@ -1,12 +1,22 @@
1
1
  /**
2
2
  * @module generate/video
3
3
  * @description `vibe generate video` (alias `vid`) — multi-provider video
4
- * generation. fal.ai (Seedance 2.0), Grok, Veo (Gemini), Kling, Runway,
5
- * plus Gemini Omni 1.1 Flash (`-p omni`).
6
- * Split out of `generate.ts` in v0.69 (Plan G Phase 2).
4
+ * generation (Seedance via fal.ai, Grok, Kling, Runway, Gemini Omni, and Veo
5
+ * until 2026-10-22). Validation, provider choice, and the dry run live here;
6
+ * generation itself is `executeVideoGenerate`, the same executor the MCP
7
+ * tool and builds use.
7
8
  */
8
9
  import type { Command } from "commander";
9
10
  export declare function registerVideoCommand(parent: Command): void;
11
+ /**
12
+ * Cost figure for a REAL (non-dry-run) generation envelope.
13
+ *
14
+ * Seedance has a token-accurate estimator; every other provider reports the
15
+ * command's tier upper bound with a warning naming it an estimate. Without
16
+ * this the success envelope defaulted to costUsd 0, which an agent budget
17
+ * loop reads as "free" - the hybrid-brew dogfood run billed Runway twice
18
+ * while reporting $0.
19
+ */
10
20
  export declare function realRunCost(provider: string, options: {
11
21
  duration?: string;
12
22
  resolution?: string;
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Commands:
7
7
  * generate image - Generate image (Gemini, OpenAI, Grok, Runway)
8
- * generate video - Generate video (Seedance, Grok, Kling, Runway, Veo)
8
+ * generate video - Generate video (Seedance, Grok, Kling, Runway, Omni, Veo)
9
9
  * generate sound-effect - Sound effects (ElevenLabs)
10
10
  * generate music - Music generation (ElevenLabs default, Replicate MusicGen)
11
11
  * generate motion - Standalone motion assets (Claude/Gemini + Remotion)
@@ -22,6 +22,8 @@ export interface StructuredError {
22
22
  retryWith?: string[];
23
23
  recoverable?: boolean;
24
24
  retryable: boolean;
25
+ /** The provider error kind (`auth`, `quota`, `likeness`, ...) when a provider call failed. */
26
+ errorKind?: string;
25
27
  /**
26
28
  * Structured context carried alongside the failure, so a refusal can hand
27
29
  * back the evidence it refused on instead of forcing a second call. Used by
@@ -32,6 +34,11 @@ export interface StructuredError {
32
34
  export declare function usageError(msg: string, suggestion?: string): StructuredError;
33
35
  export declare function authError(envVar: string, provider: string): StructuredError;
34
36
  export declare function apiError(msg: string, retryable?: boolean): StructuredError;
37
+ /**
38
+ * The structured error for a failed provider call, chosen by its error kind
39
+ * (`ProviderError.kind`) instead of by matching provider wording.
40
+ */
41
+ export declare function providerFailure(message: string, kind?: string): StructuredError;
35
42
  export declare function notFoundError(path: string): StructuredError;
36
43
  export declare function networkError(msg: string): StructuredError;
37
44
  export declare function generalError(msg: string, suggestion?: string): StructuredError;
@@ -75,6 +82,11 @@ export interface SuccessEnvelopeOptions {
75
82
  warnings?: string[];
76
83
  /** Pass-through of `--dry-run` flag — surfaces as a top-level `dryRun: true` in the envelope. */
77
84
  dryRun?: boolean;
85
+ /**
86
+ * The caller already printed its own human-readable output (a build plan,
87
+ * a render summary), so human mode adds nothing for this dry run.
88
+ */
89
+ humanRendered?: boolean;
78
90
  }
79
91
  /** Look up the upper-bound cost estimate for a command (used by dry-run). */
80
92
  /**
@@ -87,12 +99,15 @@ export declare function lookupCostEstimateUpperBound(command: string): number;
87
99
  * Emit a canonical success envelope (#33 — 2c). JSON mode prints the
88
100
  * envelope; quiet mode prints a single primary value extracted from
89
101
  * `data.outputPath ?? data.output ?? data.path ?? data.url ?? data.id`;
90
- * human mode prints nothing — the caller renders human output itself.
102
+ * human mode prints a summary for dry runs (unless the caller rendered its
103
+ * own) and otherwise nothing — the caller renders human output itself.
91
104
  *
92
105
  * Canary scope: `generate image` only in 2c-canary. 2c-sweep migrates
93
106
  * the rest. Old `outputResult()` remains for the sweep transition.
94
107
  */
95
108
  export declare function outputSuccess(opts: SuccessEnvelopeOptions): void;
109
+ /** Print warnings to stderr in human mode; JSON envelopes carry them instead. */
110
+ export declare function printWarnings(warnings: readonly string[]): void;
96
111
  /** Output result - JSON mode outputs JSON, quiet mode outputs primary value only */
97
112
  export declare function outputResult(result: Record<string, unknown>): void;
98
113
  /** Wrap console output - suppressed in JSON/quiet mode */