@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.
- package/README.md +266 -79
- package/README.zh-CN.md +254 -67
- package/package.json +2 -2
- package/server/api/admin.js +7 -0
- package/server/api/assets/docx-page.js +5 -4
- package/server/api/assets/helpers.js +8 -0
- package/server/api/assets.js +21 -33
- package/server/api/board.js +29 -1
- package/server/api/browse.js +3 -2
- package/server/api/chatai.js +9 -8
- package/server/api/exports/cards.js +7 -6
- package/server/api/exports/docx-pdf.js +4 -1
- package/server/api/local.js +10 -8
- package/server/api/projects.js +19 -3
- package/server/api/publish.js +3 -2
- package/server/api/sessions-rewind.js +220 -0
- package/server/api/sessions.js +58 -194
- package/server/api/stage.js +35 -0
- package/server/api/turn-model-switch.js +109 -0
- package/server/api/turn.js +52 -88
- package/server/auth/middleware.js +29 -6
- package/server/auth/tier.js +27 -7
- package/server/auth/users-store.js +14 -1
- package/server/engine/agent/actor-trail.js +110 -0
- package/server/engine/agent/agent-shared.js +22 -52
- package/server/engine/agent/beat-state.js +61 -0
- package/server/engine/agent/cast.js +322 -0
- package/server/engine/agent/events.js +9 -2
- package/server/engine/agent/hooks/beat-gate.js +73 -0
- package/server/engine/agent/hooks/lifecycle.js +6 -2
- package/server/engine/agent/hooks/post-trim.js +1 -0
- package/server/engine/agent/hooks/pre-board-dirty.js +29 -0
- package/server/engine/agent/hooks/pre-defaults.js +206 -2
- package/server/engine/agent/hooks/pre-injectors.js +19 -2
- package/server/engine/agent/hooks/pre-peer-guard.js +88 -0
- package/server/engine/agent/hooks/pre-unknown-params.js +82 -0
- package/server/engine/agent/hooks/pre-workspace-scope-guard.js +33 -0
- package/server/engine/agent/hooks/resident-role-lifecycle.js +100 -0
- package/server/engine/agent/hooks/slot-alias.js +30 -0
- package/server/engine/agent/hooks/user-prompt-submit.js +197 -7
- package/server/engine/agent/hooks.js +76 -6
- package/server/engine/agent/isolation.js +25 -2
- package/server/engine/agent/memory-config.js +27 -1
- package/server/engine/agent/model-context.js +102 -18
- package/server/engine/agent/model-table.js +361 -58
- package/server/engine/agent/prompts/nodesign-prelude.md +566 -59
- package/server/engine/agent/prompts/tools/direct-edit-protocol.md +1 -1
- package/server/engine/agent/prompts/tools/generate-image-cookbook.md +2 -2
- package/server/engine/agent/prompts/tools/paint-still-cookbook.md +1 -1
- package/server/engine/agent/prompts/tools/site-reference.md +2 -1
- package/server/engine/agent/role-card.js +175 -0
- package/server/engine/agent/rp-mode.js +17 -0
- package/server/engine/agent/session-loop.js +26 -14
- package/server/engine/agent/stage-status.js +73 -0
- package/server/engine/agent/subagent-flight.js +73 -0
- package/server/engine/agent/system-prompts.js +41 -0
- package/server/engine/agent/tool-input-stream.js +165 -0
- package/server/engine/mcp/actor.js +59 -0
- package/server/engine/mcp/capability-gate.js +21 -2
- package/server/engine/mcp/index.js +116 -24
- package/server/engine/mcp/mode-profile.js +139 -0
- package/server/engine/mcp/server-name.js +19 -0
- package/server/engine/mcp/tools/artifact-session.js +2 -1
- package/server/engine/mcp/tools/browse-find-batch.js +76 -14
- package/server/engine/mcp/tools/browse.js +1 -1
- package/server/engine/mcp/tools/cast-role.js +167 -0
- package/server/engine/mcp/tools/draw-trend.js +104 -0
- package/server/engine/mcp/tools/edit-board-schema.js +56 -0
- package/server/engine/mcp/tools/edit-board.js +569 -0
- package/server/engine/mcp/tools/look-at-board.js +4 -3
- package/server/engine/mcp/tools/open-sheet.js +242 -0
- package/server/engine/mcp/tools/organize-board.js +19 -5
- package/server/engine/mcp/tools/paint-still.js +1 -1
- package/server/engine/mcp/tools/pin-to-board.js +78 -3
- package/server/engine/mcp/tools/read-board.js +109 -16
- package/server/engine/mcp/tools/read-tavern-json.js +87 -19
- package/server/engine/mcp/tools/report-issue.js +1 -0
- package/server/engine/mcp/tools/role-memory.js +83 -0
- package/server/engine/mcp/tools/roll-dice.js +82 -0
- package/server/engine/mcp/tools/roll-film.js +1 -1
- package/server/engine/mcp/tools/screenshot.js +2 -2
- package/server/engine/mcp/tools/set-vars.js +150 -0
- package/server/engine/mcp/tools/sheet-replan.js +46 -0
- package/server/engine/mcp/tools/web-search.js +1 -1
- package/server/engine/mcp/tools/write-on-board-flow.js +108 -0
- package/server/engine/mcp/tools/write-on-board-place.js +211 -0
- package/server/engine/mcp/tools/write-on-board-role-anchor.js +48 -0
- package/server/engine/mcp/tools/write-on-board-schema.js +125 -0
- package/server/engine/mcp/tools/write-on-board.js +567 -107
- package/server/engine/plugins/nodesign/skills/blackboard-rp/SKILL.md +215 -0
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/SKILL.md +11 -3
- package/server/engine/plugins/nodesign/skills/docx-craft/SKILL.md +34 -4
- package/server/engine/plugins/nodesign/skills/site-craft/SKILL.md +20 -4
- package/server/engine/plugins/nodesign/skills/story-craft/SKILL.md +94 -0
- package/server/engine/plugins/nodesign/skills/story-import/SKILL.md +112 -0
- package/server/engine/plugins/nodesign/skills/story-intimacy/SKILL.md +72 -0
- package/server/engine/plugins/nodesign/skills/story-voice/SKILL.md +66 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//345/206/267/347/241/254.md +33 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//346/203/205/346/204/237/347/233/264/347/273/231.md +42 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//346/204/217/350/257/206/346/265/201.md +42 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//346/255/246/344/276/240/347/231/275/350/257/235.md +34 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//347/224/237/346/264/273/346/265/201.md +35 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//347/231/275/346/217/217.md +37 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//350/210/236/345/217/260/345/211/247.md +32 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//351/230/266/346/256/265/345/210/207/346/215/242.md +42 -0
- package/server/engine/runs/board-seater.js +272 -0
- package/server/engine/runs/board-tasklist.js +90 -48
- package/server/engine/runs/turn-relay.js +24 -2
- package/server/engine/runs/user-chalk-echo.js +44 -0
- package/server/index.js +2 -0
- package/server/lib/board-anchor.js +49 -0
- package/server/lib/board-dirty.js +93 -0
- package/server/lib/board-excerpt.js +80 -0
- package/server/lib/board-follow.js +111 -0
- package/server/lib/board-groups.js +1 -5
- package/server/lib/board-hero.js +3 -1
- package/server/lib/board-kind-sizes.js +36 -0
- package/server/lib/board-lanes.js +58 -0
- package/server/lib/board-obstacles.js +80 -0
- package/server/lib/board-relations.js +5 -1
- package/server/lib/board-sheets.js +467 -0
- package/server/lib/board-shelf.js +86 -0
- package/server/lib/board-transform.js +62 -0
- package/server/lib/canvas-id.js +18 -1
- package/server/lib/chalk-flow.js +88 -0
- package/server/lib/chalk-rewrite.js +63 -0
- package/server/lib/chalk-size-pref.js +48 -0
- package/server/lib/chalk.js +42 -3
- package/server/lib/ingress/forward-openai-chat.js +16 -4
- package/server/lib/ingress/openai-chat.js +23 -12
- package/server/lib/ingress/session-routes.js +3 -3
- package/server/lib/ingress/stream-watchdog.js +53 -0
- package/server/lib/ingress/upstream-billing.js +15 -0
- package/server/lib/ingress/upstream-error-hints.js +36 -0
- package/server/lib/json-preview.js +58 -0
- package/server/lib/model-ingress.js +26 -1
- package/server/lib/moderation.js +10 -5
- package/server/lib/quota.js +26 -6
- package/server/lib/rect.js +50 -0
- package/server/lib/screen.js +36 -0
- package/server/lib/sheet-state.js +19 -0
- package/server/lib/sketch-array.js +118 -0
- package/server/lib/sketch-hatch.js +99 -0
- package/server/lib/sketch-layout.js +269 -69
- package/server/lib/sketch-shapes.js +152 -0
- package/server/lib/sketch-stencils.js +170 -0
- package/server/lib/state-table.js +237 -0
- package/server/lib/state-trend.js +94 -0
- package/server/lib/state-triggers.js +199 -0
- package/server/lib/tavern-json.js +48 -0
- package/server/lib/user-uploads.js +88 -0
- package/server/projects/board-limits.js +5 -3
- package/server/projects/board-sanitize.js +220 -10
- package/server/projects/board-store.js +95 -6
- package/server/projects/session-jsonl.js +110 -0
- package/server/projects/store.js +56 -3
- package/server/projects/viewpoint-store.js +35 -3
- package/server/projects/workspace-slots.js +30 -0
- package/server/projects/workspace-templates.js +29 -0
- package/server/projects/workspace.js +16 -17
- package/server/runtime/capabilities.js +6 -2
- package/server/shared/locales.js +70 -0
- package/server/shared/messages-en.js +69 -0
- package/server/shared/messages.js +65 -0
- package/server/ws/broker.js +3 -0
- package/server/ws/index.js +43 -3
- package/web/README.md +1 -1
- package/web/dist/assets/{BrowserWindow-BoOBaIyz.js → BrowserWindow-CcaGRWz5.js} +1 -1
- package/web/dist/assets/DeckWindow-BIr2KGFT.js +6 -0
- package/web/dist/assets/{DocxWindow-B_u6aX9o.js → DocxWindow-B9KZmU5z.js} +2 -2
- package/web/dist/assets/{MermaidBlock-BO-46Du5.js → MermaidBlock-DrfRnz8E.js} +43 -43
- package/web/dist/assets/{SiteWindow-ConPmzdM.js → SiteWindow-CJOjCF7d.js} +6 -6
- package/web/dist/assets/{abnfDiagram-VCTEODGH-FCO9yf-n.js → abnfDiagram-VCTEODGH-CUZbQGIg.js} +1 -1
- package/web/dist/assets/{arc-BLcEOSRX.js → arc-C1-HSUny.js} +1 -1
- package/web/dist/assets/{architectureDiagram-5GKGNRK7-kxiX4TeN.js → architectureDiagram-5GKGNRK7-B5nwvu60.js} +2 -2
- package/web/dist/assets/{blockDiagram-NRAW4CY4-CptFksix.js → blockDiagram-NRAW4CY4-uPPuFLwR.js} +1 -1
- package/web/dist/assets/{c4Diagram-UCG6FXSJ-Dxmxj34F.js → c4Diagram-UCG6FXSJ-C0mKBFlz.js} +1 -1
- package/web/dist/assets/channel-BxpWNOGU.js +1 -0
- package/web/dist/assets/{chunk-2Q5K7J3B-D9inx5oo.js → chunk-2Q5K7J3B-Cs0rlZ4q.js} +1 -1
- package/web/dist/assets/{chunk-5VM5RSS4-DydfHlEc.js → chunk-5VM5RSS4-DtR63oYb.js} +1 -1
- package/web/dist/assets/{chunk-F27PBJKO-BO7GxhSv.js → chunk-F27PBJKO-B3MRdezJ.js} +1 -1
- package/web/dist/assets/{chunk-G27WJ6UU-BzP6YiQ_.js → chunk-G27WJ6UU-BtwntwpS.js} +1 -1
- package/web/dist/assets/{chunk-JWPE2WC7-CHcgcd0s.js → chunk-JWPE2WC7-BHsTe5PD.js} +1 -1
- package/web/dist/assets/{chunk-LCL6LL3I-D2Wg5JtX.js → chunk-LCL6LL3I-knY15Qdm.js} +1 -1
- package/web/dist/assets/{chunk-POPQ4Y6H-B2fCRfpM.js → chunk-POPQ4Y6H-C51tgK_I.js} +1 -1
- package/web/dist/assets/{chunk-SVP7TREG-JSLcsRlZ.js → chunk-SVP7TREG-CnwRZmF_.js} +1 -1
- package/web/dist/assets/{chunk-XXDRQBXY-BCjvaeHm.js → chunk-XXDRQBXY-BtXzVF-_.js} +1 -1
- package/web/dist/assets/classDiagram-DTDB5LWJ-DUEKmDfo.js +1 -0
- package/web/dist/assets/classDiagram-v2-JRS7N3AN-DUEKmDfo.js +1 -0
- package/web/dist/assets/{cose-bilkent-JH36ORCC-0uKv6oJ7.js → cose-bilkent-JH36ORCC-CzWlGP6i.js} +1 -1
- package/web/dist/assets/{cynefin-OW5HDTMX-Bvt-gEmA.js → cynefin-OW5HDTMX-vK64EGSv.js} +1 -1
- package/web/dist/assets/{cynefinDiagram-5FMLGOSQ-C9Ht02qC.js → cynefinDiagram-5FMLGOSQ-Bs3g1Gvh.js} +1 -1
- package/web/dist/assets/{dagre-3AP2YEHR-BfxZny4s.js → dagre-3AP2YEHR-BhgkYe8V.js} +1 -1
- package/web/dist/assets/{diagram-S7CK7UJ4-CrE0ZETE.js → diagram-S7CK7UJ4-C_6mvD2V.js} +1 -1
- package/web/dist/assets/{diagram-UQ7AKVKN-BO8VQ4Fx.js → diagram-UQ7AKVKN-qW7tssUW.js} +1 -1
- package/web/dist/assets/{diagram-VSXAHHWV-CHUZnR9F.js → diagram-VSXAHHWV-txJPHpvG.js} +1 -1
- package/web/dist/assets/{diagram-VX7I27RA-DYQAz1Vu.js → diagram-VX7I27RA-CQTMsCnL.js} +1 -1
- package/web/dist/assets/{diagram-Z3DM3KII-BDjivgLr.js → diagram-Z3DM3KII--cb1hoE6.js} +1 -1
- package/web/dist/assets/{ebnfDiagram-PWID7BFC-Bpe_QVbH.js → ebnfDiagram-PWID7BFC-Da6lDU77.js} +1 -1
- package/web/dist/assets/{erDiagram-SSCWMZ5O-BxhwuAu1.js → erDiagram-SSCWMZ5O-DGCMrsQn.js} +1 -1
- package/web/dist/assets/{flowDiagram-A5DVABFB-CCw2H08-.js → flowDiagram-A5DVABFB-GdOL_qno.js} +1 -1
- package/web/dist/assets/{ganttDiagram-EL5Y4UJY-DtTc7MyI.js → ganttDiagram-EL5Y4UJY-Cx1F_jBK.js} +4 -4
- package/web/dist/assets/{gitGraphDiagram-WWUBYQGX-BvORxMd2.js → gitGraphDiagram-WWUBYQGX-B5_6JhR3.js} +1 -1
- package/web/dist/assets/hand-CuvZZQGW.webp +0 -0
- package/web/dist/assets/index-BYKfMnmv.js +2759 -0
- package/web/dist/assets/index-CW7VsrVg.css +1 -0
- package/web/dist/assets/{infoDiagram-RXCK75RN-DMcrkypD.js → infoDiagram-RXCK75RN-CjvKpSPA.js} +1 -1
- package/web/dist/assets/{ishikawaDiagram-5VMMS53U-CZkTIbe-.js → ishikawaDiagram-5VMMS53U-CxLoAPhx.js} +1 -1
- package/web/dist/assets/{journeyDiagram-EYS64GPL-DR0XazdE.js → journeyDiagram-EYS64GPL-BfvS1upJ.js} +1 -1
- package/web/dist/assets/{kanban-definition-3QL26DDD-DN8VbwVu.js → kanban-definition-3QL26DDD-DKPPu0w4.js} +1 -1
- package/web/dist/assets/{layout-9_paCbyt.js → layout-Dhgck-Zo.js} +1 -1
- package/web/dist/assets/{linear-g6Ct012e.js → linear-DMSQ-aUw.js} +1 -1
- package/web/dist/assets/lxgw-nd-app-bold-D1pKA1bR.woff2 +0 -0
- package/web/dist/assets/lxgw-nd-app-regular-BDe3d26v.woff2 +0 -0
- package/web/dist/assets/lxgw-nd-bold-Bufvlg03.woff2 +0 -0
- package/web/dist/assets/lxgw-nd-regular-DQwoI4OP.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-100-DLPe7tEt.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-101-d3VsZKWT.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-102-ClzJuLq6.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-103-DuDnQ6K-.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-104-kPGW3Eem.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-105-BzD54h-0.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-106-BQ7fIzlx.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-107-D8tDfFHI.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-108-tGhkpwep.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-109-7SMVSrly.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-110-_uDKrFed.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-111-Bio825RE.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-112-D2ee0i-C.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-113-JPFVDrga.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-114-BcfxYA4w.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-115-B1HeeOsd.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-116-hY12tXpq.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-117-BvuZwmre.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-118-tzvs_H7j.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-119-J2DWuYDN.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-21-pDubCJV5.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-22-ChAPMpqp.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-23-BBx3oNpT.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-24-CYt-Oagk.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-25-Cx3j-ZUv.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-26-B9AfZ3LL.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-27-Bh2s9MNE.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-28-C02JPoKP.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-29-T_tbUGhk.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-30-DMfyNzhz.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-31-DFfdzbkg.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-32-Bs1fz2iW.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-33-cpB96OkZ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-34-BhinPYWX.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-35-D_njRQqA.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-36-DqXlLE3t.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-37-j5LbvMph.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-38-oO4jWdKm.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-39-CabsX4rw.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-4-PatS3YHh.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-40-yrLg3C3e.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-41-DBXmCQhc.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-42-Bqij_UiQ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-43-D3kp0Ntc.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-44-B_BNGvK4.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-45-CZc0cQWs.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-46-CHQX5Kd9.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-47-Ci8gLrHA.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-48-run3ugD3.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-49-DgfiUb6u.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-5-B0CtGbX_.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-50-CdCG-POr.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-51-L2okeQZ2.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-52-BZAqyGJW.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-53-B0xWqLeU.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-54-BZVQX-EA.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-55-093mkIUJ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-56-CbhWG8G-.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-57-pLQuvo6c.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-58-BHhoY50x.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-59-D1_6DuIQ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-6-BnAelmYU.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-60-HDBIuLTZ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-61-C-c13SeU.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-62-kHRVOhZ2.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-63-C0MCsvFv.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-64-DZekguCj.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-65-CtP6c3IU.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-66-DLVWoMSf.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-67-BVuOnayH.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-68-DpxQ6Mnx.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-69-qesBxLmC.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-70-BBt1xN7h.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-71-BWqZacwB.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-72-B1wP_Yst.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-73-C99T7jNZ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-74-DrUTsWBe.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-75-C4M5XXQe.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-76-Bq8spVWF.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-77-D9vNupE2.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-78-D6th7Gnu.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-79-bezM85cS.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-80-DD8pnhG2.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-81-N6jtSyBs.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-82-D6c180bZ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-83-em17AadM.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-84-CJ8gdrMK.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-85-9PPGO1eB.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-86-CjWPf-u5.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-87-8D_X_yOC.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-88-9vtKFPBx.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-89-BhE5jAKX.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-90-D2Npfm5E.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-91-C6Ft1-Eu.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-97-CaExyQP9.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-98-CPoVbsUd.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-99-ZUQZGVgH.woff2 +0 -0
- package/web/dist/assets/{mindmap-definition-FBJOCRG2-BGt4omYC.js → mindmap-definition-FBJOCRG2-CalfL_Kn.js} +1 -1
- package/web/dist/assets/{pegDiagram-XKGWAZYB-uSfS-PBE.js → pegDiagram-XKGWAZYB-D9mVWz7l.js} +1 -1
- package/web/dist/assets/pending-edit-apply-kwMFWsUe.js +31 -0
- package/web/dist/assets/{pieDiagram-E7YTZNPT-DpeI935H.js → pieDiagram-E7YTZNPT-DELzbZNS.js} +1 -1
- package/web/dist/assets/{quadrantDiagram-AXDQQJYC-B7IuNvWa.js → quadrantDiagram-AXDQQJYC-TZqp4mfA.js} +1 -1
- package/web/dist/assets/{railroadDiagram-O6MQD6OU-ARzYpPQI.js → railroadDiagram-O6MQD6OU-DxX59f0i.js} +1 -1
- package/web/dist/assets/{requirementDiagram-EFPCY7ZU-Cj4upkAo.js → requirementDiagram-EFPCY7ZU-DFdsJLIe.js} +1 -1
- package/web/dist/assets/{rotate-cw-CXJcyHWk.js → rotate-cw-62liz7LX.js} +1 -1
- package/web/dist/assets/{sankeyDiagram-P5KCCOFB-OaVwSnLP.js → sankeyDiagram-P5KCCOFB-ByYcd3fG.js} +1 -1
- package/web/dist/assets/{sequenceDiagram-WJ2MYXX4-1yrUbq4t.js → sequenceDiagram-WJ2MYXX4-Bj-ml1jS.js} +1 -1
- package/web/dist/assets/{sizeCapture-X5ZJPWSS-nYH5p9D6.js → sizeCapture-X5ZJPWSS-KhsXThyD.js} +1 -1
- package/web/dist/assets/{square-dashed-mouse-pointer-CTtTVKoH.js → square-dashed-mouse-pointer-D_VrqVpy.js} +1 -1
- package/web/dist/assets/{stateDiagram-HBIQ2CUA-Dj5HvyNq.js → stateDiagram-HBIQ2CUA-BJlpHfWU.js} +1 -1
- package/web/dist/assets/stateDiagram-v2-4QOOHH4V-CR2kYAH2.js +1 -0
- package/web/dist/assets/{swimlanes-XN3QIQJK-umeT0HpB.js → swimlanes-XN3QIQJK-DUB9OJVs.js} +1 -1
- package/web/dist/assets/swimlanesDiagram-VK2B7HYN-BitOxnG2.js +8 -0
- package/web/dist/assets/{timeline-definition-24CTP7MA-MqnQfHKB.js → timeline-definition-24CTP7MA-C03NX82A.js} +1 -1
- package/web/dist/assets/{vennDiagram-4TSXK5OY-b2liyZra.js → vennDiagram-4TSXK5OY-B9pjzngp.js} +1 -1
- package/web/dist/assets/{wardleyDiagram-VM6X3IG4-QMK-zNh1.js → wardleyDiagram-VM6X3IG4-UqWq_mcT.js} +1 -1
- package/web/dist/assets/{xychartDiagram-S5SC5T6Z-D5Mc6tfA.js → xychartDiagram-S5SC5T6Z-D2pDKtOv.js} +1 -1
- package/web/dist/index.html +2 -2
- package/server/engine/mcp/tools/arrange-on-board.js +0 -126
- package/server/engine/mcp/tools/create-on-board.js +0 -152
- package/server/engine/mcp/tools/edit-sketch.js +0 -167
- package/server/engine/mcp/tools/relate-on-board.js +0 -150
- package/server/engine/mcp/tools/sketch-on-board.js +0 -345
- package/server/engine/plugins/nodesign/skills/rp-craft/SKILL.md +0 -235
- 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
- package/server/engine/plugins/nodesign/skills/rp-craft//346/274/224/345/207/272.template.js +0 -268
- package/web/dist/assets/DeckWindow-Bg3rgkvi.js +0 -11
- package/web/dist/assets/channel-DFyiuGL0.js +0 -1
- package/web/dist/assets/classDiagram-DTDB5LWJ-Aw1f8z-b.js +0 -1
- package/web/dist/assets/classDiagram-v2-JRS7N3AN-Aw1f8z-b.js +0 -1
- package/web/dist/assets/index-C0KUf6Wd.css +0 -1
- package/web/dist/assets/index-DGG5wIZs.js +0 -2118
- 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-uP4uvrOD.js +0 -31
- package/web/dist/assets/stateDiagram-v2-4QOOHH4V-kJ1m_zJT.js +0 -1
- 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
|
-
|
|
5
|
+
> **哪里错了圈哪里。生成、检查、反馈和修改,全程不离开同一张无限画布。**
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
[](https://www.npmjs.com/package/@xiaobuyu/nodesign)
|
|
8
|
+
[](https://www.npmjs.com/package/@xiaobuyu/nodesign)
|
|
9
|
+
[](https://github.com/Xiaokebuyu/Nodesign/blob/main/LICENSE)
|
|
8
10
|
|
|
9
|
-
|
|
11
|
+
NoDesign 是一张以真实文件为底座的 Agent Native 创作工作台。
|
|
12
|
+
|
|
13
|
+
告诉 Agent 你想做什么,它会在画布上创建网站、演示稿、Word 文档、图片和视频。你可以留在同一张画布上检查结果;发现哪里不满意,直接圈选、评论,或者在产物旁边发起讨论。
|
|
14
|
+
|
|
15
|
+
你当前的视觉焦点、选中对象及其组件信息会随消息一起交给 Agent。它会理解你说的“这里”究竟是什么,修改背后的真实文件,再回到画布继续检查。
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
提出需求 → Agent 生成 → 画布检查 → 圈选反馈
|
|
19
|
+
→ 修改真实文件 → Agent 自检 → 原地继续
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+

|
|
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
|
-
|
|
36
|
+
启动后配置至少一种模型接入方式:
|
|
18
37
|
|
|
19
38
|
- Claude 订阅或 Anthropic API
|
|
20
39
|
- OpenAI、DeepSeek、智谱、通义、OpenRouter
|
|
21
40
|
- Ollama 或其他兼容 OpenAI API 格式的模型服务
|
|
22
41
|
|
|
23
|
-
NoDesign
|
|
42
|
+
NoDesign 本身不收取订阅费,也不对模型调用加价。
|
|
24
43
|
|
|
25
|
-
|
|
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
|
-
|
|
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
|
-
|
|
58
|
+
很多时候,问题并不是模型不会修改,而是它不知道你说的“这里”究竟是哪里。
|
|
48
59
|
|
|
49
|
-
|
|
60
|
+
在 NoDesign 中,你可以:
|
|
50
61
|
|
|
51
|
-
|
|
62
|
+
- 双击修改文字;
|
|
63
|
+
- 圈选一块区域并留下评论;
|
|
64
|
+
- 拖动和整理画布元素;
|
|
65
|
+
- 在不同内容之间建立「参考」「批注」「接着做」等关系;
|
|
66
|
+
- 在正在检查的产物旁边直接唤出 Agent。
|
|
52
67
|
|
|
53
|
-
|
|
68
|
+
当前视野、选中的目标、附近内容以及目标涉及的组件信息,会被整理为下一轮任务的上下文。
|
|
54
69
|
|
|
55
|
-
|
|
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
|
+

|
|
96
|
+
|
|
97
|
+
如果连续修改后结果仍不理想,Agent 还可以邀请一个只读评审子代理,从第三方视角逐页检查问题。评审角色只负责找出缺陷,不会直接修改文件。
|
|
98
|
+
|
|
99
|
+
### 画布上的内容对应真实文件
|
|
100
|
+
|
|
101
|
+
画布不是文件的终点。
|
|
102
|
+
|
|
103
|
+
画布上的文件卡片对应磁盘中的真实文件,文件夹卡片对应真实目录。打开、重命名、归类和移动文件等操作会同步到项目工作区。
|
|
60
104
|
|
|
61
105
|

|
|
62
106
|
|
|
63
|
-
|
|
107
|
+
Agent 生成的网站、演示稿、Word 文档、图片和视频不会被锁在 NoDesign 的私有格式里。你可以:
|
|
64
108
|
|
|
65
|
-
|
|
109
|
+
- 在画布上继续检查和批注;
|
|
110
|
+
- 下载原始文件;
|
|
111
|
+
- 使用其他软件继续编辑;
|
|
112
|
+
- 修改文件后再交给 Agent 接着处理;
|
|
113
|
+
- 将项目发布或交付给其他人。
|
|
66
114
|
|
|
67
|
-
|
|
115
|
+
画布是一张连接文件、上下文和 Agent 的工作桌,而不是一个只能展示生成结果的容器。
|
|
68
116
|
|
|
69
|
-
|
|
117
|
+
### 不同产物可以在同一张画布上接着做
|
|
70
118
|
|
|
71
|
-
|
|
119
|
+
网站、演示稿、文档、图片、视频和参考资料可以同时摊在一张画布上,由同一个 Agent 连续处理。
|
|
72
120
|
|
|
73
|
-
|
|
121
|
+
例如,你可以:
|
|
74
122
|
|
|
75
|
-
|
|
123
|
+
1. 让 Agent 调研一个主题;
|
|
124
|
+
2. 将调研结果整理成 Word 文档;
|
|
125
|
+
3. 根据文档生成演示稿;
|
|
126
|
+
4. 从演示稿中提取宣传长图;
|
|
127
|
+
5. 根据同一批素材制作配套站点;
|
|
128
|
+
6. 圈出不满意的部分,让 Agent 原地修改。
|
|
76
129
|
|
|
77
|
-
|
|
130
|
+
Agent 可以掌握这些文件在项目中的位置,并在不同产物之间继续取材和工作,不必每换一种工具就重新解释项目背景。
|
|
78
131
|
|
|
79
|
-
|
|
132
|
+

|
|
80
133
|
|
|
81
|
-
|
|
134
|
+
### Agent 也可以自己寻找和分析参考
|
|
82
135
|
|
|
83
|
-
|
|
136
|
+
Agent 拥有自己的浏览器。你可以把一个网址交给它,也可以让它自己寻找参考内容。
|
|
84
137
|
|
|
85
|
-
|
|
138
|
+
它能够:
|
|
86
139
|
|
|
87
|
-
|
|
140
|
+
- 浏览和截图网页;
|
|
141
|
+
- 分析页面布局、配色和字体;
|
|
142
|
+
- 观察页面的内容分区;
|
|
143
|
+
- 检查滚动触发的动画与交互;
|
|
144
|
+
- 将有用的截图和素材放入当前项目;
|
|
145
|
+
- 根据参考内容继续生成站点、演示稿或其他产物。
|
|
146
|
+
|
|
147
|
+
在本地版中,浏览器可以保留登录状态。遇到验证码、登录确认或其他需要人工处理的步骤时,Agent 会暂停并请求你接管;处理完成后,它可以继续原来的任务。
|
|
148
|
+
|
|
149
|
+
### 思考过程也可以留在画布上
|
|
150
|
+
|
|
151
|
+
Agent 不只把最终产物放到画布上,也可以把中间思考过程摆出来。
|
|
152
|
+
|
|
153
|
+
它会画草图、写板书、在相关内容之间建立连接,说明自己的计划,或者把复杂问题拆成可以继续讨论的部分。
|
|
154
|
+
|
|
155
|
+

|
|
156
|
+
|
|
157
|
+
板书本身也是真实文件,保存在项目的 `notes/板书/` 目录中。草图节点、连接线和板书文字都可以手动调整;修改之后,Agent 会继续使用更新后的内容。
|
|
158
|
+
|
|
159
|
+

|
|
160
|
+
|
|
161
|
+
项目决策、风格记录和个人偏好不必只藏在聊天历史里。它们可以作为可见、可编辑的内容保留在工作区,也可以进一步沉淀成可复用的 Skill。
|
|
162
|
+
|
|
163
|
+
> 正在开发:将更多头脑风暴与对话分支迁移到画布。完成后,可以从不同阶段和节点继续提问、延伸或比较方案,而不必在一条越来越长的聊天记录中来回翻找。
|
|
164
|
+
|
|
165
|
+
## 它能帮你做什么
|
|
88
166
|
|
|
89
|
-
###
|
|
167
|
+
### 三个典型场景
|
|
90
168
|
|
|
91
|
-
|
|
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
|
+

|
|
189
|
+
|
|
190
|
+

|
|
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
|
-
| 模型 |
|
|
212
|
+
| 模型 | 自行配置 Claude 订阅、API Key 或兼容 OpenAI API 格式的模型服务 | 免费模型,每日额度 |
|
|
98
213
|
| 数据 | 保存在 `~/.nodesign/`,服务仅监听 `127.0.0.1` | 服务端存储,按用户隔离 |
|
|
99
214
|
| 账号 | 无需账号,打开即可使用 | 公开注册 |
|
|
100
|
-
| 能力 |
|
|
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
|
-
|
|
110
|
-
- **本机能力**:启动时自动探测 git、Chromium、LibreOffice、poppler、ffmpeg、rembg、生图、搜索、发布能力。缺少的会标出安装方法,对应工具会明确显示为不可用,并附上安装说明。
|
|
111
|
-
- **其他设置**:搜索(四家任选一)、生图通道、Cloudflare 发布、沙盒与权限模式。
|
|
112
|
-
- **状态**:数据目录、配置文件路径、重启。
|
|
241
|
+
### 本机能力
|
|
113
242
|
|
|
114
|
-
|
|
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
|
-
|
|
278
|
+
每个项目都使用独立的工作区目录。本地数据默认保存在 `~/.nodesign/`,服务仅监听 `127.0.0.1`。
|
|
119
279
|
|
|
120
280
|
在支持的平台上,可以启用系统级命令沙盒:
|
|
121
281
|
|
|
@@ -125,21 +285,39 @@ Agent 不只是把做完的产物放上画布,也把想法放上去。它会
|
|
|
125
285
|
|
|
126
286
|
还可以启用自动权限检查,对文件上传、外部请求和其他敏感操作进行额外判断。
|
|
127
287
|
|
|
128
|
-
|
|
288
|
+
本地版默认不启用命令沙盒和自动权限检查,请根据自己的使用场景决定是否开启。
|
|
289
|
+
|
|
290
|
+
在 Windows 上,建议只打开你信任的项目,并在 Agent 执行以下操作前确认它的计划:
|
|
291
|
+
|
|
292
|
+
- 修改工作区外的文件;
|
|
293
|
+
- 安装软件或依赖;
|
|
294
|
+
- 上传本地内容;
|
|
295
|
+
- 执行其他可能影响系统环境的操作。
|
|
129
296
|
|
|
130
297
|
## 项目状态
|
|
131
298
|
|
|
132
|
-
|
|
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 文档 |
|
|
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
|
-
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
-
|
|
160
|
-
|
|
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 合计
|
|
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.
|
|
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.
|
|
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",
|
package/server/api/admin.js
CHANGED
|
@@ -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;
|