@ninkch/dsh-infinite-canvas 0.18.6 → 0.19.0

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 (89) hide show
  1. package/README.md +47 -10
  2. package/README.zh-CN.md +46 -9
  3. package/assets/canvas-craft/SKILL.md +283 -12
  4. package/assets/canvas-layout/SKILL.md +6 -3
  5. package/assets/canvas-studio/SKILL.md +57 -11
  6. package/assets/director/engine.js +5177 -0
  7. package/assets/director/models/bld_a.json +1 -0
  8. package/assets/director/models/bld_b.json +1 -0
  9. package/assets/director/models/bld_c.json +1 -0
  10. package/assets/director/models/bld_d.json +1 -0
  11. package/assets/director/models/bld_e.json +1 -0
  12. package/assets/director/models/bld_f.json +1 -0
  13. package/assets/director/models/bld_g.json +1 -0
  14. package/assets/director/models/bld_h.json +1 -0
  15. package/assets/director/models/bld_i.json +1 -0
  16. package/assets/director/models/bld_j.json +1 -0
  17. package/assets/director/models/bld_skyscraper_a.json +1 -0
  18. package/assets/director/models/bld_skyscraper_b.json +1 -0
  19. package/assets/director/models/bld_skyscraper_c.json +1 -0
  20. package/assets/director/models/bld_skyscraper_d.json +1 -0
  21. package/assets/director/models/cesiumman.json +1 -0
  22. package/assets/director/models/furn_bedDouble.json +1 -0
  23. package/assets/director/models/furn_bench.json +1 -0
  24. package/assets/director/models/furn_bookcaseClosed.json +1 -0
  25. package/assets/director/models/furn_cabinetTelevision.json +1 -0
  26. package/assets/director/models/furn_chair.json +1 -0
  27. package/assets/director/models/furn_kitchenBar.json +1 -0
  28. package/assets/director/models/furn_lampRoundFloor.json +1 -0
  29. package/assets/director/models/furn_rugRectangle.json +1 -0
  30. package/assets/director/models/furn_stoolBar.json +1 -0
  31. package/assets/director/models/furn_tableCross.json +1 -0
  32. package/assets/director/models/furn_televisionModern.json +1 -0
  33. package/assets/director/models/index.json +285 -0
  34. package/assets/director/models/soldier.json +1 -0
  35. package/assets/director/models/tree_blocks.json +1 -0
  36. package/assets/director/models/tree_cone.json +1 -0
  37. package/assets/director/models/tree_default.json +1 -0
  38. package/assets/director/models/tree_detailed.json +1 -0
  39. package/assets/director/models/tree_fat.json +1 -0
  40. package/assets/director/models/tree_oak.json +1 -0
  41. package/assets/director/models/tree_palm.json +1 -0
  42. package/assets/director/models/tree_palmDetailedTall.json +1 -0
  43. package/assets/director/models/tree_palmTall.json +1 -0
  44. package/assets/director/models/tree_pineDefaultA.json +1 -0
  45. package/assets/director/models/tree_pineRoundA.json +1 -0
  46. package/assets/director/models/tree_thin.json +1 -0
  47. package/assets/director/models/xbot.json +1 -0
  48. package/client.js +8357 -1357
  49. package/docs/UI-RULES.md +73 -0
  50. package/docs/director-3d.md +578 -0
  51. package/docs/guide.en.md +84 -8
  52. package/docs/guide.zh-CN.md +85 -9
  53. package/docs/images/director-assets-buildings-en.png +0 -0
  54. package/docs/images/director-assets-buildings-zh.png +0 -0
  55. package/docs/images/director-assets-characters-en.png +0 -0
  56. package/docs/images/director-assets-characters-zh.png +0 -0
  57. package/docs/images/director-assets-furniture-en.png +0 -0
  58. package/docs/images/director-assets-furniture-zh.png +0 -0
  59. package/docs/images/director-assets-primitives-en.png +0 -0
  60. package/docs/images/director-assets-primitives-zh.png +0 -0
  61. package/docs/images/director-assets-trees-en.png +0 -0
  62. package/docs/images/director-assets-trees-zh.png +0 -0
  63. package/docs/images/director-daylight-en.png +0 -0
  64. package/docs/images/director-dynamic-en.png +0 -0
  65. package/docs/images/director-dynamic-zh.png +0 -0
  66. package/docs/images/director-live-render-zh.png +0 -0
  67. package/docs/images/director-static-en.png +0 -0
  68. package/docs/images/director-static-zh.png +0 -0
  69. package/docs/images/help-en.png +0 -0
  70. package/docs/images/help-zh.png +0 -0
  71. package/docs/images/overview-en.png +0 -0
  72. package/docs/images/overview-zh.png +0 -0
  73. package/docs/images/panel-assets-en.png +0 -0
  74. package/docs/images/panel-assets-zh.png +0 -0
  75. package/docs/images/panel-bible-zh.png +0 -0
  76. package/docs/images/panel-projects-zh.png +0 -0
  77. package/docs/images/panel-settings-en.png +0 -0
  78. package/docs/images/panel-settings-zh.png +0 -0
  79. package/docs/images/scene1-zh.png +0 -0
  80. package/docs/images/shortcuts-en.png +0 -0
  81. package/docs/images/shortcuts-zh.png +0 -0
  82. package/docs/images/video-node-refs.png +0 -0
  83. package/docs/storyboard-segmentation.md +446 -0
  84. package/index.js +802 -120
  85. package/package.json +5 -2
  86. package/docs/images/panel-bible-en.png +0 -0
  87. package/docs/images/panel-projects-en.png +0 -0
  88. package/docs/images/pipeline-zh.png +0 -0
  89. package/docs/images/provider-detail.png +0 -0
