@vibeframe/cli 0.106.5 → 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.
@@ -41,7 +41,7 @@ export interface HostDoctorResult {
41
41
  }
42
42
  export declare function hostDefinitions(_projectDir?: string): HostDefinition[];
43
43
  export declare function resolveHostSelection(selection: HostSelection): HostSetupId[];
44
- export declare function renderHostSnippet(host: HostDefinition, _projectDir: string): string;
44
+ export declare function renderHostSnippet(host: HostDefinition, projectDir: string): string;
45
45
  export declare function claudeCodeAddCommand(): string;
46
46
  export declare function planHostSetup(host: HostDefinition, projectDir: string, opts: {
47
47
  write?: boolean;
package/dist/index.js CHANGED
@@ -67076,7 +67076,7 @@ function summariseLint(result) {
67076
67076
  fixed: result.fixed
67077
67077
  };
67078
67078
  }
67079
- var SCENE_PRESETS2, sceneStylesSchema, sceneStylesTool, sceneInitSchema, sceneInitTool, sceneAddSchema, sceneAddTool, sceneLintSchema, sceneLintTool, sceneRepairSchema, sceneRepairTool, sceneRenderSchema, sceneRenderTool, sceneBuildSchema, sceneBuildTool, sceneInstallSkillSchema, sceneInstallSkillTool, sceneComposePromptsSchema, sceneComposePromptsTool, sceneTools;
67079
+ var SCENE_PRESETS2, PROJECT_DIR_DESCRIPTION, INIT_DIR_DESCRIPTION, sceneStylesSchema, sceneStylesTool, sceneInitSchema, sceneInitTool, sceneAddSchema, sceneAddTool, sceneLintSchema, sceneLintTool, sceneRepairSchema, sceneRepairTool, sceneRenderSchema, sceneRenderTool, sceneBuildSchema, sceneBuildTool, sceneInstallSkillSchema, sceneInstallSkillTool, sceneComposePromptsSchema, sceneComposePromptsTool, sceneTools;
67080
67080
  var init_scene2 = __esm({
67081
67081
  "src/tools/manifest/scene.ts"() {
67082
67082
  "use strict";
@@ -67099,6 +67099,8 @@ var init_scene2 = __esm({
67099
67099
  "kinetic-type",
67100
67100
  "product-shot"
67101
67101
  ];
67102
+ PROJECT_DIR_DESCRIPTION = "Project directory. Defaults to the surface's cwd; in MCP hosts, relative paths resolve under the configured server workspace.";
67103
+ 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.";
67102
67104
  sceneStylesSchema = external_exports.object({
67103
67105
  name: external_exports.string().optional().describe("Style name or slug (e.g. 'Swiss Pulse', 'swiss-pulse'). Omit to list all 8.")
67104
67106
  });
@@ -67158,7 +67160,7 @@ var init_scene2 = __esm({
67158
67160
  }
67159
67161
  });
67160
67162
  sceneInitSchema = external_exports.object({
67161
- dir: external_exports.string().describe("Project directory (created if missing)."),
67163
+ dir: external_exports.string().describe(INIT_DIR_DESCRIPTION),
67162
67164
  name: external_exports.string().optional().describe("Project name. Defaults to the directory basename."),
67163
67165
  aspect: external_exports.enum(["16:9", "9:16", "1:1", "4:5"]).optional().describe("Aspect ratio. Default 16:9."),
67164
67166
  duration: external_exports.number().optional().describe("Default root composition duration in seconds. Default 10.")
@@ -67205,7 +67207,7 @@ var init_scene2 = __esm({
67205
67207
  visuals: external_exports.string().optional().describe("Image prompt \u2014 generates assets/scene-<id>.png via the configured image provider."),
67206
67208
  headline: external_exports.string().optional().describe("Visible headline text. Defaults to the humanised scene name."),
67207
67209
  kicker: external_exports.string().optional().describe("Small label above the headline (used by 'explainer' and 'product-shot' presets)."),
67208
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
67210
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION),
67209
67211
  insertInto: external_exports.string().optional().describe("Root composition file (relative to projectDir). Default 'index.html'."),
67210
67212
  imageProvider: external_exports.enum(["gemini", "openai"]).optional().describe("Image provider for visuals. Default 'gemini'."),
67211
67213
  voice: external_exports.string().optional().describe("ElevenLabs voice id or name."),
@@ -67266,7 +67268,7 @@ var init_scene2 = __esm({
67266
67268
  }
67267
67269
  });
67268
67270
  sceneLintSchema = external_exports.object({
67269
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
67271
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION),
67270
67272
  root: external_exports.string().optional().describe("Root composition file relative to projectDir. Default 'index.html'."),
67271
67273
  fix: external_exports.boolean().optional().describe('Apply mechanical auto-fixes (currently: missing class="clip").')
67272
67274
  });
@@ -67303,7 +67305,7 @@ var init_scene2 = __esm({
67303
67305
  }
67304
67306
  });
67305
67307
  sceneRepairSchema = external_exports.object({
67306
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
67308
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION),
67307
67309
  root: external_exports.string().optional().describe("Root composition file relative to projectDir. Default 'index.html'."),
67308
67310
  dryRun: external_exports.boolean().optional().describe("Preview deterministic repairs without writing files.")
67309
67311
  });
@@ -67332,7 +67334,7 @@ var init_scene2 = __esm({
67332
67334
  }
67333
67335
  });
67334
67336
  sceneRenderSchema = external_exports.object({
67335
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
67337
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION),
67336
67338
  root: external_exports.string().optional().describe("Root composition file relative to projectDir. Default 'index.html'."),
67337
67339
  beat: external_exports.string().optional().describe("Render only one storyboard beat using a temporary root."),
67338
67340
  output: external_exports.string().optional().describe("Output file path (relative paths resolve against projectDir)."),
@@ -67387,7 +67389,7 @@ var init_scene2 = __esm({
67387
67389
  });
67388
67390
  sceneBuildSchema = external_exports.object({
67389
67391
  projectDir: external_exports.string().optional().describe(
67390
- "Project directory containing STORYBOARD.md, DESIGN.md, index.html. Defaults to the surface's cwd."
67392
+ "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."
67391
67393
  ),
67392
67394
  stage: external_exports.enum(["assets", "compose", "sync", "render", "all"]).optional().describe("Build stage to run. Default all."),
67393
67395
  beat: external_exports.string().optional().describe("Restrict asset/compose work to one beat id."),
@@ -67502,7 +67504,7 @@ var init_scene2 = __esm({
67502
67504
  });
67503
67505
  sceneInstallSkillSchema = external_exports.object({
67504
67506
  projectDir: external_exports.string().describe(
67505
- "Project directory containing STORYBOARD.md / DESIGN.md. Required to keep cross-host calls explicit and prevent accidental installs in unintended cwd."
67507
+ "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."
67506
67508
  ),
67507
67509
  host: external_exports.enum(["claude-code", "cursor", "auto", "all"]).optional().describe(
67508
67510
  "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."
@@ -67552,7 +67554,7 @@ var init_scene2 = __esm({
67552
67554
  });
67553
67555
  sceneComposePromptsSchema = external_exports.object({
67554
67556
  projectDir: external_exports.string().describe(
67555
- "Project directory containing STORYBOARD.md / DESIGN.md. Required to keep cross-host calls explicit."
67557
+ "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."
67556
67558
  ),
67557
67559
  beat: external_exports.string().optional().describe(
67558
67560
  "Restrict the plan to a single beat by id (e.g. 'hook', '1'). Omit to emit every beat in the storyboard."
@@ -68241,7 +68243,7 @@ var init_ai_suggest_edit = __esm({
68241
68243
 
68242
68244
  // src/tools/manifest/inspect.ts
68243
68245
  import { resolve as resolve75 } from "node:path";
68244
- var inspectProjectTool, inspectRenderTool, analyzeMediaTool, analyzeVideoTool, analyzeReviewTool, analyzeSuggestTool, inspectTools;
68246
+ var PROJECT_DIR_DESCRIPTION2, inspectProjectTool, inspectRenderTool, analyzeMediaTool, analyzeVideoTool, analyzeReviewTool, analyzeSuggestTool, inspectTools;
68245
68247
  var init_inspect = __esm({
68246
68248
  "src/tools/manifest/inspect.ts"() {
68247
68249
  "use strict";
@@ -68252,13 +68254,14 @@ var init_inspect = __esm({
68252
68254
  init_ai_suggest_edit();
68253
68255
  init_scene_inspect();
68254
68256
  init_render_inspect();
68257
+ PROJECT_DIR_DESCRIPTION2 = "Project directory. Defaults to the surface's cwd; in MCP hosts, relative paths resolve under the configured server workspace.";
68255
68258
  inspectProjectTool = defineTool({
68256
68259
  name: "inspect_project",
68257
68260
  category: "analyze",
68258
68261
  cost: "free",
68259
68262
  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.",
68260
68263
  schema: external_exports.object({
68261
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
68264
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION2),
68262
68265
  beat: external_exports.string().optional().describe("Inspect only one storyboard beat where beat-scoped checks apply."),
68263
68266
  outputPath: external_exports.string().optional().describe("Optional review report path. Defaults to <project>/review-report.json."),
68264
68267
  report: external_exports.boolean().optional().describe("Write review-report.json. Default true.")
@@ -68273,7 +68276,11 @@ var init_inspect = __esm({
68273
68276
  });
68274
68277
  return {
68275
68278
  success: result.status !== "fail",
68276
- data: result,
68279
+ data: {
68280
+ ...result,
68281
+ workingDirectory: ctx.workingDirectory,
68282
+ projectDir
68283
+ },
68277
68284
  error: result.status === "fail" ? `${result.issues.filter((issue) => issue.severity === "error").length} project inspection error(s)` : void 0,
68278
68285
  humanLines: [
68279
68286
  `${result.status === "pass" ? "\u2705" : result.status === "warn" ? "\u26A0\uFE0F" : "\u274C"} Project inspection ${result.status} \u2014 score ${result.score}/100`,
@@ -68288,7 +68295,7 @@ var init_inspect = __esm({
68288
68295
  cost: "low",
68289
68296
  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.",
68290
68297
  schema: external_exports.object({
68291
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
68298
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION2),
68292
68299
  beat: external_exports.string().optional().describe("Inspect a render for one storyboard beat."),
68293
68300
  videoPath: external_exports.string().optional().describe("Rendered video path. Defaults to build-report outputPath or latest renders/* video."),
68294
68301
  outputPath: external_exports.string().optional().describe("Optional review report path. Defaults to <project>/review-report.json."),
@@ -68311,7 +68318,11 @@ var init_inspect = __esm({
68311
68318
  });
68312
68319
  return {
68313
68320
  success: true,
68314
- data: result2,
68321
+ data: {
68322
+ ...result2,
68323
+ workingDirectory: ctx.workingDirectory,
68324
+ projectDir
68325
+ },
68315
68326
  humanLines: [
68316
68327
  `Render inspection dry-run \u2014 ${result2.videoPath ? "render found" : "render missing"}`,
68317
68328
  ...result2.reportPath ? [`report: ${result2.reportPath}`] : []
@@ -68329,7 +68340,11 @@ var init_inspect = __esm({
68329
68340
  });
68330
68341
  return {
68331
68342
  success: result.status !== "fail",
68332
- data: result,
68343
+ data: {
68344
+ ...result,
68345
+ workingDirectory: ctx.workingDirectory,
68346
+ projectDir
68347
+ },
68333
68348
  error: result.status === "fail" ? `${result.issues.filter((issue) => issue.severity === "error").length} render inspection error(s)` : void 0,
68334
68349
  humanLines: [
68335
68350
  `${result.status === "pass" ? "\u2705" : result.status === "warn" ? "\u26A0\uFE0F" : "\u274C"} Render inspection ${result.status} \u2014 score ${result.score}/100`,
@@ -68713,7 +68728,7 @@ var init_generate2 = __esm({
68713
68728
  schema: external_exports.object({
68714
68729
  description: external_exports.string().describe("Background description / image prompt."),
68715
68730
  aspect: external_exports.enum(["16:9", "9:16", "1:1"]).optional().describe("Aspect ratio. Default '16:9'."),
68716
- output: external_exports.string().optional().describe("Output PNG path. Relative paths resolve against the surface's cwd.")
68731
+ 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.")
68717
68732
  }),
68718
68733
  async execute(args) {
68719
68734
  const result = await executeBackground(args);
@@ -68920,7 +68935,7 @@ async function readStoryboard2(projectDir) {
68920
68935
  if (!existsSync54(path2)) return null;
68921
68936
  return { path: path2, markdown: await readFile49(path2, "utf-8") };
68922
68937
  }
68923
- var projectDirSchema, storyboardListTool, storyboardValidateTool, storyboardGetTool, storyboardSetTool, storyboardMoveTool, storyboardReviseTool, planTool, storyboardTools;
68938
+ var PROJECT_DIR_DESCRIPTION3, projectDirSchema, storyboardListTool, storyboardValidateTool, storyboardGetTool, storyboardSetTool, storyboardMoveTool, storyboardReviseTool, planTool, storyboardTools;
68924
68939
  var init_storyboard2 = __esm({
68925
68940
  "src/tools/manifest/storyboard.ts"() {
68926
68941
  "use strict";
@@ -68930,8 +68945,9 @@ var init_storyboard2 = __esm({
68930
68945
  init_storyboard_edit();
68931
68946
  init_storyboard_revise();
68932
68947
  init_build_plan();
68948
+ PROJECT_DIR_DESCRIPTION3 = "Project directory. Defaults to the surface's cwd; in MCP hosts, relative paths resolve under the configured server workspace.";
68933
68949
  projectDirSchema = external_exports.object({
68934
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd.")
68950
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3)
68935
68951
  });
68936
68952
  storyboardListTool = defineTool({
68937
68953
  name: "storyboard_list",
@@ -68995,7 +69011,7 @@ var init_storyboard2 = __esm({
68995
69011
  cost: "free",
68996
69012
  description: "Return one STORYBOARD.md beat as structured data.",
68997
69013
  schema: external_exports.object({
68998
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
69014
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
68999
69015
  beat: external_exports.string().describe("Beat id to return.")
69000
69016
  }),
69001
69017
  async execute(args, ctx) {
@@ -69017,7 +69033,7 @@ var init_storyboard2 = __esm({
69017
69033
  cost: "free",
69018
69034
  description: "Set or unset one cue on one beat in STORYBOARD.md.",
69019
69035
  schema: external_exports.object({
69020
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
69036
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
69021
69037
  beat: external_exports.string().describe("Beat id to mutate."),
69022
69038
  key: external_exports.string().describe("Cue key to set."),
69023
69039
  value: external_exports.string().optional().describe("Cue value. Required unless unset is true."),
@@ -69053,7 +69069,7 @@ var init_storyboard2 = __esm({
69053
69069
  cost: "free",
69054
69070
  description: "Move one beat after another beat in STORYBOARD.md.",
69055
69071
  schema: external_exports.object({
69056
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
69072
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
69057
69073
  beat: external_exports.string().describe("Beat id to move."),
69058
69074
  after: external_exports.string().describe("Beat id that should precede the moved beat.")
69059
69075
  }),
@@ -69083,7 +69099,7 @@ var init_storyboard2 = __esm({
69083
69099
  cost: "low",
69084
69100
  description: "Revise an existing STORYBOARD.md from a natural-language request. Reads project context, validates the revised storyboard, and writes unless dryRun is true.",
69085
69101
  schema: external_exports.object({
69086
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
69102
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
69087
69103
  request: external_exports.string().describe("Revision request, e.g. 'make the hook punchier and shorten to 30 seconds'."),
69088
69104
  durationSec: external_exports.number().optional().describe("Target total duration in seconds."),
69089
69105
  composer: external_exports.enum(["claude", "openai", "gemini"]).optional().describe("Revision LLM provider. Defaults to project config or available API keys."),
@@ -69114,7 +69130,7 @@ var init_storyboard2 = __esm({
69114
69130
  cost: "free",
69115
69131
  description: "Read STORYBOARD.md and return the build plan, missing artifacts, provider needs, and estimated cost.",
69116
69132
  schema: external_exports.object({
69117
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
69133
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
69118
69134
  stage: external_exports.enum(["assets", "compose", "sync", "render", "all"]).optional().describe("Stage to plan. Default all."),
69119
69135
  beat: external_exports.string().optional().describe("Restrict the plan to one beat id."),
69120
69136
  mode: external_exports.enum(["agent", "batch", "auto"]).optional().describe("Build mode. Default auto."),
@@ -71673,13 +71689,14 @@ var init_walkthrough = __esm({
71673
71689
 
71674
71690
  // src/tools/manifest/status.ts
71675
71691
  import { resolve as resolve82 } from "node:path";
71676
- var statusJobTool, statusProjectTool, statusTools;
71692
+ var PROJECT_DIR_DESCRIPTION4, statusJobTool, statusProjectTool, statusTools;
71677
71693
  var init_status = __esm({
71678
71694
  "src/tools/manifest/status.ts"() {
71679
71695
  "use strict";
71680
71696
  init_zod();
71681
71697
  init_define_tool();
71682
71698
  init_status_jobs();
71699
+ PROJECT_DIR_DESCRIPTION4 = "Project directory. Defaults to the surface's cwd; in MCP hosts, relative paths resolve under the configured server workspace.";
71683
71700
  statusJobTool = defineTool({
71684
71701
  name: "status_job",
71685
71702
  category: "status",
@@ -71687,7 +71704,7 @@ var init_status = __esm({
71687
71704
  description: "Read one local async job record and optionally refresh supported provider status. Supports Runway/Kling video and Replicate music live checks.",
71688
71705
  schema: external_exports.object({
71689
71706
  jobId: external_exports.string().describe("Local job id returned by a no-wait command."),
71690
- projectDir: external_exports.string().optional().describe("Project directory containing .vibeframe/jobs. Defaults to nearest project root."),
71707
+ 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."),
71691
71708
  refresh: external_exports.boolean().optional().describe("Call provider status APIs when supported. Default true."),
71692
71709
  wait: external_exports.boolean().optional().describe("Wait for completion when supported."),
71693
71710
  output: external_exports.string().optional().describe("Download result media to this path when complete.")
@@ -71721,7 +71738,7 @@ var init_status = __esm({
71721
71738
  cost: "free",
71722
71739
  description: "Summarize build-report.json, review-report.json, and local async job records for a VibeFrame project.",
71723
71740
  schema: external_exports.object({
71724
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
71741
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION4),
71725
71742
  refresh: external_exports.boolean().optional().describe("Refresh active supported jobs before summarizing. Default false.")
71726
71743
  }),
71727
71744
  async execute(args, ctx) {
@@ -71729,7 +71746,11 @@ var init_status = __esm({
71729
71746
  const result = await inspectProjectStatus(projectDir, { refresh: args.refresh === true });
71730
71747
  return {
71731
71748
  success: true,
71732
- data: result,
71749
+ data: {
71750
+ ...result,
71751
+ workingDirectory: ctx.workingDirectory,
71752
+ projectDir
71753
+ },
71733
71754
  humanLines: [
71734
71755
  `Project status: ${result.status} (${result.currentStage}), ${result.jobs.active} active job(s), ${result.jobs.failed} failed job(s)`,
71735
71756
  ...result.build ? [`build: ${result.build.phase ?? "unknown"}`] : [],
@@ -72007,7 +72028,7 @@ init_source();
72007
72028
  // package.json
72008
72029
  var package_default = {
72009
72030
  name: "@vibeframe/cli",
72010
- version: "0.106.5",
72031
+ version: "0.106.6",
72011
72032
  description: "VibeFrame CLI - agentic video workflow runtime",
72012
72033
  private: false,
72013
72034
  license: "MIT",
@@ -80681,9 +80702,12 @@ function resolveHostSelection(selection) {
80681
80702
  if (selection === "claude") return ["claude-code", "claude-desktop"];
80682
80703
  return [selection];
80683
80704
  }
80684
- function renderHostSnippet(host, _projectDir) {
80705
+ function vibeframeMcpJson(host, projectDir) {
80706
+ return host.id === "claude-desktop" ? { ...VIBEFRAME_MCP_JSON, cwd: resolve53(projectDir) } : { ...VIBEFRAME_MCP_JSON };
80707
+ }
80708
+ function renderHostSnippet(host, projectDir) {
80685
80709
  if (host.configKind === "codex-toml") return CODEX_MCP_BLOCK.trimEnd();
80686
- return JSON.stringify({ mcpServers: { vibeframe: VIBEFRAME_MCP_JSON } }, null, 2);
80710
+ return JSON.stringify({ mcpServers: { vibeframe: vibeframeMcpJson(host, projectDir) } }, null, 2);
80687
80711
  }
80688
80712
  function claudeCodeAddCommand() {
80689
80713
  return "claude mcp add vibeframe --scope project -- npx -y @vibeframe/mcp-server";
@@ -80712,6 +80736,7 @@ async function planHostSetup(host, projectDir, opts) {
80712
80736
  }
80713
80737
  try {
80714
80738
  const action = host.configKind === "codex-toml" ? await mergeCodexToml(configPath, { force: opts.force === true }) : await mergeMcpJson(configPath, {
80739
+ server: vibeframeMcpJson(host, projectDir),
80715
80740
  force: opts.force === true,
80716
80741
  backup: host.id === "claude-desktop"
80717
80742
  });
@@ -80737,7 +80762,18 @@ async function inspectHost(host, projectDir) {
80737
80762
  if (existsSync40(configPath)) {
80738
80763
  try {
80739
80764
  const content = await readFile37(configPath, "utf-8");
80740
- configured = host.configKind === "codex-toml" ? /\[mcp_servers\.vibeframe\]/.test(content) : hasVibeframeMcpServer(JSON.parse(content));
80765
+ if (host.configKind === "codex-toml") {
80766
+ configured = /\[mcp_servers\.vibeframe\]/.test(content);
80767
+ } else {
80768
+ const json = JSON.parse(content);
80769
+ configured = hasVibeframeMcpServer(json);
80770
+ const server = readVibeframeMcpServer(json);
80771
+ if (host.id === "claude-desktop" && configured && !server?.cwd) {
80772
+ warnings.push(
80773
+ "Claude Desktop vibeframe MCP config has no cwd; run `vibe host setup claude-desktop <workspace> --write` to anchor relative paths."
80774
+ );
80775
+ }
80776
+ }
80741
80777
  } catch (error) {
80742
80778
  warnings.push(error instanceof Error ? error.message : String(error));
80743
80779
  }
@@ -80757,13 +80793,26 @@ async function mergeMcpJson(configPath, opts) {
80757
80793
  }
80758
80794
  const mcpServers = typeof root.mcpServers === "object" && root.mcpServers !== null && !Array.isArray(root.mcpServers) ? root.mcpServers : {};
80759
80795
  if (mcpServers.vibeframe && !opts.force) {
80796
+ const existing = mcpServers.vibeframe;
80797
+ if (canAddMissingCwd(existing, opts.server)) {
80798
+ root.mcpServers = {
80799
+ ...mcpServers,
80800
+ vibeframe: { ...existing, cwd: opts.server.cwd }
80801
+ };
80802
+ await mkdir22(dirname18(configPath), { recursive: true });
80803
+ if (exists && opts.backup) {
80804
+ await writeFile44(`${configPath}.bak-${timestamp()}`, await readFile37(configPath, "utf-8"), "utf-8");
80805
+ }
80806
+ await writeFile44(configPath, JSON.stringify(root, null, 2) + "\n", "utf-8");
80807
+ return { path: configPath, status: "merged", reason: "added cwd to existing vibeframe MCP server" };
80808
+ }
80760
80809
  return {
80761
80810
  path: configPath,
80762
80811
  status: "skipped-exists",
80763
80812
  reason: "vibeframe MCP server already exists; pass --force to replace"
80764
80813
  };
80765
80814
  }
80766
- root.mcpServers = { ...mcpServers, vibeframe: VIBEFRAME_MCP_JSON };
80815
+ root.mcpServers = { ...mcpServers, vibeframe: opts.server };
80767
80816
  await mkdir22(dirname18(configPath), { recursive: true });
80768
80817
  if (exists && opts.backup) {
80769
80818
  await writeFile44(`${configPath}.bak-${timestamp()}`, await readFile37(configPath, "utf-8"), "utf-8");
@@ -80817,6 +80866,23 @@ function hasVibeframeMcpServer(value) {
80817
80866
  if (!root.mcpServers || typeof root.mcpServers !== "object") return false;
80818
80867
  return Object.prototype.hasOwnProperty.call(root.mcpServers, "vibeframe");
80819
80868
  }
80869
+ function readVibeframeMcpServer(value) {
80870
+ if (!value || typeof value !== "object") return null;
80871
+ const root = value;
80872
+ if (!root.mcpServers || typeof root.mcpServers !== "object" || Array.isArray(root.mcpServers)) return null;
80873
+ const server = root.mcpServers.vibeframe;
80874
+ if (!server || typeof server !== "object" || Array.isArray(server)) return null;
80875
+ return server;
80876
+ }
80877
+ function canAddMissingCwd(existing, target) {
80878
+ if (!target.cwd) return false;
80879
+ if (!existing || typeof existing !== "object" || Array.isArray(existing)) return false;
80880
+ const current = existing;
80881
+ if (current.cwd) return false;
80882
+ if (current.command !== target.command) return false;
80883
+ if (!Array.isArray(current.args)) return false;
80884
+ return JSON.stringify(current.args) === JSON.stringify(target.args);
80885
+ }
80820
80886
  function hostNextSteps(host) {
80821
80887
  if (host.id === "codex") {
80822
80888
  return [
@@ -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);
@@ -52320,6 +52320,8 @@ var SCENE_PRESETS2 = [
52320
52320
  "kinetic-type",
52321
52321
  "product-shot"
52322
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.";
52323
52325
  var sceneStylesSchema = external_exports.object({
52324
52326
  name: external_exports.string().optional().describe("Style name or slug (e.g. 'Swiss Pulse', 'swiss-pulse'). Omit to list all 8.")
52325
52327
  });
@@ -52379,7 +52381,7 @@ var sceneStylesTool = defineTool({
52379
52381
  }
52380
52382
  });
52381
52383
  var sceneInitSchema = external_exports.object({
52382
- dir: external_exports.string().describe("Project directory (created if missing)."),
52384
+ dir: external_exports.string().describe(INIT_DIR_DESCRIPTION),
52383
52385
  name: external_exports.string().optional().describe("Project name. Defaults to the directory basename."),
52384
52386
  aspect: external_exports.enum(["16:9", "9:16", "1:1", "4:5"]).optional().describe("Aspect ratio. Default 16:9."),
52385
52387
  duration: external_exports.number().optional().describe("Default root composition duration in seconds. Default 10.")
@@ -52426,7 +52428,7 @@ var sceneAddSchema = external_exports.object({
52426
52428
  visuals: external_exports.string().optional().describe("Image prompt \u2014 generates assets/scene-<id>.png via the configured image provider."),
52427
52429
  headline: external_exports.string().optional().describe("Visible headline text. Defaults to the humanised scene name."),
52428
52430
  kicker: external_exports.string().optional().describe("Small label above the headline (used by 'explainer' and 'product-shot' presets)."),
52429
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
52431
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION),
52430
52432
  insertInto: external_exports.string().optional().describe("Root composition file (relative to projectDir). Default 'index.html'."),
52431
52433
  imageProvider: external_exports.enum(["gemini", "openai"]).optional().describe("Image provider for visuals. Default 'gemini'."),
52432
52434
  voice: external_exports.string().optional().describe("ElevenLabs voice id or name."),
@@ -52487,7 +52489,7 @@ var sceneAddTool = defineTool({
52487
52489
  }
52488
52490
  });
52489
52491
  var sceneLintSchema = external_exports.object({
52490
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
52492
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION),
52491
52493
  root: external_exports.string().optional().describe("Root composition file relative to projectDir. Default 'index.html'."),
52492
52494
  fix: external_exports.boolean().optional().describe('Apply mechanical auto-fixes (currently: missing class="clip").')
52493
52495
  });
@@ -52545,7 +52547,7 @@ var sceneLintTool = defineTool({
52545
52547
  }
52546
52548
  });
52547
52549
  var sceneRepairSchema = external_exports.object({
52548
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
52550
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION),
52549
52551
  root: external_exports.string().optional().describe("Root composition file relative to projectDir. Default 'index.html'."),
52550
52552
  dryRun: external_exports.boolean().optional().describe("Preview deterministic repairs without writing files.")
52551
52553
  });
@@ -52574,7 +52576,7 @@ var sceneRepairTool = defineTool({
52574
52576
  }
52575
52577
  });
52576
52578
  var sceneRenderSchema = external_exports.object({
52577
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
52579
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION),
52578
52580
  root: external_exports.string().optional().describe("Root composition file relative to projectDir. Default 'index.html'."),
52579
52581
  beat: external_exports.string().optional().describe("Render only one storyboard beat using a temporary root."),
52580
52582
  output: external_exports.string().optional().describe("Output file path (relative paths resolve against projectDir)."),
@@ -52629,7 +52631,7 @@ var sceneRenderTool = defineTool({
52629
52631
  });
52630
52632
  var sceneBuildSchema = external_exports.object({
52631
52633
  projectDir: external_exports.string().optional().describe(
52632
- "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."
52633
52635
  ),
52634
52636
  stage: external_exports.enum(["assets", "compose", "sync", "render", "all"]).optional().describe("Build stage to run. Default all."),
52635
52637
  beat: external_exports.string().optional().describe("Restrict asset/compose work to one beat id."),
@@ -52744,7 +52746,7 @@ var sceneBuildTool = defineTool({
52744
52746
  });
52745
52747
  var sceneInstallSkillSchema = external_exports.object({
52746
52748
  projectDir: external_exports.string().describe(
52747
- "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."
52748
52750
  ),
52749
52751
  host: external_exports.enum(["claude-code", "cursor", "auto", "all"]).optional().describe(
52750
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."
@@ -52794,7 +52796,7 @@ var sceneInstallSkillTool = defineTool({
52794
52796
  });
52795
52797
  var sceneComposePromptsSchema = external_exports.object({
52796
52798
  projectDir: external_exports.string().describe(
52797
- "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."
52798
52800
  ),
52799
52801
  beat: external_exports.string().optional().describe(
52800
52802
  "Restrict the plan to a single beat by id (e.g. 'hook', '1'). Omit to emit every beat in the storyboard."
@@ -55095,13 +55097,14 @@ function sanitizeFileSegment2(value) {
55095
55097
  }
55096
55098
 
55097
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.";
55098
55101
  var inspectProjectTool = defineTool({
55099
55102
  name: "inspect_project",
55100
55103
  category: "analyze",
55101
55104
  cost: "free",
55102
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.",
55103
55106
  schema: external_exports.object({
55104
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
55107
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION2),
55105
55108
  beat: external_exports.string().optional().describe("Inspect only one storyboard beat where beat-scoped checks apply."),
55106
55109
  outputPath: external_exports.string().optional().describe("Optional review report path. Defaults to <project>/review-report.json."),
55107
55110
  report: external_exports.boolean().optional().describe("Write review-report.json. Default true.")
@@ -55116,7 +55119,11 @@ var inspectProjectTool = defineTool({
55116
55119
  });
55117
55120
  return {
55118
55121
  success: result.status !== "fail",
55119
- data: result,
55122
+ data: {
55123
+ ...result,
55124
+ workingDirectory: ctx.workingDirectory,
55125
+ projectDir
55126
+ },
55120
55127
  error: result.status === "fail" ? `${result.issues.filter((issue) => issue.severity === "error").length} project inspection error(s)` : void 0,
55121
55128
  humanLines: [
55122
55129
  `${result.status === "pass" ? "\u2705" : result.status === "warn" ? "\u26A0\uFE0F" : "\u274C"} Project inspection ${result.status} \u2014 score ${result.score}/100`,
@@ -55131,7 +55138,7 @@ var inspectRenderTool = defineTool({
55131
55138
  cost: "low",
55132
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.",
55133
55140
  schema: external_exports.object({
55134
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
55141
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION2),
55135
55142
  beat: external_exports.string().optional().describe("Inspect a render for one storyboard beat."),
55136
55143
  videoPath: external_exports.string().optional().describe("Rendered video path. Defaults to build-report outputPath or latest renders/* video."),
55137
55144
  outputPath: external_exports.string().optional().describe("Optional review report path. Defaults to <project>/review-report.json."),
@@ -55154,7 +55161,11 @@ var inspectRenderTool = defineTool({
55154
55161
  });
55155
55162
  return {
55156
55163
  success: true,
55157
- data: result2,
55164
+ data: {
55165
+ ...result2,
55166
+ workingDirectory: ctx.workingDirectory,
55167
+ projectDir
55168
+ },
55158
55169
  humanLines: [
55159
55170
  `Render inspection dry-run \u2014 ${result2.videoPath ? "render found" : "render missing"}`,
55160
55171
  ...result2.reportPath ? [`report: ${result2.reportPath}`] : []
@@ -55172,7 +55183,11 @@ var inspectRenderTool = defineTool({
55172
55183
  });
55173
55184
  return {
55174
55185
  success: result.status !== "fail",
55175
- data: result,
55186
+ data: {
55187
+ ...result,
55188
+ workingDirectory: ctx.workingDirectory,
55189
+ projectDir
55190
+ },
55176
55191
  error: result.status === "fail" ? `${result.issues.filter((issue) => issue.severity === "error").length} render inspection error(s)` : void 0,
55177
55192
  humanLines: [
55178
55193
  `${result.status === "pass" ? "\u2705" : result.status === "warn" ? "\u26A0\uFE0F" : "\u274C"} Render inspection ${result.status} \u2014 score ${result.score}/100`,
@@ -55548,7 +55563,7 @@ var generateBackgroundTool = defineTool({
55548
55563
  schema: external_exports.object({
55549
55564
  description: external_exports.string().describe("Background description / image prompt."),
55550
55565
  aspect: external_exports.enum(["16:9", "9:16", "1:1"]).optional().describe("Aspect ratio. Default '16:9'."),
55551
- 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.")
55552
55567
  }),
55553
55568
  async execute(args) {
55554
55569
  const result = await executeBackground(args);
@@ -56085,8 +56100,9 @@ function stripUndefined3(value) {
56085
56100
 
56086
56101
  // src/tools/manifest/storyboard.ts
56087
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.";
56088
56104
  var projectDirSchema = external_exports.object({
56089
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd.")
56105
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3)
56090
56106
  });
56091
56107
  async function readStoryboard(projectDir) {
56092
56108
  const path2 = resolve52(projectDir, "STORYBOARD.md");
@@ -56155,7 +56171,7 @@ var storyboardGetTool = defineTool({
56155
56171
  cost: "free",
56156
56172
  description: "Return one STORYBOARD.md beat as structured data.",
56157
56173
  schema: external_exports.object({
56158
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
56174
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
56159
56175
  beat: external_exports.string().describe("Beat id to return.")
56160
56176
  }),
56161
56177
  async execute(args, ctx) {
@@ -56177,7 +56193,7 @@ var storyboardSetTool = defineTool({
56177
56193
  cost: "free",
56178
56194
  description: "Set or unset one cue on one beat in STORYBOARD.md.",
56179
56195
  schema: external_exports.object({
56180
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
56196
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
56181
56197
  beat: external_exports.string().describe("Beat id to mutate."),
56182
56198
  key: external_exports.string().describe("Cue key to set."),
56183
56199
  value: external_exports.string().optional().describe("Cue value. Required unless unset is true."),
@@ -56213,7 +56229,7 @@ var storyboardMoveTool = defineTool({
56213
56229
  cost: "free",
56214
56230
  description: "Move one beat after another beat in STORYBOARD.md.",
56215
56231
  schema: external_exports.object({
56216
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
56232
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
56217
56233
  beat: external_exports.string().describe("Beat id to move."),
56218
56234
  after: external_exports.string().describe("Beat id that should precede the moved beat.")
56219
56235
  }),
@@ -56243,7 +56259,7 @@ var storyboardReviseTool = defineTool({
56243
56259
  cost: "low",
56244
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.",
56245
56261
  schema: external_exports.object({
56246
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
56262
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
56247
56263
  request: external_exports.string().describe("Revision request, e.g. 'make the hook punchier and shorten to 30 seconds'."),
56248
56264
  durationSec: external_exports.number().optional().describe("Target total duration in seconds."),
56249
56265
  composer: external_exports.enum(["claude", "openai", "gemini"]).optional().describe("Revision LLM provider. Defaults to project config or available API keys."),
@@ -56274,7 +56290,7 @@ var planTool = defineTool({
56274
56290
  cost: "free",
56275
56291
  description: "Read STORYBOARD.md and return the build plan, missing artifacts, provider needs, and estimated cost.",
56276
56292
  schema: external_exports.object({
56277
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
56293
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
56278
56294
  stage: external_exports.enum(["assets", "compose", "sync", "render", "all"]).optional().describe("Stage to plan. Default all."),
56279
56295
  beat: external_exports.string().optional().describe("Restrict the plan to one beat id."),
56280
56296
  mode: external_exports.enum(["agent", "batch", "auto"]).optional().describe("Build mode. Default auto."),
@@ -60834,6 +60850,7 @@ var guideTools = [guideTool];
60834
60850
  // src/tools/manifest/status.ts
60835
60851
  import { resolve as resolve62 } from "node:path";
60836
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.";
60837
60854
  var statusJobTool = defineTool({
60838
60855
  name: "status_job",
60839
60856
  category: "status",
@@ -60841,7 +60858,7 @@ var statusJobTool = defineTool({
60841
60858
  description: "Read one local async job record and optionally refresh supported provider status. Supports Runway/Kling video and Replicate music live checks.",
60842
60859
  schema: external_exports.object({
60843
60860
  jobId: external_exports.string().describe("Local job id returned by a no-wait command."),
60844
- 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."),
60845
60862
  refresh: external_exports.boolean().optional().describe("Call provider status APIs when supported. Default true."),
60846
60863
  wait: external_exports.boolean().optional().describe("Wait for completion when supported."),
60847
60864
  output: external_exports.string().optional().describe("Download result media to this path when complete.")
@@ -60875,7 +60892,7 @@ var statusProjectTool = defineTool({
60875
60892
  cost: "free",
60876
60893
  description: "Summarize build-report.json, review-report.json, and local async job records for a VibeFrame project.",
60877
60894
  schema: external_exports.object({
60878
- projectDir: external_exports.string().optional().describe("Project directory. Defaults to the surface's cwd."),
60895
+ projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION4),
60879
60896
  refresh: external_exports.boolean().optional().describe("Refresh active supported jobs before summarizing. Default false.")
60880
60897
  }),
60881
60898
  async execute(args, ctx) {
@@ -60883,7 +60900,11 @@ var statusProjectTool = defineTool({
60883
60900
  const result = await inspectProjectStatus(projectDir, { refresh: args.refresh === true });
60884
60901
  return {
60885
60902
  success: true,
60886
- data: result,
60903
+ data: {
60904
+ ...result,
60905
+ workingDirectory: ctx.workingDirectory,
60906
+ projectDir
60907
+ },
60887
60908
  humanLines: [
60888
60909
  `Project status: ${result.status} (${result.currentStage}), ${result.jobs.active} active job(s), ${result.jobs.failed} failed job(s)`,
60889
60910
  ...result.build ? [`build: ${result.build.phase ?? "unknown"}`] : [],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/cli",
3
- "version": "0.106.5",
3
+ "version": "0.106.6",
4
4
  "description": "VibeFrame CLI - agentic video workflow runtime",
5
5
  "private": false,
6
6
  "license": "MIT",
@@ -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.5",
87
- "@vibeframe/core": "0.106.5"
86
+ "@vibeframe/ai-providers": "0.106.6",
87
+ "@vibeframe/core": "0.106.6"
88
88
  },
89
89
  "engines": {
90
90
  "node": ">=20"