@xiaobuyu/nodesign 0.0.1

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 (372) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +140 -0
  3. package/bin/nodesign.js +176 -0
  4. package/package.json +104 -0
  5. package/server/api/README.md +45 -0
  6. package/server/api/_guard.js +75 -0
  7. package/server/api/admin.js +187 -0
  8. package/server/api/assets/docx-page.js +103 -0
  9. package/server/api/assets/helpers.js +22 -0
  10. package/server/api/assets/notes.js +144 -0
  11. package/server/api/assets.js +896 -0
  12. package/server/api/board.js +57 -0
  13. package/server/api/browse.js +138 -0
  14. package/server/api/canvas.js +444 -0
  15. package/server/api/chatai.js +324 -0
  16. package/server/api/exports/build-standalone.js +980 -0
  17. package/server/api/exports/cards.js +118 -0
  18. package/server/api/exports/docx-pdf.js +46 -0
  19. package/server/api/exports/export-page.js +142 -0
  20. package/server/api/exports/handoff.js +147 -0
  21. package/server/api/exports.js +690 -0
  22. package/server/api/instruction.js +75 -0
  23. package/server/api/local.js +115 -0
  24. package/server/api/me.js +116 -0
  25. package/server/api/memory.js +185 -0
  26. package/server/api/pending-changes.js +366 -0
  27. package/server/api/plugins.js +164 -0
  28. package/server/api/projects.js +220 -0
  29. package/server/api/publish.js +64 -0
  30. package/server/api/recent.js +73 -0
  31. package/server/api/sessions.js +589 -0
  32. package/server/api/skills.js +77 -0
  33. package/server/api/standalone-fit.js +168 -0
  34. package/server/api/turn-compose.js +180 -0
  35. package/server/api/turn-inflight.js +44 -0
  36. package/server/api/turn.js +669 -0
  37. package/server/auth/README.md +17 -0
  38. package/server/auth/middleware.js +138 -0
  39. package/server/auth/origin-guard.js +71 -0
  40. package/server/auth/session.js +108 -0
  41. package/server/auth/tier.js +113 -0
  42. package/server/auth/users-store.js +348 -0
  43. package/server/edit/README.md +29 -0
  44. package/server/engine/README.md +113 -0
  45. package/server/engine/agent/agent-shared.js +550 -0
  46. package/server/engine/agent/auto-mode-default-hard-deny.txt +4 -0
  47. package/server/engine/agent/auto-mode-rules.js +78 -0
  48. package/server/engine/agent/context.js +418 -0
  49. package/server/engine/agent/events.js +464 -0
  50. package/server/engine/agent/hooks/canvas-validate.js +199 -0
  51. package/server/engine/agent/hooks/failure.js +120 -0
  52. package/server/engine/agent/hooks/file-events.js +75 -0
  53. package/server/engine/agent/hooks/lifecycle.js +233 -0
  54. package/server/engine/agent/hooks/post-canvas-focus.js +80 -0
  55. package/server/engine/agent/hooks/post-guidance.js +206 -0
  56. package/server/engine/agent/hooks/post-subagent-report.js +104 -0
  57. package/server/engine/agent/hooks/post-trim.js +58 -0
  58. package/server/engine/agent/hooks/pre-board-neighborhood.js +34 -0
  59. package/server/engine/agent/hooks/pre-defaults.js +84 -0
  60. package/server/engine/agent/hooks/pre-injectors.js +277 -0
  61. package/server/engine/agent/hooks/pre-performance-log-guard.js +78 -0
  62. package/server/engine/agent/hooks/pre-starter-files.js +61 -0
  63. package/server/engine/agent/hooks/pre-workspace-scope-guard.js +78 -0
  64. package/server/engine/agent/hooks/site-validate.js +94 -0
  65. package/server/engine/agent/hooks/tool-prompts.js +31 -0
  66. package/server/engine/agent/hooks/turn-state-memory.js +56 -0
  67. package/server/engine/agent/hooks/user-prompt-submit.js +215 -0
  68. package/server/engine/agent/hooks.js +354 -0
  69. package/server/engine/agent/init-contract.js +69 -0
  70. package/server/engine/agent/isolation.js +159 -0
  71. package/server/engine/agent/model-context.js +359 -0
  72. package/server/engine/agent/model-table.js +292 -0
  73. package/server/engine/agent/plugin-loader.js +266 -0
  74. package/server/engine/agent/prompts/nodesign-prelude.md +336 -0
  75. package/server/engine/agent/prompts/tools/ask-user-question-protocol.md +71 -0
  76. package/server/engine/agent/prompts/tools/direct-edit-protocol.md +98 -0
  77. package/server/engine/agent/prompts/tools/generate-image-cookbook.gemini-gateway.md +583 -0
  78. package/server/engine/agent/prompts/tools/generate-image-cookbook.md +483 -0
  79. package/server/engine/agent/prompts/tools/hybrid-reference.md +100 -0
  80. package/server/engine/agent/prompts/tools/paint-still-cookbook.md +270 -0
  81. package/server/engine/agent/prompts/tools/roll-film-cookbook.md +70 -0
  82. package/server/engine/agent/prompts/tools/site-reference.md +106 -0
  83. package/server/engine/agent/prompts/tools/tweaks-syntax.md +125 -0
  84. package/server/engine/agent/prompts/tools/vision-checker-dispatch.md +48 -0
  85. package/server/engine/agent/session-loop.js +1024 -0
  86. package/server/engine/agent/session-model.js +164 -0
  87. package/server/engine/agent/skill.js +204 -0
  88. package/server/engine/agent/system-prompts.js +86 -0
  89. package/server/engine/agent/task-events.js +78 -0
  90. package/server/engine/agents/ds-extractor.md +132 -0
  91. package/server/engine/agents/explorer.md +190 -0
  92. package/server/engine/agents/index.js +230 -0
  93. package/server/engine/agents/schemas/design-system.json +156 -0
  94. package/server/engine/agents/schemas/tweak-schema.json +113 -0
  95. package/server/engine/agents/tweak-proposer.md +127 -0
  96. package/server/engine/agents/vision-checker.md +254 -0
  97. package/server/engine/browse/capture.js +422 -0
  98. package/server/engine/browse/card.js +137 -0
  99. package/server/engine/browse/handover.js +59 -0
  100. package/server/engine/browse/page-digest.js +119 -0
  101. package/server/engine/browse/refs.js +196 -0
  102. package/server/engine/browse/registry.js +307 -0
  103. package/server/engine/browse/screencast.js +170 -0
  104. package/server/engine/browse/state.js +121 -0
  105. package/server/engine/chatai/chat-log.js +79 -0
  106. package/server/engine/chatai/index.js +193 -0
  107. package/server/engine/chatai/openai-compat.js +152 -0
  108. package/server/engine/chatai/orchestrate.js +309 -0
  109. package/server/engine/chatai/perform.js +40 -0
  110. package/server/engine/chatai/summarize.js +79 -0
  111. package/server/engine/mcp/capability-gate.js +52 -0
  112. package/server/engine/mcp/index.js +339 -0
  113. package/server/engine/mcp/param-sanitizer.js +142 -0
  114. package/server/engine/mcp/tools/arrange-on-board.js +124 -0
  115. package/server/engine/mcp/tools/artifact-session.js +278 -0
  116. package/server/engine/mcp/tools/browse-computer.js +421 -0
  117. package/server/engine/mcp/tools/browse-find-batch.js +183 -0
  118. package/server/engine/mcp/tools/browse-screenshot.js +157 -0
  119. package/server/engine/mcp/tools/browse.js +480 -0
  120. package/server/engine/mcp/tools/build-docx.js +101 -0
  121. package/server/engine/mcp/tools/clear-pending-changes.js +99 -0
  122. package/server/engine/mcp/tools/create-on-board.js +155 -0
  123. package/server/engine/mcp/tools/crystallize-skill.js +168 -0
  124. package/server/engine/mcp/tools/deliver-files.js +0 -0
  125. package/server/engine/mcp/tools/explain-style.js +237 -0
  126. package/server/engine/mcp/tools/export-handoff.js +133 -0
  127. package/server/engine/mcp/tools/expose-tweaks.js +149 -0
  128. package/server/engine/mcp/tools/generate-image.js +842 -0
  129. package/server/engine/mcp/tools/get-computed-styles.js +164 -0
  130. package/server/engine/mcp/tools/get-pending-changes.js +205 -0
  131. package/server/engine/mcp/tools/h3box-ssh.js +84 -0
  132. package/server/engine/mcp/tools/helpers/acquire-page.js +82 -0
  133. package/server/engine/mcp/tools/helpers/motion-lab.js +554 -0
  134. package/server/engine/mcp/tools/helpers/motion-scroll.js +112 -0
  135. package/server/engine/mcp/tools/helpers/perception-page.js +215 -0
  136. package/server/engine/mcp/tools/helpers/reference-download.js +103 -0
  137. package/server/engine/mcp/tools/helpers/rembg-bridge.py +80 -0
  138. package/server/engine/mcp/tools/helpers/rembg.js +273 -0
  139. package/server/engine/mcp/tools/helpers/shot-pipeline.js +280 -0
  140. package/server/engine/mcp/tools/highlight.js +68 -0
  141. package/server/engine/mcp/tools/list-pages.js +222 -0
  142. package/server/engine/mcp/tools/lookup-tags.js +59 -0
  143. package/server/engine/mcp/tools/navigate-to-page.js +60 -0
  144. package/server/engine/mcp/tools/organize-board.js +64 -0
  145. package/server/engine/mcp/tools/paint-still.js +434 -0
  146. package/server/engine/mcp/tools/pin-to-board.js +130 -0
  147. package/server/engine/mcp/tools/preview-deck.js +130 -0
  148. package/server/engine/mcp/tools/profile-scroll.js +305 -0
  149. package/server/engine/mcp/tools/publish-site.js +102 -0
  150. package/server/engine/mcp/tools/query-elements.js +195 -0
  151. package/server/engine/mcp/tools/read-board.js +103 -0
  152. package/server/engine/mcp/tools/read-document.js +93 -0
  153. package/server/engine/mcp/tools/read-page.js +264 -0
  154. package/server/engine/mcp/tools/read-tavern-json.js +143 -0
  155. package/server/engine/mcp/tools/record-decision.js +140 -0
  156. package/server/engine/mcp/tools/relate-on-board.js +110 -0
  157. package/server/engine/mcp/tools/remove-background.js +391 -0
  158. package/server/engine/mcp/tools/report-issue.js +115 -0
  159. package/server/engine/mcp/tools/roll-film.js +266 -0
  160. package/server/engine/mcp/tools/screenshot-docx.js +138 -0
  161. package/server/engine/mcp/tools/screenshot-url.js +195 -0
  162. package/server/engine/mcp/tools/screenshot.js +583 -0
  163. package/server/engine/mcp/tools/tier-gate.js +96 -0
  164. package/server/engine/mcp/tools/trace-motion.js +215 -0
  165. package/server/engine/mcp/tools/web-search.js +548 -0
  166. package/server/engine/motion/inventory.js +349 -0
  167. package/server/engine/perception/session.js +235 -0
  168. package/server/engine/plugins/nodesign/.claude-plugin/plugin.json +5 -0
  169. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/SKILL.md +192 -0
  170. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/canvas.template.html +667 -0
  171. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/hybrid-grid.md +22 -0
  172. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/image-led-cover.md +25 -0
  173. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/portrait.md +23 -0
  174. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/quote-backdrop.md +21 -0
  175. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/section-divider.md +23 -0
  176. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/text-led.md +21 -0
  177. package/server/engine/plugins/nodesign/skills/docx-craft/SKILL.md +162 -0
  178. package/server/engine/plugins/nodesign/skills/docx-craft/references/token-schema.md +407 -0
  179. package/server/engine/plugins/nodesign/skills/docx-craft//346/226/207/346/241/243.template.json +80 -0
  180. package/server/engine/plugins/nodesign/skills/rp-craft/SKILL.md +228 -0
  181. 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 -0
  182. package/server/engine/plugins/nodesign/skills/rp-craft//346/274/224/345/207/272.template.js +268 -0
  183. package/server/engine/plugins/nodesign/skills/site-craft/SKILL.md +323 -0
  184. package/server/engine/plugins/nodesign/skills/site-craft/patterns/build-lane.md +134 -0
  185. package/server/engine/plugins/nodesign/skills/site-craft/patterns/cutout-collage.md +61 -0
  186. package/server/engine/plugins/nodesign/skills/site-craft/patterns/mock-app.md +163 -0
  187. package/server/engine/plugins/nodesign/skills/site-craft/patterns/page-transitions.md +86 -0
  188. package/server/engine/runs/active-runs.js +698 -0
  189. package/server/engine/runs/live-turn.js +252 -0
  190. package/server/engine/runs/store.js +364 -0
  191. package/server/engine/runs/turn-relay.js +217 -0
  192. package/server/engine/runtime/workspace.js +164 -0
  193. package/server/index.js +235 -0
  194. package/server/lib/artifact-file-path.js +80 -0
  195. package/server/lib/artifact-target.js +284 -0
  196. package/server/lib/asset-refs.js +239 -0
  197. package/server/lib/async-queue.js +104 -0
  198. package/server/lib/auto-relations.js +130 -0
  199. package/server/lib/binding-types.js +60 -0
  200. package/server/lib/board-kind-sizes.js +62 -0
  201. package/server/lib/board-relations.js +133 -0
  202. package/server/lib/browse-proxy.js +180 -0
  203. package/server/lib/canvas-id.js +36 -0
  204. package/server/lib/cover.js +227 -0
  205. package/server/lib/danbooru-tags.js +291 -0
  206. package/server/lib/doc-extract.js +156 -0
  207. package/server/lib/docx/build-from-source.js +260 -0
  208. package/server/lib/docx/build.js +490 -0
  209. package/server/lib/docx/dump-styles.js +287 -0
  210. package/server/lib/docx/fonts/nodesign-cjk.conf +164 -0
  211. package/server/lib/docx/merge-runs.js +129 -0
  212. package/server/lib/docx/numbering.js +218 -0
  213. package/server/lib/docx/order.js +152 -0
  214. package/server/lib/docx/rawzip.js +172 -0
  215. package/server/lib/docx/render.js +92 -0
  216. package/server/lib/docx/text-lint.js +225 -0
  217. package/server/lib/docx/tokens.js +335 -0
  218. package/server/lib/docx/units.js +29 -0
  219. package/server/lib/docx/xml.js +291 -0
  220. package/server/lib/docx-pages.js +187 -0
  221. package/server/lib/export-collect.js +289 -0
  222. package/server/lib/export-package.js +210 -0
  223. package/server/lib/html-srcset.js +145 -0
  224. package/server/lib/image-variant.js +460 -0
  225. package/server/lib/ingress/forward-openai-chat.js +305 -0
  226. package/server/lib/ingress/openai-chat.js +491 -0
  227. package/server/lib/ingress/session-notice.js +66 -0
  228. package/server/lib/ingress/session-routes.js +68 -0
  229. package/server/lib/ingress/slot-probe.js +130 -0
  230. package/server/lib/ingress/upstream-billing.js +52 -0
  231. package/server/lib/ingress/upstream-fail-streak.js +72 -0
  232. package/server/lib/ingress/upstream-truncation.js +48 -0
  233. package/server/lib/issues-store.js +182 -0
  234. package/server/lib/kinds/deck.js +72 -0
  235. package/server/lib/kinds/docx.js +283 -0
  236. package/server/lib/kinds/file-kinds.js +113 -0
  237. package/server/lib/kinds/index.js +202 -0
  238. package/server/lib/kinds/site.js +161 -0
  239. package/server/lib/model-ingress.js +543 -0
  240. package/server/lib/moderation.js +255 -0
  241. package/server/lib/notice-store.js +103 -0
  242. package/server/lib/plugin-install.js +104 -0
  243. package/server/lib/plugin-validator.js +721 -0
  244. package/server/lib/publish-store.js +115 -0
  245. package/server/lib/quick-summary.js +52 -0
  246. package/server/lib/quota.js +270 -0
  247. package/server/lib/rate-window.js +29 -0
  248. package/server/lib/reference-assets.js +92 -0
  249. package/server/lib/region-shot.js +135 -0
  250. package/server/lib/safe-path.js +73 -0
  251. package/server/lib/sdk-session.js +33 -0
  252. package/server/lib/showcase-store.js +92 -0
  253. package/server/lib/site-publish.js +465 -0
  254. package/server/lib/ssrf-guard.js +432 -0
  255. package/server/lib/task-scan.js +158 -0
  256. package/server/lib/tavern-json.js +154 -0
  257. package/server/lib/video-variant.js +237 -0
  258. package/server/lib/workspace-path.js +33 -0
  259. package/server/ops/fix-sdk-musl.mjs +40 -0
  260. package/server/ops/install-macos-fonts.sh +114 -0
  261. package/server/ops/macos-fonts.conf +336 -0
  262. package/server/ops/sandbox-shim/bwrap +57 -0
  263. package/server/projects/assets-summary.js +119 -0
  264. package/server/projects/auto-name.js +53 -0
  265. package/server/projects/board-store.js +640 -0
  266. package/server/projects/move-entry.js +103 -0
  267. package/server/projects/store.js +270 -0
  268. package/server/projects/ui-config.js +54 -0
  269. package/server/projects/workspace-templates.js +53 -0
  270. package/server/projects/workspace.js +1025 -0
  271. package/server/runtime/capabilities.js +153 -0
  272. package/server/runtime/local-config.js +177 -0
  273. package/server/runtime/local-env.js +88 -0
  274. package/server/runtime/platform.js +342 -0
  275. package/server/runtime/profile.js +72 -0
  276. package/server/services/rembg-launcher.js +313 -0
  277. package/server/services/rembg-service.py +334 -0
  278. package/server/shared/README.md +25 -0
  279. package/server/shared/deck.js +54 -0
  280. package/server/shared/time.js +49 -0
  281. package/server/style-pipeline/README.md +53 -0
  282. package/server/ws/broker.js +36 -0
  283. package/server/ws/browse-channel.js +177 -0
  284. package/server/ws/index.js +386 -0
  285. package/web/README.md +89 -0
  286. package/web/dist/assets/BrowserWindow-Dc7J7CYc.js +11 -0
  287. package/web/dist/assets/DeckWindow-4G0xX7P3.js +16 -0
  288. package/web/dist/assets/DocxWindow-BXQsoPkh.js +16 -0
  289. package/web/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  290. package/web/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  291. package/web/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  292. package/web/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  293. package/web/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  294. package/web/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  295. package/web/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  296. package/web/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  297. package/web/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  298. package/web/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  299. package/web/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  300. package/web/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  301. package/web/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  302. package/web/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  303. package/web/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  304. package/web/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  305. package/web/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  306. package/web/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  307. package/web/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  308. package/web/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  309. package/web/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  310. package/web/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  311. package/web/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  312. package/web/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  313. package/web/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  314. package/web/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  315. package/web/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  316. package/web/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  317. package/web/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  318. package/web/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  319. package/web/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  320. package/web/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  321. package/web/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  322. package/web/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  323. package/web/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  324. package/web/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  325. package/web/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  326. package/web/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  327. package/web/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  328. package/web/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  329. package/web/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  330. package/web/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  331. package/web/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  332. package/web/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  333. package/web/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  334. package/web/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  335. package/web/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  336. package/web/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  337. package/web/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  338. package/web/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  339. package/web/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  340. package/web/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  341. package/web/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  342. package/web/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  343. package/web/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  344. package/web/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  345. package/web/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  346. package/web/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  347. package/web/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  348. package/web/dist/assets/SiteWindow-D6eS-2gM.js +18 -0
  349. package/web/dist/assets/again-D8tfgKKO.webp +0 -0
  350. package/web/dist/assets/caveat-nd-CP6HlsNg.woff2 +0 -0
  351. package/web/dist/assets/clock-xJhvfYpS.webp +0 -0
  352. package/web/dist/assets/film-cut-BBKMwH7q.webp +0 -0
  353. package/web/dist/assets/film-still-BZ_DL9Tt.webp +0 -0
  354. package/web/dist/assets/index-C0KUf6Wd.css +1 -0
  355. package/web/dist/assets/index-Cbl3ATvp.js +2125 -0
  356. package/web/dist/assets/ink-desk-BRbxeDsR.webp +0 -0
  357. package/web/dist/assets/ink-night-Bz4BT3XH.webp +0 -0
  358. package/web/dist/assets/ink-portrait-C0DM4V8Q.webp +0 -0
  359. package/web/dist/assets/longcang-regular-C0uvTuKa.woff2 +0 -0
  360. package/web/dist/assets/lxgw-nd-bold-DbRfiTgo.woff2 +0 -0
  361. package/web/dist/assets/lxgw-nd-regular-CpMw9Ehg.woff2 +0 -0
  362. package/web/dist/assets/pending-edit-apply-DTjo2geW.js +31 -0
  363. package/web/dist/assets/question-8H4HSqxh.webp +0 -0
  364. package/web/dist/assets/reject-BaPJqElj.webp +0 -0
  365. package/web/dist/assets/rotate-cw-LMT3x1Zj.js +11 -0
  366. package/web/dist/assets/rp-portrait-CbrGpew2.webp +0 -0
  367. package/web/dist/assets/rp-street-C4jVKjxx.webp +0 -0
  368. package/web/dist/assets/square-dashed-mouse-pointer-CBoAkfhi.js +11 -0
  369. package/web/dist/assets/tangle-DIxHVNuT.webp +0 -0
  370. package/web/dist/assets/thisone-BylZKglV.webp +0 -0
  371. package/web/dist/assets/thumb-DO1wfK1I.webp +0 -0
  372. package/web/dist/index.html +18 -0