@@ -15,7 +15,7 @@ description: 用无限画布(Infinite Canvas)做短剧/视频创作时使用
15
15
  (`canvas_update_bible`),再开始生成;用户已给出创意时按其创意补全,不要凭空另起一套。
16
16
  - **创作意图、世界观、核心设定、风格基调 → 全部写进设定集;
17
17
  【禁止】为"创作意图/世界观/设定"单独建任何节点**——那是设定集的职责,不是节点。
18
- - 角色/场景/道具的参考图也应**先从设定集条目生成**(为每个条目建 `image-gen` 节点 → `canvas_run_node`),
18
+ - 角色/场景/道具的参考图也应**先从设定集条目生成**(为每个条目建 `image` 图片节点 → `canvas_run_node`),
19
19
  再进入分镜与镜头生成,这样才能跨镜跨集一致。
20
20
  - 唯一例外:用户明确说"先随便写个剧本/不用管设定"。
21
21
  1. **同一个请求最多创建一个项目。** 调用 `canvas_create_project` 之前**必须先** `canvas_list_projects` 查重:
@@ -56,7 +56,7 @@ description: 用无限画布(Infinite Canvas)做短剧/视频创作时使用
56
56
  - 拆分操作:全集剧本已生成后,按场景把对应片段 `canvas_write_node(target:'output')`
57
57
  写入各场景剧本节点(这是**分配已有内容**,不是代写)。
58
58
  10. **汇报固定要素**:项目名 + 项目 id + 节点名/id + 成稿摘要(若已生成);有错误如实说明。
59
- 11. **生成节点前置检查单(创建任何 image-gen / video-gen 前逐条确认,任一不过 = 停止创建)**:
59
+ 11. **生成节点前置检查单(创建任何 image / video 节点前逐条确认,任一不过 = 停止创建)**:
60
60
  ① **镜头清单来源**:这一段的镜头序列已经从分镜表节点的 `shots` 读到了吗?(`canvas_node_status`)
61
61
  没读到 → 停止创建,先读分镜表节点;仍读不到 → **问用户要分镜内容**。绝不自己按剧本推导/编造镜头表。
62
62
  ② **视频节点数量 = 1**:一个分镜表对应一个完整视频(多镜头一次生成)。
@@ -88,6 +88,28 @@ description: 用无限画布(Infinite Canvas)做短剧/视频创作时使用
88
88
  `closeup` 特写插入允许跳切(接缝阈值 0.15)。续帧段由画布自动做尾帧接力
89
89
  (`tailpick` → 下段 `frame`,或沿 `tail→prev` 链自动取上一段尾帧)并做接缝校验;
90
90
  **不要**为了"接上"去复制上一段的画面描述(重演 = 白花钱且更跳)。
