@aswless_854771076/ai_short_studio_cli 0.1.50 → 0.1.52

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.
Files changed (76) hide show
  1. package/README.md +14 -1
  2. package/dist/base-command.d.ts +1 -0
  3. package/dist/base-command.js +1 -0
  4. package/dist/client/api-client.d.ts +2 -0
  5. package/dist/client/api-client.js +4 -0
  6. package/dist/commands/auth/login.d.ts +1 -0
  7. package/dist/commands/auth/logout.d.ts +1 -0
  8. package/dist/commands/auth/signup.d.ts +1 -0
  9. package/dist/commands/auth/status.d.ts +1 -0
  10. package/dist/commands/canvas/apply.d.ts +1 -0
  11. package/dist/commands/canvas/asset/download.d.ts +1 -0
  12. package/dist/commands/canvas/asset/get.d.ts +1 -0
  13. package/dist/commands/canvas/asset/list.d.ts +1 -0
  14. package/dist/commands/canvas/asset/select.d.ts +1 -0
  15. package/dist/commands/canvas/asset/upload.d.ts +1 -0
  16. package/dist/commands/canvas/continuity/analyze.d.ts +1 -0
  17. package/dist/commands/canvas/edge/connect.d.ts +1 -0
  18. package/dist/commands/canvas/edge/disconnect.d.ts +1 -0
  19. package/dist/commands/canvas/edge/list.d.ts +1 -0
  20. package/dist/commands/canvas/episode/create.d.ts +14 -0
  21. package/dist/commands/canvas/episode/create.js +16 -0
  22. package/dist/commands/canvas/episode/list.d.ts +12 -0
  23. package/dist/commands/canvas/episode/list.js +10 -0
  24. package/dist/commands/canvas/folder/copy-cross-project.d.ts +25 -0
  25. package/dist/commands/canvas/folder/copy-cross-project.js +51 -0
  26. package/dist/commands/canvas/folder/create.d.ts +20 -0
  27. package/dist/commands/canvas/folder/create.js +28 -0
  28. package/dist/commands/canvas/folder/delete.d.ts +19 -0
  29. package/dist/commands/canvas/folder/delete.js +25 -0
  30. package/dist/commands/canvas/folder/list.d.ts +19 -0
  31. package/dist/commands/canvas/folder/list.js +26 -0
  32. package/dist/commands/canvas/folder/move.d.ts +21 -0
  33. package/dist/commands/canvas/folder/move.js +32 -0
  34. package/dist/commands/canvas/folder/rename.d.ts +21 -0
  35. package/dist/commands/canvas/folder/rename.js +27 -0
  36. package/dist/commands/canvas/folder/restore.d.ts +19 -0
  37. package/dist/commands/canvas/folder/restore.js +25 -0
  38. package/dist/commands/canvas/get.d.ts +1 -0
  39. package/dist/commands/canvas/inspect.d.ts +1 -0
  40. package/dist/commands/canvas/node/add.d.ts +1 -0
  41. package/dist/commands/canvas/node/delete.d.ts +1 -0
  42. package/dist/commands/canvas/node/edit-resource.d.ts +1 -0
  43. package/dist/commands/canvas/node/edit-shot.d.ts +1 -0
  44. package/dist/commands/canvas/node/get.d.ts +1 -0
  45. package/dist/commands/canvas/node/list.d.ts +1 -0
  46. package/dist/commands/canvas/node/run.d.ts +1 -0
  47. package/dist/commands/canvas/node/types.d.ts +1 -0
  48. package/dist/commands/canvas/node/update-many.d.ts +1 -0
  49. package/dist/commands/canvas/node/update.d.ts +1 -0
  50. package/dist/commands/canvas/settings/get.d.ts +1 -0
  51. package/dist/commands/canvas/settings/set.d.ts +1 -0
  52. package/dist/commands/config/get.d.ts +1 -0
  53. package/dist/commands/config/set.d.ts +1 -0
  54. package/dist/commands/preflight.d.ts +1 -0
  55. package/dist/commands/project/create.d.ts +1 -0
  56. package/dist/commands/project/delete.d.ts +1 -0
  57. package/dist/commands/project/get.d.ts +1 -0
  58. package/dist/commands/project/list.d.ts +1 -0
  59. package/dist/commands/project/provider/get.d.ts +1 -0
  60. package/dist/commands/project/provider/set.d.ts +1 -0
  61. package/dist/commands/project/provider/test.d.ts +1 -0
  62. package/dist/commands/project/update.d.ts +1 -0
  63. package/dist/commands/skill/install.d.ts +1 -0
  64. package/dist/commands/skill/path.d.ts +1 -0
  65. package/dist/commands/skill/status.d.ts +1 -0
  66. package/dist/commands/task/cancel.d.ts +1 -0
  67. package/dist/commands/task/get.d.ts +1 -0
  68. package/dist/commands/task/wait.d.ts +1 -0
  69. package/dist/domain/vvicat-api.d.ts +21 -0
  70. package/dist/domain/vvicat-api.js +42 -0
  71. package/dist/preflight.js +0 -4
  72. package/dist/runtime.d.ts +1 -0
  73. package/dist/runtime.js +1 -1
  74. package/package.json +1 -1
  75. package/skills/using-vvicat-ai-short-studio-cli/SKILL.md +43 -3
  76. package/skills/using-vvicat-ai-short-studio-cli/references/commands.md +1 -1
