@aswless_854771076/ai_short_studio_cli 0.1.99 → 0.1.100

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
@@ -94,7 +94,7 @@ ai-short-studio canvas settings set --project "$PROJECT_ID" --file settings.json
94
94
  }
95
95
  ```
96
96
 
97
- `null` 或空字符串会清除项目覆盖并恢复继承。设置 `artStyle` 会把当前关联的 `visualBible` 保存为项目快照,画风库后续变化不会反向更新项目;同一请求显式传入 `visualBible` 时以显式值为准。所有者和管理员可写,协作者只读;409 冲突后重新 `settings get` 并携带新 `expectedVersion` 重试。`canvas apply` 仍用于节点、连线、删除和视口等低层画布图补丁;同阶段有多个可合并图变更时默认一次批量提交并统一回读。已经读取画布时传入 `--canvas-id` 与 `--expected-version`,可避免保存前再请求一次全图。批量入口不可用或合法批量请求仍因粒度失败时才回退单条命令。Pexels 继续使用 `project provider get|set|test`。
97
+ `null` 或空字符串会清除项目覆盖并恢复继承。设置 `artStyle` 会把当前关联的 `visualBible` 保存为项目快照,画风库后续变化不会反向更新项目;同一请求显式传入 `visualBible` 时以显式值为准。所有者和管理员可写,协作者只读;409 冲突后重新 `settings get` 并携带新 `expectedVersion` 重试。`canvas apply` 仍用于节点、连线、删除和视口等低层画布图补丁;同阶段有多个可合并图变更时默认一次批量提交并统一回读。已经读取画布时传入 `--canvas-id` 与 `--expected-version`,可避免保存前再请求一次全图。批量入口不可用或合法批量请求仍因粒度失败时才回退单条命令。
98
98
 
99
99
  常用审计优先使用一次聚合查询,不必临时编写脚本或逐条请求:
100
100
 
@@ -59,12 +59,6 @@ export declare class VvicatApi {
59
59
  name?: string;
60
60
  description?: string | null;
61
61
  }): Promise<JsonObject>;
62
- projectMaterialProvider(projectId: string): Promise<JsonObject>;
63
- updateProjectMaterialProvider(projectId: string, input: {
64
- apiKey?: string;
65
- enabled: boolean;
66
- }): Promise<JsonObject>;
67
- testProjectMaterialProvider(projectId: string): Promise<JsonObject>;
68
62
  deleteProject(projectId: string): Promise<JsonObject>;
69
63
  canvas(projectId: string): Promise<CanvasDto>;
70
64
  listCanvasEpisodes(projectId: string): Promise<JsonObject[]>;
@@ -87,15 +87,6 @@ export class VvicatApi {
87
87
  updateProject(projectId, input) {
88
88
  return this.client.request(`/api/projects/${projectId}`, { method: 'PATCH', body: input });
89
89
  }
90
- projectMaterialProvider(projectId) {
91
- return this.client.request(`/api/projects/${projectId}/material-providers/pexels`);
92
- }
93
- updateProjectMaterialProvider(projectId, input) {
94
- return this.client.request(`/api/projects/${projectId}/material-providers/pexels`, { method: 'PUT', body: input });
95
- }
96
- testProjectMaterialProvider(projectId) {
97
- return this.client.request(`/api/projects/${projectId}/material-providers/pexels`, { method: 'POST' });
98
- }
99
90
  deleteProject(projectId) {
100
91
  return this.client.request(`/api/projects/${projectId}`, { method: 'DELETE' });
101
92
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aswless_854771076/ai_short_studio_cli",
3
- "version": "0.1.99",
3
+ "version": "0.1.100",
4
4
  "description": "VVICAT 无限画布项目命令行工具",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -14,7 +14,7 @@ description: Use when an agent needs to inspect or operate VVICAT infinite-canva
14
14
  - MiniMax H3 视频、原生音频、遮挡转场、单镜与成片验收:[references/h3-video-delivery.md](references/h3-video-delivery.md)
15
15
  - 资产、分镜图、视频提示词和视频的滚动异步调度:[references/async-pipeline.md](references/async-pipeline.md)
16
16
  - 字幕、镜头衔接、声音平衡、时间线、渲染与剪辑验收:[references/editing-delivery.md](references/editing-delivery.md)
17
- - 专业剧本、TTS 独立音频、Meme、Remotion 等专项流程:[references/special-workflows.md](references/special-workflows.md)
17
+ - 专业剧本、TTS 独立音频、Remotion 等专项流程:[references/special-workflows.md](references/special-workflows.md)
18
18
  - 精确参数和命令示例:[references/commands.md](references/commands.md) 或 `ai-short-studio <topic> --help`
19
19
  - 参考视频复刻、去字幕和深度预处理:[references/hypit/playbooks/formats/reference-recreation-canvas.md](references/hypit/playbooks/formats/reference-recreation-canvas.md)
20
20
  - 已知错误、恢复边界和历史兼容问题:[references/troubleshooting.md](references/troubleshooting.md)
@@ -65,7 +65,6 @@ description: Use when an agent needs to inspect or operate VVICAT infinite-canva
65
65
  ## 强制分流
66
66
 
67
67
  - H3 成片中的人物说话、旁白、环境音和 BGM 全部由 H3 原生生成;不得用 `voice-design`、`voice-clone`、`tts` 或其他外部 TTS 覆盖。独立音频交付才读取专项 TTS 流程。
68
- - Meme 默认且标准链路是 `meme-scene-analysis → meme-material-search → cat-meme-video`,禁止静默切换通用视频生成;`CAT_MEME_REQUIRED_PROP_MISSING` 必须返回素材检索修复。
69
68
  - 涉及剪辑、字幕、转场、音频编排或渲染时,读取 `references/hypit/` 中对应的制作规则。
70
69
  - 编辑镜头用 `canvas node edit-shot`,编辑结构化资源用 `canvas node edit-resource`,均追加不可变版本。`outputLanguage` 变化只标记下游 stale;手工首尾帧使用 `video-frame-extract`。
71
70
 
@@ -22,12 +22,8 @@ ai-short-studio project get <projectId> --json
22
22
  ai-short-studio project create --name <name> [--description <text>] --json
23
23
  ai-short-studio project update <projectId> [--name <name>] [--description <text>] --json
24
24
  ai-short-studio project delete <projectId> --yes --json
25
- ai-short-studio project provider get <projectId> --json
26
- ai-short-studio project provider set <projectId> --json
27
- ai-short-studio project provider test <projectId> --json
28
25
  ```
