@vibeframe/cli 0.113.28 → 0.113.30

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
@@ -2,7 +2,9 @@
2
2
 
3
3
  ## Overview
4
4
 
5
- VibeFrame CLI (`vibe`) is a CLI-first video toolkit. Every operation is
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`
7
+ ceiling, and edits the results. Every operation is
6
8
  a shell command. The same surface is exposed as MCP tools through
7
9
  [`@vibeframe/mcp-server`](https://www.npmjs.com/package/@vibeframe/mcp-server).
8
10
  For long-running video work, your host's agent loop (Claude Code, Codex,
@@ -12,7 +14,7 @@ VibeFrame owns the video-specific command surface, JSON reports, cost gates,
12
14
  deterministic repair, render inspection, and `retryWith` recovery hints.
13
15
 
14
16
  For the full reference (every flag, default, enum), read
15
- [`docs/cli-reference.md`](../../docs/cli-reference.md) — auto-generated
17
+ [`docs/cli-reference.md`](../../docs/cli-reference.md) - auto-generated
16
18
  from `vibe schema --list`. This file is the _agent quickstart_: rules,
17
19
  conventions, and discovery hooks.
18
20
 
@@ -27,7 +29,7 @@ host agent loop -> vibe context/schema -> plan dry-run -> build with budget
27
29
  -> repair/edit using nextActions/fixOwner -> repeat until stop rules pass
28
30
  ```
29
31
 
30
- Copy-paste agent prompt (Codex) — a plain prompt, not a built-in command:
32
+ Copy-paste agent prompt (Codex) - a plain prompt, not a built-in command:
31
33
 
32
34
  ```text
33
35
  Build my-video/ into a reviewed VibeFrame MP4. Use --json for every vibe
@@ -44,7 +46,7 @@ AI review score is >= 90 when AI review is requested, and unresolved host-agent
44
46
  accepted with a written reason, or reported as blocked.
45
47
  ```
46
48
 
47
- Copy-paste agent prompt (Claude Code) — a plain prompt, not a built-in command:
49
+ Copy-paste agent prompt (Claude Code) - a plain prompt, not a built-in command:
48
50
 
49
51
  ```text
50
52
  Finish the VibeFrame render for my-video/ using your host's agent loop as
@@ -71,15 +73,15 @@ vibe guide <topic> --json # Step-by-step guides (motion | scene | p
71
73
 
72
74
  ## Global rules
73
75
 
74
- 1. **`--json` everywhere** — auto-enabled on non-TTY stdout but pass
76
+ 1. **`--json` everywhere** - auto-enabled on non-TTY stdout but pass
75
77
  explicitly for clarity. Output goes to **stdout**.
76
- 2. **`--dry-run` before any paid call** — returns a `costUsd` estimate
78
+ 2. **`--dry-run` before any paid call** - returns a `costUsd` estimate
77
79
  in the JSON envelope without spending. Validates inputs.
78
- 3. **`--stdin` for complex options** — `echo '{"key":"value"}' | vibe
80
+ 3. **`--stdin` for complex options** - `echo '{"key":"value"}' | vibe
79
81
  <cmd> --stdin --json`. CLI flags still win on conflict.
80
- 4. **`--fields <list>`** — limit JSON output fields on read-heavy
82
+ 4. **`--fields <list>`** - limit JSON output fields on read-heavy
81
83
  commands (e.g. `--fields "path,duration"`).
82
- 5. **`--describe`** — print a command's JSON Schema and exit (no
84
+ 5. **`--describe`** - print a command's JSON Schema and exit (no
83
85
  execution). Useful for prompt-time discovery.
84
86
 
85
87
  ## Cost tiers
@@ -123,13 +125,17 @@ vibe guide <topic> --json # Step-by-step guides (motion | scene | p
123
125
  }
