@xiaobuyu/nodesign 0.0.7 → 0.0.8

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 (353) hide show
  1. package/README.md +266 -79
  2. package/README.zh-CN.md +254 -67
  3. package/package.json +2 -2
  4. package/server/api/admin.js +7 -0
  5. package/server/api/assets/docx-page.js +5 -4
  6. package/server/api/assets/helpers.js +8 -0
  7. package/server/api/assets.js +21 -33
  8. package/server/api/board.js +29 -1
  9. package/server/api/browse.js +3 -2
  10. package/server/api/chatai.js +9 -8
  11. package/server/api/exports/cards.js +7 -6
  12. package/server/api/exports/docx-pdf.js +4 -1
  13. package/server/api/local.js +10 -8
  14. package/server/api/projects.js +19 -3
  15. package/server/api/publish.js +3 -2
  16. package/server/api/sessions-rewind.js +220 -0
  17. package/server/api/sessions.js +58 -194
  18. package/server/api/stage.js +35 -0
  19. package/server/api/turn-model-switch.js +109 -0
  20. package/server/api/turn.js +52 -88
  21. package/server/auth/middleware.js +29 -6
  22. package/server/auth/tier.js +27 -7
  23. package/server/auth/users-store.js +14 -1
  24. package/server/engine/agent/actor-trail.js +110 -0
  25. package/server/engine/agent/agent-shared.js +22 -52
  26. package/server/engine/agent/beat-state.js +61 -0
  27. package/server/engine/agent/cast.js +322 -0
  28. package/server/engine/agent/events.js +9 -2
  29. package/server/engine/agent/hooks/beat-gate.js +73 -0
  30. package/server/engine/agent/hooks/lifecycle.js +6 -2
  31. package/server/engine/agent/hooks/post-trim.js +1 -0
  32. package/server/engine/agent/hooks/pre-board-dirty.js +29 -0
  33. package/server/engine/agent/hooks/pre-defaults.js +206 -2
  34. package/server/engine/agent/hooks/pre-injectors.js +19 -2
  35. package/server/engine/agent/hooks/pre-peer-guard.js +88 -0
  36. package/server/engine/agent/hooks/pre-unknown-params.js +82 -0
  37. package/server/engine/agent/hooks/pre-workspace-scope-guard.js +33 -0
  38. package/server/engine/agent/hooks/resident-role-lifecycle.js +100 -0
  39. package/server/engine/agent/hooks/slot-alias.js +30 -0
  40. package/server/engine/agent/hooks/user-prompt-submit.js +197 -7
  41. package/server/engine/agent/hooks.js +76 -6
  42. package/server/engine/agent/isolation.js +25 -2
  43. package/server/engine/agent/memory-config.js +27 -1
  44. package/server/engine/agent/model-context.js +102 -18
  45. package/server/engine/agent/model-table.js +361 -58
  46. package/server/engine/agent/prompts/nodesign-prelude.md +566 -59
  47. package/server/engine/agent/prompts/tools/direct-edit-protocol.md +1 -1
  48. package/server/engine/agent/prompts/tools/generate-image-cookbook.md +2 -2
  49. package/server/engine/agent/prompts/tools/paint-still-cookbook.md +1 -1
  50. package/server/engine/agent/prompts/tools/site-reference.md +2 -1
  51. package/server/engine/agent/role-card.js +175 -0
  52. package/server/engine/agent/rp-mode.js +17 -0
  53. package/server/engine/agent/session-loop.js +26 -14
  54. package/server/engine/agent/stage-status.js +73 -0
  55. package/server/engine/agent/subagent-flight.js +73 -0
  56. package/server/engine/agent/system-prompts.js +41 -0
  57. package/server/engine/agent/tool-input-stream.js +165 -0
  58. package/server/engine/mcp/actor.js +59 -0
  59. package/server/engine/mcp/capability-gate.js +21 -2
  60. package/server/engine/mcp/index.js +116 -24
  61. package/server/engine/mcp/mode-profile.js +139 -0
  62. package/server/engine/mcp/server-name.js +19 -0
  63. package/server/engine/mcp/tools/artifact-session.js +2 -1
  64. package/server/engine/mcp/tools/browse-find-batch.js +76 -14
  65. package/server/engine/mcp/tools/browse.js +1 -1
  66. package/server/engine/mcp/tools/cast-role.js +167 -0
  67. package/server/engine/mcp/tools/draw-trend.js +104 -0
  68. package/server/engine/mcp/tools/edit-board-schema.js +56 -0
  69. package/server/engine/mcp/tools/edit-board.js +569 -0
  70. package/server/engine/mcp/tools/look-at-board.js +4 -3
  71. package/server/engine/mcp/tools/open-sheet.js +242 -0
  72. package/server/engine/mcp/tools/organize-board.js +19 -5
  73. package/server/engine/mcp/tools/paint-still.js +1 -1
  74. package/server/engine/mcp/tools/pin-to-board.js +78 -3
  75. package/server/engine/mcp/tools/read-board.js +109 -16
  76. package/server/engine/mcp/tools/read-tavern-json.js +87 -19
  77. package/server/engine/mcp/tools/report-issue.js +1 -0
  78. package/server/engine/mcp/tools/role-memory.js +83 -0
  79. package/server/engine/mcp/tools/roll-dice.js +82 -0
  80. package/server/engine/mcp/tools/roll-film.js +1 -1
  81. package/server/engine/mcp/tools/screenshot.js +2 -2
  82. package/server/engine/mcp/tools/set-vars.js +150 -0
  83. package/server/engine/mcp/tools/sheet-replan.js +46 -0
  84. package/server/engine/mcp/tools/web-search.js +1 -1
  85. package/server/engine/mcp/tools/write-on-board-flow.js +108 -0
  86. package/server/engine/mcp/tools/write-on-board-place.js +211 -0
  87. package/server/engine/mcp/tools/write-on-board-role-anchor.js +48 -0
  88. package/server/engine/mcp/tools/write-on-board-schema.js +125 -0
  89. package/server/engine/mcp/tools/write-on-board.js +567 -107
  90. package/server/engine/plugins/nodesign/skills/blackboard-rp/SKILL.md +215 -0
  91. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/SKILL.md +11 -3
  92. package/server/engine/plugins/nodesign/skills/docx-craft/SKILL.md +34 -4
  93. package/server/engine/plugins/nodesign/skills/site-craft/SKILL.md +20 -4
  94. package/server/engine/plugins/nodesign/skills/story-craft/SKILL.md +94 -0
  95. package/server/engine/plugins/nodesign/skills/story-import/SKILL.md +112 -0
  96. package/server/engine/plugins/nodesign/skills/story-intimacy/SKILL.md +72 -0
  97. package/server/engine/plugins/nodesign/skills/story-voice/SKILL.md +66 -0
  98. package/server/engine/plugins/nodesign/skills/story-voice/voices//345/206/267/347/241/254.md +33 -0
  99. package/server/engine/plugins/nodesign/skills/story-voice/voices//346/203/205/346/204/237/347/233/264/347/273/231.md +42 -0
  100. package/server/engine/plugins/nodesign/skills/story-voice/voices//346/204/217/350/257/206/346/265/201.md +42 -0
  101. package/server/engine/plugins/nodesign/skills/story-voice/voices//346/255/246/344/276/240/347/231/275/350/257/235.md +34 -0
  102. package/server/engine/plugins/nodesign/skills/story-voice/voices//347/224/237/346/264/273/346/265/201.md +35 -0
  103. package/server/engine/plugins/nodesign/skills/story-voice/voices//347/231/275/346/217/217.md +37 -0
  104. package/server/engine/plugins/nodesign/skills/story-voice/voices//350/210/236/345/217/260/345/211/247.md +32 -0
  105. package/server/engine/plugins/nodesign/skills/story-voice/voices//351/230/266/346/256/265/345/210/207/346/215/242.md +42 -0
  106. package/server/engine/runs/board-seater.js +272 -0
  107. package/server/engine/runs/board-tasklist.js +90 -48
  108. package/server/engine/runs/turn-relay.js +24 -2
  109. package/server/engine/runs/user-chalk-echo.js +44 -0
  110. package/server/index.js +2 -0
  111. package/server/lib/board-anchor.js +49 -0
  112. package/server/lib/board-dirty.js +93 -0
  113. package/server/lib/board-excerpt.js +80 -0
  114. package/server/lib/board-follow.js +111 -0
  115. package/server/lib/board-groups.js +1 -5
  116. package/server/lib/board-hero.js +3 -1
  117. package/server/lib/board-kind-sizes.js +36 -0
  118. package/server/lib/board-lanes.js +58 -0
  119. package/server/lib/board-obstacles.js +80 -0
  120. package/server/lib/board-relations.js +5 -1
  121. package/server/lib/board-sheets.js +467 -0
  122. package/server/lib/board-shelf.js +86 -0
  123. package/server/lib/board-transform.js +62 -0
  124. package/server/lib/canvas-id.js +18 -1
  125. package/server/lib/chalk-flow.js +88 -0
  126. package/server/lib/chalk-rewrite.js +63 -0
  127. package/server/lib/chalk-size-pref.js +48 -0
  128. package/server/lib/chalk.js +42 -3
  129. package/server/lib/ingress/forward-openai-chat.js +16 -4
  130. package/server/lib/ingress/openai-chat.js +23 -12
  131. package/server/lib/ingress/session-routes.js +3 -3
  132. package/server/lib/ingress/stream-watchdog.js +53 -0
  133. package/server/lib/ingress/upstream-billing.js +15 -0
  134. package/server/lib/ingress/upstream-error-hints.js +36 -0
  135. package/server/lib/json-preview.js +58 -0
  136. package/server/lib/model-ingress.js +26 -1
  137. package/server/lib/moderation.js +10 -5
  138. package/server/lib/quota.js +26 -6
  139. package/server/lib/rect.js +50 -0
  140. package/server/lib/screen.js +36 -0
  141. package/server/lib/sheet-state.js +19 -0
  142. package/server/lib/sketch-array.js +118 -0
  143. package/server/lib/sketch-hatch.js +99 -0
  144. package/server/lib/sketch-layout.js +269 -69
  145. package/server/lib/sketch-shapes.js +152 -0
  146. package/server/lib/sketch-stencils.js +170 -0
  147. package/server/lib/state-table.js +237 -0
  148. package/server/lib/state-trend.js +94 -0
  149. package/server/lib/state-triggers.js +199 -0
  150. package/server/lib/tavern-json.js +48 -0
  151. package/server/lib/user-uploads.js +88 -0
  152. package/server/projects/board-limits.js +5 -3
  153. package/server/projects/board-sanitize.js +220 -10
  154. package/server/projects/board-store.js +95 -6
  155. package/server/projects/session-jsonl.js +110 -0
  156. package/server/projects/store.js +56 -3
  157. package/server/projects/viewpoint-store.js +35 -3
  158. package/server/projects/workspace-slots.js +30 -0
  159. package/server/projects/workspace-templates.js +29 -0
  160. package/server/projects/workspace.js +16 -17
  161. package/server/runtime/capabilities.js +6 -2
  162. package/server/shared/locales.js +70 -0
  163. package/server/shared/messages-en.js +69 -0
  164. package/server/shared/messages.js +65 -0
  165. package/server/ws/broker.js +3 -0
  166. package/server/ws/index.js +43 -3
  167. package/web/README.md +1 -1
  168. package/web/dist/assets/{BrowserWindow-BoOBaIyz.js → BrowserWindow-CcaGRWz5.js} +1 -1
  169. package/web/dist/assets/DeckWindow-BIr2KGFT.js +6 -0
  170. package/web/dist/assets/{DocxWindow-B_u6aX9o.js → DocxWindow-B9KZmU5z.js} +2 -2
  171. package/web/dist/assets/{MermaidBlock-BO-46Du5.js → MermaidBlock-DrfRnz8E.js} +43 -43
  172. package/web/dist/assets/{SiteWindow-ConPmzdM.js → SiteWindow-CJOjCF7d.js} +6 -6
  173. package/web/dist/assets/{abnfDiagram-VCTEODGH-FCO9yf-n.js → abnfDiagram-VCTEODGH-CUZbQGIg.js} +1 -1
  174. package/web/dist/assets/{arc-BLcEOSRX.js → arc-C1-HSUny.js} +1 -1
  175. package/web/dist/assets/{architectureDiagram-5GKGNRK7-kxiX4TeN.js → architectureDiagram-5GKGNRK7-B5nwvu60.js} +2 -2
  176. package/web/dist/assets/{blockDiagram-NRAW4CY4-CptFksix.js → blockDiagram-NRAW4CY4-uPPuFLwR.js} +1 -1
  177. package/web/dist/assets/{c4Diagram-UCG6FXSJ-Dxmxj34F.js → c4Diagram-UCG6FXSJ-C0mKBFlz.js} +1 -1
  178. package/web/dist/assets/channel-BxpWNOGU.js +1 -0
  179. package/web/dist/assets/{chunk-2Q5K7J3B-D9inx5oo.js → chunk-2Q5K7J3B-Cs0rlZ4q.js} +1 -1
  180. package/web/dist/assets/{chunk-5VM5RSS4-DydfHlEc.js → chunk-5VM5RSS4-DtR63oYb.js} +1 -1
  181. package/web/dist/assets/{chunk-F27PBJKO-BO7GxhSv.js → chunk-F27PBJKO-B3MRdezJ.js} +1 -1
  182. package/web/dist/assets/{chunk-G27WJ6UU-BzP6YiQ_.js → chunk-G27WJ6UU-BtwntwpS.js} +1 -1
  183. package/web/dist/assets/{chunk-JWPE2WC7-CHcgcd0s.js → chunk-JWPE2WC7-BHsTe5PD.js} +1 -1
  184. package/web/dist/assets/{chunk-LCL6LL3I-D2Wg5JtX.js → chunk-LCL6LL3I-knY15Qdm.js} +1 -1
  185. package/web/dist/assets/{chunk-POPQ4Y6H-B2fCRfpM.js → chunk-POPQ4Y6H-C51tgK_I.js} +1 -1
  186. package/web/dist/assets/{chunk-SVP7TREG-JSLcsRlZ.js → chunk-SVP7TREG-CnwRZmF_.js} +1 -1
  187. package/web/dist/assets/{chunk-XXDRQBXY-BCjvaeHm.js → chunk-XXDRQBXY-BtXzVF-_.js} +1 -1
  188. package/web/dist/assets/classDiagram-DTDB5LWJ-DUEKmDfo.js +1 -0
  189. package/web/dist/assets/classDiagram-v2-JRS7N3AN-DUEKmDfo.js +1 -0
  190. package/web/dist/assets/{cose-bilkent-JH36ORCC-0uKv6oJ7.js → cose-bilkent-JH36ORCC-CzWlGP6i.js} +1 -1
  191. package/web/dist/assets/{cynefin-OW5HDTMX-Bvt-gEmA.js → cynefin-OW5HDTMX-vK64EGSv.js} +1 -1
  192. package/web/dist/assets/{cynefinDiagram-5FMLGOSQ-C9Ht02qC.js → cynefinDiagram-5FMLGOSQ-Bs3g1Gvh.js} +1 -1
  193. package/web/dist/assets/{dagre-3AP2YEHR-BfxZny4s.js → dagre-3AP2YEHR-BhgkYe8V.js} +1 -1
  194. package/web/dist/assets/{diagram-S7CK7UJ4-CrE0ZETE.js → diagram-S7CK7UJ4-C_6mvD2V.js} +1 -1
  195. package/web/dist/assets/{diagram-UQ7AKVKN-BO8VQ4Fx.js → diagram-UQ7AKVKN-qW7tssUW.js} +1 -1
  196. package/web/dist/assets/{diagram-VSXAHHWV-CHUZnR9F.js → diagram-VSXAHHWV-txJPHpvG.js} +1 -1
  197. package/web/dist/assets/{diagram-VX7I27RA-DYQAz1Vu.js → diagram-VX7I27RA-CQTMsCnL.js} +1 -1
  198. package/web/dist/assets/{diagram-Z3DM3KII-BDjivgLr.js → diagram-Z3DM3KII--cb1hoE6.js} +1 -1
  199. package/web/dist/assets/{ebnfDiagram-PWID7BFC-Bpe_QVbH.js → ebnfDiagram-PWID7BFC-Da6lDU77.js} +1 -1
  200. package/web/dist/assets/{erDiagram-SSCWMZ5O-BxhwuAu1.js → erDiagram-SSCWMZ5O-DGCMrsQn.js} +1 -1
  201. package/web/dist/assets/{flowDiagram-A5DVABFB-CCw2H08-.js → flowDiagram-A5DVABFB-GdOL_qno.js} +1 -1
  202. package/web/dist/assets/{ganttDiagram-EL5Y4UJY-DtTc7MyI.js → ganttDiagram-EL5Y4UJY-Cx1F_jBK.js} +4 -4
  203. package/web/dist/assets/{gitGraphDiagram-WWUBYQGX-BvORxMd2.js → gitGraphDiagram-WWUBYQGX-B5_6JhR3.js} +1 -1
  204. package/web/dist/assets/hand-CuvZZQGW.webp +0 -0
  205. package/web/dist/assets/index-BYKfMnmv.js +2759 -0
  206. package/web/dist/assets/index-CW7VsrVg.css +1 -0
  207. package/web/dist/assets/{infoDiagram-RXCK75RN-DMcrkypD.js → infoDiagram-RXCK75RN-CjvKpSPA.js} +1 -1
  208. package/web/dist/assets/{ishikawaDiagram-5VMMS53U-CZkTIbe-.js → ishikawaDiagram-5VMMS53U-CxLoAPhx.js} +1 -1
  209. package/web/dist/assets/{journeyDiagram-EYS64GPL-DR0XazdE.js → journeyDiagram-EYS64GPL-BfvS1upJ.js} +1 -1
  210. package/web/dist/assets/{kanban-definition-3QL26DDD-DN8VbwVu.js → kanban-definition-3QL26DDD-DKPPu0w4.js} +1 -1
  211. package/web/dist/assets/{layout-9_paCbyt.js → layout-Dhgck-Zo.js} +1 -1
  212. package/web/dist/assets/{linear-g6Ct012e.js → linear-DMSQ-aUw.js} +1 -1
  213. package/web/dist/assets/lxgw-nd-app-bold-D1pKA1bR.woff2 +0 -0
  214. package/web/dist/assets/lxgw-nd-app-regular-BDe3d26v.woff2 +0 -0
  215. package/web/dist/assets/lxgw-nd-bold-Bufvlg03.woff2 +0 -0
  216. package/web/dist/assets/lxgw-nd-regular-DQwoI4OP.woff2 +0 -0
  217. package/web/dist/assets/lxgwwenkaiscreen-subset-100-DLPe7tEt.woff2 +0 -0
  218. package/web/dist/assets/lxgwwenkaiscreen-subset-101-d3VsZKWT.woff2 +0 -0
  219. package/web/dist/assets/lxgwwenkaiscreen-subset-102-ClzJuLq6.woff2 +0 -0
  220. package/web/dist/assets/lxgwwenkaiscreen-subset-103-DuDnQ6K-.woff2 +0 -0
  221. package/web/dist/assets/lxgwwenkaiscreen-subset-104-kPGW3Eem.woff2 +0 -0
  222. package/web/dist/assets/lxgwwenkaiscreen-subset-105-BzD54h-0.woff2 +0 -0
  223. package/web/dist/assets/lxgwwenkaiscreen-subset-106-BQ7fIzlx.woff2 +0 -0
  224. package/web/dist/assets/lxgwwenkaiscreen-subset-107-D8tDfFHI.woff2 +0 -0
  225. package/web/dist/assets/lxgwwenkaiscreen-subset-108-tGhkpwep.woff2 +0 -0
  226. package/web/dist/assets/lxgwwenkaiscreen-subset-109-7SMVSrly.woff2 +0 -0
  227. package/web/dist/assets/lxgwwenkaiscreen-subset-110-_uDKrFed.woff2 +0 -0
  228. package/web/dist/assets/lxgwwenkaiscreen-subset-111-Bio825RE.woff2 +0 -0
  229. package/web/dist/assets/lxgwwenkaiscreen-subset-112-D2ee0i-C.woff2 +0 -0
  230. package/web/dist/assets/lxgwwenkaiscreen-subset-113-JPFVDrga.woff2 +0 -0
  231. package/web/dist/assets/lxgwwenkaiscreen-subset-114-BcfxYA4w.woff2 +0 -0
  232. package/web/dist/assets/lxgwwenkaiscreen-subset-115-B1HeeOsd.woff2 +0 -0
  233. package/web/dist/assets/lxgwwenkaiscreen-subset-116-hY12tXpq.woff2 +0 -0
  234. package/web/dist/assets/lxgwwenkaiscreen-subset-117-BvuZwmre.woff2 +0 -0
  235. package/web/dist/assets/lxgwwenkaiscreen-subset-118-tzvs_H7j.woff2 +0 -0
  236. package/web/dist/assets/lxgwwenkaiscreen-subset-119-J2DWuYDN.woff2 +0 -0
  237. package/web/dist/assets/lxgwwenkaiscreen-subset-21-pDubCJV5.woff2 +0 -0
  238. package/web/dist/assets/lxgwwenkaiscreen-subset-22-ChAPMpqp.woff2 +0 -0
  239. package/web/dist/assets/lxgwwenkaiscreen-subset-23-BBx3oNpT.woff2 +0 -0
  240. package/web/dist/assets/lxgwwenkaiscreen-subset-24-CYt-Oagk.woff2 +0 -0
  241. package/web/dist/assets/lxgwwenkaiscreen-subset-25-Cx3j-ZUv.woff2 +0 -0
  242. package/web/dist/assets/lxgwwenkaiscreen-subset-26-B9AfZ3LL.woff2 +0 -0
  243. package/web/dist/assets/lxgwwenkaiscreen-subset-27-Bh2s9MNE.woff2 +0 -0
  244. package/web/dist/assets/lxgwwenkaiscreen-subset-28-C02JPoKP.woff2 +0 -0
  245. package/web/dist/assets/lxgwwenkaiscreen-subset-29-T_tbUGhk.woff2 +0 -0
  246. package/web/dist/assets/lxgwwenkaiscreen-subset-30-DMfyNzhz.woff2 +0 -0
  247. package/web/dist/assets/lxgwwenkaiscreen-subset-31-DFfdzbkg.woff2 +0 -0
  248. package/web/dist/assets/lxgwwenkaiscreen-subset-32-Bs1fz2iW.woff2 +0 -0
  249. package/web/dist/assets/lxgwwenkaiscreen-subset-33-cpB96OkZ.woff2 +0 -0
  250. package/web/dist/assets/lxgwwenkaiscreen-subset-34-BhinPYWX.woff2 +0 -0
  251. package/web/dist/assets/lxgwwenkaiscreen-subset-35-D_njRQqA.woff2 +0 -0
  252. package/web/dist/assets/lxgwwenkaiscreen-subset-36-DqXlLE3t.woff2 +0 -0
  253. package/web/dist/assets/lxgwwenkaiscreen-subset-37-j5LbvMph.woff2 +0 -0
  254. package/web/dist/assets/lxgwwenkaiscreen-subset-38-oO4jWdKm.woff2 +0 -0
  255. package/web/dist/assets/lxgwwenkaiscreen-subset-39-CabsX4rw.woff2 +0 -0
  256. package/web/dist/assets/lxgwwenkaiscreen-subset-4-PatS3YHh.woff2 +0 -0
  257. package/web/dist/assets/lxgwwenkaiscreen-subset-40-yrLg3C3e.woff2 +0 -0
  258. package/web/dist/assets/lxgwwenkaiscreen-subset-41-DBXmCQhc.woff2 +0 -0
  259. package/web/dist/assets/lxgwwenkaiscreen-subset-42-Bqij_UiQ.woff2 +0 -0
  260. package/web/dist/assets/lxgwwenkaiscreen-subset-43-D3kp0Ntc.woff2 +0 -0
  261. package/web/dist/assets/lxgwwenkaiscreen-subset-44-B_BNGvK4.woff2 +0 -0
  262. package/web/dist/assets/lxgwwenkaiscreen-subset-45-CZc0cQWs.woff2 +0 -0
  263. package/web/dist/assets/lxgwwenkaiscreen-subset-46-CHQX5Kd9.woff2 +0 -0
  264. package/web/dist/assets/lxgwwenkaiscreen-subset-47-Ci8gLrHA.woff2 +0 -0
  265. package/web/dist/assets/lxgwwenkaiscreen-subset-48-run3ugD3.woff2 +0 -0
  266. package/web/dist/assets/lxgwwenkaiscreen-subset-49-DgfiUb6u.woff2 +0 -0
  267. package/web/dist/assets/lxgwwenkaiscreen-subset-5-B0CtGbX_.woff2 +0 -0
  268. package/web/dist/assets/lxgwwenkaiscreen-subset-50-CdCG-POr.woff2 +0 -0
  269. package/web/dist/assets/lxgwwenkaiscreen-subset-51-L2okeQZ2.woff2 +0 -0
  270. package/web/dist/assets/lxgwwenkaiscreen-subset-52-BZAqyGJW.woff2 +0 -0
  271. package/web/dist/assets/lxgwwenkaiscreen-subset-53-B0xWqLeU.woff2 +0 -0
  272. package/web/dist/assets/lxgwwenkaiscreen-subset-54-BZVQX-EA.woff2 +0 -0
  273. package/web/dist/assets/lxgwwenkaiscreen-subset-55-093mkIUJ.woff2 +0 -0
  274. package/web/dist/assets/lxgwwenkaiscreen-subset-56-CbhWG8G-.woff2 +0 -0
  275. package/web/dist/assets/lxgwwenkaiscreen-subset-57-pLQuvo6c.woff2 +0 -0
  276. package/web/dist/assets/lxgwwenkaiscreen-subset-58-BHhoY50x.woff2 +0 -0
  277. package/web/dist/assets/lxgwwenkaiscreen-subset-59-D1_6DuIQ.woff2 +0 -0
  278. package/web/dist/assets/lxgwwenkaiscreen-subset-6-BnAelmYU.woff2 +0 -0
  279. package/web/dist/assets/lxgwwenkaiscreen-subset-60-HDBIuLTZ.woff2 +0 -0
  280. package/web/dist/assets/lxgwwenkaiscreen-subset-61-C-c13SeU.woff2 +0 -0
  281. package/web/dist/assets/lxgwwenkaiscreen-subset-62-kHRVOhZ2.woff2 +0 -0
  282. package/web/dist/assets/lxgwwenkaiscreen-subset-63-C0MCsvFv.woff2 +0 -0
  283. package/web/dist/assets/lxgwwenkaiscreen-subset-64-DZekguCj.woff2 +0 -0
  284. package/web/dist/assets/lxgwwenkaiscreen-subset-65-CtP6c3IU.woff2 +0 -0
  285. package/web/dist/assets/lxgwwenkaiscreen-subset-66-DLVWoMSf.woff2 +0 -0
  286. package/web/dist/assets/lxgwwenkaiscreen-subset-67-BVuOnayH.woff2 +0 -0
  287. package/web/dist/assets/lxgwwenkaiscreen-subset-68-DpxQ6Mnx.woff2 +0 -0
  288. package/web/dist/assets/lxgwwenkaiscreen-subset-69-qesBxLmC.woff2 +0 -0
  289. package/web/dist/assets/lxgwwenkaiscreen-subset-70-BBt1xN7h.woff2 +0 -0
  290. package/web/dist/assets/lxgwwenkaiscreen-subset-71-BWqZacwB.woff2 +0 -0
  291. package/web/dist/assets/lxgwwenkaiscreen-subset-72-B1wP_Yst.woff2 +0 -0
  292. package/web/dist/assets/lxgwwenkaiscreen-subset-73-C99T7jNZ.woff2 +0 -0
  293. package/web/dist/assets/lxgwwenkaiscreen-subset-74-DrUTsWBe.woff2 +0 -0
  294. package/web/dist/assets/lxgwwenkaiscreen-subset-75-C4M5XXQe.woff2 +0 -0
  295. package/web/dist/assets/lxgwwenkaiscreen-subset-76-Bq8spVWF.woff2 +0 -0
  296. package/web/dist/assets/lxgwwenkaiscreen-subset-77-D9vNupE2.woff2 +0 -0
  297. package/web/dist/assets/lxgwwenkaiscreen-subset-78-D6th7Gnu.woff2 +0 -0
  298. package/web/dist/assets/lxgwwenkaiscreen-subset-79-bezM85cS.woff2 +0 -0
  299. package/web/dist/assets/lxgwwenkaiscreen-subset-80-DD8pnhG2.woff2 +0 -0
  300. package/web/dist/assets/lxgwwenkaiscreen-subset-81-N6jtSyBs.woff2 +0 -0
  301. package/web/dist/assets/lxgwwenkaiscreen-subset-82-D6c180bZ.woff2 +0 -0
  302. package/web/dist/assets/lxgwwenkaiscreen-subset-83-em17AadM.woff2 +0 -0
  303. package/web/dist/assets/lxgwwenkaiscreen-subset-84-CJ8gdrMK.woff2 +0 -0
  304. package/web/dist/assets/lxgwwenkaiscreen-subset-85-9PPGO1eB.woff2 +0 -0
  305. package/web/dist/assets/lxgwwenkaiscreen-subset-86-CjWPf-u5.woff2 +0 -0
  306. package/web/dist/assets/lxgwwenkaiscreen-subset-87-8D_X_yOC.woff2 +0 -0
  307. package/web/dist/assets/lxgwwenkaiscreen-subset-88-9vtKFPBx.woff2 +0 -0
  308. package/web/dist/assets/lxgwwenkaiscreen-subset-89-BhE5jAKX.woff2 +0 -0
  309. package/web/dist/assets/lxgwwenkaiscreen-subset-90-D2Npfm5E.woff2 +0 -0
  310. package/web/dist/assets/lxgwwenkaiscreen-subset-91-C6Ft1-Eu.woff2 +0 -0
  311. package/web/dist/assets/lxgwwenkaiscreen-subset-97-CaExyQP9.woff2 +0 -0
  312. package/web/dist/assets/lxgwwenkaiscreen-subset-98-CPoVbsUd.woff2 +0 -0
  313. package/web/dist/assets/lxgwwenkaiscreen-subset-99-ZUQZGVgH.woff2 +0 -0
  314. package/web/dist/assets/{mindmap-definition-FBJOCRG2-BGt4omYC.js → mindmap-definition-FBJOCRG2-CalfL_Kn.js} +1 -1
  315. package/web/dist/assets/{pegDiagram-XKGWAZYB-uSfS-PBE.js → pegDiagram-XKGWAZYB-D9mVWz7l.js} +1 -1
  316. package/web/dist/assets/pending-edit-apply-kwMFWsUe.js +31 -0
  317. package/web/dist/assets/{pieDiagram-E7YTZNPT-DpeI935H.js → pieDiagram-E7YTZNPT-DELzbZNS.js} +1 -1
  318. package/web/dist/assets/{quadrantDiagram-AXDQQJYC-B7IuNvWa.js → quadrantDiagram-AXDQQJYC-TZqp4mfA.js} +1 -1
  319. package/web/dist/assets/{railroadDiagram-O6MQD6OU-ARzYpPQI.js → railroadDiagram-O6MQD6OU-DxX59f0i.js} +1 -1
  320. package/web/dist/assets/{requirementDiagram-EFPCY7ZU-Cj4upkAo.js → requirementDiagram-EFPCY7ZU-DFdsJLIe.js} +1 -1
  321. package/web/dist/assets/{rotate-cw-CXJcyHWk.js → rotate-cw-62liz7LX.js} +1 -1
  322. package/web/dist/assets/{sankeyDiagram-P5KCCOFB-OaVwSnLP.js → sankeyDiagram-P5KCCOFB-ByYcd3fG.js} +1 -1
  323. package/web/dist/assets/{sequenceDiagram-WJ2MYXX4-1yrUbq4t.js → sequenceDiagram-WJ2MYXX4-Bj-ml1jS.js} +1 -1
  324. package/web/dist/assets/{sizeCapture-X5ZJPWSS-nYH5p9D6.js → sizeCapture-X5ZJPWSS-KhsXThyD.js} +1 -1
  325. package/web/dist/assets/{square-dashed-mouse-pointer-CTtTVKoH.js → square-dashed-mouse-pointer-D_VrqVpy.js} +1 -1
  326. package/web/dist/assets/{stateDiagram-HBIQ2CUA-Dj5HvyNq.js → stateDiagram-HBIQ2CUA-BJlpHfWU.js} +1 -1
  327. package/web/dist/assets/stateDiagram-v2-4QOOHH4V-CR2kYAH2.js +1 -0
  328. package/web/dist/assets/{swimlanes-XN3QIQJK-umeT0HpB.js → swimlanes-XN3QIQJK-DUB9OJVs.js} +1 -1
  329. package/web/dist/assets/swimlanesDiagram-VK2B7HYN-BitOxnG2.js +8 -0
  330. package/web/dist/assets/{timeline-definition-24CTP7MA-MqnQfHKB.js → timeline-definition-24CTP7MA-C03NX82A.js} +1 -1
  331. package/web/dist/assets/{vennDiagram-4TSXK5OY-b2liyZra.js → vennDiagram-4TSXK5OY-B9pjzngp.js} +1 -1
  332. package/web/dist/assets/{wardleyDiagram-VM6X3IG4-QMK-zNh1.js → wardleyDiagram-VM6X3IG4-UqWq_mcT.js} +1 -1
  333. package/web/dist/assets/{xychartDiagram-S5SC5T6Z-D5Mc6tfA.js → xychartDiagram-S5SC5T6Z-D2pDKtOv.js} +1 -1
  334. package/web/dist/index.html +2 -2
  335. package/server/engine/mcp/tools/arrange-on-board.js +0 -126
  336. package/server/engine/mcp/tools/create-on-board.js +0 -152
  337. package/server/engine/mcp/tools/edit-sketch.js +0 -167
  338. package/server/engine/mcp/tools/relate-on-board.js +0 -150
  339. package/server/engine/mcp/tools/sketch-on-board.js +0 -345
  340. package/server/engine/plugins/nodesign/skills/rp-craft/SKILL.md +0 -235
  341. 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 +0 -78
  342. package/server/engine/plugins/nodesign/skills/rp-craft//346/274/224/345/207/272.template.js +0 -268
  343. package/web/dist/assets/DeckWindow-Bg3rgkvi.js +0 -11
  344. package/web/dist/assets/channel-DFyiuGL0.js +0 -1
  345. package/web/dist/assets/classDiagram-DTDB5LWJ-Aw1f8z-b.js +0 -1
  346. package/web/dist/assets/classDiagram-v2-JRS7N3AN-Aw1f8z-b.js +0 -1
  347. package/web/dist/assets/index-C0KUf6Wd.css +0 -1
  348. package/web/dist/assets/index-DGG5wIZs.js +0 -2118
  349. package/web/dist/assets/lxgw-nd-bold-DbRfiTgo.woff2 +0 -0
  350. package/web/dist/assets/lxgw-nd-regular-CpMw9Ehg.woff2 +0 -0
  351. package/web/dist/assets/pending-edit-apply-uP4uvrOD.js +0 -31
  352. package/web/dist/assets/stateDiagram-v2-4QOOHH4V-kJ1m_zJT.js +0 -1
  353. package/web/dist/assets/swimlanesDiagram-VK2B7HYN-DPSkMbbl.js +0 -8