91
+ 16. **分镜质量闸门(生成视频前必过)。** 读到 `shots` 之后、建视频节点之前,按 `canvas-craft`
92
+ 「分镜自检」六条逐条核对:**每场冲突点 / 每场 1 个大特写 / 连续三镜不同运动 / 景别具体 /
93
+ 场间因果钩子 / 六要素齐全**。任一不过:先 `canvas_run_node` **重生成该分镜表**(不花钱),
94
+ 或用 `canvas_update_node` 改 `shots`(**整表替换**——改一镜也要把全部 shots 读回再整体写回,
95
+ 别冲掉其它镜的 `tail`/`cam`/`seg`);**绝不带着粗分镜去生成视频**(视频按秒计费、无法局部重来)。
96
+ 判定只看分镜文本,不看画面好不好看。
97
+ - **术语统一**:汇报与改写一律用「**大特写**」「**调度**」;景别必须具体(大特写/特写/近景/中景/
98
+ 全景/远景),不写"镜头""画面";`motion` 不写"平移/推近/拉远"这类空模板。完整勘误表见
99
+ `canvas-craft`「术语勘误」。
100
+ 17. **多画布:一个项目可以有多个画布(右侧「项目」页签里项目为根、子画布为子目录)。**
101
+ - `canvas_list_projects` 会在每个项目下列出 `canvasId=…` 的画布清单;**缺省 `canvasId` = 项目默认画布**,
102
+ 旧项目只有默认画布,照旧只传 `projectId` 即可。
103
+ - 用户指明"在某某画布/第二个画布"里操作时,读和写都必须**显式带 `canvasId`**:
104
+ `canvas_list_projects` → 找到目标 `canvasId` 后,`canvas_create_node` / `canvas_write_node` /
105
+ `canvas_run_node` / `canvas_node_status` / `canvas_update_node` / `canvas_connect` /
106
+ `canvas_relayout` / `canvas_delete_node` / `canvas_open` 全部支持该参数;
107
+ **不带 = 默认画布**,会"报节点不存在"或写错画布。
108
+ - 画布之间节点/连线互相隔离;**资产与设定集按项目共享**(所有画布同一份设定集、同一资产库),
109
+ 不要为不同画布重建设定集或重复上传资产。
110
+ - **专家人设给方向,技能判据是准绳**:内置分镜专家的 persona 已写入六要素 / 每场 1 个大特写 /
111
+ motion「起点→方式→终点」/ 同场连续三镜不同运动 / 每场冲撞点等硬规则,但仍以 `canvas-craft`
112
+ 的完整判据与自检表为准;两者冲突时,**以技能判据为准**。
91
113
 
92
114
  ## 二、标准工作流(对话填提示词+连线+触发,生成由节点完成)
93
115
 
@@ -100,6 +122,10 @@ description: 用无限画布(Infinite Canvas)做短剧/视频创作时使用
100
122
  - 触发生成:`canvas_run_node({ projectId, nodeId })` → `canvas_node_status` 轮询直到 done/error
101
123
  - 生成契约(自动注入,无需复述):整集 **4–10 场、每场 10–30 秒成片(按内容写足,时长不设硬上限)**;**每场以「【场N】场景名(地点·时间)」单独一行开头**
102
124
  ——这是"铺开到场景"自动拆分的解析标记,格式不可变;对白逐行「角色:台词」;结尾附人物/场景/道具清单;
125
+ - **提示词里必须点名两条叙事硬约束**(不写,节点生成的剧本大概率是场景流水账):
126
+ ① **每场结尾留因果钩子**——一个可拍摄的动作或可见物件,直接推动下一场(禁止"他决定了/危机靠近"
127
+ 这类总结句);② **每场至少一个冲突点**(人物之间,或人物与环境/物件之间),并写清
128
+ 目标—阻碍—转折—代价四要素。判定口径见 `canvas-craft` 第一节「场景间因果钩子」。
103
129
  - **【铁律】不要把成稿直接填进 output**——生成是节点的工作(用户在画布上看得到过程与结果)。
104
130
  仅当用户明确说"你直接把剧本写出来、不用节点生成"时,才允许 `target:'output'` 直接写成稿。
105
131
  3. **铺开到场景(每场 = 场景文本节点 + 分镜表节点,连线一次生成场景分镜)**:
@@ -116,13 +142,17 @@ description: 用无限画布(Infinite Canvas)做短剧/视频创作时使用
116
142
  **重新 `canvas_run_node` 该分镜表**即可修正(重生成分镜不花钱,只有视频花钱)。
117
143
  4. **逐场生成视频(多镜头一次生成)**:
118
144
  - `canvas_run_node({ 分镜表 })` → `canvas_node_status` 读 `shots`(镜头清单以此为准,绝不编造镜头表);