124
126
  ```
125
127
 
126
- | Code | Exit | Meaning | Recovery |
127
- | --------------- | ---- | ------------------- | -------------------------- |
128
- | `USAGE_ERROR` | 2 | bad arg | check `vibe schema <cmd>` |
129
- | `NOT_FOUND` | 3 | file missing | verify path |
130
- | `AUTH_ERROR` | 4 | key missing/invalid | `vibe doctor` |
131
- | `API_ERROR` | 5 | provider failed | retry if `retryable: true` |
132
- | `NETWORK_ERROR` | 6 | connection | retry with backoff |
128
+ | Code | Exit | Meaning | Recovery |
129
+ | -------------------- | ---- | --------------------------- | --------------------------------- |
130
+ | `COST_CAP_EXCEEDED` | 1 | estimate over `--max-cost` | follow `retryWith`; do not re-run as-is |
131
+ | `USAGE_ERROR` | 2 | bad arg | check `vibe schema <cmd>` |
132
+ | `NOT_FOUND` | 3 | file missing | verify path |
133
+ | `AUTH_ERROR` | 4 | key missing/invalid | `vibe doctor` |
134
+ | `API_ERROR` | 5 | provider failed | retry if `retryable: true` |
135
+ | `NETWORK_ERROR` | 6 | connection | retry with backoff |
136
+
137
+ `COST_CAP_EXCEEDED` also carries `data.plan` - the priced plan the refusal was
138
+ based on - so a refused call still tells you what the build would have cost.
133
139
 
134
140
  ## Authentication
135
141
 
@@ -15,15 +15,15 @@
15
15
  * OpenAI Codex, Cursor, Aider, Sourcegraph Cody, OpenCode, and (via
16
16
  * the @AGENTS.md import) Claude Code. Gemini CLI users may want to
17
17
  * also keep a sibling \`GEMINI.md\` since that's its primary context
18
- * file. Keep this as the canonical source of truth for agent guidance —
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) \u2014\na CLI for AI-powered video editing. The `vibe` command provides 80+\nsubcommands for video generation, editing, analysis, and pipeline\norchestration. Cost tiers below \u2014 **always confirm with the user before\nrunning 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** \u2014 `CLAUDE.md` (this file's import wrapper) +\n `AGENTS.md` + `/vibe-*` slash commands.\n- **OpenAI Codex** \u2014 reads `AGENTS.md` natively (agents.md spec).\n- **Cursor** \u2014 reads `AGENTS.md` plus `.cursor/rules/` for project\n rules; supports MCP via `.cursor/mcp.json`.\n- **Aider** \u2014 reads `AGENTS.md` (binary-only detection by VibeFrame).\n- **Gemini CLI** \u2014 primary context file is `GEMINI.md`; also reads\n `AGENTS.md` if present.\n- **OpenCode** \u2014 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 \u2014 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 \u2014 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 \u2014 **OR pastes a visual/audio brief without explicit\nstoryboard / scene / multi-scene language** \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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) \u2014 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) \u2014 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** \u2014 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 (batch / non-agent fallback)\n\nWhen you don't want to author HTML yourself, `vibe build --mode batch` runs an\nLLM internally with the same skill bundle. It auto-picks a provider based\non available keys (`claude > gemini > openai`) \u2014 pass `--composer <name>`\nto force one:\n\n| Provider | Env var | Spike notes (v0.70) |\n|---|---|---|\n| Claude (default) | `ANTHROPIC_API_KEY` | ~9 s/beat. Fastest, validated baseline. |\n| Gemini | `GOOGLE_API_KEY` | ~20 s/beat. ~2.6\u00D7 cheaper than Claude. |\n| OpenAI | `OPENAI_API_KEY` | ~70 s/beat. gpt-5 reasoning latency \u2014 opt-in only. |\n\nAll three pass first-shot lint at every effort tier on the `vibeframe-promo`\nfixture. Quality on more complex storyboards may differ \u2014 fall back to\n`--composer claude` if a non-default provider repeatedly fails lint.\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, 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";
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.).
25
25
  */
26
- export declare const CLAUDE_MD = "@AGENTS.md\n\n# Claude Code overrides\n\nThis file imports `AGENTS.md` (above) \u2014 that's the canonical source.\nAdd anything Claude-Code-specific *below*; everything generic should\nstay in AGENTS.md so other agent hosts (Codex, Cursor, Aider, Gemini CLI, OpenCode) see it\ntoo.\n\n## Skills\n\nIf you ran `vibe init` with Claude Code detected, the VibeFrame skill\npack is available as slash commands (consolidated to 2 in v0.62 \u2014 the\noverview content moved into AGENTS.md above):\n\n- `/vibe-pipeline` \u2014 YAML pipeline authoring helper (Video as Code)\n- `/vibe-scene` \u2014 per-scene HTML authoring + `vibe build`\n\nClaude-specific routing note: follow the ASSET / BUILD / REMIX decision\nrules in `AGENTS.md`. In particular, a request for one generated image or\none generated video clip is an ASSET request: use `vibe generate image` or\n`vibe generate video` directly. A request for designed/animated overlays\non an existing clip is usually `vibe edit motion-overlay ... --understand auto`,\nnot `vibe edit text-overlay`, unless the user explicitly asks for a simple\nstatic text burn-in. Do not invoke `/vibe-scene`, edit\n`DESIGN.md`, or edit `STORYBOARD.md` unless the user explicitly asks for a\nscene, storyboard, or composed video.\n\nTo install / update them later:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/vericontext/vibeframe/main/scripts/install-skills.sh | bash\n```\n\n## Project-specific guidance\n\n<!-- Add Claude-specific notes here: which sub-agents to prefer, custom\n slash commands you've added, conversational style preferences, etc. -->\n";
26
+ export declare const CLAUDE_MD = "@AGENTS.md\n\n# Claude Code overrides\n\nThis file imports `AGENTS.md` (above) - that's the canonical source.\nAdd anything Claude-Code-specific *below*; everything generic should\nstay in AGENTS.md so other agent hosts (Codex, Cursor, Aider, Gemini CLI, OpenCode) see it\ntoo.\n\n## Skills\n\nIf you ran `vibe init` with Claude Code detected, the VibeFrame skill\npack is available as slash commands (consolidated to 2 in v0.62 - the\noverview content moved into AGENTS.md above):\n\n- `/vibe-pipeline` - YAML pipeline authoring helper (Video as Code)\n- `/vibe-scene` - per-scene HTML authoring + `vibe build`\n\nClaude-specific routing note: follow the ASSET / BUILD / REMIX decision\nrules in `AGENTS.md`. In particular, a request for one generated image or\none generated video clip is an ASSET request: use `vibe generate image` or\n`vibe generate video` directly. A request for designed/animated overlays\non an existing clip is usually `vibe edit motion-overlay ... --understand auto`,\nnot `vibe edit text-overlay`, unless the user explicitly asks for a simple\nstatic text burn-in. Do not invoke `/vibe-scene`, edit\n`DESIGN.md`, or edit `STORYBOARD.md` unless the user explicitly asks for a\nscene, storyboard, or composed video.\n\nTo install / update them later:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/vericontext/vibeframe/main/scripts/install-skills.sh | bash\n```\n\n## Project-specific guidance\n\n<!-- Add Claude-specific notes here: which sub-agents to prefer, custom\n slash commands you've added, conversational style preferences, etc. -->\n";
27
27
  /**
28
28
  * Gemini CLI project file. Gemini CLI's primary context file is
29
29
  * `GEMINI.md` (per https://geminicli.com/docs/cli/gemini-md/), so this
@@ -34,7 +34,7 @@ export declare const CLAUDE_MD = "@AGENTS.md\n\n# Claude Code overrides\n\nThis
34
34
  * human-readable note below ensures the agent picks up `AGENTS.md`
35
35
  * either way.
36
36
  */