@@ -0,0 +1,19 @@
1
+ import { BaseCommand } from '../../../base-command.js';
2
+ /**
3
+ * 恢复 30 天内软删的画布目录
4
+ * - --folder-id 目标目录 ID(camelCase 别名 --folder 也可)
5
+ * - 失败码:FOLDER_NOT_FOUND / GONE(超过 30 天回收窗口)
6
+ */
7
+ export default class CanvasFolderRestore extends BaseCommand {
8
+ static description: string;
9
+ static flags: {
10
+ project: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
+ 'folder-id': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
+ 'base-url': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
15
+ profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ };
18
+ run(): Promise<void>;
19
+ }
@@ -0,0 +1,25 @@
1
+ import { Flags } from '@oclif/core';
2
+ import { BaseCommand } from '../../../base-command.js';
3
+ import { commandApi, projectFlag } from '../../../command-helpers.js';
4
+ /**
5
+ * 恢复 30 天内软删的画布目录
6
+ * - --folder-id 目标目录 ID(camelCase 别名 --folder 也可)
7
+ * - 失败码:FOLDER_NOT_FOUND / GONE(超过 30 天回收窗口)
8
+ */
9
+ export default class CanvasFolderRestore extends BaseCommand {
10
+ static description = '恢复软删的画布目录(Restore soft-deleted canvas asset folder)';
11
+ static flags = {
12
+ ...BaseCommand.baseFlags,
13
+ project: projectFlag,
14
+ 'folder-id': Flags.string({
15
+ description: '目录 ID;可用 --folder 替代(Folder id)',
16
+ required: true,
17
+ aliases: ['folder'],
18
+ }),
19
+ };
20
+ async run() {
21
+ const { flags } = await this.parse(CanvasFolderRestore);
22
+ const { api } = await commandApi(flags);
23
+ this.print(await api.restoreFolder(flags.project, flags['folder-id']));
24
+ }
25
+ }
@@ -6,6 +6,7 @@ export default class CanvasGet extends BaseCommand {
6
6
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
7
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
8
8
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
10
  };
10
11
  run(): Promise<void>;
11
12
  }
@@ -14,6 +14,7 @@ export default class CanvasInspect extends BaseCommand {
14
14
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
15
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
16
16
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
18
  };
18
19
  run(): Promise<void>;
19
20
  }
@@ -13,6 +13,7 @@ export default class CanvasNodeAdd extends BaseCommand {
13
13
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
14
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
15
15
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
17
  };
17
18
  run(): Promise<void>;
18
19
  }
@@ -10,6 +10,7 @@ export default class CanvasNodeDelete extends BaseCommand {
10
10
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
11
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
12
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
14
  };
14
15
  run(): Promise<void>;
15
16
  }
@@ -10,6 +10,7 @@ export default class CanvasNodeEditResource extends BaseCommand {
10
10
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
11
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
12
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
14
  };
14
15
  run(): Promise<void>;
15
16
  }