@@ -0,0 +1,113 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "nodesign://schemas/tweak-schema.json",
4
+ "title": "Tweak Schema",
5
+ "description": "Schema for slider/select controls the frontend renders to let the user fine-tune a finished canvas without rewriting it. Each tweak names a dimension that can be adjusted with one degree of freedom.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["meta", "tweaks"],
9
+ "properties": {
10
+ "meta": {
11
+ "type": "object",
12
+ "additionalProperties": false,
13
+ "required": ["proposedAt", "sourceArtifact"],
14
+ "properties": {
15
+ "proposedAt": { "type": "string", "format": "date-time" },
16
+ "sourceArtifact": { "type": "string" },
17
+ "summary": { "type": "string", "description": "One sentence: what kind of tweaks does this canvas afford?" }
18
+ }
19
+ },
20
+ "tweaks": {
21
+ "type": "array",
22
+ "minItems": 0,
23
+ "maxItems": 12,
24
+ "items": { "$ref": "#/definitions/tweak" }
25
+ }
26
+ },
27
+
28
+ "definitions": {
29
+ "tweak": {
30
+ "oneOf": [
31
+ { "$ref": "#/definitions/numberTweak" },
32
+ { "$ref": "#/definitions/selectTweak" },
33
+ { "$ref": "#/definitions/colorTweak" },
34
+ { "$ref": "#/definitions/booleanTweak" }
35
+ ]
36
+ },
37
+
38
+ "numberTweak": {
39
+ "type": "object",
40
+ "additionalProperties": false,
41
+ "required": ["id", "label", "type", "current", "min", "max", "step", "affects"],
42
+ "properties": {
43
+ "id": { "type": "string", "pattern": "^[a-z][a-zA-Z0-9]*$", "description": "camelCase stable identifier" },
44
+ "label": { "type": "string", "description": "Display label, max ~30 chars" },
45
+ "type": { "const": "number" },
46
+ "current": { "type": "number" },
47
+ "min": { "type": "number" },
48
+ "max": { "type": "number" },
49
+ "step": { "type": "number", "exclusiveMinimum": 0 },
50
+ "unit": { "type": "string", "description": "Display unit (e.g., 'px', '%', 'x', 'deg')" },
51
+ "affects": { "$ref": "#/definitions/affectsList" },
52
+ "description": { "type": "string" }
53
+ }
54
+ },
55
+
56
+ "selectTweak": {
57
+ "type": "object",
58
+ "additionalProperties": false,
59
+ "required": ["id", "label", "type", "current", "options", "affects"],
60
+ "properties": {
61
+ "id": { "type": "string", "pattern": "^[a-z][a-zA-Z0-9]*$" },
62
+ "label": { "type": "string" },
63
+ "type": { "const": "select" },
64
+ "current": { "type": "string" },
65
+ "options": {
66
+ "type": "array",
67
+ "minItems": 2,
68
+ "maxItems": 8,
69
+ "items": { "type": "string" }
70
+ },
71
+ "affects": { "$ref": "#/definitions/affectsList" },
72
+ "description": { "type": "string" }
73
+ }
74
+ },
75
+
76
+ "colorTweak": {
77
+ "type": "object",
78
+ "additionalProperties": false,
79
+ "required": ["id", "label", "type", "current", "affects"],
80
+ "properties": {
81
+ "id": { "type": "string", "pattern": "^[a-z][a-zA-Z0-9]*$" },
82
+ "label": { "type": "string" },
83
+ "type": { "const": "color" },
84
+ "current": { "type": "string", "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$" },
85
+ "affects": { "$ref": "#/definitions/affectsList" },
86
+ "description": { "type": "string" }
87
+ }
88
+ },
89
+
90
+ "booleanTweak": {
91
+ "type": "object",
92
+ "additionalProperties": false,
93
+ "required": ["id", "label", "type", "current", "affects"],
94
+ "properties": {
95
+ "id": { "type": "string", "pattern": "^[a-z][a-zA-Z0-9]*$" },
96
+ "label": { "type": "string" },
97
+ "type": { "const": "boolean" },
98
+ "current": { "type": "boolean" },
99
+ "affects": { "$ref": "#/definitions/affectsList" },
100
+ "description": { "type": "string" }
101
+ }
102
+ },
103
+
104
+ "affectsList": {
105
+ "type": "array",
106
+ "minItems": 1,
107
+ "items": {
108
+ "type": "string",
109
+ "description": "Token path or selector this tweak applies to (e.g., 'colors.accent', 'typography.scale.h1.fontSize', 'spacing.*', '#hero h1')."
110
+ }
111
+ }
112
+ }
113
+ }
@@ -0,0 +1,127 @@
1
+ # tweak-proposer
2
+
3
+ You propose a list of "tweakable dimensions" for a finished canvas — the
4
+ single-degree-of-freedom knobs the user could fiddle with to fine-tune
5
+ the design without rewriting it. The frontend will render each tweak as
6
+ a slider / select / color picker.
7
+
8
+ ## Your one job
9
+
10
+ When invoked, you:
11
+
12
+ 1. **Read `canvas.html`** to understand the design.
13
+ 2. **Identify 4–10 tweaks** that would meaningfully change the look
14
+ without breaking it. Each tweak must be:
15
+ - Single-axis (one slider / one selector — no compound knobs)
16
+ - Reversible (the user can dial back and forth)
17
+ - Bounded (sensible min / max)
18
+ - Distinct from the others (don't propose 3 spacing knobs that
19
+ basically do the same thing)
20
+ 3. **Output one JSON document** matching the Tweak Schema below.
21
+
22
+ You do NOT modify the canvas. You do NOT take screenshots. Just analyze
23
+ the markup + styles + composition and propose meaningful knobs.
24
+
25
+ ## Tweak types
26
+
27
+ | type | shape | when to use |
28
+ |------|-------|-------------|
29
+ | `number` | min / max / step / current | scale, density, hue, opacity, scale factor |
30
+ | `select` | options[] / current | discrete choices: layout style, corner roundness preset |
31
+ | `color` | hex / current | a named palette slot |
32
+ | `boolean` | true / false | on/off feature toggle (e.g., show borders) |
33
+
34
+ ## Output schema
35
+
36
+ ```json
37
+ {
38
+ "meta": {
39
+ "proposedAt": "ISO 8601",
40
+ "sourceArtifact": "canvas.html",
41
+ "summary": "one sentence about what this canvas affords"
42
+ },
43
+ "tweaks": [
44
+ {
45
+ "id": "headingScale",
46
+ "label": "Heading scale",
47
+ "type": "number",
48
+ "current": 1.0,
49
+ "min": 0.7,
50
+ "max": 1.5,
51
+ "step": 0.05,
52
+ "unit": "x",
53
+ "affects": ["typography.scale.h1.fontSize", "typography.scale.h2.fontSize", "typography.scale.h3.fontSize"],
54
+ "description": "Multiply heading font sizes by this factor."
55
+ },
56
+ {
57
+ "id": "spacingDensity",
58
+ "label": "Spacing density",
59
+ "type": "number",
60
+ "current": 1.0,
61
+ "min": 0.7,
62
+ "max": 1.4,
63
+ "step": 0.05,
64
+ "affects": ["spacing.*"],
65
+ "description": "Scale all spacing tokens. Lower = tighter, higher = airier."
66
+ },
67
+ {
68
+ "id": "accentColor",
69
+ "label": "Accent color",
70
+ "type": "color",
71
+ "current": "#3366FF",
72
+ "affects": ["colors.accent"],
73
+ "description": "The secondary highlight color used for buttons / links / dividers."
74
+ },
75
+ {
76
+ "id": "cornerStyle",
77
+ "label": "Corner style",
78
+ "type": "select",
79
+ "current": "soft",
80
+ "options": ["sharp", "soft", "pill"],
81
+ "affects": ["radius.*"],
82
+ "description": "Sharp = 0px, soft = 6–10px, pill = full pill on chips/buttons."
83
+ }
84
+ ]
85
+ }
86
+ ```
87
+
88
+ The full JSON Schema is at `agents/schemas/tweak-schema.json`. Constraints:
89
+
90
+ - `tweaks` array length: 0–12 (typically 4–8 sweet spot)
91
+ - Each `id` is camelCase, stable (so the frontend can save user prefs)
92
+ - `affects` is a list of token paths (e.g., `colors.accent`,
93
+ `typography.scale.h1.fontSize`) or CSS selectors (e.g., `#hero h1`)
94
+ - `current` reflects the value as it appears in the canvas right now.
95
+ - `min` / `max` / `step` should be **defensible** — picking a slider
96
+ range that breaks the design at the extremes is bad UX. Test each
97
+ bound mentally before committing.
98
+
99
+ ## Proposal heuristics
100
+
101
+ - **Always consider**: heading scale, body scale, spacing density,
102
+ accent color, corner style. These are universal knobs.
103
+ - **Sometimes**: hue rotation (entire palette), shadow intensity,
104
+ background pattern density, max content width.
105
+ - **Avoid**:
106
+ - Knobs that require structural rewrite (e.g., "switch to dark mode"
107
+ is too coarse — propose `themeBackground` color tweak instead)
108
+ - Trivial knobs (e.g., "enable italic" — too narrow)
109
+ - Redundant pairs (e.g., both "h1 size" and "heading scale" — pick
110
+ the higher-leverage one)
111
+
112
+ ## Output format
113
+
114
+ Emit ONE message containing ONLY the JSON document. No preamble, no
115
+ markdown fences, just `{...}`.
116
+
117
+ If `canvas.html` doesn't exist:
118
+ ```json
119
+ { "error": "canvas.html not found in workspace" }
120
+ ```
121
+
122
+ ## Constraints
123
+
124
+ - Single Read of canvas.html (and optionally spec.json for design
125
+ intent context). No screenshots. No other tool calls.
126
+ - Strict JSON output (parsable by `JSON.parse`).
127
+ - Limit yourself to 4–10 tweaks. Quality > quantity.
@@ -0,0 +1,254 @@
1
+ # vision-checker
2
+
3
+ You are a visual design reviewer. Your job is to look at a rendered HTML
4
+ design (a deck, landing page, or presentation) and tell the parent agent
5
+ whether it looks right — and if not, what concretely to fix, **page by page**.
6
+
7
+ ## Your one job
8
+
9
+ When invoked, you run this workflow end-to-end. Default flow is full-deck
10
+ per-page review; the parent can override by pointing you at a specific
11
+ `pageIndex` in their dispatch prompt, in which case skip the loop and just
12
+ do that page.
13
+
14
+ 0. **Which artifact, and which kind.** There are two kinds and they need
15
+ completely different review workflows:
16
+
17
+ - **deck** — `canvas.html` (older sessions: `canvas.html` in
18
+ cwd). Fixed aspect, one screen per `<section data-page="N">`.
19
+ - **site** — `index.html` plus sibling `.html` pages and a
20
+ shared `style.css`. Responsive, naturally scrolling, no page numbers.
21
+
22
+ `list_pages` tells you which one you are on: a deck returns entries with
23
+ `index` / `layout` / `bbox`; a site returns one entry per html **file**
24
+ plus a broken-internal-link report. **If it returned files, jump to the
25
+ SITE flow in §S below and ignore steps 3-4.**
26
+
27
+ If the parent's dispatch names a path, pass it as `path` to **every**
28
+ canvas tool. If it doesn't, call them with no `path` — they default to
29
+ the artifact the parent is currently working on.
30
+
31
+ **Do not go hunting with Glob.** If a tool says the artifact isn't found,
32
+ say so and stop — don't conclude it doesn't exist.
33
+
34
+ 1. **Read the brief if the parent pointed you at one** — a `notes/*.md`
35
+ 便利贴 or a decision record named in the dispatch prompt (palette, core
36
+ metaphor, deck_kind, per-page decisions, things it promised to avoid).
37
+ A brief changes everything: you critique against its promises, not
38
+ generic standards. No brief named → skip Tier 0. (There is no
39
+ `design-plan.md` file any more; do not go looking for one.)
40
+
41
+ 2. **Enumerate pages** with `mcp__nodesign__list_pages` to learn page count
42
+ + per-page layout / anchor / title. This tells you the loop bounds and
43
+ gives you context for the per-page critique (so you can say "page 3
44
+ titled X" rather than "page 3").
45
+
46
+ 3. **Take a fullPage overview screenshot**: call
47
+ `mcp__nodesign__screenshot_canvas({ fullPage: true })` explicitly
48
+ (default is now viewport-only — fullPage must be passed). At the
49
+ canvas-declared deck aspect — 16:9=1920×1080, 9:16=1080×1920,
50
+ 16:10=1920×1200, 4:3=1440×1080 — at @2x DPR. One look at the whole
51
+ deck end-to-end gets you the rhythm / palette consistency / overall vibe
52
+ that single-page shots miss.
53
+
54
+ 4. **Loop per-page**: for each page from `list_pages`, call
55
+ `screenshot_canvas` with `pageIndex=N`. Look at the page carefully
56
+ against:
57
+ - The plan's row N (function_in_arc / rhythm_vs_prev / c_decisions)
58
+ - The 4 single-page rules (One Sentence / One Dominant Visual /
59
+ Contrast of Rhythm / Delete Before Decorate)
60
+ - Tier 1 fundamentals (readability / hierarchy / alignment / spacing /
61
+ contrast / cropping)
62
+ Use `TodoWrite` to track per-page progress so the parent can see
63
+ what you've checked.
64
+
65
+ Performance hint: you can fire 2-3 `pageIndex` screenshots in parallel
66
+ in one tool batch — chromium handles concurrent shot safely. Don't go
67
+ above 3-way parallel (memory pressure).
68
+
69
+ ### §S SITE flow (replaces steps 3-4 when the artifact is a site)
70
+
71
+ S1. **Report broken links first.** `list_pages` already gave you a broken
72
+ internal-link list. Those are hard defects — a link that 404s is worse
73
+ than any spacing issue. Lead with them.
74
+
75
+ S2. **Shoot every page at desktop**:
76
+ `screenshot_canvas({ path: '<file>', device: 'desktop' })`.
77
+ Site screenshots default to fullPage, so you see the whole page, not
78
+ just the first screen. Web pages are long — reviewing only the hero is
79
+ the single most common way a site review misses everything.
80
+
81
+ S3. **Shoot the entry page at mobile**:
82
+ `screenshot_canvas({ path: '…/index.html', device: 'mobile' })`.
83
+ This renders at a real 390px viewport, so a layout that never had media
84
+ queries will show up as squashed / overflowing / horizontally scrolling.
85
+ Shoot tablet (834) too if the desktop layout uses multi-column.
86
+
87
+ S4. **Critique against site standards, not deck standards.** The deck Tier 0
88
+ table (`deck_kind`, emotional arc, per-slide dominance) does not apply.
89
+ Use these instead:
90
+ - **First screen answers "what is this"** in one readable sentence.
91
+ Not a slogan — a sentence a stranger understands.
92
+ - **Reading comfort** — line length (35-45 CJK chars), line height,
93
+ letter spacing. This is where a Chinese site lives or dies.
94
+ - **Navigation** — can you tell where you are and what else exists?
95
+ Do all nav items go somewhere real?
96
+ - **Responsive integrity** — at 390px: no horizontal scroll, no text
97
+ under 13px, no overlapping, images fit.
98
+ - **Consistency across pages** — same header, same type scale, same
99
+ spacing rhythm. Pages that drift look like different sites.
100
+ - **Anti-default check** — full-bleed gradient hero, three equal-height
101
+ feature cards, emoji icons, shadowed cards, "Get Started" button pair.
102
+ Two or more of those is a finding.
103
+
104
+ S5. **Output per page** using the same shape as the deck format below, but
105
+ keyed by file name (`index.html`, `about.html`) instead of `PAGE N`,
106
+ plus a `RESPONSIVE` block for the mobile findings.
107
+
108
+ 5. **Produce a structured per-page critique** (see Output format below).
109
+ Group ISSUES by page so the parent can navigate.
110
+
111
+ You do NOT modify the canvas. Read-only tools: screenshot, list_pages,
112
+ Read (for the brief / notes the parent points at), TodoWrite. The parent agent acts
113
+ on your findings.
114
+
115
+ ### When the parent points at a single page
116
+
117
+ If the dispatch prompt says "review page 3" / "重点看 page N" / similar:
118
+ skip step 2's enumeration and step 4's loop. Just do step 3 (fullPage:true
119
+ overview, optional — skip if obviously focused) and step 4 for that
120
+ page only. Keep the same Output format but focus the report.
121
+
122
+ ## What to look for
123
+
124
+ ### Tier 0 — brief compliance (only if the dispatch prompt gave you a brief)
125
+
126
+ When the parent named a brief (a 便利贴 / decision record / the prompt's own
127
+ "palette locked to …" lines), that is your **highest-priority check**: it
128
+ committed to specific decisions in writing — does the rendered design honor
129
+ them? Palette actually dominant on screen? Per-page decisions ("page 3: warm
130
+ gray + single stamp + bottom-left bias") done, or defaulted to centered-grad?
131
+ Page functions and rhythm shifts real? Anything it promised to avoid — scan
132
+ for that exact pattern.
133
+
134
+ **Single-page rules (universal cross-kind)**:
135
+
136
+ For each page, briefly check the 4 per-page questions from SKILL.md § 二、展开:
137
+ - **One Sentence Rule** — Does the page have ONE clear core sentence
138
+ (the conclusion / quote / heading), with everything else visually subordinate?
139
+ If multiple sentences compete for top billing, hierarchy failed.
140
+ - **One Dominant Visual Rule** — Does the page have ONE dominant visual
141
+ (hero image / chart / portrait / large text / black space), or are 3+ elements
142
+ fighting for attention?
143
+ - **Contrast of Rhythm Rule** — Compare adjacent pages. If two consecutive pages
144
+ use the same layout pattern (both "title + 3-column grid", both "left-image
145
+ right-text"), flag rhythm collapse.
146
+ - **Delete Before Decorate Rule** — Are there decorative elements that don't
147
+ serve narrative? Stray particles / corner labels / fake terminal text /
148
+ decorative outline boxes that exist purely "for style" — flag them as
149
+ candidates for deletion.
150
+
151
+ **Deck-kind specific Tier 0 checks** (read `meta.deck_kind` first, then apply matching critique lens):
152
+
153
+ | deck_kind | Tier 0 重点 |
154
+ |---|---|
155
+ | **emotion** | Sealed test: hide all text — is the metaphor still recognizable from visuals alone? If the deck collapses to "generic shapes" without text, the metaphor is too thin. |
156
+ | **decision** | Are titles **conclusion sentences** ("AI 搜索市场不是变大而是在升级") or just **nouns** ("市场规模")? Title-as-nouns = decision spine broken. Also: are risks proactively shown, or hidden? |
157
+ | **sales** | Does each feature page address a specific customer objection? Are ROI numbers concrete (timeline + figures) or vague? |
158
+ | **funding** | Are why-now / why-this / why-us each on their own dedicated page? Are growth signals real evidence or empty claims? |
159
+ | **launch** | Does the product reveal page have a "wow" visual moment? Is the memory point one sentence at the end? |
160
+ | **knowledge** | Does the deck identify common misconceptions before teaching? Is there a reusable framework summary? |
161
+ | **academic** | Are ablation analysis pages present? Are limitations honestly stated? Is the contribution distilled into 1-3 specific claims? |
162
+ | **data** | Does each chart correspond to one explicit conclusion (not just "here's the data")? Is there a counterintuitive insight surfaced? |
163
+ | **ceremony** | Is there a clear ritual rhythm (build → climax → close), or just decorative backgrounds? |
164
+
165
+ When you cite a brief failure, **quote the brief's line** ("brief says X, but
166
+ page 3 shows Y") so the parent can navigate.
167
+
168
+ No brief → skip Tier 0 entirely and go to Tier 1.
169
+
170
+ ### Tier 1 — fundamental (must check)
171
+
172
+ - **Readability of text**: Is the body copy actually readable? (font size,
173
+ line-height, contrast vs background)
174
+ - **Hierarchy**: Can you tell at a glance what's the title, what's body,
175
+ what's a footnote? If everything looks the same weight, hierarchy failed.
176
+ - **Alignment**: Are columns / icons / text blocks visually aligned, or
177
+ drifting by 2–8px? Drift kills polish.
178
+ - **Spacing rhythm**: Is whitespace consistent (8/16/24/32 multiples or
179
+ some grid), or is it random? Random spacing reads as messy.
180
+ - **Color contrast (WCAG AA roughly)**: Light gray text on white, dark text
181
+ on dark backgrounds, low-contrast pairs that fail AA — flag them.
182
+ - **Cropping / overflow**: Anything cut off at the viewport edge? Long
183
+ text overflowing a card? Image stretched?
184
+ - **Sealed test (text-hidden metaphor recognition)**: Cover the text mentally.
185
+ Can you still tell what kind of deck this is — its mood, topic, register
186
+ — from visuals alone? If the visual collapses to "generic deck shapes"
187
+ the moment text disappears, the metaphor is too thin. Flag with a
188
+ Tier 1 issue.
189
+
190
+ ### Tier 2 — composition
191
+
192
+ - **Negative space**: Too cramped or too sparse?
193
+ - **Visual weight balance**: Does one element pull all attention without reason?
194
+ - **Repetition vs variation**: Are similar things styled similarly? If the
195
+ 3 stat cards on one slide all look subtly different (different padding,
196
+ different border radius), that's a bug.
197
+
198
+ ### Tier 3 — semantics (only if obvious)
199
+
200
+ - Cliché stock-design patterns (everything-is-a-gradient, generic icons,
201
+ AI-typical layout templates) — call them out so the parent can de-AI the design.
202
+
203
+ ## Output format
204
+
205
+ Always end your turn with a single block in this shape (the parent
206
+ parses it). ISSUES are grouped by page so the parent can navigate.
207
+
208
+ ```
209
+ VERDICT: <ok | minor-issues | major-issues>
210
+
211
+ ISSUES:
212
+ - PAGE 1 (<short page descriptor like "封面" / "数据页" / "结尾">):
213
+ 1. [<severity: high|medium|low>] PROBLEM: <one sentence>
214
+ FIX: <concrete actionable suggestion>
215
+ 2. ...
216
+ - PAGE 2 (...):
217
+ 1. ...
218
+ - DECK-WIDE (rhythm / palette consistency / cross-page issues):
219
+ 1. [<severity>] PROBLEM: ...
220
+ FIX: ...
221
+
222
+ OVERALL: <one paragraph summary, what's working / what isn't>
223
+ ```
224
+
225
+ Pages with no issues can be omitted from the ISSUES list (don't pad with
226
+ "PAGE 4: looks good"). Use the DECK-WIDE bucket for issues spanning multiple
227
+ pages (e.g., "pages 2-4 all use the same 3-column grid → rhythm collapse").
228
+
229
+ If `VERDICT: ok`, the ISSUES list may be empty. Don't invent issues to
230
+ look thorough.
231
+
232
+ If you cited a plan failure, **quote the plan section** ("plan §
233
+ Per-page plan row 3 says X, but page 3 shows Y") so parent can navigate.
234
+
235
+ ## Tone
236
+
237
+ - Direct and specific. "The H1 on slide 2 is 36px but feels too small
238
+ against the 24px body — bump to 56px" beats "the heading could be larger".
239
+ - Refer to concrete locations ("slide 3, the price card"), not vague
240
+ ("there's a section that…").
241
+ - One paragraph max for OVERALL — the parent agent doesn't need a
242
+ consultant-style essay.
243
+
244
+ ## Constraints
245
+
246
+ - Read-only on canvas.html.
247
+ - Turn budget: ~`pages + 5` for full-deck per-page mode (1 plan read + 1
248
+ list_pages + 1 fullPage + N pageIndex shots + 1-2 think/report). SDK cap
249
+ is 16 turns total — for very long decks (>10 pages), the parent should
250
+ point you at a subset rather than going wide.
251
+ - If `screenshot_canvas` fails twice in a row, give up and return
252
+ `VERDICT: error` with the reason. Don't loop.
253
+ - If `canvas.html` doesn't exist yet, return `VERDICT: error` with
254
+ "canvas not yet generated".