@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.
- package/LICENSE +661 -0
- package/README.md +140 -0
- package/bin/nodesign.js +176 -0
- package/package.json +104 -0
- package/server/api/README.md +45 -0
- package/server/api/_guard.js +75 -0
- package/server/api/admin.js +187 -0
- package/server/api/assets/docx-page.js +103 -0
- package/server/api/assets/helpers.js +22 -0
- package/server/api/assets/notes.js +144 -0
- package/server/api/assets.js +896 -0
- package/server/api/board.js +57 -0
- package/server/api/browse.js +138 -0
- package/server/api/canvas.js +444 -0
- package/server/api/chatai.js +324 -0
- package/server/api/exports/build-standalone.js +980 -0
- package/server/api/exports/cards.js +118 -0
- package/server/api/exports/docx-pdf.js +46 -0
- package/server/api/exports/export-page.js +142 -0
- package/server/api/exports/handoff.js +147 -0
- package/server/api/exports.js +690 -0
- package/server/api/instruction.js +75 -0
- package/server/api/local.js +115 -0
- package/server/api/me.js +116 -0
- package/server/api/memory.js +185 -0
- package/server/api/pending-changes.js +366 -0
- package/server/api/plugins.js +164 -0
- package/server/api/projects.js +220 -0
- package/server/api/publish.js +64 -0
- package/server/api/recent.js +73 -0
- package/server/api/sessions.js +589 -0
- package/server/api/skills.js +77 -0
- package/server/api/standalone-fit.js +168 -0
- package/server/api/turn-compose.js +180 -0
- package/server/api/turn-inflight.js +44 -0
- package/server/api/turn.js +669 -0
- package/server/auth/README.md +17 -0
- package/server/auth/middleware.js +138 -0
- package/server/auth/origin-guard.js +71 -0
- package/server/auth/session.js +108 -0
- package/server/auth/tier.js +113 -0
- package/server/auth/users-store.js +348 -0
- package/server/edit/README.md +29 -0
- package/server/engine/README.md +113 -0
- package/server/engine/agent/agent-shared.js +550 -0
- package/server/engine/agent/auto-mode-default-hard-deny.txt +4 -0
- package/server/engine/agent/auto-mode-rules.js +78 -0
- package/server/engine/agent/context.js +418 -0
- package/server/engine/agent/events.js +464 -0
- package/server/engine/agent/hooks/canvas-validate.js +199 -0
- package/server/engine/agent/hooks/failure.js +120 -0
- package/server/engine/agent/hooks/file-events.js +75 -0
- package/server/engine/agent/hooks/lifecycle.js +233 -0
- package/server/engine/agent/hooks/post-canvas-focus.js +80 -0
- package/server/engine/agent/hooks/post-guidance.js +206 -0
- package/server/engine/agent/hooks/post-subagent-report.js +104 -0
- package/server/engine/agent/hooks/post-trim.js +58 -0
- package/server/engine/agent/hooks/pre-board-neighborhood.js +34 -0
- package/server/engine/agent/hooks/pre-defaults.js +84 -0
- package/server/engine/agent/hooks/pre-injectors.js +277 -0
- package/server/engine/agent/hooks/pre-performance-log-guard.js +78 -0
- package/server/engine/agent/hooks/pre-starter-files.js +61 -0
- package/server/engine/agent/hooks/pre-workspace-scope-guard.js +78 -0
- package/server/engine/agent/hooks/site-validate.js +94 -0
- package/server/engine/agent/hooks/tool-prompts.js +31 -0
- package/server/engine/agent/hooks/turn-state-memory.js +56 -0
- package/server/engine/agent/hooks/user-prompt-submit.js +215 -0
- package/server/engine/agent/hooks.js +354 -0
- package/server/engine/agent/init-contract.js +69 -0
- package/server/engine/agent/isolation.js +159 -0
- package/server/engine/agent/model-context.js +359 -0
- package/server/engine/agent/model-table.js +292 -0
- package/server/engine/agent/plugin-loader.js +266 -0
- package/server/engine/agent/prompts/nodesign-prelude.md +336 -0
- package/server/engine/agent/prompts/tools/ask-user-question-protocol.md +71 -0
- package/server/engine/agent/prompts/tools/direct-edit-protocol.md +98 -0
- package/server/engine/agent/prompts/tools/generate-image-cookbook.gemini-gateway.md +583 -0
- package/server/engine/agent/prompts/tools/generate-image-cookbook.md +483 -0
- package/server/engine/agent/prompts/tools/hybrid-reference.md +100 -0
- package/server/engine/agent/prompts/tools/paint-still-cookbook.md +270 -0
- package/server/engine/agent/prompts/tools/roll-film-cookbook.md +70 -0
- package/server/engine/agent/prompts/tools/site-reference.md +106 -0
- package/server/engine/agent/prompts/tools/tweaks-syntax.md +125 -0
- package/server/engine/agent/prompts/tools/vision-checker-dispatch.md +48 -0
- package/server/engine/agent/session-loop.js +1024 -0
- package/server/engine/agent/session-model.js +164 -0
- package/server/engine/agent/skill.js +204 -0
- package/server/engine/agent/system-prompts.js +86 -0
- package/server/engine/agent/task-events.js +78 -0
- package/server/engine/agents/ds-extractor.md +132 -0
- package/server/engine/agents/explorer.md +190 -0
- package/server/engine/agents/index.js +230 -0
- package/server/engine/agents/schemas/design-system.json +156 -0
- package/server/engine/agents/schemas/tweak-schema.json +113 -0
- package/server/engine/agents/tweak-proposer.md +127 -0
- package/server/engine/agents/vision-checker.md +254 -0
- package/server/engine/browse/capture.js +422 -0
- package/server/engine/browse/card.js +137 -0
- package/server/engine/browse/handover.js +59 -0
- package/server/engine/browse/page-digest.js +119 -0
- package/server/engine/browse/refs.js +196 -0
- package/server/engine/browse/registry.js +307 -0
- package/server/engine/browse/screencast.js +170 -0
- package/server/engine/browse/state.js +121 -0
- package/server/engine/chatai/chat-log.js +79 -0
- package/server/engine/chatai/index.js +193 -0
- package/server/engine/chatai/openai-compat.js +152 -0
- package/server/engine/chatai/orchestrate.js +309 -0
- package/server/engine/chatai/perform.js +40 -0
- package/server/engine/chatai/summarize.js +79 -0
- package/server/engine/mcp/capability-gate.js +52 -0
- package/server/engine/mcp/index.js +339 -0
- package/server/engine/mcp/param-sanitizer.js +142 -0
- package/server/engine/mcp/tools/arrange-on-board.js +124 -0
- package/server/engine/mcp/tools/artifact-session.js +278 -0
- package/server/engine/mcp/tools/browse-computer.js +421 -0
- package/server/engine/mcp/tools/browse-find-batch.js +183 -0
- package/server/engine/mcp/tools/browse-screenshot.js +157 -0
- package/server/engine/mcp/tools/browse.js +480 -0
- package/server/engine/mcp/tools/build-docx.js +101 -0
- package/server/engine/mcp/tools/clear-pending-changes.js +99 -0
- package/server/engine/mcp/tools/create-on-board.js +155 -0
- package/server/engine/mcp/tools/crystallize-skill.js +168 -0
- package/server/engine/mcp/tools/deliver-files.js +0 -0
- package/server/engine/mcp/tools/explain-style.js +237 -0
- package/server/engine/mcp/tools/export-handoff.js +133 -0
- package/server/engine/mcp/tools/expose-tweaks.js +149 -0
- package/server/engine/mcp/tools/generate-image.js +842 -0
- package/server/engine/mcp/tools/get-computed-styles.js +164 -0
- package/server/engine/mcp/tools/get-pending-changes.js +205 -0
- package/server/engine/mcp/tools/h3box-ssh.js +84 -0
- package/server/engine/mcp/tools/helpers/acquire-page.js +82 -0
- package/server/engine/mcp/tools/helpers/motion-lab.js +554 -0
- package/server/engine/mcp/tools/helpers/motion-scroll.js +112 -0
- package/server/engine/mcp/tools/helpers/perception-page.js +215 -0
- package/server/engine/mcp/tools/helpers/reference-download.js +103 -0
- package/server/engine/mcp/tools/helpers/rembg-bridge.py +80 -0
- package/server/engine/mcp/tools/helpers/rembg.js +273 -0
- package/server/engine/mcp/tools/helpers/shot-pipeline.js +280 -0
- package/server/engine/mcp/tools/highlight.js +68 -0
- package/server/engine/mcp/tools/list-pages.js +222 -0
- package/server/engine/mcp/tools/lookup-tags.js +59 -0
- package/server/engine/mcp/tools/navigate-to-page.js +60 -0
- package/server/engine/mcp/tools/organize-board.js +64 -0
- package/server/engine/mcp/tools/paint-still.js +434 -0
- package/server/engine/mcp/tools/pin-to-board.js +130 -0
- package/server/engine/mcp/tools/preview-deck.js +130 -0
- package/server/engine/mcp/tools/profile-scroll.js +305 -0
- package/server/engine/mcp/tools/publish-site.js +102 -0
- package/server/engine/mcp/tools/query-elements.js +195 -0
- package/server/engine/mcp/tools/read-board.js +103 -0
- package/server/engine/mcp/tools/read-document.js +93 -0
- package/server/engine/mcp/tools/read-page.js +264 -0
- package/server/engine/mcp/tools/read-tavern-json.js +143 -0
- package/server/engine/mcp/tools/record-decision.js +140 -0
- package/server/engine/mcp/tools/relate-on-board.js +110 -0
- package/server/engine/mcp/tools/remove-background.js +391 -0
- package/server/engine/mcp/tools/report-issue.js +115 -0
- package/server/engine/mcp/tools/roll-film.js +266 -0
- package/server/engine/mcp/tools/screenshot-docx.js +138 -0
- package/server/engine/mcp/tools/screenshot-url.js +195 -0
- package/server/engine/mcp/tools/screenshot.js +583 -0
- package/server/engine/mcp/tools/tier-gate.js +96 -0
- package/server/engine/mcp/tools/trace-motion.js +215 -0
- package/server/engine/mcp/tools/web-search.js +548 -0
- package/server/engine/motion/inventory.js +349 -0
- package/server/engine/perception/session.js +235 -0
- package/server/engine/plugins/nodesign/.claude-plugin/plugin.json +5 -0
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/SKILL.md +192 -0
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/canvas.template.html +667 -0
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/hybrid-grid.md +22 -0
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/image-led-cover.md +25 -0
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/portrait.md +23 -0
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/quote-backdrop.md +21 -0
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/section-divider.md +23 -0
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/text-led.md +21 -0
- package/server/engine/plugins/nodesign/skills/docx-craft/SKILL.md +162 -0
- package/server/engine/plugins/nodesign/skills/docx-craft/references/token-schema.md +407 -0
- package/server/engine/plugins/nodesign/skills/docx-craft//346/226/207/346/241/243.template.json +80 -0
- package/server/engine/plugins/nodesign/skills/rp-craft/SKILL.md +228 -0
- 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
- package/server/engine/plugins/nodesign/skills/rp-craft//346/274/224/345/207/272.template.js +268 -0
- package/server/engine/plugins/nodesign/skills/site-craft/SKILL.md +323 -0
- package/server/engine/plugins/nodesign/skills/site-craft/patterns/build-lane.md +134 -0
- package/server/engine/plugins/nodesign/skills/site-craft/patterns/cutout-collage.md +61 -0
- package/server/engine/plugins/nodesign/skills/site-craft/patterns/mock-app.md +163 -0
- package/server/engine/plugins/nodesign/skills/site-craft/patterns/page-transitions.md +86 -0
- package/server/engine/runs/active-runs.js +698 -0
- package/server/engine/runs/live-turn.js +252 -0
- package/server/engine/runs/store.js +364 -0
- package/server/engine/runs/turn-relay.js +217 -0
- package/server/engine/runtime/workspace.js +164 -0
- package/server/index.js +235 -0
- package/server/lib/artifact-file-path.js +80 -0
- package/server/lib/artifact-target.js +284 -0
- package/server/lib/asset-refs.js +239 -0
- package/server/lib/async-queue.js +104 -0
- package/server/lib/auto-relations.js +130 -0
- package/server/lib/binding-types.js +60 -0
- package/server/lib/board-kind-sizes.js +62 -0
- package/server/lib/board-relations.js +133 -0
- package/server/lib/browse-proxy.js +180 -0
- package/server/lib/canvas-id.js +36 -0
- package/server/lib/cover.js +227 -0
- package/server/lib/danbooru-tags.js +291 -0
- package/server/lib/doc-extract.js +156 -0
- package/server/lib/docx/build-from-source.js +260 -0
- package/server/lib/docx/build.js +490 -0
- package/server/lib/docx/dump-styles.js +287 -0
- package/server/lib/docx/fonts/nodesign-cjk.conf +164 -0
- package/server/lib/docx/merge-runs.js +129 -0
- package/server/lib/docx/numbering.js +218 -0
- package/server/lib/docx/order.js +152 -0
- package/server/lib/docx/rawzip.js +172 -0
- package/server/lib/docx/render.js +92 -0
- package/server/lib/docx/text-lint.js +225 -0
- package/server/lib/docx/tokens.js +335 -0
- package/server/lib/docx/units.js +29 -0
- package/server/lib/docx/xml.js +291 -0
- package/server/lib/docx-pages.js +187 -0
- package/server/lib/export-collect.js +289 -0
- package/server/lib/export-package.js +210 -0
- package/server/lib/html-srcset.js +145 -0
- package/server/lib/image-variant.js +460 -0
- package/server/lib/ingress/forward-openai-chat.js +305 -0
- package/server/lib/ingress/openai-chat.js +491 -0
- package/server/lib/ingress/session-notice.js +66 -0
- package/server/lib/ingress/session-routes.js +68 -0
- package/server/lib/ingress/slot-probe.js +130 -0
- package/server/lib/ingress/upstream-billing.js +52 -0
- package/server/lib/ingress/upstream-fail-streak.js +72 -0
- package/server/lib/ingress/upstream-truncation.js +48 -0
- package/server/lib/issues-store.js +182 -0
- package/server/lib/kinds/deck.js +72 -0
- package/server/lib/kinds/docx.js +283 -0
- package/server/lib/kinds/file-kinds.js +113 -0
- package/server/lib/kinds/index.js +202 -0
- package/server/lib/kinds/site.js +161 -0
- package/server/lib/model-ingress.js +543 -0
- package/server/lib/moderation.js +255 -0
- package/server/lib/notice-store.js +103 -0
- package/server/lib/plugin-install.js +104 -0
- package/server/lib/plugin-validator.js +721 -0
- package/server/lib/publish-store.js +115 -0
- package/server/lib/quick-summary.js +52 -0
- package/server/lib/quota.js +270 -0
- package/server/lib/rate-window.js +29 -0
- package/server/lib/reference-assets.js +92 -0
- package/server/lib/region-shot.js +135 -0
- package/server/lib/safe-path.js +73 -0
- package/server/lib/sdk-session.js +33 -0
- package/server/lib/showcase-store.js +92 -0
- package/server/lib/site-publish.js +465 -0
- package/server/lib/ssrf-guard.js +432 -0
- package/server/lib/task-scan.js +158 -0
- package/server/lib/tavern-json.js +154 -0
- package/server/lib/video-variant.js +237 -0
- package/server/lib/workspace-path.js +33 -0
- package/server/ops/fix-sdk-musl.mjs +40 -0
- package/server/ops/install-macos-fonts.sh +114 -0
- package/server/ops/macos-fonts.conf +336 -0
- package/server/ops/sandbox-shim/bwrap +57 -0
- package/server/projects/assets-summary.js +119 -0
- package/server/projects/auto-name.js +53 -0
- package/server/projects/board-store.js +640 -0
- package/server/projects/move-entry.js +103 -0
- package/server/projects/store.js +270 -0
- package/server/projects/ui-config.js +54 -0
- package/server/projects/workspace-templates.js +53 -0
- package/server/projects/workspace.js +1025 -0
- package/server/runtime/capabilities.js +153 -0
- package/server/runtime/local-config.js +177 -0
- package/server/runtime/local-env.js +88 -0
- package/server/runtime/platform.js +342 -0
- package/server/runtime/profile.js +72 -0
- package/server/services/rembg-launcher.js +313 -0
- package/server/services/rembg-service.py +334 -0
- package/server/shared/README.md +25 -0
- package/server/shared/deck.js +54 -0
- package/server/shared/time.js +49 -0
- package/server/style-pipeline/README.md +53 -0
- package/server/ws/broker.js +36 -0
- package/server/ws/browse-channel.js +177 -0
- package/server/ws/index.js +386 -0
- package/web/README.md +89 -0
- package/web/dist/assets/BrowserWindow-Dc7J7CYc.js +11 -0
- package/web/dist/assets/DeckWindow-4G0xX7P3.js +16 -0
- package/web/dist/assets/DocxWindow-BXQsoPkh.js +16 -0
- package/web/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/web/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/web/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/web/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/web/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/web/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/web/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/web/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/web/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/web/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/web/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/web/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/web/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/web/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/web/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/web/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/web/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/web/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/web/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/web/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/web/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/web/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/web/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/web/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/web/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/web/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/web/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/web/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/web/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/web/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/web/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/web/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/web/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/web/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/web/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/web/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/web/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/web/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/web/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/web/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/web/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/web/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/web/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/web/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/web/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/web/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/web/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/web/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/web/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/web/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/web/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/web/dist/assets/SiteWindow-D6eS-2gM.js +18 -0
- package/web/dist/assets/again-D8tfgKKO.webp +0 -0
- package/web/dist/assets/caveat-nd-CP6HlsNg.woff2 +0 -0
- package/web/dist/assets/clock-xJhvfYpS.webp +0 -0
- package/web/dist/assets/film-cut-BBKMwH7q.webp +0 -0
- package/web/dist/assets/film-still-BZ_DL9Tt.webp +0 -0
- package/web/dist/assets/index-C0KUf6Wd.css +1 -0
- package/web/dist/assets/index-Cbl3ATvp.js +2125 -0
- package/web/dist/assets/ink-desk-BRbxeDsR.webp +0 -0
- package/web/dist/assets/ink-night-Bz4BT3XH.webp +0 -0
- package/web/dist/assets/ink-portrait-C0DM4V8Q.webp +0 -0
- package/web/dist/assets/longcang-regular-C0uvTuKa.woff2 +0 -0
- package/web/dist/assets/lxgw-nd-bold-DbRfiTgo.woff2 +0 -0
- package/web/dist/assets/lxgw-nd-regular-CpMw9Ehg.woff2 +0 -0
- package/web/dist/assets/pending-edit-apply-DTjo2geW.js +31 -0
- package/web/dist/assets/question-8H4HSqxh.webp +0 -0
- package/web/dist/assets/reject-BaPJqElj.webp +0 -0
- package/web/dist/assets/rotate-cw-LMT3x1Zj.js +11 -0
- package/web/dist/assets/rp-portrait-CbrGpew2.webp +0 -0
- package/web/dist/assets/rp-street-C4jVKjxx.webp +0 -0
- package/web/dist/assets/square-dashed-mouse-pointer-CBoAkfhi.js +11 -0
- package/web/dist/assets/tangle-DIxHVNuT.webp +0 -0
- package/web/dist/assets/thisone-BylZKglV.webp +0 -0
- package/web/dist/assets/thumb-DO1wfK1I.webp +0 -0
- 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".
|