@@ -10,6 +10,7 @@ export default class CanvasNodeEditShot extends BaseCommand {
10
10
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
11
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
12
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
14
  };
14
15
  run(): Promise<void>;
15
16
  }
@@ -9,6 +9,7 @@ export default class CanvasNodeGet extends BaseCommand {
9
9
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
10
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
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>;
12
13
  };
13
14
  run(): Promise<void>;
14
15
  }
@@ -6,6 +6,7 @@ export default class CanvasNodeList extends BaseCommand {
6
6
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
7
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
8
8
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
10
  };
10
11
  run(): Promise<void>;
11
12
  }
@@ -13,6 +13,7 @@ export default class CanvasNodeRun extends BaseCommand {
13
13
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
14
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
15
15
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
17
  };
17
18
  run(): Promise<void>;
18
19
  }
@@ -9,6 +9,7 @@ export default class CanvasNodeTypes extends BaseCommand {
9
9
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
10
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
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>;
12
13
  };
13
14
  run(): Promise<void>;
14
15
  }
@@ -8,6 +8,7 @@ export default class CanvasNodeUpdateMany extends BaseCommand {
8
8
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
9
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
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>;
11
12
  };
12
13
  run(): Promise<void>;
13
14
  }
@@ -15,6 +15,7 @@ export default class CanvasNodeUpdate extends BaseCommand {
15
15
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
16
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
17
17
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
19
  };
19
20
  run(): Promise<void>;
20
21
  }
@@ -6,6 +6,7 @@ export default class CanvasSettingsGet extends BaseCommand {
6
6
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
7
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
8
8
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
10
  };
10
11
  run(): Promise<void>;
11
12
  }
@@ -17,6 +17,7 @@ export default class CanvasSettingsSet extends BaseCommand {
17
17
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
18
18
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
19
19
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
21
  };
21
22
  run(): Promise<void>;
22
23
  }
@@ -5,6 +5,7 @@ export default class ConfigGet extends BaseCommand {
5
5
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
6
6
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
7
7
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
9
  };
9
10
  run(): Promise<void>;
10
11
  }
@@ -6,6 +6,7 @@ export default class ConfigSet extends BaseCommand {
6
6
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
7
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
8
8
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
10
  };
10
11
  run(): Promise<void>;
11
12
  }
@@ -7,6 +7,7 @@ export default class Preflight extends BaseCommand {
7
7
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
8
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
9
9
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
11
  };
11
12
  run(): Promise<void>;
12
13
  }
@@ -7,6 +7,7 @@ export default class ProjectCreate extends BaseCommand {
7
7
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
8
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
9
9
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
11
  };
11
12
  run(): Promise<void>;
12
13
  }
@@ -9,6 +9,7 @@ export default class ProjectDelete extends BaseCommand {
9
9
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
10
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
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>;
12
13
  };
13
14
  run(): Promise<void>;
14
15
  }
@@ -8,6 +8,7 @@ export default class ProjectGet extends BaseCommand {
8
8
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
9
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
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>;
11
12
  };
12
13
  run(): Promise<void>;
13
14
  }
@@ -9,6 +9,7 @@ export default class ProjectList extends BaseCommand {
9
9
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
10
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
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>;
12
13
  };
13
14
  run(): Promise<void>;
14
15
  }
@@ -8,6 +8,7 @@ export default class ProjectProviderGet extends BaseCommand {
8
8
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
9
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
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>;
11
12
  };
12
13
  run(): Promise<void>;
13
14
  }
@@ -9,6 +9,7 @@ export default class ProjectProviderSet extends BaseCommand {
9
9
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
10
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
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>;
12
13
  };
13
14
  run(): Promise<void>;
14
15
  }
@@ -8,6 +8,7 @@ export default class ProjectProviderTest extends BaseCommand {
8
8
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
9
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
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>;
11
12
  };
12
13
  run(): Promise<void>;
13
14
  }
@@ -10,6 +10,7 @@ export default class ProjectUpdate extends BaseCommand {
10
10
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
11
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
12
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
14
  };
14
15
  run(): Promise<void>;
15
16
  }
@@ -10,6 +10,7 @@ export default class SkillInstall extends BaseCommand {
10
10
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
11
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
12
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
14
  };
14
15
  run(): Promise<void>;
