@xiaobuyu/nodesign 0.0.1 → 0.0.3

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 (358) hide show
  1. package/README.md +156 -106
  2. package/bin/nodesign.js +0 -0
  3. package/package.json +1 -1
  4. package/server/api/README.md +45 -45
  5. package/server/api/_guard.js +75 -75
  6. package/server/api/admin.js +187 -187
  7. package/server/api/assets/docx-page.js +103 -103
  8. package/server/api/assets/helpers.js +42 -22
  9. package/server/api/assets/notes.js +194 -144
  10. package/server/api/assets.js +891 -896
  11. package/server/api/board.js +134 -57
  12. package/server/api/browse.js +138 -138
  13. package/server/api/canvas.js +444 -444
  14. package/server/api/chatai.js +324 -324
  15. package/server/api/exports/build-standalone.js +980 -980
  16. package/server/api/exports/cards.js +118 -118
  17. package/server/api/exports/docx-pdf.js +46 -46
  18. package/server/api/exports/export-page.js +142 -142
  19. package/server/api/exports/handoff.js +147 -147
  20. package/server/api/exports.js +690 -690
  21. package/server/api/instruction.js +75 -75
  22. package/server/api/me.js +116 -116
  23. package/server/api/memory.js +185 -185
  24. package/server/api/pending-changes.js +366 -366
  25. package/server/api/plugins.js +164 -164
  26. package/server/api/projects.js +220 -220
  27. package/server/api/publish.js +64 -64
  28. package/server/api/recent.js +73 -73
  29. package/server/api/sessions.js +589 -589
  30. package/server/api/skills.js +77 -77
  31. package/server/api/standalone-fit.js +168 -168
  32. package/server/api/turn-compose.js +180 -180
  33. package/server/api/turn-inflight.js +44 -44
  34. package/server/auth/README.md +17 -17
  35. package/server/auth/middleware.js +138 -138
  36. package/server/auth/origin-guard.js +71 -71
  37. package/server/auth/session.js +108 -108
  38. package/server/auth/tier.js +113 -113
  39. package/server/auth/users-store.js +348 -348
  40. package/server/edit/README.md +29 -29
  41. package/server/engine/README.md +113 -113
  42. package/server/engine/agent/agent-shared.js +550 -550
  43. package/server/engine/agent/auto-mode-default-hard-deny.txt +4 -4
  44. package/server/engine/agent/auto-mode-rules.js +78 -78
  45. package/server/engine/agent/context.js +418 -418
  46. package/server/engine/agent/events.js +465 -464
  47. package/server/engine/agent/hooks/canvas-validate.js +199 -199
  48. package/server/engine/agent/hooks/failure.js +120 -120
  49. package/server/engine/agent/hooks/file-events.js +75 -75
  50. package/server/engine/agent/hooks/lifecycle.js +233 -233
  51. package/server/engine/agent/hooks/post-canvas-focus.js +80 -80
  52. package/server/engine/agent/hooks/post-guidance.js +206 -206
  53. package/server/engine/agent/hooks/post-subagent-report.js +104 -104
  54. package/server/engine/agent/hooks/post-trim.js +58 -58
  55. package/server/engine/agent/hooks/pre-board-neighborhood.js +34 -34
  56. package/server/engine/agent/hooks/pre-defaults.js +84 -84
  57. package/server/engine/agent/hooks/pre-injectors.js +277 -277
  58. package/server/engine/agent/hooks/pre-performance-log-guard.js +78 -78
  59. package/server/engine/agent/hooks/pre-starter-files.js +61 -61
  60. package/server/engine/agent/hooks/pre-workspace-scope-guard.js +78 -78
  61. package/server/engine/agent/hooks/site-validate.js +94 -94
  62. package/server/engine/agent/hooks/tool-prompts.js +31 -31
  63. package/server/engine/agent/hooks/turn-state-memory.js +56 -56
  64. package/server/engine/agent/hooks/user-prompt-submit.js +258 -215
  65. package/server/engine/agent/hooks.js +354 -354
  66. package/server/engine/agent/init-contract.js +69 -69
  67. package/server/engine/agent/isolation.js +159 -159
  68. package/server/engine/agent/model-table.js +292 -292
  69. package/server/engine/agent/plugin-loader.js +266 -266
  70. package/server/engine/agent/prompts/nodesign-prelude.md +388 -336
  71. package/server/engine/agent/prompts/tools/ask-user-question-protocol.md +71 -71
  72. package/server/engine/agent/prompts/tools/direct-edit-protocol.md +98 -98
  73. package/server/engine/agent/prompts/tools/generate-image-cookbook.gemini-gateway.md +583 -583
  74. package/server/engine/agent/prompts/tools/generate-image-cookbook.md +483 -483
  75. package/server/engine/agent/prompts/tools/hybrid-reference.md +100 -100
  76. package/server/engine/agent/prompts/tools/paint-still-cookbook.md +270 -270
  77. package/server/engine/agent/prompts/tools/roll-film-cookbook.md +70 -70
  78. package/server/engine/agent/prompts/tools/site-reference.md +106 -106
  79. package/server/engine/agent/prompts/tools/tweaks-syntax.md +125 -125
  80. package/server/engine/agent/prompts/tools/vision-checker-dispatch.md +48 -48
  81. package/server/engine/agent/session-loop.js +1035 -1024
  82. package/server/engine/agent/session-model.js +164 -164
  83. package/server/engine/agent/skill.js +204 -204
  84. package/server/engine/agent/task-events.js +78 -78
  85. package/server/engine/agents/ds-extractor.md +132 -132
  86. package/server/engine/agents/explorer.md +190 -190
  87. package/server/engine/agents/index.js +230 -230
  88. package/server/engine/agents/schemas/design-system.json +156 -156
  89. package/server/engine/agents/schemas/tweak-schema.json +113 -113
  90. package/server/engine/agents/tweak-proposer.md +127 -127
  91. package/server/engine/agents/vision-checker.md +254 -254
  92. package/server/engine/browse/capture.js +422 -422
  93. package/server/engine/browse/card.js +137 -137
  94. package/server/engine/browse/handover.js +59 -59
  95. package/server/engine/browse/page-digest.js +119 -119
  96. package/server/engine/browse/refs.js +196 -196
  97. package/server/engine/browse/registry.js +307 -307
  98. package/server/engine/browse/screencast.js +170 -170
  99. package/server/engine/browse/state.js +121 -121
  100. package/server/engine/chatai/chat-log.js +79 -79
  101. package/server/engine/chatai/index.js +193 -193
  102. package/server/engine/chatai/openai-compat.js +152 -152
  103. package/server/engine/chatai/orchestrate.js +309 -309
  104. package/server/engine/chatai/perform.js +40 -40
  105. package/server/engine/chatai/summarize.js +79 -79
  106. package/server/engine/mcp/capability-gate.js +52 -52
  107. package/server/engine/mcp/index.js +351 -339
  108. package/server/engine/mcp/param-sanitizer.js +142 -142
  109. package/server/engine/mcp/tools/arrange-on-board.js +124 -124
  110. package/server/engine/mcp/tools/artifact-session.js +278 -278
  111. package/server/engine/mcp/tools/browse-computer.js +421 -421
  112. package/server/engine/mcp/tools/browse-find-batch.js +183 -183
  113. package/server/engine/mcp/tools/browse-screenshot.js +157 -157
  114. package/server/engine/mcp/tools/browse.js +480 -480
  115. package/server/engine/mcp/tools/build-docx.js +101 -101
  116. package/server/engine/mcp/tools/clear-pending-changes.js +99 -99
  117. package/server/engine/mcp/tools/create-on-board.js +152 -155
  118. package/server/engine/mcp/tools/crystallize-skill.js +168 -168
  119. package/server/engine/mcp/tools/edit-sketch.js +167 -0
  120. package/server/engine/mcp/tools/explain-style.js +237 -237
  121. package/server/engine/mcp/tools/export-handoff.js +133 -133
  122. package/server/engine/mcp/tools/expose-tweaks.js +149 -149
  123. package/server/engine/mcp/tools/generate-image.js +842 -842
  124. package/server/engine/mcp/tools/get-computed-styles.js +164 -164
  125. package/server/engine/mcp/tools/get-pending-changes.js +205 -205
  126. package/server/engine/mcp/tools/h3box-ssh.js +84 -84
  127. package/server/engine/mcp/tools/helpers/acquire-page.js +82 -82
  128. package/server/engine/mcp/tools/helpers/motion-lab.js +554 -554
  129. package/server/engine/mcp/tools/helpers/motion-scroll.js +112 -112
  130. package/server/engine/mcp/tools/helpers/perception-page.js +215 -215
  131. package/server/engine/mcp/tools/helpers/reference-download.js +103 -103
  132. package/server/engine/mcp/tools/helpers/rembg-bridge.py +80 -80
  133. package/server/engine/mcp/tools/helpers/shot-pipeline.js +280 -280
  134. package/server/engine/mcp/tools/highlight.js +68 -68
  135. package/server/engine/mcp/tools/list-pages.js +222 -222
  136. package/server/engine/mcp/tools/look-at-board.js +124 -0
  137. package/server/engine/mcp/tools/lookup-tags.js +59 -59
  138. package/server/engine/mcp/tools/navigate-to-page.js +60 -60
  139. package/server/engine/mcp/tools/organize-board.js +64 -64
  140. package/server/engine/mcp/tools/paint-still.js +434 -434
  141. package/server/engine/mcp/tools/pin-to-board.js +130 -130
  142. package/server/engine/mcp/tools/preview-deck.js +130 -130
  143. package/server/engine/mcp/tools/profile-scroll.js +305 -305
  144. package/server/engine/mcp/tools/publish-site.js +102 -102
  145. package/server/engine/mcp/tools/query-elements.js +195 -195
  146. package/server/engine/mcp/tools/read-board.js +190 -103
  147. package/server/engine/mcp/tools/read-document.js +93 -93
  148. package/server/engine/mcp/tools/read-page.js +264 -264
  149. package/server/engine/mcp/tools/read-tavern-json.js +143 -143
  150. package/server/engine/mcp/tools/read-user-view.js +59 -0
  151. package/server/engine/mcp/tools/record-decision.js +140 -140
  152. package/server/engine/mcp/tools/relate-on-board.js +112 -110
  153. package/server/engine/mcp/tools/report-issue.js +115 -115
  154. package/server/engine/mcp/tools/roll-film.js +266 -266
  155. package/server/engine/mcp/tools/screenshot-docx.js +138 -138
  156. package/server/engine/mcp/tools/screenshot-url.js +195 -195
  157. package/server/engine/mcp/tools/screenshot.js +583 -583
  158. package/server/engine/mcp/tools/sketch-on-board.js +337 -0
  159. package/server/engine/mcp/tools/tier-gate.js +96 -96
  160. package/server/engine/mcp/tools/trace-motion.js +215 -215
  161. package/server/engine/mcp/tools/web-search.js +548 -548
  162. package/server/engine/mcp/tools/write-on-board.js +130 -0
  163. package/server/engine/motion/inventory.js +349 -349
  164. package/server/engine/perception/session.js +235 -235
  165. package/server/engine/plugins/nodesign/.claude-plugin/plugin.json +5 -5
  166. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/SKILL.md +199 -192
  167. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/canvas.template.html +667 -667
  168. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/hybrid-grid.md +22 -22
  169. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/image-led-cover.md +25 -25
  170. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/portrait.md +23 -23
  171. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/quote-backdrop.md +21 -21
  172. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/section-divider.md +23 -23
  173. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/text-led.md +21 -21
  174. package/server/engine/plugins/nodesign/skills/docx-craft/SKILL.md +169 -162
  175. package/server/engine/plugins/nodesign/skills/docx-craft/references/token-schema.md +407 -407
  176. package/server/engine/plugins/nodesign/skills/docx-craft//346/226/207/346/241/243.template.json +80 -80
  177. package/server/engine/plugins/nodesign/skills/rp-craft/SKILL.md +235 -228
  178. package/server/engine/plugins/nodesign/skills/rp-craft/patterns//346/274/224/345/207/272/351/241/265-/346/234/200/345/260/217/345/256/236/347/216/260.html +78 -78
  179. package/server/engine/plugins/nodesign/skills/rp-craft//346/274/224/345/207/272.template.js +268 -268
  180. package/server/engine/plugins/nodesign/skills/site-craft/SKILL.md +330 -323
  181. package/server/engine/plugins/nodesign/skills/site-craft/patterns/build-lane.md +134 -134
  182. package/server/engine/plugins/nodesign/skills/site-craft/patterns/cutout-collage.md +61 -61
  183. package/server/engine/plugins/nodesign/skills/site-craft/patterns/mock-app.md +163 -163
  184. package/server/engine/plugins/nodesign/skills/site-craft/patterns/page-transitions.md +86 -86
  185. package/server/engine/runs/active-runs.js +698 -698
  186. package/server/engine/runs/board-tasklist.js +130 -0
  187. package/server/engine/runs/live-turn.js +252 -252
  188. package/server/engine/runs/store.js +364 -364
  189. package/server/engine/runs/turn-relay.js +217 -217
  190. package/server/engine/runtime/workspace.js +164 -164
  191. package/server/index.js +3 -0
  192. package/server/lib/artifact-file-path.js +80 -80
  193. package/server/lib/artifact-target.js +284 -284
  194. package/server/lib/asset-refs.js +239 -239
  195. package/server/lib/async-queue.js +104 -104
  196. package/server/lib/auto-relations.js +130 -130
  197. package/server/lib/binding-types.js +72 -60
  198. package/server/lib/board-graph-export.js +191 -0
  199. package/server/lib/board-groups.js +167 -0
  200. package/server/lib/board-hero.js +76 -0
  201. package/server/lib/board-kind-sizes.js +85 -62
  202. package/server/lib/board-relations.js +133 -133
  203. package/server/lib/browse-proxy.js +180 -180
  204. package/server/lib/canvas-id.js +36 -36
  205. package/server/lib/chalk.js +121 -0
  206. package/server/lib/cover.js +227 -227
  207. package/server/lib/danbooru-tags.js +291 -291
  208. package/server/lib/doc-extract.js +156 -156
  209. package/server/lib/docx/build-from-source.js +260 -260
  210. package/server/lib/docx/build.js +490 -490
  211. package/server/lib/docx/dump-styles.js +287 -287
  212. package/server/lib/docx/fonts/nodesign-cjk.conf +164 -164
  213. package/server/lib/docx/merge-runs.js +129 -129
  214. package/server/lib/docx/numbering.js +218 -218
  215. package/server/lib/docx/order.js +152 -152
  216. package/server/lib/docx/rawzip.js +172 -172
  217. package/server/lib/docx/render.js +92 -92
  218. package/server/lib/docx/text-lint.js +225 -225
  219. package/server/lib/docx/tokens.js +335 -335
  220. package/server/lib/docx/units.js +29 -29
  221. package/server/lib/docx/xml.js +291 -291
  222. package/server/lib/docx-pages.js +187 -187
  223. package/server/lib/export-collect.js +289 -289
  224. package/server/lib/export-package.js +210 -210
  225. package/server/lib/html-srcset.js +145 -145
  226. package/server/lib/image-variant.js +460 -460
  227. package/server/lib/ingress/forward-openai-chat.js +305 -305
  228. package/server/lib/ingress/openai-chat.js +491 -491
  229. package/server/lib/ingress/session-notice.js +66 -66
  230. package/server/lib/ingress/session-routes.js +68 -68
  231. package/server/lib/ingress/slot-probe.js +130 -130
  232. package/server/lib/ingress/upstream-billing.js +52 -52
  233. package/server/lib/ingress/upstream-fail-streak.js +72 -72
  234. package/server/lib/ingress/upstream-truncation.js +48 -48
  235. package/server/lib/issues-store.js +182 -182
  236. package/server/lib/kinds/deck.js +72 -72
  237. package/server/lib/kinds/docx.js +283 -283
  238. package/server/lib/kinds/file-kinds.js +113 -113
  239. package/server/lib/kinds/index.js +202 -202
  240. package/server/lib/kinds/site.js +161 -161
  241. package/server/lib/model-ingress.js +543 -543
  242. package/server/lib/moderation.js +255 -255
  243. package/server/lib/notice-store.js +103 -103
  244. package/server/lib/plugin-install.js +104 -104
  245. package/server/lib/plugin-validator.js +721 -721
  246. package/server/lib/publish-store.js +115 -115
  247. package/server/lib/quick-summary.js +52 -52
  248. package/server/lib/quota.js +270 -270
  249. package/server/lib/rate-window.js +29 -29
  250. package/server/lib/reference-assets.js +92 -92
  251. package/server/lib/region-shot.js +135 -135
  252. package/server/lib/safe-path.js +73 -73
  253. package/server/lib/sdk-session.js +33 -33
  254. package/server/lib/showcase-store.js +92 -92
  255. package/server/lib/site-publish.js +465 -465
  256. package/server/lib/sketch-layout.js +277 -0
  257. package/server/lib/ssrf-guard.js +432 -432
  258. package/server/lib/task-scan.js +158 -158
  259. package/server/lib/tavern-json.js +154 -154
  260. package/server/lib/video-variant.js +237 -237
  261. package/server/lib/workspace-path.js +33 -33
  262. package/server/ops/fix-sdk-musl.mjs +40 -40
  263. package/server/ops/install-macos-fonts.sh +114 -114
  264. package/server/ops/macos-fonts.conf +336 -336
  265. package/server/ops/sandbox-shim/bwrap +57 -57
  266. package/server/projects/assets-summary.js +119 -119
  267. package/server/projects/auto-name.js +53 -53
  268. package/server/projects/board-limits.js +12 -0
  269. package/server/projects/board-sanitize.js +252 -0
  270. package/server/projects/board-store.js +507 -640
  271. package/server/projects/move-entry.js +103 -103
  272. package/server/projects/store.js +270 -270
  273. package/server/projects/ui-config.js +60 -54
  274. package/server/projects/viewpoint-store.js +78 -0
  275. package/server/projects/workspace-templates.js +53 -53
  276. package/server/projects/workspace.js +1025 -1025
  277. package/server/runtime/local-config.js +177 -177
  278. package/server/runtime/profile.js +72 -72
  279. package/server/services/rembg-service.py +334 -334
  280. package/server/shared/README.md +25 -25
  281. package/server/shared/deck.js +54 -54
  282. package/server/shared/time.js +49 -49
  283. package/server/style-pipeline/README.md +53 -53
  284. package/server/ws/broker.js +39 -36
  285. package/server/ws/browse-channel.js +177 -177
  286. package/server/ws/index.js +386 -386
  287. package/web/README.md +89 -89
  288. package/web/dist/assets/BrowserWindow-P_vIdh-G.js +11 -0
  289. package/web/dist/assets/{DeckWindow-4G0xX7P3.js → DeckWindow-BpLv5082.js} +3 -3
  290. package/web/dist/assets/{DocxWindow-BXQsoPkh.js → DocxWindow-DSAU1-tD.js} +4 -4
  291. package/web/dist/assets/MermaidBlock-DR1GikCv.js +313 -0
  292. package/web/dist/assets/SiteWindow-92uBuRRR.js +18 -0
  293. package/web/dist/assets/abnfDiagram-VCTEODGH-uA8Esix4.js +1 -0
  294. package/web/dist/assets/arc-D_khH_xN.js +1 -0
  295. package/web/dist/assets/architectureDiagram-5GKGNRK7-DydJHqOt.js +36 -0
  296. package/web/dist/assets/blockDiagram-NRAW4CY4-B7wBbKiW.js +129 -0
  297. package/web/dist/assets/c4Diagram-UCG6FXSJ-6mrH0x7Y.js +38 -0
  298. package/web/dist/assets/channel-DGkccMO1.js +1 -0
  299. package/web/dist/assets/chunk-2Q5K7J3B-Cuikho5Q.js +1 -0
  300. package/web/dist/assets/chunk-5VM5RSS4-3-KZ5AUz.js +15 -0
  301. package/web/dist/assets/chunk-F27PBJKO-Bkwq2gGU.js +1 -0
  302. package/web/dist/assets/chunk-G27WJ6UU-BLyQzdGE.js +231 -0
  303. package/web/dist/assets/chunk-JWPE2WC7-B7HxxQds.js +1 -0
  304. package/web/dist/assets/chunk-LCL6LL3I-CtXrnUwF.js +206 -0
  305. package/web/dist/assets/chunk-POPQ4Y6H-dxddZlXt.js +1 -0
  306. package/web/dist/assets/chunk-SVP7TREG-DpkmrgHn.js +88 -0
  307. package/web/dist/assets/chunk-XXDRQBXY-BwZ7RbpQ.js +1 -0
  308. package/web/dist/assets/classDiagram-DTDB5LWJ-BGscw3OD.js +1 -0
  309. package/web/dist/assets/classDiagram-v2-JRS7N3AN-BGscw3OD.js +1 -0
  310. package/web/dist/assets/cose-bilkent-JH36ORCC-DGFOsMUt.js +1 -0
  311. package/web/dist/assets/cynefin-OW5HDTMX-DUwn3ehS.js +178 -0
  312. package/web/dist/assets/cynefinDiagram-5FMLGOSQ-DlLAOZ9x.js +62 -0
  313. package/web/dist/assets/cytoscape.esm-BjAbmLdb.js +331 -0
  314. package/web/dist/assets/dagre-3AP2YEHR-CyourLfz.js +4 -0
  315. package/web/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  316. package/web/dist/assets/diagram-S7CK7UJ4-BTMbx2np.js +30 -0
  317. package/web/dist/assets/diagram-UQ7AKVKN-UK94_1-P.js +41 -0
  318. package/web/dist/assets/diagram-VSXAHHWV-C7zS-v9v.js +3 -0
  319. package/web/dist/assets/diagram-VX7I27RA-DKJRa6CK.js +24 -0
  320. package/web/dist/assets/diagram-Z3DM3KII-kUbAfGAp.js +24 -0
  321. package/web/dist/assets/ebnfDiagram-PWID7BFC-CVW16_vb.js +1 -0
  322. package/web/dist/assets/erDiagram-SSCWMZ5O-BRQMFQ5y.js +99 -0
  323. package/web/dist/assets/flowDiagram-A5DVABFB-S34LpLtK.js +168 -0
  324. package/web/dist/assets/ganttDiagram-EL5Y4UJY-BFiqk1-G.js +292 -0
  325. package/web/dist/assets/gitGraphDiagram-WWUBYQGX-LZsrdyyv.js +106 -0
  326. package/web/dist/assets/index-GAamh1p4.js +2152 -0
  327. package/web/dist/assets/infoDiagram-RXCK75RN-0DvN6KIp.js +2 -0
  328. package/web/dist/assets/init-Gi6I4Gst.js +1 -0
  329. package/web/dist/assets/ishikawaDiagram-5VMMS53U-CaY3A-Bx.js +70 -0
  330. package/web/dist/assets/journeyDiagram-EYS64GPL-BBeiaCrj.js +139 -0
  331. package/web/dist/assets/kanban-definition-3QL26DDD-ux42DRXQ.js +89 -0
  332. package/web/dist/assets/layout-CnXiF_NB.js +1 -0
  333. package/web/dist/assets/linear-BMW0u6G6.js +1 -0
  334. package/web/dist/assets/mindmap-definition-FBJOCRG2-hUxSpdKn.js +96 -0
  335. package/web/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  336. package/web/dist/assets/pegDiagram-XKGWAZYB-aCaQPH0w.js +1 -0
  337. package/web/dist/assets/{pending-edit-apply-DTjo2geW.js → pending-edit-apply-AcdOQ9Ij.js} +6 -6
  338. package/web/dist/assets/pieDiagram-E7YTZNPT-CmOEZ8zg.js +39 -0
  339. package/web/dist/assets/quadrantDiagram-AXDQQJYC-VW6fAhsV.js +7 -0
  340. package/web/dist/assets/railroadDiagram-O6MQD6OU-CKJ7Ba5K.js +1 -0
  341. package/web/dist/assets/requirementDiagram-EFPCY7ZU-pNGkq9Vw.js +84 -0
  342. package/web/dist/assets/{rotate-cw-LMT3x1Zj.js → rotate-cw-KAfChbGV.js} +1 -1
  343. package/web/dist/assets/sankeyDiagram-P5KCCOFB-BIMmDTfZ.js +40 -0
  344. package/web/dist/assets/sequenceDiagram-WJ2MYXX4-BBW7wzKY.js +162 -0
  345. package/web/dist/assets/sizeCapture-X5ZJPWSS-DdkXmLYR.js +1 -0
  346. package/web/dist/assets/{square-dashed-mouse-pointer-CBoAkfhi.js → square-dashed-mouse-pointer-CDUlhUP7.js} +1 -1
  347. package/web/dist/assets/stateDiagram-HBIQ2CUA-W313Uz16.js +1 -0
  348. package/web/dist/assets/stateDiagram-v2-4QOOHH4V-DDhJBZzf.js +1 -0
  349. package/web/dist/assets/swimlanes-XN3QIQJK-C29TL26K.js +1 -0
  350. package/web/dist/assets/swimlanesDiagram-VK2B7HYN-BfN-Xdmu.js +8 -0
  351. package/web/dist/assets/timeline-definition-24CTP7MA-CF0JMObX.js +120 -0
  352. package/web/dist/assets/vennDiagram-4TSXK5OY-DrDFsaH3.js +34 -0
  353. package/web/dist/assets/wardleyDiagram-VM6X3IG4-CVrnRIS_.js +78 -0
  354. package/web/dist/assets/xychartDiagram-S5SC5T6Z-BvkN1zsT.js +7 -0
  355. package/web/dist/index.html +17 -17
  356. package/web/dist/assets/BrowserWindow-Dc7J7CYc.js +0 -11
  357. package/web/dist/assets/SiteWindow-D6eS-2gM.js +0 -18
  358. package/web/dist/assets/index-Cbl3ATvp.js +0 -2125