29
26
 
30
- `provider set` 的 Key 只从安全 stdin 或秘密管理器提供。删除既有项目必须取得明确授权。
31
27
 
32
28
  ## Settings
33
29
 
@@ -18,4 +18,4 @@
18
18
 
19
19
  视频时长读取实时 `durationOptions`。只有实时选项恰为 5、10、15 秒时才按这三档向上取整。RunningHub MiniMax H3 支持纯文本,5–15 秒逐秒可选,1–4 秒归一为 5 秒;画幅为 16:9 / 9:16,分辨率为 480p / 720p / 1K / 2K。
20
20
 
21
- 结构化资源使用 `canvas node edit-resource`,镜头使用 `canvas node edit-shot`。Meme 使用 `meme-scene-analysis → meme-material-search → cat-meme-video`,禁止静默切换通用视频;`CAT_MEME_REQUIRED_PROP_MISSING` 返回素材检索修复。
21
+ 结构化资源使用 `canvas node edit-resource`,镜头使用 `canvas node edit-shot`。
@@ -43,7 +43,7 @@
43
43
  - 在线模板 CRUD、提示词管理后台、通知、SSE 和 Web 页面状态。
44
44
  - 无限画布、节点编辑器及其节点 ID 合同。
45
45
 
46
- 原项目四组制作提示词共有 45 个唯一 stem:38 个按原能力映射,`character_reference_to_sheet` 合并优化为人物完整 `character_asset_sheet`,`panel_h3_video` 重构为独立于画布的 `h3_video`;`character_voice_recommend_cosy` 已去除单一供应商耦合并吸收到通用 `character_voice_recommend`,而 `cat_meme_*`、`director_snapshot_render`、`project_cover_generation` 仍不进入标准短剧插件。插件另补 source analysis、brief、director book、production plan、script review、画风/资产完整设定板和 Seedance 2.0 等标准制作模板,当前合计 52 组中英文模板。
46
+ 原项目四组制作提示词共有 45 个唯一 stem:38 个按原能力映射,`character_reference_to_sheet` 合并优化为人物完整 `character_asset_sheet`,`panel_h3_video` 重构为独立于画布的 `h3_video`;`character_voice_recommend_cosy` 已去除单一供应商耦合并吸收到通用 `character_voice_recommend`,而 `director_snapshot_render`、`project_cover_generation` 仍不进入标准短剧插件。插件另补 source analysis、brief、director book、production plan、script review、画风/资产完整设定板和 Seedance 2.0 等标准制作模板,当前合计 52 组中英文模板。
47
47
 
48
48
  人物视觉不是普通美观评分:`audience_appeal` 先从明确年龄证据区分 `adult-charisma` 与 `child-cuteness`;定妆图逐项审查年龄、身份、妆造服装、`memory_anchors`、观众吸引力及保护标记。任何一项失败都禁止选版。跨镜引用用档案 SHA、`appearance_id` 和 `identity_constraints` 绑定,连续性计划用 `visual_identity` 阻止无剧情证据的换脸、换妆造或换装。
49
49
 
@@ -14,12 +14,6 @@
14
14
 
15
15
  先读取实时 `audioModel` 和 `tts` / `voice-design` / `voice-clone` schema。声音设计和克隆必须先生成真实音色 ID,再连接到 TTS;不得把任务 ID、节点 ID 或预置音色名当音色 ID。CosyVoice v3.5 plus/flash 只接受同型号设计或克隆音色。运行后等待终态并试听完整音频,检查语言、文本、音色、语速、音调、时长、空音频和破音;按错误码修正,不盲目换音色重试。
16
16
 
