@vibeframe/cli 0.70.0 → 0.71.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.
Files changed (2) hide show
  1. package/dist/index.js +463 -7
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -29108,6 +29108,26 @@ function detectAgentHosts(env2 = process.env) {
29108
29108
  detected: false,
29109
29109
  signals: [],
29110
29110
  projectFiles: ["AGENTS.md", ".aider.conf.yml"]
29111
+ },
29112
+ {
29113
+ id: "gemini-cli",
29114
+ label: "Gemini CLI",
29115
+ detected: false,
29116
+ signals: [],
29117
+ // Per https://geminicli.com/docs/cli/gemini-md/ Gemini CLI's primary
29118
+ // context file is GEMINI.md; AGENTS.md is the cross-tool fallback
29119
+ // VibeFrame writes by default. Both are honoured.
29120
+ projectFiles: ["GEMINI.md", "AGENTS.md", ".gemini/"]
29121
+ },
29122
+ {
29123
+ id: "opencode",
29124
+ label: "OpenCode",
29125
+ detected: false,
29126
+ signals: [],
29127
+ // sst/opencode officially supports the agents.md spec — AGENTS.md at
29128
+ // project root is the standard place. Local config also under
29129
+ // `.opencode/` per https://opencode.ai/docs/config/.
29130
+ projectFiles: ["AGENTS.md", ".opencode/"]
29111
29131
  }
29112
29132
  ].map((host) => {
29113
29133
  const signals2 = [];
@@ -29165,14 +29185,21 @@ var init_agent_host_detect = __esm({
29165
29185
  "claude-code": "claude",
29166
29186
  codex: "codex",
29167
29187
  cursor: "cursor",
29168
- aider: "aider"
29188
+ aider: "aider",
29189
+ "gemini-cli": "gemini",
29190
+ opencode: "opencode"
29169
29191
  };
29170
29192
  HOST_CONFIG_DIRS = {
29171
29193
  "claude-code": ".claude",
29172
29194
  codex: ".codex",
29173
29195
  cursor: ".cursor",
29174
29196
  // some installs; macOS app stores prefs elsewhere
29175
- aider: null
29197
+ aider: null,
29198
+ "gemini-cli": ".gemini",
29199
+ // sst/opencode uses XDG-style `~/.config/opencode/` per
29200
+ // https://opencode.ai/docs/config/. The path is relative to $HOME so
29201
+ // the join in detectAgentHosts() resolves correctly.
29202
+ opencode: ".config/opencode"
29176
29203
  };
29177
29204
  }
29178
29205
  });