@@ -1,71 +1,71 @@
1
- # AskUserQuestion —— NoDesign 约定(首次调用时注入)
2
-
3
- > SDK preset `claude_code` 自带 AskUserQuestion 工具用法;本节是 NoDesign 项目对该工具的**额外约定**(特别是 `preview` 字段渲染方式),SDK preset 不含这部分。
4
-
5
- (何时用 AskUserQuestion、何时直接聊,prelude 已定:有结构化候选用它,开放问题和 yes/no 走聊天。)
6
-
7
- ### 调用 schema
8
-
9
- ```js
10
- {
11
- questions: [
12
- {
13
- question: "<完整问题文本>",
14
- header: "<≤12 字 chip 标签>",
15
- options: [
16
- { label: "<1-5 词>", description: "<一句话 trade-off>", preview: "<可选>" },
17
- ...
18
- ],
19
- multiSelect: false, // 默认 false;候选互不互斥时 true
20
- }
21
- ]
22
- }
23
- ```
24
-
25
- 单次调用 **1-4 个 question**,每个 question **2-4 个 option**。
26
-
27
- ### 写好选项的诀窍
28
-
29
- - 选项要**互斥**(避免 "A" 和 "A 加一点 B" 这种边界模糊的对)
30
- - 每个 label 1-5 词 + 一句 description 解释 trade-off
31
- - 最多 4 选项,多了用户晕
32
- - **不要加 "Other / 其他"** —— 系统自动提供(SDK 默认行为)
33
-
34
- ### `preview` 字段 — 选项要"看到"差异时给
35
-
36
- 前端**自动检测内容形态**分派渲染(多模态 preview):
37
-
38
- | preview 内容 | 渲染方式 | 适用场景 |
39
- |---|---|---|
40
- | `data:image/...;base64,XXX` | `<img>` 直接显 | 多变体并排选 cover/portrait(先 generate_image 出图再当 preview) |
41
- | `https://...` / `/api/.../assets/...` 以 .png/.jpg 结尾 | `<img>` 直接显 | 已有 asset path 直接当 preview |
42
- | `assets/generated/x.jpg` 相对路径 | `<img>` 直接显(fallback) | 同上简写 |
43
- | 含 `<...>` 像 HTML | sandbox iframe srcDoc | 视觉方向 / 配色 / 字体 / 排版(约束见下) |
44
- | 纯文本 | mono 字 fallback | 兜底 |
45
-
46
- **HTML preview 约束**(视觉方向 / 配色 / 字体 / 排版示意场景):
47
- - 尺寸:240×140(前端 sandbox iframe 渲染区)
48
- - 内容:**HTML 片段,每个元素 `style="..."` 属性写样式**。⚠️ SDK validator 硬性拒 `<style>` 和 `<script>` 标签——只能 inline style 属性("inline" 字面理解:写在 element 里,不是 `<style>` 块)。也不能含 `<html>` / `<body>` / `<!doctype>` 等完整文档标签,纯 fragment。
49
- - 体积:≤ 5KB(超出会被截断)
50
- - 用途:让用户视觉对比 4 个选项的差异(主色 + 字体方向 + 排版示意),不是渲染完整页面
51
-
52
- **典型 HTML preview 范例**(240×140 配色 + 字体方向,全 inline style):
53
-
54
- ```html
55
- <div style="background: #f9f8f6; padding: 12px; font-family: 'Lyon Display', 'Songti SC', 'Noto Serif SC', serif; color: #2d2418;">
56
- <h1 style="font-size: 28px; font-weight: 600; margin: 0 0 8px; letter-spacing: -0.02em;">Cover</h1>
57
- <p style="font-size: 11px; color: #c45c3f; margin: 0;">warm cream + cherry accent + serif</p>
58
- </div>
59
- ```
60
-
61
- 字体 chain 4 段式(latin → 苹果 CJK → Noto CJK → generic)跟真 deck 同款规则——只是从 `<style>` 块挪到每个元素的 `style` 属性里。
62
-
63
- ### 何时用 image preview vs HTML preview vs 不带 preview
64
-
65
- - **image preview**(base64 / asset path):多张候选图选哪张(cover / portrait / decoration)→ 先 generate_image 出 3 变体,每个 option 的 preview 字段贴对应图
66
- - **HTML preview**(240×140 self-contained):视觉方向 / 配色 / 字体 / 排版 / **风格名候选** → 每个元素 `style="..."` 属性演示主色 / 字体 / 排版差异(**别用 `<style>` 块、`<script>`、`<html>`/`<body>`——SDK validator 拒**)
67
-
68
- ⚠️ **别把 web_search 搜来的图片网址直接当 preview**:判据要求地址以 `.png/.jpg/.jpeg/.webp/.gif/.svg` 结尾(可带 `?查询串`),很多图床地址不满足,会**静默退成纯文本**,用户看到一行网址而不是图。搜来的图是给你自己对齐理解用的;要让用户看,用 HTML 小样,或先 generate_image 再贴 base64。
69
- - **不带 preview**:离散文字决策(yes/no, deck-kind 选择, 是否需要 PDF)→ 选项标签足够说明
70
-
71
- ---
1
+ # AskUserQuestion —— NoDesign 约定(首次调用时注入)
2
+
3
+ > SDK preset `claude_code` 自带 AskUserQuestion 工具用法;本节是 NoDesign 项目对该工具的**额外约定**(特别是 `preview` 字段渲染方式),SDK preset 不含这部分。
4
+
5
+ (何时用 AskUserQuestion、何时直接聊,prelude 已定:有结构化候选用它,开放问题和 yes/no 走聊天。)
6
+
7
+ ### 调用 schema
8
+
9
+ ```js
10
+ {
11
+ questions: [
12
+ {
13
+ question: "<完整问题文本>",
14
+ header: "<≤12 字 chip 标签>",
15
+ options: [
16
+ { label: "<1-5 词>", description: "<一句话 trade-off>", preview: "<可选>" },
17
+ ...
18
+ ],
19
+ multiSelect: false, // 默认 false;候选互不互斥时 true
20
+ }
21
+ ]
22
+ }
23
+ ```
24
+
25
+ 单次调用 **1-4 个 question**,每个 question **2-4 个 option**。
26
+
27
+ ### 写好选项的诀窍
28
+
29
+ - 选项要**互斥**(避免 "A" 和 "A 加一点 B" 这种边界模糊的对)
30
+ - 每个 label 1-5 词 + 一句 description 解释 trade-off
31
+ - 最多 4 选项,多了用户晕
32
+ - **不要加 "Other / 其他"** —— 系统自动提供(SDK 默认行为)
33
+
34
+ ### `preview` 字段 — 选项要"看到"差异时给
35
+
36
+ 前端**自动检测内容形态**分派渲染(多模态 preview):
37
+
38
+ | preview 内容 | 渲染方式 | 适用场景 |
39
+ |---|---|---|
40
+ | `data:image/...;base64,XXX` | `<img>` 直接显 | 多变体并排选 cover/portrait(先 generate_image 出图再当 preview) |
41
+ | `https://...` / `/api/.../assets/...` 以 .png/.jpg 结尾 | `<img>` 直接显 | 已有 asset path 直接当 preview |
42
+ | `assets/generated/x.jpg` 相对路径 | `<img>` 直接显(fallback) | 同上简写 |
43
+ | 含 `<...>` 像 HTML | sandbox iframe srcDoc | 视觉方向 / 配色 / 字体 / 排版(约束见下) |
44
+ | 纯文本 | mono 字 fallback | 兜底 |
45
+
46
+ **HTML preview 约束**(视觉方向 / 配色 / 字体 / 排版示意场景):
47
+ - 尺寸:240×140(前端 sandbox iframe 渲染区)
48
+ - 内容:**HTML 片段,每个元素 `style="..."` 属性写样式**。⚠️ SDK validator 硬性拒 `<style>` 和 `<script>` 标签——只能 inline style 属性("inline" 字面理解:写在 element 里,不是 `<style>` 块)。也不能含 `<html>` / `<body>` / `<!doctype>` 等完整文档标签,纯 fragment。
49
+ - 体积:≤ 5KB(超出会被截断)
50
+ - 用途:让用户视觉对比 4 个选项的差异(主色 + 字体方向 + 排版示意),不是渲染完整页面
51
+
52
+ **典型 HTML preview 范例**(240×140 配色 + 字体方向,全 inline style):
53
+
54
+ ```html
55
+ <div style="background: #f9f8f6; padding: 12px; font-family: 'Lyon Display', 'Songti SC', 'Noto Serif SC', serif; color: #2d2418;">
56
+ <h1 style="font-size: 28px; font-weight: 600; margin: 0 0 8px; letter-spacing: -0.02em;">Cover</h1>
57
+ <p style="font-size: 11px; color: #c45c3f; margin: 0;">warm cream + cherry accent + serif</p>
58
+ </div>
59
+ ```
60
+
61
+ 字体 chain 4 段式(latin → 苹果 CJK → Noto CJK → generic)跟真 deck 同款规则——只是从 `<style>` 块挪到每个元素的 `style` 属性里。
62
+
63
+ ### 何时用 image preview vs HTML preview vs 不带 preview
64
+
65
+ - **image preview**(base64 / asset path):多张候选图选哪张(cover / portrait / decoration)→ 先 generate_image 出 3 变体,每个 option 的 preview 字段贴对应图
66
+ - **HTML preview**(240×140 self-contained):视觉方向 / 配色 / 字体 / 排版 / **风格名候选** → 每个元素 `style="..."` 属性演示主色 / 字体 / 排版差异(**别用 `<style>` 块、`<script>`、`<html>`/`<body>`——SDK validator 拒**)
67
+
68
+ ⚠️ **别把 web_search 搜来的图片网址直接当 preview**:判据要求地址以 `.png/.jpg/.jpeg/.webp/.gif/.svg` 结尾(可带 `?查询串`),很多图床地址不满足,会**静默退成纯文本**,用户看到一行网址而不是图。搜来的图是给你自己对齐理解用的;要让用户看,用 HTML 小样,或先 generate_image 再贴 base64。
69
+ - **不带 preview**:离散文字决策(yes/no, deck-kind 选择, 是否需要 PDF)→ 选项标签足够说明
70
+
71
+ ---
@@ -1,98 +1,98 @@
1
- # DirectEdit 逐 kind 处理协议(get_pending_changes 首调注入)
2
-
3
- > prelude 常驻部分只教流程骨架(get → 处理 → clear → 收尾总结);本文是每类
4
- > pending change 的完整处理细则,agent 第一次调 get_pending_changes 时注入。
5
-
6
- ## item 字段
7
-
8
- - `kind`: `'edit'` / `'comment'` / `'pending-move'` / `'pending-duplicate'` / `'pending-style'` / `'pending-delete'` / `'applied-move'` / `'applied-style'` / `'applied-duplicate'`
9
- - `anchor`: 元素稳定锚点({ dataId, path, textHint, bbox })
10
- - `path`(可选): 改动属于哪份文件(如 `about.html`);没有 = 会话当前活跃的那份产物
11
- - `aiContext`: 元素角色 / 页面信息 / outerHTML / computed styles / siblings;移动类还带 `targetContainerTag` + `alignmentHints`
12
- - `diff`(edit): `{ oldText, newText }` —— 用户改成了什么
13
- - `text`(comment): 评论原文
14
- - `move`(pending-move / pending-duplicate): `{ container: anchor, before: anchor|null }` —— 目标容器 + 插在哪个 sibling 之前(null 表示末尾)
15
- - `styleDelta`(pending-style): 待改的 inline style key/value
16
- - `reactMount`(任意): true → 改的是 `<script id="__nd-app">` 里的 JSX 子树,不是 HTML 段
17
-
18
- ## 逐 kind 处理
19
-
20
- - **comments 是用户的修改请求** —— 按评论的指示改条目 `path` 指向的那份文件(用 Edit 工具)
21
- - **comment 带 `linkedToEditId`**:评论关联到 buffer 里的某条 pending-* edit(拖完浮 PostDragNotePanel 提交的 follow-up)。处理时**把该 comment 视为对那条 edit 的补充指令**——比如 pending-move 关联 comment "保持其它元素位置不变" → 走默认保护邻居的更严格档;pending-move 关联 comment "顺便把右边那块也搬过来" → 视为复合操作一起做。处理完两条都进 clearedIds
22
- - **edits 是用户已经手动改完的** —— done deal 不动;只在回复里知会"用户改了 N 处文字 OK"
23
- - **applied-move / applied-style / applied-duplicate 也是 done deal** —— 站点窗的拖拽落地时前端已把改动写回 `path` 指的文件。**不要再应用一遍**(重复应用 = 元素被搬两次)。用它理解用户动了什么;如果用户后续要求"顺一下",可以把烤进 inline 的 left/top 提炼进样式表,否则不主动动
24
- - **`path` 在构建产物目录下**(如 `dist/…`)时:改动落在的是构建产物,下次构建会把它冲掉。在做任何会触发重新构建的事之前,先把这条改动同步回对应的源文件(按 anchor/aiContext 找源码里的对应元素)
25
- - 记录带 `serializedFrom: 'runtime-dom'` 时:落盘走的是整页运行时序列化兜底(干净源码上没定位到锚点),文件里可能混入该页脚本的运行时产物(注入节点/内联动画态)。用户抱怨"页面变怪了"时优先查这份文件
26
- - **pending-move / pending-duplicate** —— 用户已经在画布拖完了视觉,但**源代码还是老样子**。
27
- - 用 `anchor.dataId` (data-anchor) 在那份文件里 grep 出 source 段
28
- - 用 `move.container.dataId` 找出 target 容器段
29
- - 用 `move.before.dataId` 找出"插在它前面"的 sibling(null 时插末尾)
30
- - 用 Edit 工具完成 DOM 树移动:剪 source 段 → 插到 target 容器内 before sibling 前
31
- - `pending-duplicate` 同理但保留 source 原位置
32
- - **`move.intent` 提示语义**:
33
- - `sibling-before` / `sibling-after`:本质都是"插入 sibling",按 before 字段定位
34
- - `child-of`:用户拖到了 target 元素 **内部** → `move.container` 就是 target 元素自己,`move.before` 通常 null(append 到末尾)。这跟 sibling-* 的语义区别是:source 变成了 container 的**子节点**而不是兄弟节点
35
- - **默认保护邻居 layout**:用户拖动元素时**默认期望邻居视觉位置/尺寸尽量不动**——只挪 source 不动其它。`aiContext.neighbors` 给你**决策上下文**(邻居 anchor + 原几何),由你**自己选合适的 CSS 手段**实现这个目标。
36
-
37
- **aiContext.neighbors 结构**:
38
- - `pending-move/pending-duplicate`: `{ sourceParent: [...], targetContainer: [...] }`(同容器时两者重合)
39
- - `pending-style` (free position): `[...]`(source 同容器邻居 flat list)
40
- - 每条 neighbor:`{ anchor, tag, rect: { w, h } }`
41
-
42
- **手段不是被规定的**——根据具体 layout 情况选最合适的(任意组合):
43
- - 把 source 改 `position: absolute` 让它脱离 flow,邻居自然不受影响(自由模式已经这样了)
44
- - 用 `transform: translate(X, Y)` 视觉移动 source 不动 DOM
45
- - 给某个邻居加 `min-width` / `min-height` / `flex-basis: Xpx` 防它扩张
46
- - 给容器加 `min-height` 防塌缩
47
- - 调整 grid-template-areas / grid-template-columns 精细控制
48
- - 必要时给个别邻居加 inline `width/height` 锁尺寸
49
- - 或者**判断本次 reflow 是合理的**(如 3 张卡片走 1 张剩 2 张平分宽度),不做额外保护
50
-
51
- **核心原则**:用户拖动想要的是"我把这个元素挪到那"——副作用越少越好。具体怎么实现你来判断,但要能说出为什么这样选。
52
-
53
- **`linkedToEditId` follow-up comment 的优先级最高**:用户填了"重排 OK" / "保持完全不动" 等明确指令,按 comment 来。没填走默认(你自己判断"尽量不动")
54
- - **pending-style** —— 按 `styleDelta` 改 inline style 或对应 Tailwind class(如 styleDelta.marginLeft 改 `ml-*`)。
55
- - **自由模式(free position)—— 最小改动原则**:
56
- - `styleDelta` 只含 `{position:'absolute', left, top}` —— 这是用户的真实意图(落位)
57
- - **不要无脑写整个 source 的样式**。默认只改这 3 个定位字段,**保留 source 原本的 CSS class 行为**(响应式、flex/grid 分配的尺寸、margin、transform 等)
58
- - 看 `aiContext.parentNeedsRelative` —— true 时把 `parentAnchor` 父元素加 `position:relative`
59
- - **`aiContext.preDragLayout` 是关键决策上下文**——source 拖前的 computed style 快照,让你判断是否需要追加补救:
60
-
61
- | preDragLayout 情况 | 切 absolute 后会怎样 | 落地建议 |
62
- |---|---|---|
63
- | `flex > 0` / `flexGrow > 0` / `flexBasis: 0` | source 之前靠 flex 父分配宽度,切 absolute 后宽度变 content-auto 几何突变 | **额外写 inline width/height** = `preDragGeometry.{w,h}` 锁尺寸 |
64
- | `gridArea` / `gridColumn/Row` 非默认 | source 之前占 grid cell,切 absolute 后 cell 空出 | 同上锁尺寸 + 考虑给 grid 容器加 `grid-template-areas` 显式管理 |
65
- | `width: 'XXpx'` (source 自己有显式宽度) | 几何稳定,宽度走 CSS class 不变 | **只写 3 字段不动 width**(最小改动) |
66
- | `display: inline*` | inline 元素切 absolute 后变 block-like | 锁尺寸更稳 |
67
-
68
- - **不要破坏 source 的现有 padding / 内容 / Tailwind class**;优先在 inline style 写定位,必要时追加 width/height 锁尺寸,其它属性原样保留
69
- - **Constraint anchor**:`item.constraint = { x, y }` 时,用户在 ConstraintPanel 上指定了"父 resize 时跟哪边"。`styleDelta` 已经按 anchor 算好对应 CSS,agent 直接照搬即可。9 种 anchor 组合的 CSS 模式参考:
70
- | constraint | CSS (除 position:absolute 外)|
71
- |---|---|
72
- | `(left, top)` 默认 | `left: Xpx; top: Ypx` |
73
- | `(right, top)` | `right: Xpx; top: Ypx` |
74
- | `(left, bottom)` | `left: Xpx; bottom: Ypx` |
75
- | `(right, bottom)` | `right: Xpx; bottom: Ypx` |
76
- | `(center, top)` | `left: 50%; top: Ypx; transform: translateX(-50%)` |
77
- | `(left, center)` | `left: Xpx; top: 50%; transform: translateY(-50%)` |
78
- | `(center, center)` | `left: 50%; top: 50%; transform: translate(-50%, -50%)` |
79
- | `(stretch, top)` | `left: Xpx; right: Ypx; top: Zpx; width: auto` |
80
- | `(center, bottom)` 等组合 | 按规则推 |
81
- 直接复用 `styleDelta` 写到 source 即可;记得**清掉 source 上跟 anchor 冲突的旧 inline style**(比如老 left 切到 right anchor 后老 left 要清,让浏览器只看新写的 right)
82
- - **pending-delete** —— 直接删 source 段。
83
- - **reactMount=true** 的任何 kind —— 改 `<script id="__nd-app">` 里的 JSX 而不是静态 HTML。anchor 的 dataId 仍能在 JSX 里找到(agent 写 JSX 时也该给元素加 data-anchor)。
84
- - 用户消息本身可能是对这些 changes 的进一步说明("你看我改的字够大吗"),结合上下文一起处理
85
-
86
-
87
- ---
88
-
89
- ## 常见 anti-pattern(prelude 2026-07-28 挪来)
90
-
91
- agent 容易在 pending changes 流程上犯的 4 类错(每条都让用户体感"agent 没看到我的改动"):
92
-
93
- - **跳过 get_pending_changes 直接回应** — 看到 system 提示但忽略,丢掉用户在 canvas 上的全部 edit / comment / 拖移上下文,回应跟用户的实际操作脱节
94
- - **处理完忘记 clear_pending_changes** — 下个 turn 仍见到同样的 changes 重复处理一遍,浪费 turn + 让用户困惑"我刚不是改过了"
95
- - **把 edit 当 comment 处理** — edit 是用户已经手动 done deal(contenteditable blur 已 PUT 文件),把它"按指令再改回去"等于 revert 用户操作
96
- - **pending-move 当成 comment "建议" 处理** —— pending-move 是**结构化操作意图**不是建议。用户已经"在画布上看见东西搬到新位置了"(前端运行时改了 DOM 但没碰源码),你必须按 `anchor.dataId` 真的把 source 段从那份文件里剪走插到 target 容器去;不照做下次 iframe reload 视觉跳回,用户体感"我拖了等于没拖"
97
-
98
- ---
1
+ # DirectEdit 逐 kind 处理协议(get_pending_changes 首调注入)
2
+
3
+ > prelude 常驻部分只教流程骨架(get → 处理 → clear → 收尾总结);本文是每类
4
+ > pending change 的完整处理细则,agent 第一次调 get_pending_changes 时注入。
5
+
6
+ ## item 字段
7
+
8
+ - `kind`: `'edit'` / `'comment'` / `'pending-move'` / `'pending-duplicate'` / `'pending-style'` / `'pending-delete'` / `'applied-move'` / `'applied-style'` / `'applied-duplicate'`
9
+ - `anchor`: 元素稳定锚点({ dataId, path, textHint, bbox })
10
+ - `path`(可选): 改动属于哪份文件(如 `about.html`);没有 = 会话当前活跃的那份产物
11
+ - `aiContext`: 元素角色 / 页面信息 / outerHTML / computed styles / siblings;移动类还带 `targetContainerTag` + `alignmentHints`
12
+ - `diff`(edit): `{ oldText, newText }` —— 用户改成了什么
13
+ - `text`(comment): 评论原文
14
+ - `move`(pending-move / pending-duplicate): `{ container: anchor, before: anchor|null }` —— 目标容器 + 插在哪个 sibling 之前(null 表示末尾)
15
+ - `styleDelta`(pending-style): 待改的 inline style key/value
16
+ - `reactMount`(任意): true → 改的是 `<script id="__nd-app">` 里的 JSX 子树,不是 HTML 段
17
+
18
+ ## 逐 kind 处理
19
+
20
+ - **comments 是用户的修改请求** —— 按评论的指示改条目 `path` 指向的那份文件(用 Edit 工具)
21
+ - **comment 带 `linkedToEditId`**:评论关联到 buffer 里的某条 pending-* edit(拖完浮 PostDragNotePanel 提交的 follow-up)。处理时**把该 comment 视为对那条 edit 的补充指令**——比如 pending-move 关联 comment "保持其它元素位置不变" → 走默认保护邻居的更严格档;pending-move 关联 comment "顺便把右边那块也搬过来" → 视为复合操作一起做。处理完两条都进 clearedIds
22
+ - **edits 是用户已经手动改完的** —— done deal 不动;只在回复里知会"用户改了 N 处文字 OK"
23
+ - **applied-move / applied-style / applied-duplicate 也是 done deal** —— 站点窗的拖拽落地时前端已把改动写回 `path` 指的文件。**不要再应用一遍**(重复应用 = 元素被搬两次)。用它理解用户动了什么;如果用户后续要求"顺一下",可以把烤进 inline 的 left/top 提炼进样式表,否则不主动动
24
+ - **`path` 在构建产物目录下**(如 `dist/…`)时:改动落在的是构建产物,下次构建会把它冲掉。在做任何会触发重新构建的事之前,先把这条改动同步回对应的源文件(按 anchor/aiContext 找源码里的对应元素)
25
+ - 记录带 `serializedFrom: 'runtime-dom'` 时:落盘走的是整页运行时序列化兜底(干净源码上没定位到锚点),文件里可能混入该页脚本的运行时产物(注入节点/内联动画态)。用户抱怨"页面变怪了"时优先查这份文件
26
+ - **pending-move / pending-duplicate** —— 用户已经在画布拖完了视觉,但**源代码还是老样子**。
27
+ - 用 `anchor.dataId` (data-anchor) 在那份文件里 grep 出 source 段
28
+ - 用 `move.container.dataId` 找出 target 容器段
29
+ - 用 `move.before.dataId` 找出"插在它前面"的 sibling(null 时插末尾)
30
+ - 用 Edit 工具完成 DOM 树移动:剪 source 段 → 插到 target 容器内 before sibling 前
31
+ - `pending-duplicate` 同理但保留 source 原位置
32
+ - **`move.intent` 提示语义**:
33
+ - `sibling-before` / `sibling-after`:本质都是"插入 sibling",按 before 字段定位
34
+ - `child-of`:用户拖到了 target 元素 **内部** → `move.container` 就是 target 元素自己,`move.before` 通常 null(append 到末尾)。这跟 sibling-* 的语义区别是:source 变成了 container 的**子节点**而不是兄弟节点
35
+ - **默认保护邻居 layout**:用户拖动元素时**默认期望邻居视觉位置/尺寸尽量不动**——只挪 source 不动其它。`aiContext.neighbors` 给你**决策上下文**(邻居 anchor + 原几何),由你**自己选合适的 CSS 手段**实现这个目标。
36
+
37
+ **aiContext.neighbors 结构**:
38
+ - `pending-move/pending-duplicate`: `{ sourceParent: [...], targetContainer: [...] }`(同容器时两者重合)
39
+ - `pending-style` (free position): `[...]`(source 同容器邻居 flat list)
40
+ - 每条 neighbor:`{ anchor, tag, rect: { w, h } }`
41
+
42
+ **手段不是被规定的**——根据具体 layout 情况选最合适的(任意组合):
43
+ - 把 source 改 `position: absolute` 让它脱离 flow,邻居自然不受影响(自由模式已经这样了)
44
+ - 用 `transform: translate(X, Y)` 视觉移动 source 不动 DOM
45
+ - 给某个邻居加 `min-width` / `min-height` / `flex-basis: Xpx` 防它扩张
46
+ - 给容器加 `min-height` 防塌缩
47
+ - 调整 grid-template-areas / grid-template-columns 精细控制
48
+ - 必要时给个别邻居加 inline `width/height` 锁尺寸
49
+ - 或者**判断本次 reflow 是合理的**(如 3 张卡片走 1 张剩 2 张平分宽度),不做额外保护
50
+
51
+ **核心原则**:用户拖动想要的是"我把这个元素挪到那"——副作用越少越好。具体怎么实现你来判断,但要能说出为什么这样选。
52
+
53
+ **`linkedToEditId` follow-up comment 的优先级最高**:用户填了"重排 OK" / "保持完全不动" 等明确指令,按 comment 来。没填走默认(你自己判断"尽量不动")
54
+ - **pending-style** —— 按 `styleDelta` 改 inline style 或对应 Tailwind class(如 styleDelta.marginLeft 改 `ml-*`)。
55
+ - **自由模式(free position)—— 最小改动原则**:
56
+ - `styleDelta` 只含 `{position:'absolute', left, top}` —— 这是用户的真实意图(落位)
57
+ - **不要无脑写整个 source 的样式**。默认只改这 3 个定位字段,**保留 source 原本的 CSS class 行为**(响应式、flex/grid 分配的尺寸、margin、transform 等)
58
+ - 看 `aiContext.parentNeedsRelative` —— true 时把 `parentAnchor` 父元素加 `position:relative`
59
+ - **`aiContext.preDragLayout` 是关键决策上下文**——source 拖前的 computed style 快照,让你判断是否需要追加补救:
60
+
61
+ | preDragLayout 情况 | 切 absolute 后会怎样 | 落地建议 |
62
+ |---|---|---|
63
+ | `flex > 0` / `flexGrow > 0` / `flexBasis: 0` | source 之前靠 flex 父分配宽度,切 absolute 后宽度变 content-auto 几何突变 | **额外写 inline width/height** = `preDragGeometry.{w,h}` 锁尺寸 |
64
+ | `gridArea` / `gridColumn/Row` 非默认 | source 之前占 grid cell,切 absolute 后 cell 空出 | 同上锁尺寸 + 考虑给 grid 容器加 `grid-template-areas` 显式管理 |
65
+ | `width: 'XXpx'` (source 自己有显式宽度) | 几何稳定,宽度走 CSS class 不变 | **只写 3 字段不动 width**(最小改动) |
66
+ | `display: inline*` | inline 元素切 absolute 后变 block-like | 锁尺寸更稳 |
67
+
68
+ - **不要破坏 source 的现有 padding / 内容 / Tailwind class**;优先在 inline style 写定位,必要时追加 width/height 锁尺寸,其它属性原样保留
69
+ - **Constraint anchor**:`item.constraint = { x, y }` 时,用户在 ConstraintPanel 上指定了"父 resize 时跟哪边"。`styleDelta` 已经按 anchor 算好对应 CSS,agent 直接照搬即可。9 种 anchor 组合的 CSS 模式参考:
70
+ | constraint | CSS (除 position:absolute 外)|
71
+ |---|---|
72
+ | `(left, top)` 默认 | `left: Xpx; top: Ypx` |
73
+ | `(right, top)` | `right: Xpx; top: Ypx` |
74
+ | `(left, bottom)` | `left: Xpx; bottom: Ypx` |
75
+ | `(right, bottom)` | `right: Xpx; bottom: Ypx` |
76
+ | `(center, top)` | `left: 50%; top: Ypx; transform: translateX(-50%)` |
77
+ | `(left, center)` | `left: Xpx; top: 50%; transform: translateY(-50%)` |
78
+ | `(center, center)` | `left: 50%; top: 50%; transform: translate(-50%, -50%)` |
79
+ | `(stretch, top)` | `left: Xpx; right: Ypx; top: Zpx; width: auto` |
80
+ | `(center, bottom)` 等组合 | 按规则推 |
81
+ 直接复用 `styleDelta` 写到 source 即可;记得**清掉 source 上跟 anchor 冲突的旧 inline style**(比如老 left 切到 right anchor 后老 left 要清,让浏览器只看新写的 right)
82
+ - **pending-delete** —— 直接删 source 段。
83
+ - **reactMount=true** 的任何 kind —— 改 `<script id="__nd-app">` 里的 JSX 而不是静态 HTML。anchor 的 dataId 仍能在 JSX 里找到(agent 写 JSX 时也该给元素加 data-anchor)。
84
+ - 用户消息本身可能是对这些 changes 的进一步说明("你看我改的字够大吗"),结合上下文一起处理
85
+
86
+
87
+ ---
88
+
89
+ ## 常见 anti-pattern(prelude 2026-07-28 挪来)
90
+
91
+ agent 容易在 pending changes 流程上犯的 4 类错(每条都让用户体感"agent 没看到我的改动"):
92
+
93
+ - **跳过 get_pending_changes 直接回应** — 看到 system 提示但忽略,丢掉用户在 canvas 上的全部 edit / comment / 拖移上下文,回应跟用户的实际操作脱节
94
+ - **处理完忘记 clear_pending_changes** — 下个 turn 仍见到同样的 changes 重复处理一遍,浪费 turn + 让用户困惑"我刚不是改过了"
95
+ - **把 edit 当 comment 处理** — edit 是用户已经手动 done deal(contenteditable blur 已 PUT 文件),把它"按指令再改回去"等于 revert 用户操作
96
+ - **pending-move 当成 comment "建议" 处理** —— pending-move 是**结构化操作意图**不是建议。用户已经"在画布上看见东西搬到新位置了"(前端运行时改了 DOM 但没碰源码),你必须按 `anchor.dataId` 真的把 source 段从那份文件里剪走插到 target 容器去;不照做下次 iframe reload 视觉跳回,用户体感"我拖了等于没拖"
97
+
98
+ ---