package/README.zh-CN.md CHANGED
@@ -2,120 +2,280 @@
2
2
 
3
3
  # NoDesign
4
4
 
5
- 一张无限画布,一个始终在场的 Agent。
5
+ > **哪里错了圈哪里。生成、检查、反馈和修改,全程不离开同一张无限画布。**
6
6
 
7
- 告诉它你想做什么,它会在画布上创建网站、演示稿、文档、图片和视频。所有产物都会保存为真实文件,可以继续编辑、批注、下载和发布。
7
+ [![npm version](https://img.shields.io/npm/v/%40xiaobuyu%2Fnodesign)](https://www.npmjs.com/package/@xiaobuyu/nodesign)
8
+ [![npm downloads](https://img.shields.io/npm/dw/%40xiaobuyu%2Fnodesign)](https://www.npmjs.com/package/@xiaobuyu/nodesign)
9
+ [![license](https://img.shields.io/npm/l/%40xiaobuyu%2Fnodesign)](https://github.com/Xiaokebuyu/Nodesign/blob/main/LICENSE)
8
10
 
9
- ![demo](https://raw.githubusercontent.com/Xiaokebuyu/Nodesign/main/docs/demo.gif)
11
+ NoDesign 是一张以真实文件为底座的 Agent Native 创作工作台。
12
+
13
+ 告诉 Agent 你想做什么,它会在画布上创建网站、演示稿、Word 文档、图片和视频。你可以留在同一张画布上检查结果;发现哪里不满意,直接圈选、评论,或者在产物旁边发起讨论。
14
+
15
+ 你当前的视觉焦点、选中对象及其组件信息会随消息一起交给 Agent。它会理解你说的“这里”究竟是什么,修改背后的真实文件,再回到画布继续检查。
16
+
17
+ ```text
18
+ 提出需求 → Agent 生成 → 画布检查 → 圈选反馈
19
+ → 修改真实文件 → Agent 自检 → 原地继续
20
+ ```
21
+
22
+ ![在画布上圈选具体区域,Agent 获取目标上下文后直接修改](https://raw.githubusercontent.com/Xiaokebuyu/Nodesign/main/docs/demo-roundtrip.gif)
23
+
24
+ NoDesign 不只是把 AI 生成的结果摆到画布上,而是把生成、检查、反馈和修改组成的完整创作循环留在同一张画布里。
10
25
 
11
26
  ## 立即体验
12
27
 
28
+ ### 本地版
29
+
30
+ 需要 Node.js 20 或更高版本:
31
+
13
32
  ```bash
14
33
  npx @xiaobuyu/nodesign
15
34
  ```
16
35
 
17
- 需要 Node.js 20+,并配置至少一种模型接入方式:
36
+ 启动后配置至少一种模型接入方式:
18
37
 
19
38
  - Claude 订阅或 Anthropic API
20
39
  - OpenAI、DeepSeek、智谱、通义、OpenRouter
21
40
  - Ollama 或其他兼容 OpenAI API 格式的模型服务
22
41
 
23
- NoDesign 本身不收取订阅费,也不对模型调用加价。项目文件和配置保存在本地。使用云端模型时,完成任务所需的上下文会发送给你配置的模型服务。使用本地模型(如 Ollama)时,所有数据都留在你的电脑上。
42
+ NoDesign 本身不收取订阅费,也不对模型调用加价。
24
43
 
25
- 暂时不想安装,也可以通过在线实例体验基础能力:[nodesign.xiaobuyu.trade](https://nodesign.xiaobuyu.trade)
44
+ 项目文件和配置保存在本地。使用云端模型时,完成任务所需的上下文会发送给你配置的模型服务;使用本地模型(如 Ollama)时,数据可以完全留在你的电脑上。
26
45
 
27
- 在线体验版提供免费模型和每日额度,部分本地能力暂未开放。
46
+ ### 在线体验版
28
47
 
29
- ## 它能帮你做什么
48
+ 暂时不想安装,也可以直接体验基础能力:
30
49
 
31
- 三个典型场景:
50
+ [https://nodesign.xiaobuyu.trade](https://nodesign.xiaobuyu.trade)
32
51
 
33
- - **做一个作品集页面**:把参考图和文字素材放到画布上,告诉 Agent 你要什么风格,检查桌面、平板和手机尺寸下的效果,配置后一键发布到公网。
34
- - **做一份演示稿**:把照片、文字和参考风格放到画布上,Agent 生成分页幻灯,你直接在上面批注修改,导出 PDF 或 PPTX。
35
- - **做一个内容项目**:网站、图片、视频和文档放在同一张画布上,由同一个 Agent 连续处理。Agent 可以在不同产物之间继续取材和修改。
52
+ 线上版提供免费模型和每日额度,部分依赖本机环境的能力暂未开放。
36
53
 
37
- ### 产物类型
54
+ ## 为什么整个创作过程可以留在画布里
38
55
 
39
- | 产物 | 格式 | 能做什么 |
40
- |---|---|---|
41
- | 演示稿(幻灯、长图、海报) | `.html` | 16:9、9:16、4:3 等比例分页,导出 HTML、PDF、PPTX |
42
- | 站点(作品集、落地页、小应用) | 带 `index.html` 的文件夹 | 桌面、平板和手机尺寸预览,整站 zip 导出,配置 Cloudflare 后可一键发布 |
43
- | Word 文档 | `.docx` | 直接生成标准 OOXML,不是把 HTML 包装成 Word 文件。页图预览、翻页、下载原件 |
44
- | 图片 | 常见图片格式 | 生图、抠图 |
45
- | 视频 | 常见视频格式 | 视频导入、预览与转码 |
56
+ ### 哪里错了圈哪里
46
57
 
47
- ![说一句话生成图片,再抠掉背景,得到透明底 PNG](https://raw.githubusercontent.com/Xiaokebuyu/Nodesign/main/docs/demo-image.gif)
58
+ 很多时候,问题并不是模型不会修改,而是它不知道你说的“这里”究竟是哪里。
48
59
 
49
- ![Agent 生成 Word 文档,在画布上直接看排版](https://raw.githubusercontent.com/Xiaokebuyu/Nodesign/main/docs/demo-docx.gif)
60
+ NoDesign 中,你可以:
50
61
 
51
- 这些文件不依赖 NoDesign 的私有格式,可以使用其他工具继续编辑和下载。
62
+ - 双击修改文字;
63
+ - 圈选一块区域并留下评论;
64
+ - 拖动和整理画布元素;
65
+ - 在不同内容之间建立「参考」「批注」「接着做」等关系;
66
+ - 在正在检查的产物旁边直接唤出 Agent。
52
67
 
53
- 使用 NoDesign 完成的实际项目:一个乐队的研究站、一份 15 页的西藏攻略幻灯配站点、一套像素风服务器宣传页、一份改了六版的简历 .docx。也有实验性项目,比如一个在页面上选择剧情、在聊天里生成内容的互动视觉小说。已发布的一个站点:[spica-mix.share.xiaobuyu.trade](https://spica-mix.share.xiaobuyu.trade)。
68
+ 当前视野、选中的目标、附近内容以及目标涉及的组件信息,会被整理为下一轮任务的上下文。
54
69
 
55
- ## 它为什么不只是另一个 AI 聊天框
70
+ 你不需要再截图并解释:
56
71
 
57
- ### 画布就是工作区
72
+ > 第二屏右边那个蓝色的块位置不太对。
58
73
 
59
- 画布上的卡片对应真实文件,文件夹对应真实目录。移动、编辑和整理卡片,也会同步改变磁盘上的内容。
74
+ 直接圈住它,说一句:
75
+
76
+ > 这里太挤了。
77
+
78
+ 这样就够了。
79
+
80
+ Agent 完成修改后,结果会回到同一张画布。你可以继续检查、追问或进行下一轮修改,不必在聊天框、预览窗口、编辑器和文件夹之间反复切换。
81
+
82
+ ### Agent 能检查自己的结果
83
+
84
+ Agent 不只负责生成,也能主动检查自己做出来的东西。
85
+
86
+ 对于站点,它可以:
87
+
88
+ - 获取桌面、平板和手机宽度下的页面截图;
89
+ - 读取浏览器控制台错误;
90
+ - 检查最终渲染样式;
91
+ - 检查字体是否正确加载;
92
+ - 提取滚动动效和关键动画帧;
93
+ - 根据检查结果继续修改。
94
+
95
+ ![站点在桌面、平板、手机尺寸下的预览](https://raw.githubusercontent.com/Xiaokebuyu/Nodesign/main/docs/demo-viewport.gif)
96
+
97
+ 如果连续修改后结果仍不理想,Agent 还可以邀请一个只读评审子代理,从第三方视角逐页检查问题。评审角色只负责找出缺陷,不会直接修改文件。
98
+
99
+ ### 画布上的内容对应真实文件
100
+
101
+ 画布不是文件的终点。
102
+
103
+ 画布上的文件卡片对应磁盘中的真实文件,文件夹卡片对应真实目录。打开、重命名、归类和移动文件等操作会同步到项目工作区。
60
104
 
61
105
  ![打开文件夹、把卡片拖进文件夹、在两张卡之间建立关系](https://raw.githubusercontent.com/Xiaokebuyu/Nodesign/main/docs/demo-desktop.gif)
62
106
 
63
- ### Agent 始终在场
107
+ Agent 生成的网站、演示稿、Word 文档、图片和视频不会被锁在 NoDesign 的私有格式里。你可以:
64
108
 
65
- Agent 会出现在它正在处理的内容旁边。你可以看到它正在编辑哪个文件,以及内容如何逐步生成,而不是只能等待聊天框返回最终结果。
109
+ - 在画布上继续检查和批注;
110
+ - 下载原始文件;
111
+ - 使用其他软件继续编辑;
112
+ - 修改文件后再交给 Agent 接着处理;
113
+ - 将项目发布或交付给其他人。
66
114
 
67
- ### 画布也是黑板
115
+ 画布是一张连接文件、上下文和 Agent 的工作桌,而不是一个只能展示生成结果的容器。
68
116
 
69
- Agent 不只是把做完的产物放上画布,也把想法放上去。它会画草图、写板书、在相关的东西之间拉线,说明自己打算怎么做,或者把一件复杂的事情拆开摆出来。
117
+ ### 不同产物可以在同一张画布上接着做
70
118
 
71
- ![拆《雷雨》的人物关系:八个人分成两家,关系线标出谁和谁是什么,主要人物的肖像当场生成后连回名字](https://raw.githubusercontent.com/Xiaokebuyu/Nodesign/main/docs/demo-blackboard.gif)
119
+ 网站、演示稿、文档、图片、视频和参考资料可以同时摊在一张画布上,由同一个 Agent 连续处理。
72
120
 
73
- 板书是真文件,保存在项目的 `notes/板书/` 目录下。草图节点、连线和板书都可以双击直接改,改完 Agent 接着用改过的版本。
121
+ 例如,你可以:
74
122
 
75
- ![双击 Agent 写的板书,在画布上原地改字](https://raw.githubusercontent.com/Xiaokebuyu/Nodesign/main/docs/demo-chalk.gif)
123
+ 1. Agent 调研一个主题;
124
+ 2. 将调研结果整理成 Word 文档;
125
+ 3. 根据文档生成演示稿;
126
+ 4. 从演示稿中提取宣传长图;
127
+ 5. 根据同一批素材制作配套站点;
128
+ 6. 圈出不满意的部分,让 Agent 原地修改。
76
129
 
77
- ### 你的操作会成为下一轮上下文
130
+ Agent 可以掌握这些文件在项目中的位置,并在不同产物之间继续取材和工作,不必每换一种工具就重新解释项目背景。
78
131
 
79
- 你可以直接修改文字、圈选区域、拖动元素,或者在不同产物之间建立「参考」「批注」「接着做」等关系。这些操作会被整理为后续任务的上下文。
132
+ ![NoDesign 综合创作流程](https://raw.githubusercontent.com/Xiaokebuyu/Nodesign/main/docs/demo.gif)
80
133
 
81
- ![圈选封面的一块区域写一句话,Agent 取到后直接修改](https://raw.githubusercontent.com/Xiaokebuyu/Nodesign/main/docs/demo-roundtrip.gif)
134
+ ### Agent 也可以自己寻找和分析参考
82
135
 
83
- ### Agent 能检查自己的结果
136
+ Agent 拥有自己的浏览器。你可以把一个网址交给它,也可以让它自己寻找参考内容。
84
137
 
85
- 它可以获取不同屏幕尺寸下的页面截图、样式计算结果、控制台错误、字体加载状态和动效帧,并根据检查结果继续修改。做完之后它自己截图核对,改了两轮你还是不满意,它会请一个只读的评审子代理逐页检查。
138
+ 它能够:
86
139
 
87
- ![站点在桌面、平板、手机尺寸下的预览](https://raw.githubusercontent.com/Xiaokebuyu/Nodesign/main/docs/demo-viewport.gif)
140
+ - 浏览和截图网页;
141
+ - 分析页面布局、配色和字体;
142
+ - 观察页面的内容分区;
143
+ - 检查滚动触发的动画与交互;
144
+ - 将有用的截图和素材放入当前项目;
145
+ - 根据参考内容继续生成站点、演示稿或其他产物。
146
+
147
+ 在本地版中,浏览器可以保留登录状态。遇到验证码、登录确认或其他需要人工处理的步骤时,Agent 会暂停并请求你接管;处理完成后,它可以继续原来的任务。
148
+
149
+ ### 思考过程也可以留在画布上
150
+
151
+ Agent 不只把最终产物放到画布上,也可以把中间思考过程摆出来。
152
+
153
+ 它会画草图、写板书、在相关内容之间建立连接,说明自己的计划,或者把复杂问题拆成可以继续讨论的部分。
154
+
155
+ ![拆解《雷雨》人物关系:生成角色、肖像与关系线](https://raw.githubusercontent.com/Xiaokebuyu/Nodesign/main/docs/demo-blackboard.gif)
156
+
157
+ 板书本身也是真实文件,保存在项目的 `notes/板书/` 目录中。草图节点、连接线和板书文字都可以手动调整;修改之后,Agent 会继续使用更新后的内容。
158
+
159
+ ![双击 Agent 写下的板书,在画布上原地修改](https://raw.githubusercontent.com/Xiaokebuyu/Nodesign/main/docs/demo-chalk.gif)
160
+
161
+ 项目决策、风格记录和个人偏好不必只藏在聊天历史里。它们可以作为可见、可编辑的内容保留在工作区,也可以进一步沉淀成可复用的 Skill。
162
+
163
+ > 正在开发:将更多头脑风暴与对话分支迁移到画布。完成后,可以从不同阶段和节点继续提问、延伸或比较方案,而不必在一条越来越长的聊天记录中来回翻找。
164
+
165
+ ## 它能帮你做什么
88
166
 
89
- ### 记忆是可见、可编辑的
167
+ ### 三个典型场景
90
168
 
91
- 项目决策、风格记录和个人偏好不会只藏在对话历史中。它们会以可见内容保留在工作区,也可以沉淀成可复用的 Skill。
169
+ - **制作作品集或落地页**
170
+ 把参考图和文字素材放到画布上,告诉 Agent 你想要的风格。Agent 完成页面后,会检查桌面、平板和手机尺寸下的效果;你可以圈出不满意的位置继续修改,配置后发布到公网。
171
+
172
+ - **制作一份演示稿**
173
+ 将照片、文字和参考风格放在画布上,Agent 生成分页幻灯。你可以直接查看每页效果、修改文字、圈选批注,最后导出 PDF 或 PPTX。
174
+
175
+ - **完成一个跨媒体内容项目**
176
+ 将网站、图片、视频、演示稿和文档放在同一张画布上,由同一个 Agent 连续处理。不同产物可以共享已有素材、研究结果和风格上下文。
177
+
178
+ ### 支持的产物类型
179
+
180
+ | 产物 | 文件格式 | 当前能力 |
181
+ |---|---|---|
182
+ | 演示稿、长图、海报 | `.html` | 支持 16:9、9:16、4:3 等比例分页,导出 HTML、PDF、PPTX |
183
+ | 作品集、落地页、小应用 | 带 `index.html` 的文件夹 | 桌面、平板和手机尺寸预览,整站 ZIP 导出,配置 Cloudflare 后发布 |
184
+ | Word 文档 | `.docx` | 生成标准 OOXML,不是将 HTML 修改后缀;支持页图预览、翻页和原件下载 |
185
+ | 图片 | 常见图片格式 | 图片生成、背景移除和素材处理 |
186
+ | 视频 | 常见视频格式 | 导入、预览和转码 |
187
+
188
+ ![说一句话生成图片,再移除背景,得到透明 PNG](https://raw.githubusercontent.com/Xiaokebuyu/Nodesign/main/docs/demo-image.gif)
189
+
190
+ ![Agent 生成 Word 文档,在画布上直接检查排版](https://raw.githubusercontent.com/Xiaokebuyu/Nodesign/main/docs/demo-docx.gif)
191
+
192
+ ### 已经完成的实际项目
193
+
194
+ 下面这些站点都在 NoDesign 里做出来,并且现在都能打开。
195
+
196
+ | 站点 | 内容 |
197
+ |---|---|
198
+ | [喷气发动机 3D 互动教具](https://jet-engine-lab.share.xiaobuyu.trade) | 程序化几何构建的涡扇发动机,可旋转缩放、启动加油门、爆炸拆解、剖切透视与气流可视化,按站位读取压比、温度、速度与能量变化 |
199
+ | [深入第三极](https://third-pole.share.xiaobuyu.trade) | 藏地三十日私人探险,长篇图文站 |
200
+ | [晨曦 CHENXI](https://chenxi.share.xiaobuyu.trade) | 一份护肤刊物,以及从中生长出来的产品线 |
201
+ | [相対性理論 · 纸上手账](https://soutaiseiriron.share.xiaobuyu.trade) | 乐队非公式粉丝站 |
202
+ | [凛 · 角色拆解](https://rin.share.xiaobuyu.trade) | 短片《Shelter》主角的拆解笔记,每条批注同时是一个切换器 |
203
+ | [某日猜想](https://225ad5.share.xiaobuyu.trade) | 分章节的互动故事,一个夏天午后的解谜 |
204
+ | [SPiCa -paid vacation mix-](https://spica-mix.share.xiaobuyu.trade) | 单曲鉴赏页 |
205
+
206
+ 不是网站、但同样在这里做出来的:与上面第二个站配套的 15 页西藏攻略演示稿、一套像素风服务器宣传页,以及一份经历六轮修改的正式简历 `.docx`。
92
207
 
93
208
  ## 本地版与线上版
94
209
 
95
210
  | | 本地版 `npx @xiaobuyu/nodesign` | 线上版 [nodesign.xiaobuyu.trade](https://nodesign.xiaobuyu.trade) |
96
211
  |---|---|---|
97
- | 模型 | 你自己配置的(Claude 订阅、API Key 或兼容 OpenAI API 格式的服务) | 免费模型,每日额度 |
212
+ | 模型 | 自行配置 Claude 订阅、API Key 或兼容 OpenAI API 格式的模型服务 | 免费模型,每日额度 |
98
213
  | 数据 | 保存在 `~/.nodesign/`,服务仅监听 `127.0.0.1` | 服务端存储,按用户隔离 |
99
214
  | 账号 | 无需账号,打开即可使用 | 公开注册 |
100
- | 能力 | 全部。截图、Word、抠图、生图等按本机环境自动探测。站点发布需要配置 Cloudflare Pages | 截图、搜索、生图开放。站点发布和订阅模型暂不对外开放 |
101
- | 费用 | 无订阅,无抽成。模型费用由你配置的服务商收取 | 免费 |
215
+ | 能力 | 完整能力;截图、Word、抠图、生图等根据本机环境自动探测;站点发布需要配置 Cloudflare Pages | 开放截图、搜索和生图;站点发布与订阅模型暂未对外开放 |
216
+ | 费用 | NoDesign 无订阅、无抽成;模型费用由配置的服务商收取 | 免费 |
102
217
 
103
- 本地版是主力。线上版用来在不安装的情况下快速体验。
218
+ 本地版是主力,线上版用于在不安装的情况下快速体验基础能力。
104
219
 
105
220
  ## 配置
106
221
 
107
- 启动后点右上角齿轮进入设置页,分为四个区域:
222
+ 启动后,点击右上角齿轮进入设置页。
223
+
224
+ ### 模型
225
+
226
+ 设置页提供两类模型配置:
227
+
228
+ - **Claude 官方**:填写 Anthropic API Key,或通过 `nodesign login` 登录 Claude 订阅;
229
+ - **自定义接入**:从服务商预设中选择 DeepSeek、OpenAI、智谱、通义、OpenRouter、Ollama 等服务,并填写接口地址和密钥。
230
+
231
+ 每个模型配置都可以运行连接测试,实际验证:
232
+
233
+ - 普通对话;
234
+ - 流式输出;
235
+ - 工具调用;
236
+ - 图片理解;
237
+ - Token 计数能力。
238
+
239
+ 没有配置任何模型时,模型选择器会保持为空。
108
240
 
109
- - **模型**:两张并列的卡片。「Claude 官方」填 API Key 或通过 `nodesign login` 登录 Claude 订阅。「自定义接入」从服务商预设里选一个(DeepSeek、OpenAI、智谱、通义、OpenRouter、Ollama 等),填入接口地址和密钥。每个模型配置都可以运行连接测试,实际验证普通对话、流式输出、工具调用、图片理解和计数能力。没有配置任何模型时,模型选择器是空的。
110
- - **本机能力**:启动时自动探测 git、Chromium、LibreOffice、poppler、ffmpeg、rembg、生图、搜索、发布能力。缺少的会标出安装方法,对应工具会明确显示为不可用,并附上安装说明。
111
- - **其他设置**:搜索(四家任选一)、生图通道、Cloudflare 发布、沙盒与权限模式。
112
- - **状态**:数据目录、配置文件路径、重启。
241
+ ### 本机能力
113
242
 
114
- 配置文件存放在 `~/.nodesign/.env`(密钥)和 `~/.nodesign/config.json`(模型插槽),也可以直接编辑。
243
+ 启动时会自动探测:
244
+
245
+ - git
246
+ - Chromium
247
+ - LibreOffice
248
+ - poppler
249
+ - ffmpeg
250
+ - rembg
251
+ - 图片生成
252
+ - 搜索
253
+ - 发布能力
254
+
255
+ 缺少依赖时,设置页会标明安装方法,对应工具也会明确显示为不可用。
256
+
257
+ ### 其他设置
258
+
259
+ 还可以配置:
260
+
261
+ - 搜索服务;
262
+ - 图片生成通道;
263
+ - Cloudflare Pages 发布;
264
+ - 命令沙盒;
265
+ - 自动权限检查。
266
+
267
+ 配置文件存放在:
268
+
269
+ ```text
270
+ ~/.nodesign/.env
271
+ ~/.nodesign/config.json
272
+ ```
273
+
274
+ `.env` 用于保存密钥,`config.json` 用于保存模型插槽和其他配置,也可以直接编辑。
115
275
 
116
276
  ## 安全与隐私
117
277
 
118
- 每个项目使用独立的工作区目录。本地数据默认保存在 `~/.nodesign/`,服务仅监听 `127.0.0.1`。
278
+ 每个项目都使用独立的工作区目录。本地数据默认保存在 `~/.nodesign/`,服务仅监听 `127.0.0.1`。
119
279
 
120
280
  在支持的平台上,可以启用系统级命令沙盒:
121
281
 
@@ -125,21 +285,39 @@ Agent 不只是把做完的产物放上画布,也把想法放上去。它会
125
285
 
126
286
  还可以启用自动权限检查,对文件上传、外部请求和其他敏感操作进行额外判断。
127
287
 
128
- 本地版默认不启用命令沙盒和自动权限检查。请根据使用场景在设置中开启。在 Windows 上,建议仅打开你信任的项目,并在执行涉及工作区外文件、安装软件或上传内容的操作前确认 Agent 的计划。
288
+ 本地版默认不启用命令沙盒和自动权限检查,请根据自己的使用场景决定是否开启。
289
+
290
+ 在 Windows 上,建议只打开你信任的项目,并在 Agent 执行以下操作前确认它的计划:
291
+
292
+ - 修改工作区外的文件;
293
+ - 安装软件或依赖;
294
+ - 上传本地内容;
295
+ - 执行其他可能影响系统环境的操作。
129
296
 
130
297
  ## 项目状态
131
298
 
132
- 个人项目,2026 年 4 月底起步,目前仍在快速迭代。本地发行版当前是 `0.0.6`,核心功能已在内测中稳定使用。
299
+ NoDesign 是一个仍在快速迭代的个人项目,始于 2026 年 4 月底。
300
+
301
+ 当前状态:
302
+
303
+ - 本地发行版:`0.0.7`
304
+ - 进程内工具:54 个
305
+ - 自动化测试:1,037 项
306
+ - 早期用户:50 名
307
+
308
+ 核心功能已经在内测中稳定使用,但操作体验、平台兼容性和部分边缘能力仍需继续打磨。
133
309
 
134
- ### 功能
310
+ ### 功能状态
135
311
 
136
312
  | 能力 | 当前状态 |
137
313
  |---|---|
138
314
  | 画布与项目管理 | 内测主版本运行中 |
139
315
  | 网站生成、预览与发布 | 稳定 |
140
316
  | 演示稿生成与导出 | 稳定 |
141
- | Word 文档 | 可用。预览分页与 Microsoft Word 可能存在偏差 |
142
- | 图片与视频工具 | 可用。具体能力取决于本机依赖和服务配置 |
317
+ | Word 文档 | 可用;预览分页与 Microsoft Word 可能存在偏差 |
318
+ | 图片与视频工具 | 可用;具体能力取决于本机依赖和服务配置 |
319
+ | 空间化板书与关系图 | 可用,交互仍在继续完善 |
320
+ | 画布对话与思考分支 | 开发中 |
143
321
  | 互动演出模式 | 实验中,尚未完整进入公开版本 |
144
322
 
145
323
  ### 平台兼容性
@@ -147,17 +325,26 @@ Agent 不只是把做完的产物放上画布,也把想法放上去。它会
147
325
  | 平台 | 状态 |
148
326
  |---|---|
149
327
  | Linux | 生产环境运行中 |
150
- | Windows | 已完成真机安装与运行验证 |
151
- | macOS | 有对应代码分支,尚未在真机上验证 |
152
- | 移动端 | 可以浏览和对话,整理和编辑建议使用电脑 |
328
+ | Windows | 已完成真机安装和运行验证 |
329
+ | macOS | 有对应代码分支,尚未进行真机验证 |
330
+ | 移动端 | 可以浏览和对话;整理和编辑建议使用电脑 |
153
331
 
154
332
  ## 技术架构
155
333
 
156
- - **前端**:React + Vite。无限画布的相机、命中检测、关系排布和产物能力系统为自研实现(web/src/lib,45 个纯函数模块,配有单测)。
157
- - **服务端**:Node.js ESM。Agent 会话以项目工作区作为执行目录,通过 56 个进程内工具操作文件、浏览器和不同类型的产物。
158
- - **会话同步**:服务端维护会话状态,支持流式输出、断线恢复和多标签页同步。
159
- - **模型兼容**:原生支持 Claude,并通过格式转换接入兼容 OpenAI API 的模型服务。无法匹配上游时直接返回错误,避免请求被发送到错误的模型服务。
160
- - **产物系统**:网站、演示稿和 Word 文档通过统一的注册机制接入预览、导出和发布流程。新增产物类型时,通过同一注册入口接入相关能力。
334
+ - **前端**
335
+ React + Vite。无限画布的相机、命中检测、关系排布和产物能力系统为自研实现;`web/src/lib` 包含 46 个独立模块,几何计算、命中判定、导出格式等核心逻辑配有单元测试。
336
+
337
+ - **服务端**
338
+ Node.js ESM。Agent 会话以项目工作区作为执行目录,通过 54 个进程内工具操作文件、浏览器和不同类型的产物。
339
+
340
+ - **会话同步**
341
+ 服务端维护会话状态,支持流式输出、断线恢复和多标签页同步。
342
+
343
+ - **模型兼容**
344
+ 原生支持 Claude,并通过格式转换接入兼容 OpenAI API 的模型服务。无法匹配上游时直接返回错误,避免请求被发送到错误的模型服务。
345
+
346
+ - **产物系统**
347
+ 网站、演示稿和 Word 文档通过统一的注册机制接入预览、导出和发布流程。新增产物类型时,通过同一注册入口接入相关能力。
161
348
 
162
349
  ## 开发
163
350
 
@@ -170,7 +357,7 @@ npm test # server 测试 + web 测试
170
357
 
171
358
  > 注意:完整运行需要配置模型接入(Claude 订阅或 API Key)以及部分本地工具依赖。设置页会列出缺少的依赖和安装方法。
172
359
 
173
- 项目以 Vitest 测试套件作为发布前检查,server 和 web 合计 1021 项用例,覆盖前后端契约、模块边界、权限能力表和关键用户文案。部分约束以静态测试固化,避免仅依赖注释和人工约定。例如:
360
+ 项目以 Vitest 测试套件作为发布前检查,server 和 web 合计 1,037 项用例,覆盖前后端契约、模块边界、权限能力表和关键用户文案。部分约束以静态测试固化,避免仅依赖注释和人工约定。例如:
174
361
 
175
362
  - 前后端双份能力表逐项对账
176
363
  - 权限判断必须通过能力表查询
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xiaobuyu/nodesign",
3
- "version": "0.0.7",
3
+ "version": "0.0.8",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "NoDesign: an infinite canvas workbench for independent creators. An agent builds sites, decks, documents, images and video as real files, on your machine, with your own model key.",
@@ -41,7 +41,7 @@
41
41
  "prepack": "npm run build:web"
42
42
  },
43
43
  "dependencies": {
44
- "@anthropic-ai/claude-agent-sdk": "^0.3.237",
44
+ "@anthropic-ai/claude-agent-sdk": "^0.3.251",
45
45
  "async-mutex-lite": "^1.0.0",
46
46
  "better-sqlite3": "^12.8.0",
47
47
  "cors": "^2.8.5",
@@ -8,6 +8,7 @@
8
8
  * GET /api/admin/invites 邀请码列表(含用量)
9
9
  * PATCH /api/admin/invites/:code {maxUses} 改总次数(0 = 封死)
10
10
  * GET /api/admin/users 用户列表 + 今日用量
11
+ * GET /api/admin/modes 设计 / 演出 两个模式各自的用量(不含站主)
11
12
  * PATCH /api/admin/users/:id {disabled?, dailyCostLimitUsd?, lifetimeCostLimitUsd?} 封禁/调限额
12
13
  * GET /api/admin/issues harness 问题库(按次数降序)+ 按工具聚合
13
14
  * PATCH /api/admin/issues/:id {status} open|ack|ignored|closed
@@ -17,6 +18,7 @@
17
18
  import express from 'express';
18
19
  import { adminGuard } from '../auth/middleware.js';
19
20
  import { createInvite, listInvites, getInvite, updateInvite, listUsers, getUserById, updateUser } from '../auth/users-store.js';
21
+ import { modeStats } from '../projects/store.js';
20
22
  import { tierOf, PLANS } from '../auth/tier.js';
21
23
  import { usedCostToday, usedCostTotal, usedTokensToday, limitFor } from '../lib/quota.js';
22
24
  import { listIssues, setIssueStatus, removeIssue, issueStats } from '../lib/issues-store.js';
@@ -73,6 +75,11 @@ router.get('/users', (_req, res) => {
73
75
  res.json({ users });
74
76
  });
75
77
 
78
+ // 两个模式各自的用量。只读、无参数,控制台顶上那两张卡用。
79
+ router.get('/modes', (_req, res) => {
80
+ res.json({ modes: modeStats() });
81
+ });
82
+
76
83
  router.patch('/users/:id', (req, res) => {
77
84
  const user = getUserById(req.params.id);
78
85
  if (!user) return res.status(404).json({ error: 'user not found' });
@@ -18,6 +18,7 @@ import { promises as fs } from 'node:fs';
18
18
  import { pageImage, docPdf } from '../../lib/docx-pages.js';
19
19
  import { safeResolveRead } from '../../lib/safe-path.js';
20
20
 
21
+ import { msg } from '../../shared/messages.js';
21
22
  /** 缩略图宽度上限:再大就不是缩略图了,纯粹是让服务端白干 */
22
23
  const MAX_WIDTH = 2000;
23
24
 
@@ -37,7 +38,7 @@ export function makeDocxPageHandler({ getSharedDir, guardProject }) {
37
38
  if (!abs) return res.status(403).json({ error: 'path escapes workspace' });
38
39
 
39
40
  let stat;
40
- try { stat = await fs.stat(abs); } catch { return res.status(404).json({ error: '找不到这份文档' }); }
41
+ try { stat = await fs.stat(abs); } catch { return res.status(404).json({ error: msg(req, '找不到这份文档') }); }
41
42
 
42
43
  // ETag 带 mtime + size:agent 一 rebuild 就换 key,浏览器自然重取
43
44
  const w = Math.min(Math.max(0, Number(req.query.w) || 0), MAX_WIDTH);
@@ -51,7 +52,7 @@ export function makeDocxPageHandler({ getSharedDir, guardProject }) {
51
52
  } catch (err) {
52
53
  console.warn('[docx-page] render failed:', err.message);
53
54
  return res.status(err.status || 500).json({
54
- error: '渲染失败',
55
+ error: msg(req, '渲染失败'),
55
56
  details: String(err.message || err).slice(0, 300),
56
57
  });
57
58
  }
@@ -80,7 +81,7 @@ export function makeDocxPdfHandler({ getSharedDir, guardProject }) {
80
81
  const abs = await safeResolveRead(root, rel);
81
82
  if (!abs) return res.status(403).json({ error: 'path escapes workspace' });
82
83
  let stat;
83
- try { stat = await fs.stat(abs); } catch { return res.status(404).json({ error: '找不到这份文档' }); }
84
+ try { stat = await fs.stat(abs); } catch { return res.status(404).json({ error: msg(req, '找不到这份文档') }); }
84
85
  const etag = `"${stat.mtimeMs}-${stat.size}-pdf"`;
85
86
  if (req.headers['if-none-match'] === etag) return res.status(304).end();
86
87
  let out;
@@ -89,7 +90,7 @@ export function makeDocxPdfHandler({ getSharedDir, guardProject }) {
89
90
  } catch (err) {
90
91
  console.warn('[docx-pdf] render failed:', err.message);
91
92
  return res.status(err.status || 500).json({
92
- error: '渲染失败',
93
+ error: msg(req, '渲染失败'),
93
94
  details: String(err.message || err).slice(0, 300),
94
95
  });
95
96
  }
@@ -9,6 +9,7 @@
9
9
 
10
10
  import { promises as fs } from 'node:fs';
11
11
  import { parseChalk } from '../../lib/chalk.js';
12
+ import { jsonPreview } from '../../lib/json-preview.js';
12
13
 
13
14
  /** 单层路径片段:不含分隔符、不含 `..`、不以点开头、长度可控 */
14
15
  export function safeSegment(s) {
@@ -54,6 +55,13 @@ export async function decorateFilePreview(item, absPath) {
54
55
  const raw = await fs.readFile(absPath, 'utf8');
55
56
  const head = /^---\n[\s\S]{0,1200}?\n---\n?/.exec(raw)?.[0] || '';
56
57
  const body = raw.slice(head.length).trimStart();
58
+ // json 走结构裁剪(08-29 刀 B):产出仍是合法 json,前端才画得出折叠树。
59
+ // 硬截断的 json parse 不动,卡面上只能是半行 `{"name":"…`。
60
+ if (/\.json$/i.test(absPath)) {
61
+ const shrunk = jsonPreview(body);
62
+ if (shrunk !== null) { item.preview = shrunk; item.previewKind = 'json'; return item; }
63
+ // 不是合法 json(写了一半 / 带注释):退回原样,别假装看得懂
64
+ }
57
65
  item.preview = body.length > 1024 ? body.slice(0, 1024) + '…' : body;
58
66
  } catch { /* 读不到就没有预览,卡退回细条 */ }
59
67
  return item;