119
- - `canvas_create_node({ projectId, type: 'video-gen', name: '第X节-场Y视频', connectFrom: 分镜表节点id, duration: 各镜时长之和 })`
145
+ - **【质量闸门 · 先自检再建节点】** 用这组 `shots` 过一遍硬约束 16 的六条自检(冲突点/大特写/
146
+ 三镜同运动/景别具体/因果钩子/六要素)。不过关 → `canvas_run_node` 重生成该分镜表,
147
+ 或 `canvas_update_node` 改 `shots`(整表替换);**过闸门之前不要建视频节点**——
148
+ 分镜重生成不花钱,视频生成按秒计费且无法局部重来。
149
+ - `canvas_create_node({ projectId, type: 'video', name: '第X节-场Y视频', connectFrom: 分镜表节点id, duration: 各镜时长之和 })`
120
150
  (不传 connectFrom 且项目里有已拆解镜头的分镜表时会自动连线;prompt 留空);
121
151
  - **【禁止逐镜建节点】**一段 10–30 秒的场景视频**不需要逐镜的图片节点或"镜头图→镜头视频"链路**:
122
152
  多镜头一致性靠角色/场景/道具**参考图资产**(`@资产名@` 引用自动挂载)保证,视频模型在一次调用里完成全部镜头。
123
153
  最多为**开场首帧或 1–2 个关键镜头**补定帧图(接同一视频节点的 frame/ref 端口)。
124
154
  一旦发现自己在批量创建"第X节-场Y-镜Z"这类镜头图片/视频节点 = 走错路,**立即停止**并回到本条。
125
- - 参考图:把角色/场景/道具参考图资产连到视频生成节点的 `ref` 端口(`canvas_connect`);
155
+ - 参考图:把角色/场景/道具参考图资产连到视频节点的 `ref` 端口(`canvas_connect`);
126
156
  提示词里的 `@资产名@` 命中的资产也会自动挂上
127
157
  - **【跨段连贯:分镜承接 + 尾帧 → 首帧】**连贯分两层,先文本后画面:
128
158
  **①分镜承接(文本层,先做)**:上一分镜表 `tail` → 本分镜表 `prev`(见硬约束 13 / 工作流第 3 步),
@@ -154,9 +184,9 @@ description: 用无限画布(Infinite Canvas)做短剧/视频创作时使用
154
184
  **按顺序触发**:上一段 `canvas_node_status` 为 done 后再触发下一段(自动续帧要读上一段成片)。
155
185
  分镜表节点上的「铺开到画布」按钮会**自动把上一段的 `tailpick`/`last` 接到本段 `frame`**
156
186
  (按上面同一条「找上一段」规则),所以铺开 → 逐段按顺序生成即可,通常不必手工连 frame。