15
16
  }
@@ -9,6 +9,7 @@ export default class SkillPath extends BaseCommand {
9
9
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
10
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
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>;
12
13
  };
13
14
  run(): Promise<void>;
14
15
  }
@@ -9,6 +9,7 @@ export default class SkillStatus extends BaseCommand {
9
9
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
10
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
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>;
12
13
  };
13
14
  run(): Promise<void>;
14
15
  }
@@ -9,6 +9,7 @@ export default class TaskCancel extends BaseCommand {
9
9
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
10
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
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>;
12
13
  };
13
14
  run(): Promise<void>;
14
15
  }
@@ -8,6 +8,7 @@ export default class TaskGet extends BaseCommand {
8
8
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
9
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
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>;
11
12
  };
12
13
  run(): Promise<void>;
13
14
  }
@@ -11,6 +11,7 @@ export default class TaskWait extends BaseCommand {
11
11
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
12
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
13
13
  profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ episode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
15
  };
15
16
  run(): Promise<void>;
16
17
  }
@@ -67,8 +67,29 @@ export declare class VvicatApi {
67
67
  testProjectMaterialProvider(projectId: string): Promise<JsonObject>;
68
68
  deleteProject(projectId: string): Promise<JsonObject>;
69
69
  canvas(projectId: string): Promise<CanvasDto>;
70
+ listCanvasEpisodes(projectId: string): Promise<JsonObject[]>;
71
+ createCanvasEpisode(projectId: string, episodeNumber: number, name?: string): Promise<JsonObject>;
70
72
  canvasSettings(projectId: string): Promise<JsonObject>;
71
73
  updateCanvasSettings(projectId: string, input: JsonObject): Promise<JsonObject>;
74
+ listFolders(projectId: string, query?: string): Promise<JsonObject>;
75
+ createFolder(projectId: string, input: {
76
+ name: string;
77
+ parentId?: string | null;
78
+ }): Promise<JsonObject>;
79
+ updateFolder(projectId: string, folderId: string, input: {
80
+ name?: string;
81
+ }): Promise<JsonObject>;
82
+ deleteFolder(projectId: string, folderId: string): Promise<JsonObject>;
83
+ restoreFolder(projectId: string, folderId: string): Promise<JsonObject>;
84
+ moveFolder(projectId: string, folderId: string, input: {
85
+ newParentId: string | null;
86
+ }): Promise<JsonObject>;
87
+ copyAssetCrossProject(projectId: string, input: {
88
+ assetId: string;
89
+ targetProjectId: string;
90
+ targetFolderId: string | null;
91
+ targetCanvasEpisodeId?: string | null;
92
+ }): Promise<JsonObject>;
72
93
  listNodes(projectId: string): Promise<CanvasNode[]>;
73
94
  node(projectId: string, nodeId: string): Promise<CanvasNode>;
74
95
  listEdges(projectId: string): Promise<JsonObject[]>;
@@ -102,12 +102,51 @@ export class VvicatApi {
102
102
  const payload = await this.client.request(`/api/projects/${projectId}/canvas`);
103
103
  return payload.data.canvas;
104
104
  }
105
+ async listCanvasEpisodes(projectId) {
106
+ const payload = await this.client.request(`/api/projects/${projectId}/canvas-episodes`);
107
+ return payload.episodes;
108
+ }
109
+ async createCanvasEpisode(projectId, episodeNumber, name) {
110
+ return this.client.request(`/api/projects/${projectId}/canvas-episodes`, {
111
+ method: 'POST', body: { episodeNumber, ...(name ? { name } : {}) },
112
+ });
113
+ }
114
+ // CLI 只开放分集查询与创建;删除涉及“至少保留一集”约束,继续由网页交互确认。
105
115
  canvasSettings(projectId) {
106
116
  return this.client.request(`/api/projects/${projectId}/canvas/settings`);
107
117
  }
108
118
  updateCanvasSettings(projectId, input) {
109
119
  return this.client.request(`/api/projects/${projectId}/canvas/settings`, { method: 'PATCH', body: input });
110
120
  }
121
+ listFolders(projectId, query = '') {
122
+ // 树形目录列表;预设 5 项 + 用户子目录(含 deletedAt / purgeInDays / referencedBy)
123
+ return this.client.request(`/api/projects/${projectId}/canvas-folders${query ? `?${query}` : ''}`);
124
+ }
125
+ createFolder(projectId, input) {
126
+ return this.client.request(`/api/projects/${projectId}/canvas-folders`, { method: 'POST', body: input });
127
+ }
128
+ updateFolder(projectId, folderId, input) {
129
+ return this.client.request(`/api/projects/${projectId}/canvas-folders/${folderId}`, { method: 'PATCH', body: input });
130
+ }
131
+ deleteFolder(projectId, folderId) {
132
+ return this.client.request(`/api/projects/${projectId}/canvas-folders/${folderId}`, {
133
+ method: 'DELETE',
134
+ });
135
+ }
136
+ restoreFolder(projectId, folderId) {
137
+ return this.client.request(`/api/projects/${projectId}/canvas-folders/${folderId}/restore`, { method: 'POST' });
138
+ }
139
+ moveFolder(projectId, folderId, input) {
140
+ // 服务端契约使用 newParentId;调用方传入 null 表示提升到根
141
+ return this.client.request(`/api/projects/${projectId}/canvas-folders/${folderId}/move`, {
142
+ method: 'PATCH', body: { newParentId: input.newParentId },
143
+ });
144
+ }
145
+ copyAssetCrossProject(projectId, input) {
146
+ return this.client.request(`/api/projects/${projectId}/canvas-assets/copy-cross-project`, {
147
+ method: 'POST', body: input,
148
+ });
149
+ }
111
150
  async listNodes(projectId) {
112
151
  return (await this.canvas(projectId)).nodes;
113
152
  }
@@ -284,6 +323,7 @@ export class VvicatApi {
284
323
  task(taskId) {
285
324
  return this.client.request(`/api/tasks/${taskId}`);
286
325
  }
326
+ // CLI 只读取、等待或取消任务;人工复核结果仍由网页端提交,避免自动化误选生产资产。
287
327
  cancelTask(taskId) {
288
328
  return this.client.request(`/api/tasks/${taskId}`, { method: 'DELETE' });
289
329
  }
@@ -299,6 +339,8 @@ export class VvicatApi {
299
339
  return this.client.request('/api/user/api-config?redactSecrets=1');
300
340
  }
301
341
  updateConfig(input) {
342
+ if (Object.hasOwn(input, 'providers') || Object.hasOwn(input, 'models'))
343
+ throw new Error('供应商和模型目录只能由管理员维护');
302
344
  return this.client.request('/api/user/api-config', { method: 'PUT', body: input });
303
345
  }
304
346
  raw(path, options) {
package/dist/preflight.js CHANGED
@@ -87,7 +87,6 @@ export function updateCliPackage(input) {
87
87
  }
88
88
  export function inspectCreationConfig(config) {
89
89
  const value = isRecord(config) ? config : {};
90
- const providers = Array.isArray(value.providers) ? value.providers.filter(isRecord) : [];
91
90
  const models = Array.isArray(value.models) ? value.models.filter(isRecord) : [];
92
91
  const defaults = isRecord(value.defaultModels) ? value.defaultModels : {};
93
92
  const capabilityDefaults = isRecord(value.capabilityDefaults) ? value.capabilityDefaults : {};
@@ -105,9 +104,6 @@ export function inspectCreationConfig(config) {
105
104
  addMissing(`models.${modelKey}`);
106
105
  continue;
107
106
  }
108
- const provider = providers.find((item) => item.id === model.provider);
109
- if (!provider || provider.hasApiKey !== true)
110
- addMissing(`providers.${String(model.provider)}.apiKey`);
111
107
  inspectModelCapabilities(model, modelKey, expectedType, capabilityDefaults, addMissing);
112
108
  }
113
109
  if (!isRecord(value.capabilityDefaults))
package/dist/runtime.d.ts CHANGED
@@ -5,6 +5,7 @@ interface RuntimeFlags {
5
5
  'base-url'?: string;
6
6
  locale?: string;
7
7
  profile?: string;
8
+ episode?: string;
8
9
  'supabase-publishable-key'?: string;
9
10
  'supabase-url'?: string;
10
11
  }
package/dist/runtime.js CHANGED
@@ -36,7 +36,7 @@ export async function createRuntime(flags) {
36
36
  return {
37
37
  profile,
38
38
  session,
39
- client: new ApiClient({ baseUrl, session, locale: flags.locale }),
39
+ client: new ApiClient({ baseUrl, session, locale: flags.locale, episode: flags.episode }),
40
40
  };
41
41
  }
42
42
  function resolveAuthConfig(profile, flags) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aswless_854771076/ai_short_studio_cli",
3
- "version": "0.1.50",
3
+ "version": "0.1.52",
4
4
  "description": "VVICAT 无限画布项目命令行工具",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -18,8 +18,9 @@ description: Use when an agent needs to inspect or operate VVICAT infinite-canva
18
18
  创建项目或修改任何资源前,按顺序执行:
19
19
 
20
20
  1. 运行 `ai-short-studio preflight --json`。它通过 API base URL 检查连通性和 CLI 最新稳定版,未配置地址时使用测试环境 `https://ai-short-studio.vvicat.dev`,默认发现更新就更新当前全局包;`restartRequired` 为真时必须重跑。连不上时提醒用户检查 `--base-url`、`VVICAT_BASE_URL`、profile 或默认测试环境,不猜其他地址。
21
- 2. 未登录且已有账号时执行 `ai-short-studio auth login --google` 或邮箱登录;没有账号且用户明确要求注册时,先核对 profile 的 `baseUrl` 确实指向目标环境,再使用 `auth signup --email <email> --password-stdin`。CLI 会从服务端取得 Supabase 公共配置,并把同域的 `/{locale}/auth/callback` 显式设为注册确认回调。注册返回 `confirmationRequired: true` 时,等待用户完成邮件验证后再登录。登录后重跑 preflight。`ready` 为 false 时,把 `missing` 一次性告知用户并询问如何补齐;新配置模型首选公司的 [StarRouter](https://starrouter.io/),账号开通联系邱茂。
22
- 3. 运行账户级只读命令 `ai-short-studio config get --json`,取得账户默认模型及可用 provider。创建项目至少要求已配置 `defaultModels.analysisModel`;缺失时 `project create` 会在发送创建请求前停止,需先由用户在设置中心完成配置。此步骤只用于计算继承后的有效模型,不得用 `config set` 改账户配置来完成项目配置。
21
+ 2. 未登录且已有账号时执行 `ai-short-studio auth login --google` 或邮箱登录;没有账号且用户明确要求注册时,先核对 profile 的 `baseUrl` 确实指向目标环境,再使用 `auth signup --email <email> --password-stdin`。CLI 会从服务端取得 Supabase 公共配置,并把同域的 `/{locale}/auth/callback` 显式设为注册确认回调。注册返回 `confirmationRequired: true` 时,等待用户完成邮件验证后再登录。登录后重跑 preflight。`ready` 为 false 时,把缺失的默认模型和能力选项一次性告知用户;供应商与模型目录问题交由管理员处理。
22
+ 3. 运行账户级只读命令 `ai-short-studio config get --json`,取得账户默认模型及管理员已发布的全局模型。创建项目至少要求已配置 `defaultModels.analysisModel`;缺失时 `project create` 会在发送创建请求前停止,需先由用户在设置中心完成配置。供应商、密钥和模型目录只能由管理员维护;`config set` 只维护个人默认模型及其能力默认值和工作流并发,不得写入 `providers` 或 `models`。
23
+ Comfly 和 RunningHub 同样从全局目录选择;其凭据、服务地址和工作流映射由管理员或服务端维护,CLI 不要求也不接受用户配置供应商连接。
23
24
  4. 运行 `ai-short-studio canvas node types --json`,按实时 `inputSchema`、`outputSchema`、`configSchema` 和 `defaultConfig` 确定能力与必填项。
24
25
  5. 运行 `project list` 判断目标是新项目还是既有项目。新项目先确认账户默认分析模型已配置,再按“确认名称和用途 → `project create` → `project get` + 一次 `canvas inspect --include summary --include nodes --include edges --include assets --include settings --include node-types`”继续;未通过模型审查时不得尝试创建。既有项目同样用 `project get` 加一次聚合查询取得画布、项目配置、节点目录和资产。只有聚合结果缺少专用命令独有字段时才补充单项读取,不得把这些查询拆成一串 CLI 进程;也不得要求尚未创建的新项目先读取项目或画布。任何缺口仍按核心原则询问。
25
26
  6. 运行 `ai-short-studio skill status --target codex --json`;非 current 时询问后更新,用户修改或非托管目录不得擅自 `--force` 覆盖。
@@ -80,6 +81,45 @@ description: Use when an agent needs to inspect or operate VVICAT infinite-canva
80
81
 
81
82
  结构字段漏项属于上游产物或物化缺陷,不得静默绕过。能用确定映射恢复 reference 时按上述幂等流程修复;不能确定时停止并报告缺口,等待用户选择重新拆解或确认映射。
82
83
 
84
+ ## 画布资产目录管理(canvas folder)
85
+
86
+ 无限画布项目按分集隔离画布、目录和资产。用 `canvas episode list --project <projectId>` 列出分集,用 `canvas episode create --project <projectId> --number <n>` 创建分集;其他 `canvas *` 命令传 `--episode <episodeId|集数>` 选择作用域。
87
+
88
+ CLI 不提供分集删除或任务人工复核提交。遇到需要删除分集、选择一致性测试结果或提交视频人工复核的场景,转到网页端完成,不得用低层请求绕过确认。
89
+
90
+ 画布资产目录是项目内"道具 / 人物 / 场景 / 配音 / 分镜"五类的物理容器,命令族 `canvas folder *` 独立于 `canvas asset *`,专管目录结构。
91
+
92
+ ### 概述
93
+
94
+ - 5 个预设目录(道具、人物、场景、配音、分镜)在项目初始化时自动创建,名称固定,不可重命名、不可移动、不可删除
95
+ - 用户可在 5 个预设目录的任意层下创建子目录,递归层级上限 32 层
96
+ - 删除目录走软删逻辑:节点进入 30 天回收窗口,可恢复;窗口外返回 `FOLDER_GONE`
97
+ - 跨项目复制资产时不复制目录结构,仅复制资产条目与所属版本
98
+
99
+ ### 强制顺序
100
+
101
+ 1. 执行 `canvas folder list --project <projectId> --json` 取得活动目录树(含 5 个预设 + 用户子目录)。只有传 `--include-soft-deleted` 时才同时返回软删节点
102
+ 2. 需要修改目录结构前必须先 list,避免对不存在的 `folderId` 操作触发 `404 / FOLDER_NOT_FOUND`
103
+ 3. 创建子目录:`canvas folder create --project <projectId> --name "..." --parent-id <folderId>`。省略 `--parent-id` 时创建在项目根层
104
+ 4. 重命名:`canvas folder rename --project <projectId> --folder <folderId> --name "..."`。预设目录禁止重命名,返回 `FOLDER_PRESET_IMMUTABLE`
105
+ 5. 移动:`canvas folder move --project <projectId> --folder <folderId> --parent-id <parentId>`。预设目录禁止移动;同项目内不允许形成环(目标 `parentId` 不能是 `folderId` 的后代),返回 `FOLDER_CYCLE_DETECTED`
106
+ 6. 删除:`canvas folder delete --project <projectId> --folder <folderId>`。预设目录禁止删除;被引用时返回 `FOLDER_IN_USE` 并附引用方列表,必须先解除引用再重试
107
+ 7. 恢复软删目录:`canvas folder restore --project <projectId> --folder <folderId>`。超过 30 天回收窗口返回 `FOLDER_GONE`,无法恢复
108
+ 8. 跨项目或跨分集复制资产:`canvas folder copy-cross-project --project <sourceProjectId> --asset-id <assetId> --target-project <targetProjectId> --target-episode-id <episodeId> --target-folder-id <folderId>`。`--target-episode-id` 指定目标分集;省略 `--target-folder-id` 时复制到该分集的未分类。目标目录必须属于目标项目和目标分集。该命令只复制资产及版本,不复制目录结构;目标项目无写入权限时返回 `FOLDER_FORBIDDEN`
109
+
110
+ ### 批量操作原则
111
+
112
+ - 单次命令只处理一个目录;批量场景按目录循环执行
113
+ - 删除、移动、重命名互不依赖时可并发执行;存在依赖(先重命名再删除)必须按顺序串行
114
+ - 操作前后用 `canvas folder list --project <projectId>` 回读验证结果是否生效
115
+ - 任何 `404 / FOLDER_NOT_FOUND / FOLDER_PRESET_IMMUTABLE / FOLDER_IN_USE` 错误必须停下修正;被引用时必须先解除引用再重试
116
+
117
+ ### 与现有 CLI 命令的关系
118
+
119
+ - `canvas folder *` 命令**独立于** `canvas asset *`。folder 操作对象是目录容器,asset 操作对象是容器内的资产条目
120
+ - `canvas folder list` 是取得目标目录 ID 的唯一目录命令;`canvas asset list` 当前仅支持 `--kind` 与 `--search`,不接受目录筛选参数
121
+ - 复制后用目标项目的 `canvas asset get <assetId>` 或网页资产目录回读;目录结构和回收站状态以 `canvas folder list` 为准
122
+
83
123
  ## 关联资产参考图门禁(真假/版本/衍生)
84
124
 
85
125
  故事里存在“真/假”“原版/复制品”“同款不同状态”的成对道具、不同年龄同一人物、或母题相关的场景时,三视图和分镜图必须保持视觉血缘一致性,禁止各版本互不相干地自由发挥:
@@ -204,7 +244,7 @@ RunningHub MiniMax H3 的实时 `aspectRatio` 只有 16:9、9:16,`resolution`
204
244
  - 邮箱注册同样只通过交互式隐藏输入或安全 stdin 传递密码,不把密码放入命令参数、日志或仓库。
205
245
  - 用户已在当前会话明确提供密码时,可将其直接写入正在等待的交互式隐藏密码提示;不得复述密码、拼入 shell 命令、写入临时文件或跨会话保存。
206
246
  - 注册环境通过 profile `baseUrl` 区分;Supabase Redirect URLs 应预先允许各环境,禁止为单次本地注册临时修改全局 Site URL。
207
- - `config get` 只应返回 `hasApiKey`,不得依赖或要求服务端回显密钥。
247
+ - `config get` 不返回全局 Provider 密钥;返回的模型已经过管理员发布和可用性校验,预检不得要求用户持有 Provider 密钥。
208
248
  - `project provider get` 只返回配置状态。`project provider set` 的 JSON 必须来自安全 stdin 或不入库的临时秘密文件,禁止把 Key 写进命令参数、仓库文件或会回显的 shell 历史。
209
249
  - 删除用户既有项目、覆盖完整画布或修改模型配置前,先明确目标和影响;没有授权就停在读取或生成变更计划。
210
250
  - `canvas apply` 只用于节点、连线、删除、视口等低层图补丁,不能代替 `canvas settings set`。同阶段有多个图变更时优先一次批量提交;已有画布快照时必须传 `--canvas-id` 和 `--expected-version`,不让 CLI 再预读全图。批量失败按“核心原则”分类处理,不能通过逐条重试绕过权限、schema、业务门禁或付费确认。遇到 409 才重新读取、合并并确认后重试。项目配置遇到 409 时也必须重新读取和确认。
@@ -193,7 +193,7 @@ ai-short-studio config get --json
193
193
  ai-short-studio config set --file <config.json> --json
194
194
  ```
195
195
 
196
- `config set` 接受 `models`、`providers`、`defaultModels`、`capabilityDefaults`、`workflowConcurrency` 的部分对象。provider `apiKey` 缺省时保留现有密钥,空字符串表示清除;敏感配置文件不要提交到版本库。标准创作启动只执行只读的 `config get` 来计算账户默认模型的继承结果;不得用账户级 `config set` 代替项目的 canvas settings。
196
+ `config set` 只接受 `defaultModels`、`capabilityDefaults`、`workflowConcurrency` 的部分对象;CLI 与服务端都会拒绝 `providers` `models`。Provider 密钥和全局模型目录只能由管理员后台维护。标准创作启动只执行只读的 `config get` 来计算账户默认模型的继承结果;不得用账户级 `config set` 代替项目的 canvas settings。
197
197
 
198
198
  ## 标准创作命令顺序
199
199