@@ -61356,6 +61383,363 @@ Audio:`);
61356
61383
  }
61357
61384
  });
61358
61385
 
61386
+ // src/commands/_shared/walkthroughs/walkthroughs.ts
61387
+ function loadWalkthrough(topic) {
61388
+ const meta = META[topic];
61389
+ const content = CONTENT[topic];
61390
+ if (!meta || !content) {
61391
+ throw new Error(`Unknown walkthrough topic: ${topic}`);
61392
+ }
61393
+ return {
61394
+ topic,
61395
+ title: meta.title,
61396
+ summary: meta.summary,
61397
+ steps: meta.steps,
61398
+ relatedCommands: meta.relatedCommands,
61399
+ content
61400
+ };
61401
+ }
61402
+ function listWalkthroughs() {
61403
+ return WALKTHROUGH_TOPICS.map((topic) => ({
61404
+ topic,
61405
+ title: META[topic].title,
61406
+ summary: META[topic].summary
61407
+ }));
61408
+ }
61409
+ function isWalkthroughTopic(value) {
61410
+ return typeof value === "string" && WALKTHROUGH_TOPICS.includes(value);
61411
+ }
61412
+ var SCENE_WALKTHROUGH, PIPELINE_WALKTHROUGH, META, CONTENT, WALKTHROUGH_TOPICS;
61413
+ var init_walkthroughs = __esm({
61414
+ "src/commands/_shared/walkthroughs/walkthroughs.ts"() {
61415
+ "use strict";
61416
+ SCENE_WALKTHROUGH = `# Scene authoring with vibe
61417
+
61418
+ A scene project is a directory that is **bilingual**: it works with both
61419
+ \`vibe\` and \`npx hyperframes\`. Each scene is one HTML file with scoped CSS
61420
+ and a paused GSAP timeline. Cheap to edit, cheap to lint, expensive only
61421
+ at render.
61422
+
61423
+ \`vibe scene build\` (v0.60+) is the supported one-shot driver from a
61424
+ written storyboard to an MP4. Plan H (v0.70) added \`--mode agent\` so the
61425
+ host agent itself authors the per-beat HTML \u2014 no internal LLM call.
61426
+
61427
+ ## Three authoring paths
61428
+
61429
+ | Path | Command | When to use |
61430
+ |---|---|---|
61431
+ | **One-shot (default, v0.60+)** | \`vibe scene build [project-dir]\` | STORYBOARD.md has YAML frontmatter + per-beat cues |
61432
+ | **High-craft (manual)** | \`DESIGN.md\` + Hyperframes skill in your agent | Maximum control: hand-author each scene |
61433
+ | **Quick draft** | \`vibe scene add --style <preset>\` | No agent or no API keys; fast iteration |
61434
+
61435
+ Recommend \`vibe scene build\` whenever the user has a STORYBOARD with
61436
+ narration / backdrop intent.
61437
+
61438
+ ## High-craft path
61439
+
61440
+ 1. \`vibe scene init my-promo --visual-style "Swiss Pulse"\` \u2014 seeds
61441
+ \`DESIGN.md\` (palette, typography, motion, transitions) plus the
61442
+ \`vibe.project.yaml\` / \`hyperframes.json\` / \`index.html\` scaffold.
61443
+ In Plan H this **also installs the Hyperframes skill** at the
61444
+ right place for your host (\`.claude/skills/hyperframes/\` for Claude
61445
+ Code, \`.cursor/rules/hyperframes.mdc\` for Cursor, universal
61446
+ \`SKILL.md\` for everyone else).
61447
+ 2. Read \`SKILL.md\` (or the host-specific copy) \u2014 Hyperframes
61448
+ framework rules, motion principles, type system, transition recipes.
61449
+ 3. Read \`DESIGN.md\` \u2014 project-specific palette / typography / motion
61450
+ signature (visual identity hard-gate).
61451
+ 4. Author each scene HTML directly under \`compositions/scene-<id>.html\`
61452
+ using the rules from steps 2 and 3. The skill enforces the visual
61453
+ identity contract \u2014 scenes that contradict DESIGN.md fail lint.
61454
+ 5. \`vibe scene lint --fix\` for mechanical issues, \`vibe scene render\`
61455
+ to MP4.
61456
+
61457
+ ## Quick-draft path
61458
+
61459
+ \`\`\`bash
61460
+ vibe scene init my-promo -r 16:9 -d 30
61461
+ vibe scene add intro --style announcement \\
61462
+ --headline "Ship videos, not clicks"
61463
+ vibe scene lint
61464
+ vibe scene render
61465
+ \`\`\`
61466
+
61467
+ \`vibe scene init\` is **idempotent** \u2014 running it on an existing
61468
+ Hyperframes directory merges \`hyperframes.json\` instead of clobbering it.
61469
+ Safe to invoke on user-provided projects.
61470
+
61471
+ ## Subcommands
61472
+
61473
+ \`\`\`bash
61474
+ vibe scene init <dir> [-r 16:9|9:16|1:1|4:5] [-d <sec>] [--visual-style "<name>"]
61475
+ vibe scene styles [<name>] # list / show vendored visual identities
61476
+ vibe scene install-skill [<dir>] [--host all] # retroactive Hyperframes-skill install
61477
+ vibe scene add <name> --style <preset> [...]
61478
+ vibe scene compose-prompts [<dir>] [--beat <id>] # H2: emit plan, no LLM call
61479
+ vibe scene lint [<root>] [--json] [--fix]
61480
+ vibe scene render [<root>] [--fps 30] [--quality standard] [--format mp4]
61481
+ vibe scene build [<dir>] [--mode agent|batch|auto] # H3 dispatch
61482
+ \`\`\`
61483
+
61484
+ ## Style presets (for \`vibe scene add --style\`)
61485
+
61486
+ - **simple** \u2014 backdrop + bottom caption (default)
61487
+ - **announcement** \u2014 single huge headline, gradient text
61488
+ - **explainer** \u2014 kicker + title + subtitle stack
61489
+ - **kinetic-type** \u2014 words animate in word-by-word
61490
+ - **product-shot** \u2014 corner label + bottom headline + slow zoom
61491
+
61492
+ All presets accept \`--narration <text|file>\`, \`--visuals <prompt>\`,
61493
+ \`--headline\`, \`--kicker\`. With \`--narration\`, scene duration auto-derives
61494
+ from the generated TTS audio.
61495
+
61496
+ ## STORYBOARD-to-MP4 (one command, v0.60+)
61497
+
61498
+ \`\`\`bash
61499
+ vibe scene init my-promo --visual-style "Swiss Pulse" -d 12
61500
+ # (edit STORYBOARD.md with per-beat YAML cues \u2014 narration, backdrop, duration)
61501
+ vibe scene build my-promo
61502
+ \`\`\`
61503
+
61504
+ \`vibe scene build\` reads the STORYBOARD frontmatter + per-beat cues,
61505
+ dispatches TTS + image-gen per beat, then either:
61506
+
61507
+ - **\`--mode agent\`** (default when an agent host is detected) \u2014 emits a
61508
+ \`needs-author\` plan via \`vibe scene compose-prompts\`. The host agent
61509
+ authors each \`compositions/scene-<id>.html\` itself, then re-invoking
61510
+ \`vibe scene build\` proceeds to lint + render.
61511
+ - **\`--mode batch\`** \u2014 VibeFrame runs an internal LLM (Claude / OpenAI /
61512
+ Gemini) to compose the HTML, then renders.
61513
+
61514
+ \`VIBE_BUILD_MODE\` env var overrides the auto-resolve.
61515
+
61516
+ ## Lint feedback loop
61517
+
61518
+ \`\`\`bash
61519
+ vibe scene lint --json --fix
61520
+ \`\`\`
61521
+
61522
+ Returns structured findings. The recommended loop: 1) run lint with
61523
+ \`--fix\` (mechanical fixes applied), 2) if \`errorCount > 0\`, edit the
61524
+ scene HTML, 3) re-lint. Cap retries at 3 \u2014 if errors persist, fall back
61525
+ to a template preset (\`vibe scene add <id> --style simple --force\`)
61526
+ and surface the error to the user.
61527
+
61528
+ ## When to use VibeFrame vs raw Hyperframes
61529
+
61530
+ | Task | Tool |
61531
+ |------|------|
61532
+ | Generate narration + image, then author scene | \`vibe scene add\` |
61533
+ | Generate a full scenes project from a STORYBOARD | \`vibe scene build\` |
61534
+ | Hand-tweak a single scene's animation | edit \`compositions/<file>.html\` directly |
61535
+ | Render the project | \`vibe scene render\` *or* \`npx hyperframes render\` (equivalent) |
61536
+ | Lint | \`vibe scene lint\` *or* \`npx hyperframes lint\` (equivalent) |
61537
+
61538
+ The \`vibe\` CLI adds asset generation, AI orchestration, and pipeline
61539
+ integration on top of Hyperframes' rendering primitives.
61540
+
61541
+ ## Quality checklist before render
61542
+
61543
+ - [ ] \`vibe scene lint\` exits 0 (or only warnings)
61544
+ - [ ] \`vibe doctor\` confirms a usable Chrome (required for render)
61545
+ - [ ] Root \`data-duration\` matches the sum of clip durations
61546
+ - [ ] Aspect ratio in \`vibe.project.yaml\` matches the destination platform
61547
+ `;
61548
+ PIPELINE_WALKTHROUGH = `# YAML pipelines (Video as Code)
61549
+
61550
+ A pipeline is a YAML manifest with steps that reference each other's
61551
+ outputs. \`vibe run pipeline.yaml\` executes them with checkpointing and
61552
+ cost estimation.
61553
+
61554
+ ## Minimal skeleton
61555
+
61556
+ \`\`\`yaml
61557
+ name: promo-video
61558
+ description: 15s product teaser
61559
+ steps:
61560
+ - id: backdrop
61561
+ action: generate-image
61562
+ prompt: "sleek product shot on white background"
61563
+ output: backdrop.png
61564
+ - id: scene
61565
+ action: generate-video
61566
+ image: $backdrop.output # reference previous step output
61567
+ prompt: "slow camera pan"
61568
+ duration: 5
61569
+ output: scene.mp4
61570
+ - id: voice
61571
+ action: generate-tts
61572
+ text: "Meet the new standard."
61573
+ output: voice.mp3
61574
+ - id: final
61575
+ action: compose
61576
+ video: $scene.output
61577
+ audio: $voice.output
61578
+ output: final.mp4
61579
+ \`\`\`
61580
+
61581
+ ## Supported actions
61582
+
61583
+ - \`generate-image\`, \`generate-video\`, \`generate-tts\`, \`generate-music\`,
61584
+ \`generate-sound-effect\`, \`generate-storyboard\`, \`generate-motion\`
61585
+ - \`edit-silence-cut\`, \`edit-jump-cut\`, \`edit-caption\`, \`edit-grade\`,
61586
+ \`edit-reframe\`, \`edit-speed-ramp\`, \`edit-fade\`, \`edit-noise-reduce\`,
61587
+ \`edit-text-overlay\`, \`edit-fill-gaps\`
61588
+ - \`analyze-media\`, \`analyze-video\`, \`analyze-review\`, \`analyze-suggest\`
61589
+ - \`audio-transcribe\`, \`audio-isolate\`, \`audio-voice-clone\`, \`audio-dub\`,
61590
+ \`audio-duck\`
61591
+ - \`detect-scenes\`, \`detect-silence\`, \`detect-beats\`
61592
+ - \`compose\`, \`export\`
61593
+ - \`scene-build\` (Plan H one-shot driver) and \`scene-render\`
61594
+ - \`compose-scenes-with-skills\` (internal-LLM compose pass)
61595
+
61596
+ The full set lives in \`packages/cli/src/pipeline/executor.ts\`.
61597
+
61598
+ ## Variable references
61599
+
61600
+ - \`$<step-id>.output\` \u2014 previous step's output path
61601
+ - \`$<step-id>.result.<field>\` \u2014 structured field from JSON result
61602
+ - \`\${ENV_VAR}\` \u2014 environment variable
61603
+ - Values can be templated: \`"\${SCRIPT_TITLE} - Episode \${EPISODE}"\`
61604
+
61605
+ ## Running
61606
+
61607
+ \`\`\`bash
61608
+ vibe run pipeline.yaml --dry-run # plan + cost estimate, no execution
61609
+ vibe run pipeline.yaml # execute
61610
+ vibe run pipeline.yaml --resume # retry from last successful step
61611
+ vibe run pipeline.yaml --from scene # start at specific step
61612
+ vibe run pipeline.yaml --provider-video kling # override provider
61613
+ \`\`\`
61614
+
61615
+ Checkpoints land next to the YAML: \`pipeline.yaml.checkpoint.json\`.
61616
+
61617
+ ## Authoring tips
61618
+
61619
+ 1. **Start from examples** \u2014 \`examples/demo-pipeline.yaml\` (FFmpeg-only,
61620
+ no keys), \`examples/promo-video.yaml\` (AI providers).
61621
+ 2. **Dry-run first** \u2014 you see estimated cost and resolved variable
61622
+ graph before spending API credits.
61623
+ 3. **Keep step ids short and descriptive** (\`intro\`, \`scene1\`, \`voice\`,
61624
+ \`bgm\`) \u2014 they appear in logs and variable refs.
61625
+ 4. **Name outputs** with extensions matching the action (\`.mp4\`, \`.mp3\`,
61626
+ \`.png\`, \`.json\`).
61627
+ 5. **Declare \`budget:\`** on expensive pipelines:
61628
+ \`\`\`yaml
61629
+ budget:
61630
+ tokens: 500_000
61631
+ max_tool_errors: 3
61632
+ cost_usd: 5.00
61633
+ \`\`\`
61634
+ 6. **Split large pipelines** into smaller YAML files and compose via
61635
+ \`action: run-pipeline\` (nested).
61636
+
61637
+ ## Converting ad-hoc shell sessions to pipelines
61638
+
61639
+ When the user has a working shell sequence, extract steps:
61640
+
61641
+ - Each \`vibe ...\` command becomes one step
61642
+ - File outputs become step outputs; downstream \`-i <file>\` references
61643
+ become \`$<id>.output\`
61644
+ - Shared parameters move to a top-level \`defaults:\` section
61645
+ - Wrap the entire chain in a \`name:\` + \`steps:\` skeleton
61646
+
61647
+ The \`compose\` action is the catch-all assembly step (audio mux, video
61648
+ overlay, etc.) \u2014 useful at the tail of a pipeline.
61649
+ `;
61650
+ META = {
61651
+ scene: {
61652
+ title: "Scene authoring with vibe",
61653
+ summary: "Author per-scene HTML compositions and render to MP4 (BUILD flow)",
61654
+ steps: [
61655
+ 'Run `vibe scene init <dir> --visual-style "<style name>"` to scaffold the project + install the Hyperframes skill (Plan H).',
61656
+ "Edit `STORYBOARD.md` with per-beat YAML cues (narration / backdrop / duration).",
61657
+ "Read `SKILL.md` for the framework rules and `DESIGN.md` for the visual-identity hard-gate.",
61658
+ "Run `vibe scene build <dir>`. With an agent host detected, the CLI emits a `needs-author` plan; the host agent authors each `compositions/scene-<id>.html` and re-invokes to render.",
61659
+ "Run `vibe scene lint --fix` to validate, then `vibe scene render` to produce the MP4."
61660
+ ],
61661
+ relatedCommands: [
61662
+ "vibe scene init",
61663
+ "vibe scene styles",
61664
+ "vibe scene install-skill",
61665
+ "vibe scene compose-prompts",
61666
+ "vibe scene build",
61667
+ "vibe scene lint",
61668
+ "vibe scene render",
61669
+ "vibe scene add"
61670
+ ]
61671
+ },
61672
+ pipeline: {
61673
+ title: "YAML pipelines (Video as Code)",
61674
+ summary: "Author and run reproducible multi-step video workflows",
61675
+ steps: [
61676
+ "Sketch the workflow as YAML \u2014 `name`, `description`, then `steps:` with `id` + `action` + inputs/outputs.",
61677
+ "Reference previous step outputs via `$<step-id>.output` (or `$<step-id>.result.<field>` for structured returns).",
61678
+ "Run `vibe run pipeline.yaml --dry-run` to see the resolved graph + cost estimate before spending API budget.",
61679
+ "Add a `budget:` block (tokens / cost_usd / max_tool_errors) to cap expensive runs.",
61680
+ "Run `vibe run pipeline.yaml` to execute. Failed steps checkpoint to `pipeline.yaml.checkpoint.json`; resume with `--resume`."
61681
+ ],
61682
+ relatedCommands: [
61683
+ "vibe run",
61684
+ "vibe schema --list",
61685
+ "vibe doctor"
61686
+ ]
61687
+ }
61688
+ };
61689
+ CONTENT = {
61690
+ scene: SCENE_WALKTHROUGH,
61691
+ pipeline: PIPELINE_WALKTHROUGH
61692
+ };
61693
+ WALKTHROUGH_TOPICS = ["scene", "pipeline"];
61694
+ }
61695
+ });
61696
+
61697
+ // src/tools/manifest/walkthrough.ts
61698
+ var walkthroughSchema, walkthroughTool, walkthroughTools;
61699
+ var init_walkthrough = __esm({
61700
+ "src/tools/manifest/walkthrough.ts"() {
61701
+ "use strict";
61702
+ init_zod();
61703
+ init_define_tool();
61704
+ init_walkthroughs();
61705
+ walkthroughSchema = external_exports.object({
61706
+ topic: external_exports.enum(WALKTHROUGH_TOPICS).optional().describe(
61707
+ "Walkthrough topic to load. Omit to list every available walkthrough \u2014 useful for discovery on first contact."
61708
+ )
61709
+ });
61710
+ walkthroughTool = defineTool({
61711
+ name: "walkthrough",
61712
+ category: "agent",
61713
+ cost: "free",
61714
+ description: "Load the step-by-step authoring guide for a vibe workflow (BUILD scene authoring, YAML pipeline authoring). Universal CLI-equivalent of Claude Code's /vibe-* slash commands \u2014 any host agent that calls this tool gets the same content the slash menu delivers in Claude Code, with no Claude Code dependency. Without a topic, returns the catalog of walkthroughs for discovery.",
61715
+ schema: walkthroughSchema,
61716
+ async execute(args) {
61717
+ if (!args.topic) {
61718
+ const topics = listWalkthroughs();
61719
+ return {
61720
+ success: true,
61721
+ data: { action: "list", topics },
61722
+ humanLines: [
61723
+ `Available walkthroughs: ${topics.map((t) => t.topic).join(", ")}.`,
61724
+ `Call again with topic to load full content.`
61725
+ ]
61726
+ };
61727
+ }
61728
+ const result = loadWalkthrough(args.topic);
61729
+ return {
61730
+ success: true,
61731
+ data: { action: "show", ...result },
61732
+ humanLines: [
61733
+ `Loaded walkthrough: ${result.title}.`,
61734
+ `${result.steps.length} steps, ${result.relatedCommands.length} related commands, ${result.content.length} chars of guide content.`
61735
+ ]
61736
+ };
61737
+ }
61738
+ });
61739
+ walkthroughTools = [walkthroughTool];
61740
+ }
61741
+ });
61742
+
61359
61743
  // src/tools/manifest/index.ts
