@aswless_854771076/ai_short_studio_cli 0.1.20 → 0.1.22

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/README.md CHANGED
@@ -66,7 +66,7 @@ ai-short-studio canvas settings set --project "$PROJECT_ID" --file settings.json
66
66
  "expectedVersion": 3,
67
67
  "values": {
68
68
  "aspectRatio": "9:16",
69
- "storyboardGridSize": 4,
69
+ "storyboardGridSize": 6,
70
70
  "videoModel": null
71
71
  }
72
72
  }
@@ -76,6 +76,10 @@ ai-short-studio canvas settings set --project "$PROJECT_ID" --file settings.json
76
76
 
77
77
  CLI 通过 `/api/v1/bootstrap` 完成版本、连通性与 Supabase 公共配置预检,并直接使用现有 `/api/projects`、`/api/canvas/node-types`、项目画布与资产路由。
78
78
 
79
+ 视频生成节点固定使用参考图生视频,不再提供 `videoInputMode`;图片连接到 `references`,不会作为视频首帧。
80
+
81
+ `storyboard-image` schema 现在暴露节点级 `gridSize`。CLI 继续按实时 schema 通用写入,配套 Skill 会分析每个镜头的动作、运镜、多人调度和连续性难度,向用户确认后逐镜设置;未单独设置或连接旧服务时回退到项目格数,系统默认为 6 格。
82
+
79
83
  运行 `ai-short-studio <topic> --help` 查看精确参数。可执行命令使用完整产品名 `ai-short-studio`,同时避免与其他 CLI 冲突。所有结构化响应保持 JSON;API 错误也返回稳定的 `error.code`、`status`、`retryable` 和 `details`。
80
84
 
81
85
  退出码:`0` 成功,`3` 未认证,`4` 不存在,`5` 禁止或冲突,`6` 参数错误,`7` 其他错误。
@@ -22,6 +22,7 @@ interface NodeType extends JsonObject {
22
22
  kind: string;
23
23
  title: string;
24
24
  defaultConfig: JsonObject;
25
+ configSchema: JsonObject;
25
26
  }