17
- ## Meme
18
-
19
- 标准链路固定为 `meme-scene-analysis → meme-material-search → cat-meme-video`。即使禁用外部素材,也要运行 material search 解析内置素材和必显道具。刷新画布后复用自动创建的计划、搜索和视频节点,不手工重复创建。
20
-
21
- `CAT_MEME_REQUIRED_PROP_MISSING` 返回素材检索补道具;`CAT_MEME_DISPLAY_CONTENT_REQUIRED` 修复场景计划;`CAT_MEME_FFMPEG_FAILED` 修复或部署渲染器后重试。不得把失败当作切换通用 `video-generate` 的授权。
22
-
23
17
  ## AI 剪辑
24
18
 
25
19
  涉及时间线、裁切、字幕、转场、音频编排或渲染时,必须先加载 `remotion-best-practices`,然后完整执行 [剪辑与交付流程](editing-delivery.md)。只使用已确认的 selected 资产;原始镜头和 manifest 单独保留。H3 成片只对原生整轨做轻量处理,禁止另铺外部 TTS、旁白、对白、环境音或 BGM 覆盖。
@@ -27,4 +27,3 @@
27
27
 
28
28
  - `STORYBOARD_LANGUAGE_MISMATCH`:专业拆镜输出含目标语言之外的文字;修正本地化块或 `targetLanguage` 后重跑。
29
29
  - `COSYVOICE_TTS_CUSTOM_VOICE_REQUIRED`:仅独立 TTS 流程使用同型号声音设计/克隆 ID,不反复尝试预置音色。
30
- - `CAT_MEME_REQUIRED_PROP_MISSING`:返回 material search;`CAT_MEME_DISPLAY_CONTENT_REQUIRED` 修复计划;`CAT_MEME_FFMPEG_FAILED` 修复渲染器后重试,均不得静默切换通用视频生成。
@@ -1,14 +0,0 @@
1
- import { BaseCommand } from '../../../base-command.js';
2
- export default class ProjectProviderGet extends BaseCommand {
3
- static args: {
4
- projectId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
5
- };
6
- static flags: {
7
- 'base-url': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
- json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
- locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
- profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
- episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
- };
13
- run(): Promise<void>;
14
- }
@@ -1,12 +0,0 @@
1
- import { Args } from '@oclif/core';
2
- import { BaseCommand } from '../../../base-command.js';
3
- import { commandApi } from '../../../command-helpers.js';
4
- export default class ProjectProviderGet extends BaseCommand {
5
- static args = { projectId: Args.string({ required: true }) };
6
- static flags = BaseCommand.baseFlags;
7
- async run() {
8
- const { args, flags } = await this.parse(ProjectProviderGet);
9
- const { api } = await commandApi(flags);
10
- this.print(await api.projectMaterialProvider(args.projectId));
11
- }
12
- }
@@ -1,15 +0,0 @@
1
- import { BaseCommand } from '../../../base-command.js';
2
- export default class ProjectProviderSet extends BaseCommand {
3
- static args: {
4
- projectId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
5
- };
6
- static flags: {
7
- file: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
- 'base-url': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
- json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
- locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
- profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
- episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
- };
14
- run(): Promise<void>;
15
- }
@@ -1,18 +0,0 @@
1
- import { Args, Flags } from '@oclif/core';
2
- import { BaseCommand } from '../../../base-command.js';
3
- import { commandApi, readJsonInput } from '../../../command-helpers.js';
4
- export default class ProjectProviderSet extends BaseCommand {
5
- static args = { projectId: Args.string({ required: true }) };
6
- static flags = { ...BaseCommand.baseFlags, file: Flags.string({ description: '配置 JSON;省略时读取 stdin' }) };
7
- async run() {
8
- const { args, flags } = await this.parse(ProjectProviderSet);
9
- const input = await readJsonInput(flags.file);
10
- if (typeof input.enabled !== 'boolean')
11
- this.error('配置必须包含 boolean 类型的 enabled');
12
- const { api } = await commandApi(flags);
13
- this.print(await api.updateProjectMaterialProvider(args.projectId, {
14
- enabled: input.enabled,
15
- ...(typeof input.apiKey === 'string' ? { apiKey: input.apiKey } : {}),
16
- }));
17
- }
18
- }
@@ -1,14 +0,0 @@
1
- import { BaseCommand } from '../../../base-command.js';
2
- export default class ProjectProviderTest extends BaseCommand {
3
- static args: {
4
- projectId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
5
- };
6
- static flags: {
7
- 'base-url': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
- json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
- locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
- profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
- episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
- };
13
- run(): Promise<void>;
14
- }
@@ -1,12 +0,0 @@
1
- import { Args } from '@oclif/core';
2
- import { BaseCommand } from '../../../base-command.js';
3
- import { commandApi } from '../../../command-helpers.js';
4
- export default class ProjectProviderTest extends BaseCommand {
5
- static args = { projectId: Args.string({ required: true }) };
6
- static flags = BaseCommand.baseFlags;
7
- async run() {
8
- const { args, flags } = await this.parse(ProjectProviderTest);
9
- const { api } = await commandApi(flags);
10
- this.print(await api.testProjectMaterialProvider(args.projectId));
11
- }
12
- }