61360
61744
  var manifest_exports = {};
61361
61745
  __export(manifest_exports, {
@@ -61370,7 +61754,8 @@ __export(manifest_exports, {
61370
61754
  pipelineTools: () => pipelineTools,
61371
61755
  projectTools: () => projectTools,
61372
61756
  sceneTools: () => sceneTools,
61373
- timelineTools: () => timelineTools
61757
+ timelineTools: () => timelineTools,
61758
+ walkthroughTools: () => walkthroughTools
61374
61759
  });
61375
61760
  var manifest;
61376
61761
  var init_manifest = __esm({
@@ -61387,6 +61772,7 @@ var init_manifest = __esm({
61387
61772
  init_project2();
61388
61773
  init_export2();
61389
61774
  init_agent_only();
61775
+ init_walkthrough();
61390
61776
  manifest = [
61391
61777
  ...sceneTools,
61392
61778
  ...audioTools,
@@ -61398,7 +61784,8 @@ var init_manifest = __esm({
61398
61784
  ...timelineTools,
61399
61785
  ...projectTools,
61400
61786
  ...exportTools,
61401
- ...agentOnlyTools
61787
+ ...agentOnlyTools,
61788
+ ...walkthroughTools
61402
61789
  ];
61403
61790
  }
61404
61791
  });
@@ -61602,7 +61989,7 @@ init_source();
61602
61989
  // package.json
61603
61990
  var package_default = {
61604
61991
  name: "@vibeframe/cli",
61605
- version: "0.70.0",
61992
+ version: "0.71.0",
61606
61993
  description: "VibeFrame CLI - natural language video editing from the terminal",
61607
61994
  private: false,
61608
61995
  license: "MIT",
@@ -68651,7 +69038,7 @@ defaults:
68651
69038
 
68652
69039
  // src/commands/init.ts
68653
69040
  init_output();
68654
- var VALID_AGENTS = ["claude-code", "codex", "cursor", "aider", "all", "auto"];
69041
+ var VALID_AGENTS = ["claude-code", "codex", "cursor", "aider", "gemini-cli", "opencode", "all", "auto"];
68655
69042
  var initCommand = new Command("init").description("Scaffold project-scope agent files (AGENTS.md / CLAUDE.md / .env.example / .gitignore)").argument("[project-dir]", "Project directory (defaults to cwd)", ".").option("--agent <id>", `Agent target: ${VALID_AGENTS.join(" | ")}`, "auto").option("--force", "Overwrite existing files instead of skipping").option("--dry-run", "Print the file list without writing anything").action(async (projectDirArg, options) => {
68656
69043
  const agent = options.agent;
68657
69044
  if (!VALID_AGENTS.includes(agent)) {
@@ -68744,7 +69131,7 @@ var initCommand = new Command("init").description("Scaffold project-scope agent
68744
69131
  });
68745
69132
  function resolveTargets(agent) {
68746
69133
  if (agent === "all") {
68747
- return ["claude-code", "codex", "cursor", "aider"];
69134
+ return ["claude-code", "codex", "cursor", "aider", "gemini-cli", "opencode"];
68748
69135
  }
68749
69136
  if (agent === "auto") {
68750
69137
  const detected = detectedAgentHosts().map((h) => h.id);
@@ -70301,6 +70688,74 @@ function getEnvVar(provider) {
70301
70688
  return envVars[provider] || "API_KEY";
70302
70689
  }
70303
70690
 
70691
+ // src/commands/walkthrough.ts
70692
+ init_esm();
70693
+ init_source();
70694
+ init_walkthroughs();
70695
+ init_output();
70696
+ var walkthroughCommand = new Command("walkthrough").description("Step-by-step authoring guide for a vibe workflow (universal /vibe-* slash-command equivalent)").argument("[topic]", `Walkthrough topic: ${WALKTHROUGH_TOPICS.join(" | ")}. Omit to list all.`).option("--list", "List available walkthroughs and exit").action(async (topicArg, options) => {
70697
+ if (!topicArg || options.list) {
70698
+ const topics = listWalkthroughs();
70699
+ if (isJsonMode()) {
70700
+ outputResult({
70701
+ command: "walkthrough",
70702
+ action: "list",
70703
+ topics
70704
+ });
70705
+ return;
70706
+ }
70707
+ console.log();
70708
+ console.log(source_default.bold.cyan("Available walkthroughs"));
70709
+ console.log(source_default.dim("\u2500".repeat(60)));
70710
+ for (const t of topics) {
70711
+ console.log(` ${source_default.bold(t.topic.padEnd(10))} ${source_default.dim(t.summary)}`);
70712
+ }
70713
+ console.log();
70714
+ console.log(source_default.dim("Run `vibe walkthrough <topic>` for the full guide."));
70715
+ console.log(source_default.dim("Add `--json` to get structured output for an agent host."));
70716
+ console.log();
70717
+ return;
70718
+ }
70719
+ if (!isWalkthroughTopic(topicArg)) {
70720
+ exitWithError(usageError(
70721
+ `Unknown walkthrough topic: ${topicArg}`,
70722
+ `Valid topics: ${WALKTHROUGH_TOPICS.join(", ")}`
70723
+ ));
70724
+ }
70725
+ const topic = topicArg;
70726
+ const result = loadWalkthrough(topic);
70727
+ if (isJsonMode()) {
70728
+ outputResult({
70729
+ command: "walkthrough",
70730
+ action: "show",
70731
+ ...result
70732
+ });
70733
+ return;
70734
+ }
70735
+ console.log();
70736
+ console.log(source_default.bold.cyan(result.title));
70737
+ console.log(source_default.dim("\u2500".repeat(60)));
70738
+ console.log(source_default.dim(result.summary));
70739
+ console.log();
70740
+ console.log(source_default.bold("Quick steps"));
70741
+ console.log(source_default.dim("\u2500".repeat(60)));
70742
+ for (let i = 0; i < result.steps.length; i++) {
70743
+ console.log(` ${source_default.cyan(`${i + 1}.`)} ${result.steps[i]}`);
70744
+ }
70745
+ console.log();
70746
+ console.log(source_default.bold("Related commands"));
70747
+ console.log(source_default.dim("\u2500".repeat(60)));
70748
+ for (const cmd of result.relatedCommands) {
70749
+ console.log(` ${source_default.cyan(cmd)}`);
70750
+ }
70751
+ console.log();
70752
+ console.log(source_default.bold("Full guide"));
70753
+ console.log(source_default.dim("\u2500".repeat(60)));
70754
+ console.log();
70755
+ console.log(result.content);
70756
+ console.log();
70757
+ });
70758
+
70304
70759
  // src/index.ts
70305
70760
  init_api_key();
70306
70761
 
@@ -70501,6 +70956,7 @@ program2.addCommand(detectCommand);
70501
70956
  program2.addCommand(batchCommand);
70502
70957
  program2.addCommand(schemaCommand);
70503
70958
  program2.addCommand(contextCommand);
70959
+ program2.addCommand(walkthroughCommand);
70504
70960
  program2.addCommand(mediaCommand, { hidden: true });
70505
70961
  function propagateErrorHandling(cmd) {
70506
70962
  for (const sub of cmd.commands) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/cli",
3
- "version": "0.70.0",
3
+ "version": "0.71.0",
4
4
  "description": "VibeFrame CLI - natural language video editing from the terminal",
5
5
  "private": false,
6
6
  "license": "MIT",
@@ -182,8 +182,8 @@
182
182
  "tsx": "^4.21.0",
183
183
  "typescript": "^5.3.3",
184
184
  "vitest": "^1.2.2",
185
- "@vibeframe/ai-providers": "0.70.0",
186
- "@vibeframe/core": "0.70.0"
185
+ "@vibeframe/ai-providers": "0.71.0",
186
+ "@vibeframe/core": "0.71.0"
187
187
  },
188
188
  "engines": {
189
189
  "node": ">=20"