157
- **资产参考图按需就地补齐**:铺开时对每个角色/场景/道具先查资产库——
158
- 已有图 → 直接挂 `图片资产` 节点并接到视频的 `参考图` 口;
159
- **没有图 → 建「图片生成」节点**,标签按命名规范(`角色-<名> 设定图` / `场景-<名> 设定图` /
187
+ **资产参考图按需就地补齐**(图片与资产已合并成同一种「图片节点」:**有图就是资产、空节点点开面板生成**):
188
+ 已有图 → 直接挂 `image` 图片节点并接到视频的 `参考图` 口;
189
+ **没有图 → 建「图片节点」**,标签按命名规范(`角色-<名> 设定图` / `场景-<名> 设定图` /
160
190
  `道具-<名> 设定图`),提示词已按 canvas-craft「资产设定图版式」写好(角色六段式 / 场景主图+环绕小图 /
161
191
  道具 45° 主图+细节+色卡,2K 横版),设定集的「外观:…」自动注入,**不留空壳占位节点**。
162
192
  所以铺开后先按拓扑顺序把资产图生成掉(或直接跑工作流),再生成视频;同一分镜表重复铺开不会叠加重复资产节点。
@@ -185,7 +215,7 @@ description: 用无限画布(Infinite Canvas)做短剧/视频创作时使用
185
215
  首帧接力则追加首帧锚定行与 `continuity:` 段。**你不必(也不要)把这些手工拼进提示词**,
186
216
  只需在分镜 `shots` 里把字段写对;分镜表节点「分镜衔接」开关(`cont`)默认开,
187
217
  关掉后 AI 拆镜不再产出这四个字段(留给人工写)。
188
- 5. **生成角色/场景/道具参考图**:为设定集里的每个条目创建 image-gen 节点
218
+ 5. **生成角色/场景/道具参考图**:为设定集里的每个条目创建 image 图片节点
189
219
  (命名规范「角色-<名> 设定图」/「场景-<名> 设定图」/「道具-<名> 设定图」),
190
220
  **prompt 必须按 `canvas-craft`「资产设定图版式」一节的排版模板写详细版式提示词,
191
221
  禁止只写一句三视图/外观关键词**——信息量不足,撑不起后续视频的角色一致性。要点(完整模板见 canvas-craft):
@@ -242,15 +272,15 @@ description: 用无限画布(Infinite Canvas)做短剧/视频创作时使用
242
272
  1. 每集开工前先 `canvas_get_bible`,**只沿用已有名称**;新元素先 `canvas_update_bible` 补卡再使用。
243
273
  2. **绝不改名**:一个角色的名字一旦写进设定集,后续所有集数、所有提示词都用同一个名字。
244
274
  3. 已生成的参考图资产**持续复用**:`@资产名@` 会自动带上它们,不需要重复生成。
245
- 4. 若某实体还没有参考图,先为它建一个 `image-gen` 节点生成(用规范命名),再进入镜头生成。
275
+ 4. 若某实体还没有参考图,先为它建一个 `image` 图片节点生成(用规范命名),再进入镜头生成。
246
276
  ## 四、节点类型与字段
247
277
 
248
278
  | 类型 | 用途 | 主要字段 |
249
279
  | --- | --- | --- |
250
280
  | `script` | 剧本 | `idea`=创作意图/提示词,`output`=剧本成稿 |
251
281
  | `storyboard` | 分镜表(多镜头脚本) | 由剧本拆镜头(画布内生成);一个分镜表对应一次视频生成 |
252
- | `image-gen` | 图片生成 | `prompt`=画面提示词 |
253
- | `video-gen` | 视频生成(多镜头一次性生成) | 多镜头提示词来自上游分镜表连线;`duration`=各镜时长之和 |
282
+ | `image` | 图片节点(合并类型:有 `assetId` 就是资产图,有 `prompt` 就是待生成) | `prompt`=画面提示词;`size`/`ratio`;有结果即资产 |
283
+ | `video` | 视频节点(合并类型:生成与结果同属一个节点,多镜头一次性生成) | 多镜头提示词来自上游分镜表连线;`duration`=各镜时长之和;有 `assetId` 即资产 |
254
284
  | `text` | 自由文本 | `text` |
255
285
 
256
286
  ## 四、生成能力(必须真的产出内容)
@@ -322,3 +352,19 @@ description: 用无限画布(Infinite Canvas)做短剧/视频创作时使用
322
352
  - ❌ 只写提示词、不写剧本正文 → 成稿必须进 `output`
323
353
  - ❌ 节点不留名字 → 一律用 `name` 命名
324
354
  - ❌ 未经确认就删除项目/节点 → 先列表确认、再按用户明确要求删除
355
+ - ❌ 分镜还是"中景,他走过来/镜头缓慢推近"这种粗颗粒就急着生成视频 → 先过硬约束 16 的质量闸门
356
+ (每场冲突点 / 每场 1 个大特写 / 连续三镜不同运动 / 景别具体 / 因果钩子 / 六要素),
357
+ 重生成分镜不花钱,视频按秒计费
358
+ - ❌ 把景别写成"镜头""画面"、把「大特写」写成"大豆/大特"、把「调度」写成"调职" → 按 `canvas-craft`
359
+ 「术语勘误」统一,术语错 = 分镜粗,粗分镜 = 成片糊
360
+
361
+ ## 3D 导演台(AI 直接驱动出预演)
362
+
363
+ 用 `canvas_director_stage` 工具,一段 JSON 规格即可生成整场 3D 预演,不用手动搭场景:
364
+
365
+ - `action=help` → 列出可用姿态 id / 道具 preset / 动作片段
366
+ - `action=apply` + `spec` → 写入项目并落盘;客户端打开 3D 导演台会自动套用
367
+ - `action=get` → 读回当前规格
368
+
369
+ 规格结构:`title`、`duration`、`env`、`characters[{name,pos,rotY,h,pose,color,material,path,pathFace,poseAnim,loop,keys}]`、`props[{preset,pos,scale,color}]`、`cameras[{name,pos,target,fov,keys}]`、`shots[{camera,start,end}]`。
370
+ 路径为二维地面点数组,物体沿路径运动并按切线自动转向;`poseAnim` 首尾姿态相同即可无缝循环。