@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.
- package/dist/index.js +463 -7
- 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.
|
|
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.
|
|
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.
|
|
186
|
-
"@vibeframe/core": "0.
|
|
185
|
+
"@vibeframe/ai-providers": "0.71.0",
|
|
186
|
+
"@vibeframe/core": "0.71.0"
|
|
187
187
|
},
|
|
188
188
|
"engines": {
|
|
189
189
|
"node": ">=20"
|