@vibeframe/cli 0.106.4 → 0.106.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -159,7 +159,11 @@ function buildMcpDispatcher(manifest) {
159
159
  workingDirectory: process.cwd(),
160
160
  surface: "mcp"
161
161
  });
162
- const text = result.success ? JSON.stringify({ success: true, ...result.data }) : `${name} failed: ${result.error ?? "unknown error"}`;
162
+ const text = result.success ? JSON.stringify({ success: true, ...result.data }) : result.data ? JSON.stringify({
163
+ success: false,
164
+ error: result.error ?? "unknown error",
165
+ ...result.data
166
+ }) : `${name} failed: ${result.error ?? "unknown error"}`;
163
167
  return { content: [{ type: "text", text }] };
164
168
  } catch (error) {
165
169
  const msg = error instanceof Error ? error.message : String(error);
@@ -9,6 +9,7 @@ var EXPLICIT_COMMAND_METADATA = {
9
9
  build: { surface: "public", note: "Primary storyboard-to-video build engine." },
10
10
  render: { surface: "public", note: "Project render entrypoint." },
11
11
  doctor: { surface: "public", note: "System and provider health check." },
12
+ host: { surface: "public", note: "Codex, Claude, and Cursor app integration setup." },
12
13
  guide: { surface: "public", note: "Workflow chooser and first-run guidance." },
13
14
  demo: { surface: "advanced", note: "Smoke-test/demo helper, not a core workflow." },
14
15
  run: { surface: "agent", note: "Automation surface for YAML pipelines." },
@@ -7733,6 +7733,18 @@ a host agent's built-in image/audio generation tool for VibeFrame project
7733
7733
  assets unless the user explicitly requests an external, non-VibeFrame
7734
7734
  asset.
7735
7735
 
7736
+ ## App host setup
7737
+
7738
+ VibeFrame is CLI-first, not terminal-only. Codex, Claude Code, and Cursor can
7739
+ drive this project through shell commands, and app hosts can use the MCP server
7740
+ as a typed tool surface.
7741
+
7742
+ \`\`\`bash
7743
+ vibe host setup all # print Codex/Claude/Cursor snippets
7744
+ vibe host setup all --write # write project/app config
7745
+ vibe host doctor all --json # verify readiness
7746
+ \`\`\`
7747
+
7736
7748
  ## Skills \u2014 USE THESE FIRST
7737
7749
 
7738
7750
  @SKILL.md
@@ -50485,6 +50497,7 @@ var EXPLICIT_COMMAND_METADATA = {
50485
50497
  build: { surface: "public", note: "Primary storyboard-to-video build engine." },
50486
50498
  render: { surface: "public", note: "Project render entrypoint." },
50487
50499
  doctor: { surface: "public", note: "System and provider health check." },
50500
+ host: { surface: "public", note: "Codex, Claude, and Cursor app integration setup." },
50488
50501
  guide: { surface: "public", note: "Workflow chooser and first-run guidance." },
50489
50502
  demo: { surface: "advanced", note: "Smoke-test/demo helper, not a core workflow." },
50490
50503
  run: { surface: "agent", note: "Automation surface for YAML pipelines." },
@@ -52307,6 +52320,8 @@ var SCENE_PRESETS2 = [
52307
52320
  "kinetic-type",
52308
52321
  "product-shot"
52309
52322
  ];
52323
+ var PROJECT_DIR_DESCRIPTION = "Project directory. Defaults to the surface's cwd; in MCP hosts, relative paths resolve under the configured server workspace.";
52324
+ var INIT_DIR_DESCRIPTION = "Project directory to create. Prefer a project name or workspace-relative path; in MCP hosts, relative paths resolve under the configured server workspace. Do not use /tmp or /home/claude unless the user explicitly asks.";
52310
52325
  var sceneStylesSchema = external_exports.object({
52311
52326
  name: external_exports.string().optional().describe("Style name or slug (e.g. 'Swiss Pulse', 'swiss-pulse'). Omit to list all 8.")
52312
52327
  });
@@ -52366,7 +52381,7 @@ var sceneStylesTool = defineTool({
52366
52381
  }
52367
52382
  });
52368
52383
  var sceneInitSchema = external_exports.object({
52369
- dir: external_exports.string().describe("Project directory (created if missing)."),
52384
+ dir: external_exports.string().describe(INIT_DIR_DESCRIPTION),
52370
52385
  name: external_exports.string().optional().describe("Project name. Defaults to the directory basename."),
52371
52386
  aspect: external_exports.enum(["16:9", "9:16", "1:1", "4:5"]).optional().describe("Aspect ratio. Default 16:9."),
52372
52387
  duration: external_exports.number().optional().describe("Default root composition duration in seconds. Default 10.")
@@ -52413,7 +52428,7 @@ var sceneAddSchema = external_exports.object({
52413
52428
  visuals: external_exports.string().optional().describe("Image prompt \u2014 generates assets/scene-<id>.png via the configured image provider."),
52414
52429
  headline: external_exports.string().optional().describe("Visible headline text. Defaults to the humanised scene name."),
52415
52430
  kicker: external_exports.string().optional().describe("Small label above the headline (used by 'explainer' and 'product-shot' presets)."),
52416
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
52431
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION),
52417
52432
  insertInto: external_exports.string().optional().describe("Root composition file (relative to projectDir). Default 'index.html'."),
52418
52433
  imageProvider: external_exports.enum(["gemini", "openai"]).optional().describe("Image provider for visuals. Default 'gemini'."),
52419
52434
  voice: external_exports.string().optional().describe("ElevenLabs voice id or name."),
@@ -52474,7 +52489,7 @@ var sceneAddTool = defineTool({
52474
52489
  }
52475
52490
  });
52476
52491
  var sceneLintSchema = external_exports.object({
52477
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
52492
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION),
52478
52493
  root: external_exports.string().optional().describe("Root composition file relative to projectDir. Default 'index.html'."),
52479
52494
  fix: external_exports.boolean().optional().describe('Apply mechanical auto-fixes (currently: missing class="clip").')
52480
52495
  });
@@ -52532,7 +52547,7 @@ var sceneLintTool = defineTool({
52532
52547
  }
52533
52548
  });
52534
52549
  var sceneRepairSchema = external_exports.object({
52535
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
52550
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION),
52536
52551
  root: external_exports.string().optional().describe("Root composition file relative to projectDir. Default 'index.html'."),
52537
52552
  dryRun: external_exports.boolean().optional().describe("Preview deterministic repairs without writing files.")
52538
52553
  });
@@ -52561,7 +52576,7 @@ var sceneRepairTool = defineTool({
52561
52576
  }
52562
52577
  });
52563
52578
  var sceneRenderSchema = external_exports.object({
52564
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
52579
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION),
52565
52580
  root: external_exports.string().optional().describe("Root composition file relative to projectDir. Default 'index.html'."),
52566
52581
  beat: external_exports.string().optional().describe("Render only one storyboard beat using a temporary root."),
52567
52582
  output: external_exports.string().optional().describe("Output file path (relative paths resolve against projectDir)."),
@@ -52616,7 +52631,7 @@ var sceneRenderTool = defineTool({
52616
52631
  });
52617
52632
  var sceneBuildSchema = external_exports.object({
52618
52633
  projectDir: external_exports.string().optional().describe(
52619
- "Project directory containing STORYBOARD.md, DESIGN.md, index.html. Defaults to the surface's cwd."
52634
+ "Project directory containing STORYBOARD.md, DESIGN.md, index.html. Defaults to the surface's cwd; in MCP hosts, relative paths resolve under the configured server workspace."
52620
52635
  ),
52621
52636
  stage: external_exports.enum(["assets", "compose", "sync", "render", "all"]).optional().describe("Build stage to run. Default all."),
52622
52637
  beat: external_exports.string().optional().describe("Restrict asset/compose work to one beat id."),
@@ -52731,7 +52746,7 @@ var sceneBuildTool = defineTool({
52731
52746
  });
52732
52747
  var sceneInstallSkillSchema = external_exports.object({
52733
52748
  projectDir: external_exports.string().describe(
52734
- "Project directory containing STORYBOARD.md / DESIGN.md. Required to keep cross-host calls explicit and prevent accidental installs in unintended cwd."
52749
+ "Project directory containing STORYBOARD.md / DESIGN.md. Required to keep cross-host calls explicit; in MCP hosts, relative paths resolve under the configured server workspace."
52735
52750
  ),
52736
52751
  host: external_exports.enum(["claude-code", "cursor", "auto", "all"]).optional().describe(
52737
52752
  "Host layout target. 'auto' (default) detects installed agent hosts; 'all' writes every layout; 'claude-code' / 'cursor' force a single host. Codex / Aider read the universal SKILL.md via AGENTS.md so don't need a host-specific layout."
@@ -52781,7 +52796,7 @@ var sceneInstallSkillTool = defineTool({
52781
52796
  });
52782
52797
  var sceneComposePromptsSchema = external_exports.object({
52783
52798
  projectDir: external_exports.string().describe(
52784
- "Project directory containing STORYBOARD.md / DESIGN.md. Required to keep cross-host calls explicit."
52799
+ "Project directory containing STORYBOARD.md / DESIGN.md. Required to keep cross-host calls explicit; in MCP hosts, relative paths resolve under the configured server workspace."
52785
52800
  ),
52786
52801
  beat: external_exports.string().optional().describe(
52787
52802
  "Restrict the plan to a single beat by id (e.g. 'hook', '1'). Omit to emit every beat in the storyboard."
@@ -55082,13 +55097,14 @@ function sanitizeFileSegment2(value) {
55082
55097
  }
55083
55098
 
55084
55099
  // src/tools/manifest/inspect.ts
55100
+ var PROJECT_DIR_DESCRIPTION2 = "Project directory. Defaults to the surface's cwd; in MCP hosts, relative paths resolve under the configured server workspace.";
55085
55101
  var inspectProjectTool = defineTool({
55086
55102
  name: "inspect_project",
55087
55103
  category: "analyze",
55088
55104
  cost: "free",
55089
55105
  description: "Local project inspection: checks STORYBOARD.md, DESIGN.md, config, build-report, scene lint, composition files, and referenced assets. Writes review-report.json by default.",
55090
55106
  schema: external_exports.object({
55091
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
55107
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION2),
55092
55108
  beat: external_exports.string().optional().describe("Inspect only one storyboard beat where beat-scoped checks apply."),
55093
55109
  outputPath: external_exports.string().optional().describe("Optional review report path. Defaults to <project>/review-report.json."),
55094
55110
  report: external_exports.boolean().optional().describe("Write review-report.json. Default true.")
@@ -55103,7 +55119,11 @@ var inspectProjectTool = defineTool({
55103
55119
  });
55104
55120
  return {
55105
55121
  success: result.status !== "fail",
55106
- data: result,
55122
+ data: {
55123
+ ...result,
55124
+ workingDirectory: ctx.workingDirectory,
55125
+ projectDir
55126
+ },
55107
55127
  error: result.status === "fail" ? `${result.issues.filter((issue) => issue.severity === "error").length} project inspection error(s)` : void 0,
55108
55128
  humanLines: [
55109
55129
  `${result.status === "pass" ? "\u2705" : result.status === "warn" ? "\u26A0\uFE0F" : "\u274C"} Project inspection ${result.status} \u2014 score ${result.score}/100`,
@@ -55118,7 +55138,7 @@ var inspectRenderTool = defineTool({
55118
55138
  cost: "low",
55119
55139
  description: "Render inspection: runs cheap local video checks by default, optionally adds Gemini AI review with ai: true, and writes review-report.json by default.",
55120
55140
  schema: external_exports.object({
55121
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
55141
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION2),
55122
55142
  beat: external_exports.string().optional().describe("Inspect a render for one storyboard beat."),
55123
55143
  videoPath: external_exports.string().optional().describe("Rendered video path. Defaults to build-report outputPath or latest renders/* video."),
55124
55144
  outputPath: external_exports.string().optional().describe("Optional review report path. Defaults to <project>/review-report.json."),
@@ -55141,7 +55161,11 @@ var inspectRenderTool = defineTool({
55141
55161
  });
55142
55162
  return {
55143
55163
  success: true,
55144
- data: result2,
55164
+ data: {
55165
+ ...result2,
55166
+ workingDirectory: ctx.workingDirectory,
55167
+ projectDir
55168
+ },
55145
55169
  humanLines: [
55146
55170
  `Render inspection dry-run \u2014 ${result2.videoPath ? "render found" : "render missing"}`,
55147
55171
  ...result2.reportPath ? [`report: ${result2.reportPath}`] : []
@@ -55159,7 +55183,11 @@ var inspectRenderTool = defineTool({
55159
55183
  });
55160
55184
  return {
55161
55185
  success: result.status !== "fail",
55162
- data: result,
55186
+ data: {
55187
+ ...result,
55188
+ workingDirectory: ctx.workingDirectory,
55189
+ projectDir
55190
+ },
55163
55191
  error: result.status === "fail" ? `${result.issues.filter((issue) => issue.severity === "error").length} render inspection error(s)` : void 0,
55164
55192
  humanLines: [
55165
55193
  `${result.status === "pass" ? "\u2705" : result.status === "warn" ? "\u26A0\uFE0F" : "\u274C"} Render inspection ${result.status} \u2014 score ${result.score}/100`,
@@ -55535,7 +55563,7 @@ var generateBackgroundTool = defineTool({
55535
55563
  schema: external_exports.object({
55536
55564
  description: external_exports.string().describe("Background description / image prompt."),
55537
55565
  aspect: external_exports.enum(["16:9", "9:16", "1:1"]).optional().describe("Aspect ratio. Default '16:9'."),
55538
- output: external_exports.string().optional().describe("Output PNG path. Relative paths resolve against the surface's cwd.")
55566
+ output: external_exports.string().optional().describe("Output PNG path. Relative paths resolve against the surface's cwd; in MCP hosts, that is the configured server workspace.")
55539
55567
  }),
55540
55568
  async execute(args) {
55541
55569
  const result = await executeBackground(args);
@@ -56072,8 +56100,9 @@ function stripUndefined3(value) {
56072
56100
 
56073
56101
  // src/tools/manifest/storyboard.ts
56074
56102
  init_build_plan();
56103
+ var PROJECT_DIR_DESCRIPTION3 = "Project directory. Defaults to the surface's cwd; in MCP hosts, relative paths resolve under the configured server workspace.";
56075
56104
  var projectDirSchema = external_exports.object({
56076
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd.")
56105
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3)
56077
56106
  });
56078
56107
  async function readStoryboard(projectDir) {
56079
56108
  const path2 = resolve52(projectDir, "STORYBOARD.md");
@@ -56142,7 +56171,7 @@ var storyboardGetTool = defineTool({
56142
56171
  cost: "free",
56143
56172
  description: "Return one STORYBOARD.md beat as structured data.",
56144
56173
  schema: external_exports.object({
56145
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
56174
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
56146
56175
  beat: external_exports.string().describe("Beat id to return.")
56147
56176
  }),
56148
56177
  async execute(args, ctx) {
@@ -56164,7 +56193,7 @@ var storyboardSetTool = defineTool({
56164
56193
  cost: "free",
56165
56194
  description: "Set or unset one cue on one beat in STORYBOARD.md.",
56166
56195
  schema: external_exports.object({
56167
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
56196
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
56168
56197
  beat: external_exports.string().describe("Beat id to mutate."),
56169
56198
  key: external_exports.string().describe("Cue key to set."),
56170
56199
  value: external_exports.string().optional().describe("Cue value. Required unless unset is true."),
@@ -56200,7 +56229,7 @@ var storyboardMoveTool = defineTool({
56200
56229
  cost: "free",
56201
56230
  description: "Move one beat after another beat in STORYBOARD.md.",
56202
56231
  schema: external_exports.object({
56203
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
56232
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
56204
56233
  beat: external_exports.string().describe("Beat id to move."),
56205
56234
  after: external_exports.string().describe("Beat id that should precede the moved beat.")
56206
56235
  }),
@@ -56230,7 +56259,7 @@ var storyboardReviseTool = defineTool({
56230
56259
  cost: "low",
56231
56260
  description: "Revise an existing STORYBOARD.md from a natural-language request. Reads project context, validates the revised storyboard, and writes unless dryRun is true.",
56232
56261
  schema: external_exports.object({
56233
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
56262
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
56234
56263
  request: external_exports.string().describe("Revision request, e.g. 'make the hook punchier and shorten to 30 seconds'."),
56235
56264
  durationSec: external_exports.number().optional().describe("Target total duration in seconds."),
56236
56265
  composer: external_exports.enum(["claude", "openai", "gemini"]).optional().describe("Revision LLM provider. Defaults to project config or available API keys."),
@@ -56261,7 +56290,7 @@ var planTool = defineTool({
56261
56290
  cost: "free",
56262
56291
  description: "Read STORYBOARD.md and return the build plan, missing artifacts, provider needs, and estimated cost.",
56263
56292
  schema: external_exports.object({
56264
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
56293
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
56265
56294
  stage: external_exports.enum(["assets", "compose", "sync", "render", "all"]).optional().describe("Stage to plan. Default all."),
56266
56295
  beat: external_exports.string().optional().describe("Restrict the plan to one beat id."),
56267
56296
  mode: external_exports.enum(["agent", "batch", "auto"]).optional().describe("Build mode. Default auto."),
@@ -60821,6 +60850,7 @@ var guideTools = [guideTool];
60821
60850
  // src/tools/manifest/status.ts
60822
60851
  import { resolve as resolve62 } from "node:path";
60823
60852
  init_status_jobs();
60853
+ var PROJECT_DIR_DESCRIPTION4 = "Project directory. Defaults to the surface's cwd; in MCP hosts, relative paths resolve under the configured server workspace.";
60824
60854
  var statusJobTool = defineTool({
60825
60855
  name: "status_job",
60826
60856
  category: "status",
@@ -60828,7 +60858,7 @@ var statusJobTool = defineTool({
60828
60858
  description: "Read one local async job record and optionally refresh supported provider status. Supports Runway/Kling video and Replicate music live checks.",
60829
60859
  schema: external_exports.object({
60830
60860
  jobId: external_exports.string().describe("Local job id returned by a no-wait command."),
60831
- projectDir: external_exports.string().optional().describe("Project directory containing .vibeframe/jobs. Defaults to nearest project root."),
60861
+ projectDir: external_exports.string().optional().describe("Project directory containing .vibeframe/jobs. Defaults to nearest project root; in MCP hosts, relative paths resolve under the configured server workspace."),
60832
60862
  refresh: external_exports.boolean().optional().describe("Call provider status APIs when supported. Default true."),
60833
60863
  wait: external_exports.boolean().optional().describe("Wait for completion when supported."),
60834
60864
  output: external_exports.string().optional().describe("Download result media to this path when complete.")
@@ -60862,7 +60892,7 @@ var statusProjectTool = defineTool({
60862
60892
  cost: "free",
60863
60893
  description: "Summarize build-report.json, review-report.json, and local async job records for a VibeFrame project.",
60864
60894
  schema: external_exports.object({
60865
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
60895
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION4),
60866
60896
  refresh: external_exports.boolean().optional().describe("Refresh active supported jobs before summarizing. Default false.")
60867
60897
  }),
60868
60898
  async execute(args, ctx) {
@@ -60870,7 +60900,11 @@ var statusProjectTool = defineTool({
60870
60900
  const result = await inspectProjectStatus(projectDir, { refresh: args.refresh === true });
60871
60901
  return {
60872
60902
  success: true,
60873
- data: result,
60903
+ data: {
60904
+ ...result,
60905
+ workingDirectory: ctx.workingDirectory,
60906
+ projectDir
60907
+ },
60874
60908
  humanLines: [
60875
60909
  `Project status: ${result.status} (${result.currentStage}), ${result.jobs.active} active job(s), ${result.jobs.failed} failed job(s)`,
60876
60910
  ...result.build ? [`build: ${result.build.phase ?? "unknown"}`] : [],
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vibeframe/cli",
3
- "version": "0.106.4",
4
- "description": "VibeFrame CLI - natural language video editing from the terminal",
3
+ "version": "0.106.6",
4
+ "description": "VibeFrame CLI - agentic video workflow runtime",
5
5
  "private": false,
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -83,8 +83,8 @@
83
83
  "tsx": "^4.21.0",
84
84
  "typescript": "^5.3.3",
85
85
  "vitest": "^1.2.2",
86
- "@vibeframe/ai-providers": "0.106.4",
87
- "@vibeframe/core": "0.106.4"
86
+ "@vibeframe/ai-providers": "0.106.6",
87
+ "@vibeframe/core": "0.106.6"
88
88
  },
89
89
  "engines": {
90
90
  "node": ">=20"