37
- export declare const GEMINI_MD = "@AGENTS.md\n\n# Gemini CLI overrides\n\nThis project's canonical agent guidance lives in `AGENTS.md` \u2014 read\nit first. The `@AGENTS.md` line above is the import marker; if\nGemini CLI doesn't inline imported files in your version, open\n`AGENTS.md` directly. Both files are kept in sync by `vibe init`.\n\n## Project-specific guidance\n\n<!-- Add Gemini-CLI-specific notes here: any conventions specific to\n how you drive vibe from Gemini CLI (preferred models, tone, etc.). -->\n";
37
+ export declare const GEMINI_MD = "@AGENTS.md\n\n# Gemini CLI overrides\n\nThis project's canonical agent guidance lives in `AGENTS.md` - read\nit first. The `@AGENTS.md` line above is the import marker; if\nGemini CLI doesn't inline imported files in your version, open\n`AGENTS.md` directly. Both files are kept in sync by `vibe init`.\n\n## Project-specific guidance\n\n<!-- Add Gemini-CLI-specific notes here: any conventions specific to\n how you drive vibe from Gemini CLI (preferred models, tone, etc.). -->\n";
38
38
  /** Shape the init renderer can fill in for the .env.example body. */
39
39
  export interface EnvExampleOptions {
40
40
  /** When true, surfaces a "tier: free local fallbacks" section at the top. */
@@ -50,7 +50,7 @@ export declare function renderEnvExample(opts?: EnvExampleOptions): string;
50
50
  export declare const GITIGNORE_ADDITIONS = "\n# VibeFrame\n.env\n.env.local\nrenders/\n.pipeline-state.yaml\n*.vibe.json\n.vibeframe/\n\n# Hyperframes skill copies left by older VibeFrame versions, which vendored a\n# snapshot of upstream's rules. Nothing writes these now - upstream's installer\n# owns the rules and puts them under .agents/skills/hyperframes/, which is\n# yours to commit or ignore. These lines only keep pre-existing copies quiet.\n/SKILL.md\n/references/\n/.claude/skills/hyperframes/\n/.cursor/rules/hyperframes.mdc\n";
51
51
  /**
52
52
  * vibe.project.yaml minimal scaffold. Only written when no project
53
- * config exists — `vibe init` never overwrites an existing file unless
53
+ * config exists - `vibe init` never overwrites an existing file unless
54
54
  * --force.
55
55
  */
56
56
  export declare function renderProjectYaml(opts: {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @module _shared/scene-project
3
3
  *
4
- * Helpers for scaffolding a "scene project" — a directory that works as both
4
+ * Helpers for scaffolding a "scene project" - a directory that works as both
5
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.
@@ -15,13 +15,13 @@ import type { VisualStyle } from "./visual-styles.js";
15
15
  export type SceneAspect = "16:9" | "9:16" | "1:1" | "4:5";
16
16
  export type SceneScaffoldProfile = "minimal" | "agent" | "full";
17
17
  /**
18
- * Project KIND — orthogonal to {@link SceneScaffoldProfile} (which decides which
18
+ * Project KIND - orthogonal to {@link SceneScaffoldProfile} (which decides which
19
19
  * files exist). Kind decides which pipeline STAGES run and which composer is the
20
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).
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
25
  */
26
26
  export type SceneKind = "cinema" | "product" | "aivideo" | "story" | "motion";
27
27
  export declare const VALID_SCENE_KINDS: readonly SceneKind[];
@@ -98,13 +98,13 @@ export declare function buildHyperframesConfig(): HyperframesConfig;
98
98
  export declare function buildHyperframesMeta(name: string, now?: Date): HyperframesMeta;
99
99
  /**
100
100
  * Merge an existing Hyperframes config with our defaults, preserving any
101
- * user-authored keys and nested values. `vibe scene init` is idempotent:
101
+ * user-authored keys and nested values. `vibe init` is idempotent:
102
102
  * running it on a directory that already has `hyperframes.json` must never
103
103
  * lose user config.
104
104
  */
105
105
  export declare function mergeHyperframesConfig(existing: HyperframesConfig, defaults: HyperframesConfig): HyperframesConfig;
106
106
  /**
107
- * Minimal valid Hyperframes root composition — empty (no sub-compositions
107
+ * Minimal valid Hyperframes root composition - empty (no sub-compositions
108
108
  * yet). A later `vibe scene add` inserts `<div class="clip" ...>` children.
109
109
  */
110
110
  export declare function buildEmptyRootHtml(opts: {
@@ -116,13 +116,13 @@ export declare function buildDesignMd(opts: {
116
116
  style?: VisualStyle;
117
117
  }): string;
118
118
  /**
119
- * Always-on `SCRIPT.md` — the narrative spine authored before the beat-level
119
+ * Always-on `SCRIPT.md` - the narrative spine authored before the beat-level
120
120
  * STORYBOARD.md. Kind tailors the guidance (a `motion`/`product` script is a
121
121
  * shot/asset list; a `story`/`cinema` script is a scene-by-scene narrative).
122
122
  */
123
123
  export declare function buildScriptMd(name: string, kind?: SceneKind): string;
124
124
  /**
125
- * Kind-gated `CHARACTERS.md` — the cast bible. Promotes today's STORYBOARD
125
+ * Kind-gated `CHARACTERS.md` - the cast bible. Promotes today's STORYBOARD
126
126
  * \`characters:\` frontmatter into first-class identity blocks (reference sheet
127
127
  * path + an identity-lock description used to keep keyframes/i2v on-model).
128
128
  */
@@ -149,7 +149,7 @@ export interface ScaffoldOptions {
149
149
  visualStyle?: VisualStyle;
150
150
  /** Scaffold shape. Defaults to "full" for backward-compatible programmatic use. */
151
151
  profile?: SceneScaffoldProfile;
152
- /** Project kind — drives which pipeline stages run + the default composer. */
152
+ /** Project kind - drives which pipeline stages run + the default composer. */
153
153
  kind?: SceneKind;
154
154
  }
155
155
  export interface ScaffoldResult {
@@ -5,7 +5,7 @@
5
5
  * `/vibe-pipeline` slash commands. After Plan H, host agents
6
6
  * (Claude Code, Codex, Cursor, Aider, Gemini CLI, OpenCode) all read
7
7
  * SKILL.md from the user's project and can drive `vibe build`
8
- * directly — but discoverability of the *workflow* itself was still
8
+ * directly - but discoverability of the *workflow* itself was still
9
9
  * Claude-Code-only via the slash menu.
10
10
  *
11
11
  * `vibe guide <topic>` closes that gap: any host (or a human at
@@ -30,12 +30,12 @@ export interface WalkthroughResult {
30
30
  steps: string[];
31
31
  /** Related vibe CLI commands referenced by the walkthrough. */
32
32
  relatedCommands: string[];
33
- /** Full markdown body — same content the Claude Code slash command loads. */
33
+ /** Full markdown body - same content the Claude Code slash command loads. */
34
34
  content: string;
35
35
  }
36
36
  /** All walkthrough topics this CLI knows. */
37
37
  export declare const WALKTHROUGH_TOPICS: readonly WalkthroughTopic[];
38
- /** Pure data accessor — no I/O. Throws on unknown topic. */
38
+ /** Pure data accessor - no I/O. Throws on unknown topic. */
39
39
  export declare function loadWalkthrough(topic: WalkthroughTopic): WalkthroughResult;
40
40
  /** List all walkthroughs (for `vibe guide --list` / no-arg invocation). */
41
41
  export declare function listWalkthroughs(): Array<{
@@ -22,6 +22,12 @@ export interface StructuredError {
22
22
  retryWith?: string[];
23
23
  recoverable?: boolean;
24
24
  retryable: boolean;
25
+ /**
26
+ * Structured context carried alongside the failure, so a refusal can hand
27
+ * back the evidence it refused on instead of forcing a second call. Used by
28
+ * the `--max-cost` gate to return the priced build plan with the refusal.
29
+ */
30
+ data?: Record<string, unknown>;
25
31
  }
26
32
  export declare function usageError(msg: string, suggestion?: string): StructuredError;
27
33
  export declare function authError(envVar: string, provider: string): StructuredError;
@@ -29,6 +35,21 @@ export declare function apiError(msg: string, retryable?: boolean): StructuredEr
29
35
  export declare function notFoundError(path: string): StructuredError;
30
36
  export declare function networkError(msg: string): StructuredError;
31
37
  export declare function generalError(msg: string, suggestion?: string): StructuredError;
38
+ /**
39
+ * The `--max-cost` refusal. A command that declines to spend is a failure, so
40
+ * it takes the structured error path like every other refusal: `success:false`
41
+ * on stderr, exit 1. `data` carries the priced plan the refusal was based on,
42
+ * so an agent gets the estimate and the reason from one call.
43
+ *
44
+ * `recoverable: true` because the caller has two real ways forward (raise the
45
+ * ceiling, or narrow the scope), both spelled out in `retryWith`.
46
+ */
47
+ export declare function costCapError(opts: {
48
+ estimatedCostUsd: number;
49
+ maxCostUsd: number;
50
+ retryWith: string[];
51
+ data?: Record<string, unknown>;
52
+ }): StructuredError;
32
53
  /** Output structured error then exit */
33
54
  export declare function exitWithError(err: StructuredError): never;
34
55
  /** Check if --json flag is active */