26
27
  export declare class VvicatApi {
27
28
  private readonly client;
@@ -1,4 +1,21 @@
1
1
  import { randomUUID } from 'node:crypto';
2
+ function validateConfigEnums(nodeType, config) {
3
+ if (!config)
4
+ return;
5
+ const properties = nodeType.configSchema?.properties;
6
+ if (!properties || typeof properties !== 'object' || Array.isArray(properties))
7
+ return;
8
+ for (const [key, value] of Object.entries(config)) {
9
+ const schema = properties[key];
10
+ if (!schema || typeof schema !== 'object' || Array.isArray(schema)) {
11
+ throw new Error(`节点 ${nodeType.kind} 的 ${key} 不在实时 schema 中`);
12
+ }
13
+ const allowed = schema.enum;
14
+ if (Array.isArray(allowed) && !allowed.some((candidate) => Object.is(candidate, value))) {
15
+ throw new Error(`节点 ${nodeType.kind} 的 ${key} 不在实时 schema 允许范围内`);
16
+ }
17
+ }
18
+ }
2
19
  export class VvicatApi {
3
20
  client;
4
21
  sleep;
@@ -74,6 +91,7 @@ export class VvicatApi {
74
91
  const definition = catalog.nodeTypes.find((item) => item.kind === input.kind);
75
92
  if (!definition)
76
93
  throw new Error(`未知节点类型:${input.kind}`);
94
+ validateConfigEnums(definition, input.config);
77
95
  const node = {
78
96
  id: randomUUID(),
79
97
  kind: input.kind,
@@ -93,6 +111,11 @@ export class VvicatApi {
93
111
  const node = canvas.nodes.find((item) => item.id === nodeId);
94
112
  if (!node)
95
113
  throw new Error(`节点不存在:${nodeId}`);
114
+ const catalog = await this.nodeTypes();
115
+ const definition = catalog.nodeTypes.find((item) => item.kind === node.kind);
116
+ if (!definition)
117
+ throw new Error(`未知节点类型:${node.kind}`);
118
+ validateConfigEnums(definition, config);
96
119
  return this.patchCanvas(projectId, {
97
120
  canvasId: canvas.id,
98
121
  expectedVersion: canvas.version,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aswless_854771076/ai_short_studio_cli",
3
- "version": "0.1.20",
3
+ "version": "0.1.22",
4
4
  "description": "VVICAT 无限画布项目命令行工具",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -24,7 +24,7 @@ description: Use when an agent needs to inspect or operate VVICAT infinite-canva
24
24
  ## 项目配置门禁
25
25
 
26
26
  1. 运行 `canvas settings get --project <projectId> --json`,向用户展示项目名称与用途,并逐项确认以下设置的项目覆盖值 `currentValue`、继承后的 `effectiveValue`、建议值和来源 `source`:`aspectRatio`、`artStyle`、`visualBible`、`storyboardImageType`、`analysisModel`、`imageModel`、`editModel`、`videoModel`、`audioModel`。画风、画幅、分镜和模型候选必须读取服务端实时 `options`;`visualBible` 按返回的 `schema` 构造,不得硬编码枚举或结构。模型既可写为项目覆盖,也可由用户明确确认继承账户默认,但必须列明最终生效且当前可用的具体模型。缺失、冲突或继承结果不明确时先一次性询问。
27
- 2. `storyboardGridSize` 不是统一创作默认值,只在无法按节点设置 `gridSize` 的异常回退场景中展示并取得用户确认。正常流程仍按镜头复杂度逐个设置节点 `gridSize`,不得因项目 settings 已有该字段而套用统一格数。
27
+ 2. 必须展示并确认 `storyboardGridSize` 的项目覆盖值、继承后的默认分镜格数和来源;系统默认值为 6 格。`storyboard-image` 的实时 schema 已提供节点级 `gridSize`,正常流程应逐镜配置;连接旧版本服务且 schema 未暴露该字段时,禁止虚假写入,并回退到用户确认的项目格数。
28
28
  3. 新项目按初始化顺序确认名称和用途、创建项目并取得项目、画布与 settings;既有项目开始创作前也必须完成本门禁,名称或用途需要更新时只用 `project update` 修改用户确认的项目字段。用途可记录在项目描述中,但描述不构成画布 settings。不得用账户级 `config set`、项目 `description` 或节点 `prompt`/`config` 代替 `canvas settings set`。
29
29
  4. 用户确认后,用一次 `canvas settings set --file <settings.json>` 或 stdin 原子写入所有变更。标准创作门禁必须把最近一次 `settings get` 返回的 `version` 填入请求的 `expectedVersion`,并统一使用这种批量模式;`--field/--value` 只适合已确认无并发写入的交互式便利操作。画风 ID 必须从 `artStyle.options` 选择并解析实时 `option.value`,示例中的 `$ART_STYLE_ID` 不是固定值。`null` 或空字符串表示清除项目覆盖并恢复账户/系统继承。设置 `artStyle` 会保存其当前关联的 `visualBible` 项目快照;画风库之后的修改不反向更新项目,同一请求显式传入 `visualBible` 时以显式值为准。
30
30
  5. 写入后立即再次执行 `canvas settings get`,比较所有目标字段的 `currentValue`、`effectiveValue` 和 `source`。只有结果符合用户确认且所需模型明确可用,才可创建或执行创作节点。409 冲突时重新读取、展示变化并取得确认,携带新 `expectedVersion` 重试;不得盲目覆盖。所有者和管理员可写,协作者只读;写入、回读或权限校验失败时停在配置阶段,不触发任何付费任务。
@@ -33,10 +33,10 @@ description: Use when an agent needs to inspect or operate VVICAT infinite-canva
33
33
 
34
34
  1. 明确原始故事或剧本、目标受众与平台、语言、画幅、总时长与镜头时长、风格参考、人物/场景/道具约束,以及交付是否包含剧本、设定、分镜图、视频和音频;缺项先问。
35
35
  2. 完成 preflight、账户配置读取和节点目录检查后,新项目按“project list → 确认名称/用途 → project create → project get + canvas get + canvas settings get”继续,既有项目读取相同的已有资源;再按“项目配置门禁”确认、原子写入并回读 settings。两种项目都必须在任何创作节点之前通过门禁;既有项目只修改用户确认字段,并优先复用已确认的节点与 selected version。
36
- 3. 原文需要改编时执行 `novel-to-script`。分镜拆解前必须先完成人物、场景、道具等本次故事涉及的素材生成;互不依赖的素材节点应同批执行并收集真实任务 ID,再并发 `task wait`,不得等待一个完成后才提交下一个;存在上游依赖时按依赖顺序分批执行。每个任务都必须到成功终态,并让用户确认后为每项素材设置 selected version。任一素材未生成成功、未确认或没有 selected version 时,禁止执行 `storyboard-breakdown`,先询问用户并补齐。
36
+ 3. 原文需要改编时执行 `novel-to-script`。分镜拆解前必须先完成人物、场景、道具等本次故事涉及的素材生成。创建或执行 `character-turnaround`、`prop-turnaround` 时,建议值固定为 `aspectRatio: 16:9`,向用户确认后把最终画幅显式写入节点配置,不得继承项目默认画幅。人物视觉方案的每个 `appearance.descriptions` 候选必须拆成独立输入,并采用“一候选描述 → 一个三视图节点 → 一个独立图片资产”的方式生成;道具存在多个候选方案时同样处理。每个三视图节点只能接收一个人物形象或一个道具候选,提示词必须明确“只生成当前候选的一张三视图,不得拼接其他候选”;单张三视图内部可以包含同一对象的正面、侧面和背面,但禁止把多个候选方案纵向、横向或宫格拼成一张图。`count` 只表示同一候选的独立生成版本数,每个结果必须作为独立图片版本展示和选择,不得合并为一张长图。互不依赖的素材节点应同批执行并收集真实任务 ID,再并发 `task wait`,不得等待一个完成后才提交下一个;存在上游依赖时按依赖顺序分批执行。每个任务都必须到成功终态,并让用户确认后为每项素材设置 selected version。任一素材未生成成功、未确认或没有 selected version 时,禁止执行 `storyboard-breakdown`,先询问用户并补齐。
37
37
  4. 按实时节点 schema,把已确认的剧本节点,以及每个人物、场景、道具等相关素材节点,逐项连接到 `storyboard-breakdown` 对应输入 handle(通常为 `script`、`characters`、`locations`、`props`)。执行前重新读取画布和连线,确认本次故事涉及的素材节点无遗漏;即使服务端把素材输入标为可选,标准创作流程也不得省略。任一对应连线缺失时禁止拆解,先补线;素材范围不清楚时先询问用户。全部门禁满足后才执行并等待。成功后刷新画布,读取服务端自动创建的 `storyboard-shot` 和 `storyboard-image`,不得重复手工创建。
38
- 5. 生成分镜图前,用 `canvas asset get/list` 取得人物、场景、道具等已选版本,必要时下载,并把实际图片或可访问预览展示给用户;只提供资产 ID、文件路径或文字说明不算展示。用户明确确认素材与选版后,逐镜头评估需要独立呈现的关键状态(起势、动作或表情变化、人物与道具关系变化、机位或视角变化、空间调度和结果),把 `gridSize` 设为实时 schema 允许值中能够完整表达这些状态的最小值:单一静态状态用 1 格,一般连续变化优先 4 格,多阶段动作或复杂调度再用 6/9 格,只有确实存在更多不可合并状态时才用 12 格以上;不得全项目固定同一格数,也不得只按镜头时长决定。向用户列出“镜号、复杂度依据、建议格数”并确认;连续叙事优先建议 `imageLayout: storyboard`,同时说明 `grid` 与 `single` 可选,最终由用户确认布局、镜头范围、参考资产、模型与费用范围。未展示或未确认时禁止生成分镜图。
39
- 6. 执行分镜图后检查任务终态、候选资产与 selected version,并把实际分镜图或可访问预览展示给用户。用户明确确认分镜图以及需要制作的视频镜头后,才能刷新画布并复用服务端自动创建的 `storyboard-video-prompt`;提示词再经用户确认后执行自动创建的 `video-generate`,音频按交付范围执行。未展示或未确认分镜图时禁止生成视频。
38
+ 5. 生成分镜图前,用 `canvas asset get/list` 取得人物、场景、道具等已选版本,必要时下载,并把实际图片或可访问预览展示给用户;只提供资产 ID、文件路径或文字说明不算展示。用户明确确认素材与选版后,读取 `storyboard-image` 的实时 `configSchema`,分析每个镜头的动作阶段、运镜变化、多人调度和连续性难度,选择 schema 允许的最小够用格数:简单镜头建议 4 格,常规镜头使用默认 6 格,复杂镜头建议 9 格,16/25 格只用于用户明确需要的长动作或高密度关键帧。向用户展示逐镜建议并确认后,将各自 `gridSize` 写入对应节点;旧服务 schema 未暴露该字段时才说明限制并回退到项目格数,用户未另行确认时为 6 格。连续叙事优先建议 `imageLayout: storyboard`,同时说明 `grid` 与 `single` 可选,最终由用户确认布局、镜头范围、参考资产、模型与费用范围。未展示或未确认时禁止生成分镜图。
39
+ 6. 执行分镜图后检查任务终态、候选资产与 selected version,并把实际分镜图或可访问预览展示给用户。用户明确确认分镜图以及需要制作的视频镜头后,才能刷新画布并复用服务端自动创建的 `storyboard-video-prompt`;提示词再经用户确认后执行自动创建的 `video-generate`。视频生成固定使用参考图模式,把图片连接到 `references`,不得把分镜图作为首帧;节点不再提供 `videoInputMode`。音频按交付范围执行。未展示或未确认分镜图时禁止生成视频。
40
40
  7. 配置门禁固定用一次 `canvas settings set` 写入确认字段;通过门禁后的节点与连线写入,仍需在每次写入前重新读取画布版本,优先用专用 node/edge 命令,批量图变更才用低层 `canvas apply`。每次执行都读取真实任务 ID 并 `task wait`,不用固定 sleep。
41
41
  8. 交付前确认 selected version 与下载目录,记录项目、节点、任务和资产 ID、失败项与未决项。临时项目在所有结束路径删除;既有项目绝不擅自删除。
42
42
 
@@ -88,7 +88,9 @@ ai-short-studio canvas node list --project "$PROJECT_ID" --json
88
88
  - 自动创建的下游节点重复添加:任务完成后先刷新画布并复用真实节点 ID。
89
89
  - 素材未完成或未连线就拆分镜:人物、场景、道具等相关素材必须任务成功、已确认 selected version,并逐项连接到 `storyboard-breakdown` 对应输入后才能执行。
90
90
  - 未展示产物就继续:生成分镜图前展示并确认素材,生成视频前展示并确认分镜图;只报告 ID 或路径不能代替预览与用户确认。
91
- - 所有镜头沿用同一故事版格数:必须按每个镜头的关键状态与调度复杂度分别设置最小够用的 `gridSize`,并在执行前让用户确认。
91
+ - 所有镜头沿用项目格数却声称已动态配置:实时 schema 提供 `gridSize` 时,必须展示并确认逐镜难度建议,再把数值写入对应节点;只有旧服务未暴露字段时才回退到项目格数,未另行确认时为 6 格。
92
+ - 人物或道具三视图继承项目画幅:必须先建议 `16:9`,确认后把最终 `aspectRatio` 显式写入 `character-turnaround`、`prop-turnaround` 节点。
93
+ - 多个三视图候选被拼成一张图:每个候选必须使用独立输入和独立三视图节点生成;`count` 产生的多个版本也必须保持为独立图片,不能拼接展示。
92
94
  - 涉及剪辑却自行设计:时间线、字幕、转场、音频编排或渲染必须先使用 `remotion-best-practices`。
93
95
  - 只检查任务创建响应:必须 `task wait` 并检查终态和错误字段。
94
96
  - 下载列表中的任意 URL:先确认资产的 selected version,再下载。
@@ -77,7 +77,7 @@ ai-short-studio canvas settings set --project "$PROJECT_ID" --file settings.json
77
77
  "expectedVersion": 3,
78
78
  "values": {
79
79
  "aspectRatio": "9:16",
80
- "storyboardGridSize": 4,
80
+ "storyboardGridSize": 6,
81
81
  "videoModel": null
82
82
  }
83
83
  }