@xiaobuyu/nodesign 0.0.6 → 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 +26 -0
- package/server/api/assets/notes.js +50 -0
- package/server/api/assets.js +31 -38
- 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/instruction.js +3 -3
- 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 +18 -1
- package/server/engine/agent/hooks/beat-gate.js +73 -0
- package/server/engine/agent/hooks/failure.js +11 -1
- package/server/engine/agent/hooks/lifecycle.js +16 -41
- package/server/engine/agent/hooks/post-guidance.js +4 -38
- 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 +208 -47
- package/server/engine/agent/hooks.js +80 -14
- package/server/engine/agent/isolation.js +25 -2
- package/server/engine/agent/memory-config.js +87 -0
- 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 +579 -70
- package/server/engine/agent/prompts/tools/direct-edit-protocol.md +1 -1
- package/server/engine/agent/prompts/tools/generate-image-cookbook.md +26 -9
- package/server/engine/agent/prompts/tools/paint-still-cookbook.md +1 -1
- package/server/engine/agent/prompts/tools/site-reference.md +15 -4
- 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 +55 -32
- 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/agents/explorer.md +1 -1
- package/server/engine/agents/index.js +1 -1
- package/server/engine/mcp/actor.js +59 -0
- package/server/engine/mcp/capability-gate.js +21 -2
- package/server/engine/mcp/index.js +118 -33
- 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-computer.js +2 -1
- package/server/engine/mcp/tools/browse-find-batch.js +95 -16
- package/server/engine/mcp/tools/browse.js +25 -3
- package/server/engine/mcp/tools/cast-role.js +167 -0
- package/server/engine/mcp/tools/crystallize-skill.js +1 -1
- 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/generate-image.js +50 -70
- package/server/engine/mcp/tools/helpers/codex-imagegen.js +139 -0
- package/server/engine/mcp/tools/helpers/rembg.js +7 -2
- package/server/engine/mcp/tools/helpers/shot-pipeline.js +109 -0
- package/server/engine/mcp/tools/list-pages.js +11 -5
- 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 +45 -6
- package/server/engine/mcp/tools/paint-still.js +1 -1
- package/server/engine/mcp/tools/pin-to-board.js +103 -19
- package/server/engine/mcp/tools/read-board.js +123 -16
- package/server/engine/mcp/tools/read-tavern-json.js +87 -19
- package/server/engine/mcp/tools/report-issue.js +15 -7
- 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 +19 -9
- 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 +12 -16
- 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 +568 -99
- package/server/engine/plugins/nodesign/skills/blackboard-rp/SKILL.md +215 -0
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/SKILL.md +14 -7
- package/server/engine/plugins/nodesign/skills/docx-craft/SKILL.md +44 -5
- package/server/engine/plugins/nodesign/skills/docx-craft/references/token-schema.md +16 -0
- package/server/engine/plugins/nodesign/skills/site-craft/SKILL.md +24 -8
- 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 -2
- package/server/lib/artifact-target.js +31 -14
- 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 +38 -3
- 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 +46 -4
- 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/export-collect.js +3 -1
- 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/issues-store.js +3 -1
- package/server/lib/json-preview.js +58 -0
- package/server/lib/kinds/docx.js +11 -4
- package/server/lib/kinds/index.js +6 -16
- package/server/lib/kinds/site.js +40 -7
- 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/rewrite-refs.js +110 -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/ssrf-guard.js +9 -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/task-scan.js +18 -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 +137 -7
- package/server/projects/memory-migration.js +85 -0
- package/server/projects/move-entry.js +11 -1
- package/server/projects/session-jsonl.js +110 -0
- package/server/projects/store.js +56 -3
- package/server/projects/ui-config.js +2 -1
- package/server/projects/viewpoint-store.js +35 -3
- package/server/projects/workspace-slots.js +30 -0
- package/server/projects/workspace-templates.js +42 -10
- package/server/projects/workspace.js +25 -26
- package/server/runtime/capabilities.js +6 -2
- package/server/services/rembg-launcher.js +5 -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-P_vIdh-G.js → BrowserWindow-CcaGRWz5.js} +1 -1
- package/web/dist/assets/DeckWindow-BIr2KGFT.js +6 -0
- package/web/dist/assets/{DocxWindow-DSAU1-tD.js → DocxWindow-B9KZmU5z.js} +2 -2
- package/web/dist/assets/{MermaidBlock-DR1GikCv.js → MermaidBlock-DrfRnz8E.js} +43 -43
- package/web/dist/assets/{SiteWindow-92uBuRRR.js → SiteWindow-CJOjCF7d.js} +6 -6
- package/web/dist/assets/{abnfDiagram-VCTEODGH-uA8Esix4.js → abnfDiagram-VCTEODGH-CUZbQGIg.js} +1 -1
- package/web/dist/assets/{arc-D_khH_xN.js → arc-C1-HSUny.js} +1 -1
- package/web/dist/assets/{architectureDiagram-5GKGNRK7-DydJHqOt.js → architectureDiagram-5GKGNRK7-B5nwvu60.js} +2 -2
- package/web/dist/assets/{blockDiagram-NRAW4CY4-B7wBbKiW.js → blockDiagram-NRAW4CY4-uPPuFLwR.js} +1 -1
- package/web/dist/assets/{c4Diagram-UCG6FXSJ-6mrH0x7Y.js → c4Diagram-UCG6FXSJ-C0mKBFlz.js} +1 -1
- package/web/dist/assets/channel-BxpWNOGU.js +1 -0
- package/web/dist/assets/{chunk-2Q5K7J3B-Cuikho5Q.js → chunk-2Q5K7J3B-Cs0rlZ4q.js} +1 -1
- package/web/dist/assets/{chunk-5VM5RSS4-3-KZ5AUz.js → chunk-5VM5RSS4-DtR63oYb.js} +1 -1
- package/web/dist/assets/{chunk-F27PBJKO-Bkwq2gGU.js → chunk-F27PBJKO-B3MRdezJ.js} +1 -1
- package/web/dist/assets/{chunk-G27WJ6UU-BLyQzdGE.js → chunk-G27WJ6UU-BtwntwpS.js} +1 -1
- package/web/dist/assets/{chunk-JWPE2WC7-B7HxxQds.js → chunk-JWPE2WC7-BHsTe5PD.js} +1 -1
- package/web/dist/assets/{chunk-LCL6LL3I-CtXrnUwF.js → chunk-LCL6LL3I-knY15Qdm.js} +1 -1
- package/web/dist/assets/{chunk-POPQ4Y6H-dxddZlXt.js → chunk-POPQ4Y6H-C51tgK_I.js} +1 -1
- package/web/dist/assets/{chunk-SVP7TREG-DpkmrgHn.js → chunk-SVP7TREG-CnwRZmF_.js} +1 -1
- package/web/dist/assets/{chunk-XXDRQBXY-BwZ7RbpQ.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-DGFOsMUt.js → cose-bilkent-JH36ORCC-CzWlGP6i.js} +1 -1
- package/web/dist/assets/{cynefin-OW5HDTMX-DUwn3ehS.js → cynefin-OW5HDTMX-vK64EGSv.js} +1 -1
- package/web/dist/assets/{cynefinDiagram-5FMLGOSQ-DlLAOZ9x.js → cynefinDiagram-5FMLGOSQ-Bs3g1Gvh.js} +1 -1
- package/web/dist/assets/{dagre-3AP2YEHR-CyourLfz.js → dagre-3AP2YEHR-BhgkYe8V.js} +1 -1
- package/web/dist/assets/{diagram-S7CK7UJ4-BTMbx2np.js → diagram-S7CK7UJ4-C_6mvD2V.js} +1 -1
- package/web/dist/assets/{diagram-UQ7AKVKN-UK94_1-P.js → diagram-UQ7AKVKN-qW7tssUW.js} +1 -1
- package/web/dist/assets/{diagram-VSXAHHWV-C7zS-v9v.js → diagram-VSXAHHWV-txJPHpvG.js} +1 -1
- package/web/dist/assets/{diagram-VX7I27RA-DKJRa6CK.js → diagram-VX7I27RA-CQTMsCnL.js} +1 -1
- package/web/dist/assets/{diagram-Z3DM3KII-kUbAfGAp.js → diagram-Z3DM3KII--cb1hoE6.js} +1 -1
- package/web/dist/assets/{ebnfDiagram-PWID7BFC-CVW16_vb.js → ebnfDiagram-PWID7BFC-Da6lDU77.js} +1 -1
- package/web/dist/assets/{erDiagram-SSCWMZ5O-BRQMFQ5y.js → erDiagram-SSCWMZ5O-DGCMrsQn.js} +1 -1
- package/web/dist/assets/{flowDiagram-A5DVABFB-S34LpLtK.js → flowDiagram-A5DVABFB-GdOL_qno.js} +1 -1
- package/web/dist/assets/{ganttDiagram-EL5Y4UJY-BFiqk1-G.js → ganttDiagram-EL5Y4UJY-Cx1F_jBK.js} +4 -4
- package/web/dist/assets/{gitGraphDiagram-WWUBYQGX-LZsrdyyv.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-0DvN6KIp.js → infoDiagram-RXCK75RN-CjvKpSPA.js} +1 -1
- package/web/dist/assets/{ishikawaDiagram-5VMMS53U-CaY3A-Bx.js → ishikawaDiagram-5VMMS53U-CxLoAPhx.js} +1 -1
- package/web/dist/assets/{journeyDiagram-EYS64GPL-BBeiaCrj.js → journeyDiagram-EYS64GPL-BfvS1upJ.js} +1 -1
- package/web/dist/assets/{kanban-definition-3QL26DDD-ux42DRXQ.js → kanban-definition-3QL26DDD-DKPPu0w4.js} +1 -1
- package/web/dist/assets/{layout-CnXiF_NB.js → layout-Dhgck-Zo.js} +1 -1
- package/web/dist/assets/{linear-BMW0u6G6.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-hUxSpdKn.js → mindmap-definition-FBJOCRG2-CalfL_Kn.js} +1 -1
- package/web/dist/assets/{pegDiagram-XKGWAZYB-aCaQPH0w.js → pegDiagram-XKGWAZYB-D9mVWz7l.js} +1 -1
- package/web/dist/assets/pending-edit-apply-kwMFWsUe.js +31 -0
- package/web/dist/assets/{pieDiagram-E7YTZNPT-CmOEZ8zg.js → pieDiagram-E7YTZNPT-DELzbZNS.js} +1 -1
- package/web/dist/assets/{quadrantDiagram-AXDQQJYC-VW6fAhsV.js → quadrantDiagram-AXDQQJYC-TZqp4mfA.js} +1 -1
- package/web/dist/assets/{railroadDiagram-O6MQD6OU-CKJ7Ba5K.js → railroadDiagram-O6MQD6OU-DxX59f0i.js} +1 -1
- package/web/dist/assets/{requirementDiagram-EFPCY7ZU-pNGkq9Vw.js → requirementDiagram-EFPCY7ZU-DFdsJLIe.js} +1 -1
- package/web/dist/assets/{rotate-cw-KAfChbGV.js → rotate-cw-62liz7LX.js} +1 -1
- package/web/dist/assets/{sankeyDiagram-P5KCCOFB-BIMmDTfZ.js → sankeyDiagram-P5KCCOFB-ByYcd3fG.js} +1 -1
- package/web/dist/assets/{sequenceDiagram-WJ2MYXX4-BBW7wzKY.js → sequenceDiagram-WJ2MYXX4-Bj-ml1jS.js} +1 -1
- package/web/dist/assets/{sizeCapture-X5ZJPWSS-DdkXmLYR.js → sizeCapture-X5ZJPWSS-KhsXThyD.js} +1 -1
- package/web/dist/assets/{square-dashed-mouse-pointer-CDUlhUP7.js → square-dashed-mouse-pointer-D_VrqVpy.js} +1 -1
- package/web/dist/assets/{stateDiagram-HBIQ2CUA-W313Uz16.js → stateDiagram-HBIQ2CUA-BJlpHfWU.js} +1 -1
- package/web/dist/assets/stateDiagram-v2-4QOOHH4V-CR2kYAH2.js +1 -0
- package/web/dist/assets/{swimlanes-XN3QIQJK-C29TL26K.js → swimlanes-XN3QIQJK-DUB9OJVs.js} +1 -1
- package/web/dist/assets/swimlanesDiagram-VK2B7HYN-BitOxnG2.js +8 -0
- package/web/dist/assets/{timeline-definition-24CTP7MA-CF0JMObX.js → timeline-definition-24CTP7MA-C03NX82A.js} +1 -1
- package/web/dist/assets/{vennDiagram-4TSXK5OY-DrDFsaH3.js → vennDiagram-4TSXK5OY-B9pjzngp.js} +1 -1
- package/web/dist/assets/{wardleyDiagram-VM6X3IG4-CVrnRIS_.js → wardleyDiagram-VM6X3IG4-UqWq_mcT.js} +1 -1
- package/web/dist/assets/{xychartDiagram-S5SC5T6Z-BvkN1zsT.js → xychartDiagram-S5SC5T6Z-D2pDKtOv.js} +1 -1
- package/web/dist/index.html +2 -2
- package/server/api/memory.js +0 -185
- package/server/engine/agent/prompts/tools/generate-image-cookbook.gemini-gateway.md +0 -583
- package/server/engine/mcp/tools/arrange-on-board.js +0 -124
- 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/record-decision.js +0 -140
- package/server/engine/mcp/tools/relate-on-board.js +0 -112
- package/server/engine/mcp/tools/sketch-on-board.js +0 -337
- 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-BpLv5082.js +0 -16
- package/web/dist/assets/channel-DGkccMO1.js +0 -1
- package/web/dist/assets/classDiagram-DTDB5LWJ-BGscw3OD.js +0 -1
- package/web/dist/assets/classDiagram-v2-JRS7N3AN-BGscw3OD.js +0 -1
- package/web/dist/assets/index-C0KUf6Wd.css +0 -1
- package/web/dist/assets/index-GAamh1p4.js +0 -2152
- 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-AcdOQ9Ij.js +0 -31
- package/web/dist/assets/stateDiagram-v2-4QOOHH4V-DDhJBZzf.js +0 -1
- package/web/dist/assets/swimlanesDiagram-VK2B7HYN-BfN-Xdmu.js +0 -8
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: blackboard-rp
|
|
3
|
+
version: 0.8.0
|
|
4
|
+
description: 黑板 RP 的**版面协议** —— 在画布上跑角色扮演/跑团时怎么排版面:章节板书连成竖直线程、一拍配一条选项板书、nd:controls 控件面板三档生命周期、状态表(`| 键 | 值 |` 一张表 + set_vars 改格,数字进 git 不进 board.json)、条件触发器(nd:triggers 围栏,条件成立那一拍自动提醒你)、状态板 follow 跟最新章、在场人物栏、明骰表、十几章后的前情归档。台上所有人的台词都由你写(见系统提示词「你一个人演全场」)。文风见 story-voice,剧情技法见 story-craft,酒馆卡/预设导入见 story-import。
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 黑板 RP 是什么
|
|
8
|
+
|
|
9
|
+
一场完全在画布上进行的角色扮演:正文直接落板书,状态住在板上,用户在板书上标注
|
|
10
|
+
来回应。这套**版面协议**来自一场真实 15 章会话的沉淀,照它跑能省掉一轮轮的试错。
|
|
11
|
+
|
|
12
|
+
**本 skill 只管版面。**分工按系统提示词的「你一个人演全场」节走:环境、情节、判定、
|
|
13
|
+
状态板、骰表,以及**台上每个人的台词**,全是你的笔(⛔ 这一版不派角色子代理)。
|
|
14
|
+
写谁的话之前先 Read 一遍他的 `角色/<名>/角色卡.md` 找回腔调。
|
|
15
|
+
|
|
16
|
+
隔壁三个包按需加载:**文风**→`story-voice`,**剧情技法/反公式/骰子判据**→`story-craft`,
|
|
17
|
+
**酒馆卡与预设导入**→`story-import`。
|
|
18
|
+
|
|
19
|
+
# 版面协议(六条,开场就按这个搭)
|
|
20
|
+
|
|
21
|
+
## 1. 章节是一条竖直线程
|
|
22
|
+
|
|
23
|
+
每拍正文一条板书:`write_on_board {text, tag:"章节", chain:true}` —— chain 自动接在
|
|
24
|
+
同 tag 上一条下面并画「接着」线,竖直往下长(纸 = 用户一屏)。**纸写满不会自动翻页** ——
|
|
25
|
+
排不下会被拒收,下一页你自己 `open_sheet` 规划。用户滚轮/翻纸就能回看整条故事。
|
|
26
|
+
⚠️ 串线程唯一正门是 chain(`near` 只画线不定位置,串不了线程)。
|
|
27
|
+
一拍别超过一屏;正文超过一个卡面(约 300 字)就**自己分段**:plan 里给每段开一个
|
|
28
|
+
空位(省掉 at 自动竖排),一段一条 write 填进去 —— 一段超了只拒那一段,不连坐。
|
|
29
|
+
现成长文(导入的文本)懒得手分时才用 `flow:true` 让机器按段落代拆。
|
|
30
|
+
|
|
31
|
+
## 2. 一拍 = 正文板书 + 选项板书
|
|
32
|
+
|
|
33
|
+
正文落完,紧跟一条选项板书(`reply_to` 本拍正文,同 tag),正文里用 nd:controls
|
|
34
|
+
围栏落成**真按钮**:
|
|
35
|
+
|
|
36
|
+
```nd:controls
|
|
37
|
+
supersede: 章节选项
|
|
38
|
+
- [A] 跟上去 -> 选A:跟上去,但保持距离
|
|
39
|
+
- [B] 留在原地 -> 选B:留下,观察修女的反应
|
|
40
|
+
- [继续] send
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
用户点选项是攒着(再点一次是取消,会真撤回队列)、点 [继续] 连同攒的一起进你下一轮
|
|
44
|
+
(消息形如【画布标注】板书「…」:选A…)。自由行动照旧走标注(在板书上写一句),
|
|
45
|
+
两条路都要在选项板书里提一句。选项写短、编号清楚。
|
|
46
|
+
**这不是第一拍的仪式,是每拍的义务**:玩家面前永远要有把手,他打出「接下来该怎么办」
|
|
47
|
+
就是你漏拍了。配方:一枚推进主线、一枚人际/私人、一枚剑走偏锋(合理但意想不到)。
|
|
48
|
+
⛔ 操作指引全走控件 —— 正文里不写「*(轮到谁…可以标注)*」式的括号舞台指令,
|
|
49
|
+
那每拍破一次第四墙。
|
|
50
|
+
`supersede: 章节选项` 那行是死期声明:下一拍的选项板一落,这拍的自动变灰 ——
|
|
51
|
+
每拍都写同一个组名,别的控件(背包/商店)不受影响。
|
|
52
|
+
|
|
53
|
+
## 2.5 控件不只是选项 —— 面板模式(发挥的地方)
|
|
54
|
+
|
|
55
|
+
nd:controls 是通用按钮:每枚 = 一条待发提示词。生命周期三档,按面板性质挑:
|
|
56
|
+
|
|
57
|
+
| 档 | 写法 | 给谁用 |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| 常设(默认) | 什么都不写 | 背包、商店、快捷动作 —— 全程要活着的 |
|
|
60
|
+
| 同组顶替 | `supersede: <组名>` | 章节选项、限时事件的当前一轮 |
|
|
61
|
+
| 定时 | `until: +30m` 或 ISO 时刻 | 倒计时抉择、限时商店 |
|
|
62
|
+
|
|
63
|
+
可以造的东西(都验证过语法,放开想):
|
|
64
|
+
- **背包面板**(常设,进状态板组跟着走):`- [用药水] -> 使用一瓶治疗药水`
|
|
65
|
+
- **商店**(进城落一张、离城 edit_board remove):`- [买长剑] 30金 -> 购买长剑`
|
|
66
|
+
- **快捷指令条**(常设):`- [骰] 我要主动检定 -> 我想对当前局面做一次主动检定,你定技能和DC`、
|
|
67
|
+
`- [问] OOC提问 -> (OOC)`
|
|
68
|
+
- **限时抉择**:`until: +10m` + 正文写明倒计时后果
|
|
69
|
+
|
|
70
|
+
更新面板内容用 `edit_board set_text` 改那条板书(板书文件也认 —— 重写正文、
|
|
71
|
+
重算尺寸、线和标注全保留;只能改**自己写的**)。面板要跟着剧情走就归进 状态板 组吃
|
|
72
|
+
follow。**别把十个面板同时铺满** —— 常设面板 2~3 个(背包+快捷条)为宜,
|
|
73
|
+
场景性的(商店)用完就收。
|
|
74
|
+
|
|
75
|
+
## 3. 状态:数字住一张表,表住一条板书
|
|
76
|
+
|
|
77
|
+
⚠️ **2026-08-30 改了写法。**以前状态板是 `nodes:[PC卡, 当前场景, 明骰表]` 一组画布
|
|
78
|
+
节点 —— 那条路把字存进 `board.json`,而 `board.json` 在 gitignore 里:**用户回滚
|
|
79
|
+
项目时正文退回旧章、数字却停在新值**,agent 也 Read 不到那些字。现在分两件:
|
|
80
|
+
|
|
81
|
+
### ① 状态表(数字的家,一条独立板书)
|
|
82
|
+
|
|
83
|
+
开场落一条**独立的 chalk 板书**,`tag` 就叫 `状态表`,正文里一张两列表:
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
write_on_board {
|
|
87
|
+
text: "## 状态\n\n| 键 | 值 |\n| --- | --- |\n| 好感度_苏绵 | 3 |\n| 时间 | 戌时 |\n| 体力 | 8/10 |",
|
|
88
|
+
tag: "状态表", slot: "aside", staging: false
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
⛔ **必须用 `text:` 不能用 `nodes:`** —— `text` 才落成 `notes/板书/*.md` 文件
|
|
93
|
+
(进 git、用户能改、agent 能 Read、服务端能解析);`nodes` 落的是画布原生节点。
|
|
94
|
+
⚠️ 给它划版位时留实数:一张带触发器围栏的状态表**约 500px 高**(真会话里给 460
|
|
95
|
+
被当场拒收)—— 开小了用 `edit_board replan` 调高,别废掉整页。
|
|
96
|
+
|
|
97
|
+
**这条板书全场只能有一条。**服务端按 `tag: 状态表` 找它,找到两条就拒绝写入并
|
|
98
|
+
点名两个路径 —— 它不猜该改哪一条。
|
|
99
|
+
|
|
100
|
+
**每拍改数字用 `set_vars`**:
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
set_vars { vars: { "好感度_苏绵": 5, "时间": "亥时" } }
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
它**只改表里那一格**,你写的说明文字、别的行、卡的位置一个字节都不动,卡高自动重算。
|
|
107
|
+
⛔ 别用 `edit_board set_text` 改数字 —— 那是重写整篇正文,等于让你把十几行不该变的
|
|
108
|
+
东西重新生成一遍,数字就是这么写丢的。
|
|
109
|
+
|
|
110
|
+
**数字的过去也是现成的**:`draw_trend {key:"好感度"}` 把这个键随拍数的走势画成
|
|
111
|
+
一条手绘曲线(数据来自工作区 git,每回合一点)——`set_vars` 之后再调一次它原地
|
|
112
|
+
长一格(用户拖过也认位置)。把它归进状态板组跟着走,玩家一眼看见关系怎么变的。
|
|
113
|
+
|
|
114
|
+
**改完不用记在脑子里**:表里的现值会出现在你**下一轮开头**的工作台状态里。
|
|
115
|
+
表被改坏(重复键、多张表、表没了)也会在那儿报警,不会静默消失。
|
|
116
|
+
|
|
117
|
+
**用户可以直接改这张表** —— 他在画布上双击就能编辑,改完就是新状态。这是特性不是
|
|
118
|
+
漏洞:状态是他和你共享的东西。
|
|
119
|
+
|
|
120
|
+
### ② 状态板(给人看的那几张卡,可选)
|
|
121
|
+
|
|
122
|
+
想在画布上摆得好看,另立一组卡(`tag:"状态板"`,`nodes:` 随意用),把状态表那条
|
|
123
|
+
板书也归进这一组,然后立一次跟随规则(**只立一次**):
|
|
124
|
+
|
|
125
|
+
`edit_board { ops:[{ op:"follow", group_tag:"状态板", target_tag:"章节", side:"right" }] }`
|
|
126
|
+
|
|
127
|
+
从此每拍正文一落,整组自动挪到它右侧、锚线自动重指,你不用手搬。`#章节` 这会儿
|
|
128
|
+
还是空的没关系:规则先立着,第一拍一落自动接线并就位。用户拖过它也照样跟随
|
|
129
|
+
(他摆的**相对格局**会保留),要彻底停跟随用 `unfollow`。
|
|
130
|
+
|
|
131
|
+
⚠️ 这一组里的卡是**给人看的排版**,不是真相 —— 真相在①那张表里。两边别各存一份
|
|
132
|
+
数字,那是这条线上翻过最多次车的账。
|
|
133
|
+
|
|
134
|
+
### ③ 条件触发器:让服务端在该提醒你的时候提醒你
|
|
135
|
+
|
|
136
|
+
状态表那条板书的正文里可以写一段 ```nd:triggers 围栏 —— 挂几个条件,条件成立的
|
|
137
|
+
**那一拍**,服务端把你写的那句话端到你下一轮开头。
|
|
138
|
+
|
|
139
|
+
```nd:triggers
|
|
140
|
+
- [好感度_苏绵 >= 5] once -> 她开始愿意主动找你说话了,这一拍给她一个开口的机会
|
|
141
|
+
- [体力 <= 2 && 时间 == 夜] on_cross -> 体力见底又是夜里:这一拍必须有代价
|
|
142
|
+
- [线索数 >= 3] once -> 线索够了,可以让他自己拼出真相
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**语法(故意窄)**:`- [条件] 档 -> 要说的话`。`&&` 是唯一的连接词(全都成立才算
|
|
146
|
+
命中),没有 `||` 没有括号。比较符 `>= <= > < == !=`;**大小比较只对数字生效**,
|
|
147
|
+
比文字用 `==` / `!=`(写 `时间 >= 戌时` 会被明确报错,不会按字典序偷偷比)。
|
|
148
|
+
|
|
149
|
+
**两档,别选错**:
|
|
150
|
+
|
|
151
|
+
| 档 | 什么时候响 | 用在哪 |
|
|
152
|
+
|---|---|---|
|
|
153
|
+
| `once` | 第一次从不成立变成成立,之后退休 | 一次性的剧情钩子(好感度到了、线索够了) |
|
|
154
|
+
| `on_cross` | **每次**从不成立变成成立 | 会来回摆的(体力见底、天黑、进城) |
|
|
155
|
+
|
|
156
|
+
⛔ **没有"成立就一直响"这一档**,那会每拍注一遍,当天就变成噪音。
|
|
157
|
+
|
|
158
|
+
**三条要知道的**:
|
|
159
|
+
|
|
160
|
+
- **上膛不击发**:一条触发器刚写上去(或者服务重启过)的第一轮,就算条件当场
|
|
161
|
+
就成立,也**不会**响 —— 它先记下当前状态。想立刻响就把值先落回去再改上来。
|
|
162
|
+
- **写错会被点名**:语法错、比较不了、键在表里不存在,都会在你下一轮开头写明
|
|
163
|
+
「这条一直不会响」+ 原文。不会静默失效。
|
|
164
|
+
- **删一条就是编辑那一行**(`edit_board set_text` 或用户自己改)。每轮开头也会
|
|
165
|
+
报「N 条挂着、M 条已退休」,你随时知道现在有几个钩子在等。
|
|
166
|
+
|
|
167
|
+
**挂触发器的时机**:埋伏笔的时候。你写下"如果她好感度到 5 就会主动开口"这个设计
|
|
168
|
+
的当下,把它挂上去 —— 而不是指望二十拍之后自己还记得。这正是这套东西存在的理由。
|
|
169
|
+
|
|
170
|
+
### ③ 明骰表分家
|
|
171
|
+
|
|
172
|
+
明骰表是**另一张表、另一条板书**(表头别用 `| 键 | 值 |`,用
|
|
173
|
+
`| 拍 | 检定 | DC | 骰 | 结果 |`)。⛔ 别跟状态表挤在同一条板书里 —— 一条板书里
|
|
174
|
+
出现两张 `| 键 | 值 |` 表,解析器会拒绝,`set_vars` 当场失败。
|
|
175
|
+
|
|
176
|
+
**状态是场务的正事,别让它烂在正文里。**数字变了板不变,用户就不信这块板了。
|
|
177
|
+
|
|
178
|
+
## 4. 在场人物栏
|
|
179
|
+
|
|
180
|
+
独立组 `tag:"在场人物"`,一个 NPC 一张卡,三行定式:好感 / 警戒 / 状态,用 `●●●○○`
|
|
181
|
+
五格条。人物上下场就 `edit_board` 加删卡;换场换整批时 `erase_group` 重画。
|
|
182
|
+
|
|
183
|
+
板上这张卡记的是**数值**;这个人的**人设**另有一份档案(`角色/<名>/角色卡.md`,
|
|
184
|
+
`cast_role` 写的那张)。够格(有名字、会再出现、用户会想单独跟他说话)就顺手写一张,
|
|
185
|
+
写他的话之前 Read 那份。两张卡各管一头,别混。
|
|
186
|
+
|
|
187
|
+
## 5. 明骰表
|
|
188
|
+
|
|
189
|
+
住在状态板里的一张 markdown 表,逐拍累积:`| 拍 | 检定 | DC | 骰 | 结果 |`。
|
|
190
|
+
骰子用 `roll_dice` **真投**(服务端随机,骰面同时直达用户屏幕)。
|
|
191
|
+
投骰过程写进正文(有仪式感),结果落表(可回溯)。
|
|
192
|
+
**怎么判、失败该换来什么** → `story-craft`。
|
|
193
|
+
|
|
194
|
+
## 6. 前情归档(十几拍后必然要做,别等画布撑不住)
|
|
195
|
+
|
|
196
|
+
章节链过 12~15 条:把旧章合并成一张「前情提要」板书(接在链头),全文归档进一个
|
|
197
|
+
`前情/第一卷.md` 文件,旧章节板书 `edit_board remove` 撤下(删除是软删,进回收站
|
|
198
|
+
`.nd/trash/`,捞得回来 —— 但归档文件先写好再撤,顺序别反)。
|
|
199
|
+
|
|
200
|
+
# 纪律
|
|
201
|
+
|
|
202
|
+
- **玩家画像持续沉淀**:留意他的口味(节奏快慢、吃哪种梗、雷点、对白密度),写进
|
|
203
|
+
`记忆/玩家画像.md`,每场开演先扫一眼 —— 画像写「他吃什么」,不写剧情本身。
|
|
204
|
+
- 侧栏只说一句「第 N 拍上板了」,正文全在板上,别两头贴。
|
|
205
|
+
- 板书是 md:对白、分镜留白按文字节奏排,不要塞 sketch 节点(那是画图的)。
|
|
206
|
+
- 画场景小图(营地/圆桌/地形)用 shapes 的词汇表和算子省笔:`stencil` 有
|
|
207
|
+
person/house/boat/sword 等十六词;**围一圈**用 `ring{n,cx,cy,upright:true}`
|
|
208
|
+
(侧视图里帐篷/人有重力,不加 upright 会东倒西歪);阴影面 `fill:'hatch'`。
|
|
209
|
+
- 一拍的板面动作(正文、选项、版面维护)同一回合连着发完,别摊到几拍;
|
|
210
|
+
每一发看过返回再发下一发(拒收/余量的提示都在返回里)。
|
|
211
|
+
- **短拍别一拍开一张新纸**:接着当前纸往下写(chain:true、省掉 slot 自动接排),
|
|
212
|
+
写完的返回会报这张纸还剩多少。翻纸=换场景或被拒收,不是每拍的开场动作。
|
|
213
|
+
- 开场先 `read_user_view` 看他的屏幕,版面宽度按他的视口定;顺手
|
|
214
|
+
`edit_board {ops:[{op:"chalk_edit", on:true}]}` 把「改板书」替用户打开 ——
|
|
215
|
+
跑团里他随时要拖板书、改状态,别让他跟双击武装较劲。
|
|
@@ -16,6 +16,9 @@ description: NoDesign deck 设计守则 —— 形态和风格都跟用户探索
|
|
|
16
16
|
命名是把他嘴里的形容词换成一个真实存在的风格名(下面单独一节),它决定了试作
|
|
17
17
|
往哪个方向做;跳过它直接试作,等于拿模型均值去猜他的心思。
|
|
18
18
|
|
|
19
|
+
开工顺手给产物留地:铺工作纸时切一块 `for:"artifacts"` 的版位(deck 卡、生成的
|
|
20
|
+
配图会自动落进去),旁边留说明区。不留的话到货全堆在暂存架上,回头还得一件件搬。
|
|
21
|
+
|
|
19
22
|
试作阶段一次只做一页(通常是封面,或者最能代表调性的那页),做真的、可看的,
|
|
20
23
|
不是描述。用户看着实物给反馈,比看你写"暖调克制风"准一个量级。
|
|
21
24
|
方向没定之前不要往后铺页,铺了就是在给自己制造返工。
|
|
@@ -51,7 +54,12 @@ brief 里读不出场合就问一句 —— 这一步答错,风格做得再好
|
|
|
51
54
|
这一步的产出:**一个用户点过头的名字**。
|
|
52
55
|
|
|
53
56
|
1. 从他的话里抠特征:他提到的东西、举的例子、否掉的东西,以及他做的这件事本身
|
|
54
|
-
(同人本宣传图 / 歌词视觉页 /
|
|
57
|
+
(同人本宣传图 / 歌词视觉页 / 作品集主页各有自己的风格谱系)。
|
|
58
|
+
⭐ 题材自带视觉传统的(一首歌、一个 IP、一个品牌、一个年代),候选从那个
|
|
59
|
+
传统里来 —— 先搜一眼它的官方视觉再命名:风格词条在你脑子里,题材的视觉
|
|
60
|
+
事实不在。想到某个真站 / 真刊物正是这个风格的活例子,顺口提议去采它的
|
|
61
|
+
配色字体版式(`browser_navigate` + `browser_capture`)——**提议主动、展开
|
|
62
|
+
经他点头**,他说不用就直接做
|
|
55
63
|
2. 翻译成 2-4 个候选名字(词典在下面,那是你的词汇量)
|
|
56
64
|
3. `AskUserQuestion` 给他挑:label 就是名字,`preview` 放一张 240×140 的 HTML
|
|
57
65
|
小样(全 inline style,演示这个风格的字体 / 配色 / 版式关系)。小样比找张照片
|
|
@@ -116,10 +124,9 @@ IP、角色、真人、某个具体产品型号、小众品牌 —— 那种情
|
|
|
116
124
|
用户点头之后,把这一份固化下来,它就是后面所有页的基准:
|
|
117
125
|
|
|
118
126
|
- `<style id="design-tokens">` 的 `:root` 整组写死(色号、字号、字体链)
|
|
119
|
-
- `
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
- 风格锚定之后顺手更新 `agent-memory/brand/memory.md`(风格档案),参照图留在
|
|
127
|
+
- 落锚进长期记忆:写一条 `type: project` 记忆(名字打头,如「风格锚 = 拼贴」,
|
|
128
|
+
取值写进正文:"纸纹底 + 微旋转 + 白边 + 手写体标注 + 一点樱桃红");项目级
|
|
129
|
+
定案还该进根 `CLAUDE.md` 的「风格档案」节(用户点头后)。参照图留在
|
|
123
130
|
`assets/references/` 别删 —— 后面几页跑偏时靠它回锚
|
|
124
131
|
|
|
125
132
|
锚说不出名字,说明还没定下来,回去再试一轮。
|
|
@@ -192,8 +199,8 @@ IP、角色、真人、某个具体产品型号、小众品牌 —— 那种情
|
|
|
192
199
|
> layout 骨架参考按需 Read `<plugin>/patterns/<role>.md`。
|
|
193
200
|
|
|
194
201
|
## 板书(交稿纪律)
|
|
195
|
-
|
|
202
|
+
做完这一轮的东西,写一条板书连上它(`write_on_board near=那张卡` —— near 画「说的是它」那条线,字落在当前纸上):这版是什么 / 为什么这么做 /
|
|
196
203
|
看哪里。改了几处就写几条要点,一条说一件事。同一件东西出了新版本,画一条「改自」线
|
|
197
|
-
(`
|
|
204
|
+
(`edit_board` add_edge derives-from);有参考来源画「取材」。用户在你的板书上标注了,用
|
|
198
205
|
`write_on_board reply_to=` 接在那条下面回。多步任务先 TodoWrite 列步骤 —— 步骤清单会自动上板、
|
|
199
206
|
每步的产物自动连过去。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: docx-craft
|
|
3
3
|
version: 0.1.0
|
|
4
|
-
description: NoDesign Word 文档设计守则 —— 产出 .docx(真 Word
|
|
4
|
+
description: NoDesign Word 文档设计守则 —— 产出 .docx(真 Word 文件,对方能打开接着改)。先问这份文档给谁看、进什么流程,再把用户嘴里的形容词翻译成一个真实存在的版式名,然后试作、给看、改、锚定、铺开。含中英两套排版军规(中文:eastAsia 字体槽 / 首行缩进随字号 / 禁则 / 中文无真斜体;西文:半角标点 / 段间距不缩进 / 真斜体 / 磅值字号,按产物正文主体语言选,拿不准走中文)、闭合 token 契约、结构真实性(真样式真编号真表格几何)、渲染验收回路。**当用户明确要一份 .docx / Word 文件,或要的东西必须能在 Word 里打开继续编辑,或是有格式硬规定的正式文书(公文、学位论文、合同、投递用简历)时使用。** 反向:要演示 / 幻灯片 / PPT 走 deskskill-engine-mini,要网页 / 站点 / 落地页走 site-craft。⚠️ 用户只说"做个报告 / 写个方案"而没提格式时**不要**用这条 —— 默认仍走 deck 或站点,画布里可看可迭代是主场,Word 是显式出口。
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# 核心守则:跟 deck / 站点同一条路
|
|
@@ -38,6 +38,13 @@ docx 的版式谱系跟网页不是一套,常用的这些:
|
|
|
38
38
|
| 简历 / 投递 | **单页履历体** | 窄边距、姓名区大字号、条目左对齐悬挂缩进、零装饰 |
|
|
39
39
|
| 手册 / 说明书 | **技术文档体** | 编号标题、等宽代码块、表格密排 |
|
|
40
40
|
|
|
41
|
+
⚠️ 公文体的坑(实测反馈,08-21 案):严格国标的三级标题**同缩进、纯换字体**
|
|
42
|
+
(黑/楷/仿宋),而预览的替身字体会吃掉楷体与仿宋的对比度 —— 三级在预览里几乎
|
|
43
|
+
不可辨,用户大概率抱怨"层级看不出来"。两条路先问一句:a) 严格国标(对方单位
|
|
44
|
+
真按 9704 收文时用);b) **层级强化变体**(用户没点名国标就默认它)——
|
|
45
|
+
Heading1 加 `spacing.beforePt: 8`、Heading2 加 `indent.leftChars: 200` + `bold: true`,
|
|
46
|
+
层级立刻一眼可辨且不破坏 exact 行距的页数稳定性。
|
|
47
|
+
|
|
41
48
|
内置词典条目有三个(`build_docx` 的 `preset`):`办公标准` / `公文` / `学术论文`。
|
|
42
49
|
**它们是起点不是菜单** —— 上表其余的用 preset 起手再覆写 tokens,或者干脆不写
|
|
43
50
|
preset 给完整 token 表。自造词作废("科技感文档"不是版式名),但凡是真实存在、
|
|
@@ -60,7 +67,9 @@ preset 给完整 token 表。自造词作废("科技感文档"不是版式名
|
|
|
60
67
|
新旧并排),⛔ 别覆盖旧版 —— 版本是给用户看的,不是给你腾地方的。
|
|
61
68
|
|
|
62
69
|
起手文件 `文档.template.json` 已经拷进工作区了 —— 照着它改,别从空白开始。
|
|
63
|
-
**字段全集 Read `references/token-schema.md
|
|
70
|
+
**字段全集 Read `references/token-schema.md`**(⚠️ 相对**本 SKILL 文件所在目录**,
|
|
71
|
+
不相对工作区 —— 用加载本 skill 时给出的 SKILL.md 路径拼出绝对路径去 Read,
|
|
72
|
+
别在工作区里找、更别 find / 全盘扫)—— 键名、值域、单位、块的形状、
|
|
64
73
|
常见错法对照全在那里,别靠猜,也别去读引擎源码。
|
|
65
74
|
|
|
66
75
|
**schema 是闭合的**:写了没登记过的字段名,`build_docx` 直接报错。这是故意的 ——
|
|
@@ -93,7 +102,16 @@ preset 给完整 token 表。自造词作废("科技感文档"不是版式名
|
|
|
93
102
|
|
|
94
103
|
判据很简单:**用户在 Word 里改一处,会不会散架。** 会散架的就是假的。
|
|
95
104
|
|
|
96
|
-
##
|
|
105
|
+
## 四、排版军规
|
|
106
|
+
|
|
107
|
+
**先定这份文档的正文主体是什么语言**,排版规矩跟它走 —— 不跟界面语言走,也不跟
|
|
108
|
+
你们对话用的语言走。一个界面设成英文的人照样会做中文简历,反过来也一样;brief 里
|
|
109
|
+
没说清就问一句。中英混排按**正文主体**那一种算(中文文章里引几句英文,仍是中文文档)。
|
|
110
|
+
|
|
111
|
+
### 4.1 中文正文(默认路径)
|
|
112
|
+
|
|
113
|
+
下面六条是硬约束,不是可选项:
|
|
114
|
+
|
|
97
115
|
|
|
98
116
|
1. ⭐ **`eastAsia` 槽必须设。** 中文字符走的是 `w:rFonts` 的 `eastAsia` 槽,
|
|
99
117
|
只写 `ascii` 等于没给中文指定字体。token 里 `fonts` 每个槽四件套都要填。
|
|
@@ -109,6 +127,27 @@ preset 给完整 token 表。自造词作废("科技感文档"不是版式名
|
|
|
109
127
|
|
|
110
128
|
字号用中文字号名(三号 / 小四 / 五号)比写磅值可靠,token 直接收它们。
|
|
111
129
|
|
|
130
|
+
### 4.2 西文正文(例外路径)
|
|
131
|
+
|
|
132
|
+
**只有确认正文主体是西文时才走这一节**,拿不准就走 4.1。逐条对应上面:
|
|
133
|
+
|
|
134
|
+
1. `eastAsia` 槽照样填 —— 英文文档里也会出现中文(人名、引用、参考文献),
|
|
135
|
+
槽空着那几个字就掉到系统默认字体。这条不是中文特有的,别关。
|
|
136
|
+
2. 首行缩进**不用**。西文段落靠段间距分段,不靠缩进;两个都上跟中文里两个都上
|
|
137
|
+
一样难看。`firstLineChars: 0` + 段后距。
|
|
138
|
+
3. 上一条的推论:4.1 第 3 条的"二选一"在这边固定选段间距那一边。
|
|
139
|
+
4. **西文有真斜体,正常用。** 书名、期刊名、外来语、强调都走 `i`,
|
|
140
|
+
别为了跟中文一致改成加粗。
|
|
141
|
+
5. 标题不缩进这条照旧(`firstLineChars: 0`),理由一样。
|
|
142
|
+
6. 标点用**半角**,后面跟一个空格。中文文档里的全角 `,:` 出现在英文正文里
|
|
143
|
+
是最扎眼的一种错。引号用 `"…"` / `'…'`,不用 `「」`。
|
|
144
|
+
7. 字号写**磅值**(11pt / 12pt),不用中文字号名 —— "小四"在英文语境里没有意义。
|
|
145
|
+
正文常用 11pt 或 12pt,行距 1.15 到 1.5。
|
|
146
|
+
8. 编号走 `1. / a. / i.` 这套,不用 `①②③`(4.1 里推荐的圈码是中文文档的习惯)。
|
|
147
|
+
|
|
148
|
+
⚠️ 这一节是**例外**,不是"另一半"。判断不出正文主体语言时,
|
|
149
|
+
走 4.1 —— 给中文文档套西文排版,比反过来更容易被一眼看出不对。
|
|
150
|
+
|
|
112
151
|
## 五、渲染验收:做完必须看
|
|
113
152
|
|
|
114
153
|
`screenshot_canvas` 对 .docx 会渲成页图(LibreOffice → PDF → PNG),带 `pages` 参数
|
|
@@ -162,8 +201,8 @@ screenshot_canvas → 看版式
|
|
|
162
201
|
Word 里导(域和字体都对)。
|
|
163
202
|
|
|
164
203
|
## 板书(交稿纪律)
|
|
165
|
-
|
|
204
|
+
做完这一轮的东西,写一条板书连上它(`write_on_board near=那张卡` —— near 画「说的是它」那条线,字落在当前纸上):这版是什么 / 为什么这么做 /
|
|
166
205
|
看哪里。改了几处就写几条要点,一条说一件事。同一件东西出了新版本,画一条「改自」线
|
|
167
|
-
(`
|
|
206
|
+
(`edit_board` add_edge derives-from);有参考来源画「取材」。用户在你的板书上标注了,用
|
|
168
207
|
`write_on_board reply_to=` 接在那条下面回。多步任务先 TodoWrite 列步骤 —— 步骤清单会自动上板、
|
|
169
208
|
每步的产物自动连过去。
|
|
@@ -262,6 +262,22 @@
|
|
|
262
262
|
写成 `"para": {...}` **会被拒**(2026-08-18 起 content 和页眉页脚都过闭合校验)。
|
|
263
263
|
在那之前它是"不报错也不生效"——最难发现的一类错,起手模板自己教错过一次。
|
|
264
264
|
|
|
265
|
+
⭐ **对象型键(`spacing` / `indent` / `borders`)与样式里的同名键是属性级深合并**,
|
|
266
|
+
跟 tokens 对 preset 的合并规则一致:引擎只把你写的属性写进这一段的 pPr,
|
|
267
|
+
没写的属性照常从样式继承(OOXML 的属性级联就是这个粒度;2026-08-24 真渲染
|
|
268
|
+
实测证实——样式 `line:10/lineRule:"exact"` 的段,块级只写 `beforePt:30`,
|
|
269
|
+
行距不掉):
|
|
270
|
+
|
|
271
|
+
```jsonc
|
|
272
|
+
{ "t": "p", "style": "要点", "spacing": { "beforePt": 3 } }
|
|
273
|
+
// ✅ 只多 3pt 段前距;样式里的 line/lineRule 原样保留,不必重抄
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
唯一的例外是 `indent`:`firstLine*` 和 `hanging*` 互斥(见上),而深合并抹不掉
|
|
277
|
+
从样式继承来的属性——所以"样式带首行缩进的段想改成悬挂"**不要**靠块级开小灶
|
|
278
|
+
(继承的 firstLine 还在,两个属性并存后哪个生效随渲染器),正路是给这类段落
|
|
279
|
+
单独立一个不带首行缩进的样式。
|
|
280
|
+
|
|
265
281
|
### `{"t": "table"}` 表格
|
|
266
282
|
|
|
267
283
|
```jsonc
|
|
@@ -15,6 +15,10 @@ description: NoDesign 站点设计方法论 —— 静态站点(手写起步
|
|
|
15
15
|
的气质八成由正文排版决定,只做个漂亮 hero 给用户看,等铺到正文那天他会说"怎么
|
|
16
16
|
跟我想的不一样"。试作放 `_drafts/<名字>.html`,各自渲成卡并排给用户挑。
|
|
17
17
|
|
|
18
|
+
开工顺手给产物留地:铺工作纸时切一块 `for:"artifacts"` 的版位(试作卡、截图、
|
|
19
|
+
采回的参考图会自动落进去),旁边留一块说明区写板书。不留的话到货全堆在暂存架上,
|
|
20
|
+
回头还得一件件搬。
|
|
21
|
+
|
|
18
22
|
并排的那几份是**同一个名字的不同解法**,不是几种不同风格 —— 名字在上一步已经定了,
|
|
19
23
|
再摆三种风格等于推翻他刚点过的锚。例外:命名那轮没收敛(两个候选他都想看),那就
|
|
20
24
|
跳过选名字,每个候选各做一份真试作、文件名带上名字并排给他挑;真稿的判别力比
|
|
@@ -52,7 +56,12 @@ description: NoDesign 站点设计方法论 —— 静态站点(手写起步
|
|
|
52
56
|
这一步的产出:**一个用户点过头的名字**。
|
|
53
57
|
|
|
54
58
|
1. 从他的话里抠特征:他提到的东西、举的例子、否掉的东西,以及这个站是干嘛的
|
|
55
|
-
(个人站 / 作品集 / 同人本宣传 /
|
|
59
|
+
(个人站 / 作品集 / 同人本宣传 / 长文阅读页各有自己的风格谱系)。
|
|
60
|
+
⭐ **题材自带视觉传统的,候选从那个传统里来**:站的主题是一首歌、一个 IP、
|
|
61
|
+
一个品牌、一个年代或地域时,它多半有官方视觉 / 既成的粉丝审美 —— 先搜一眼
|
|
62
|
+
它的官方视觉再命名(这不算下面禁的"为理解风格搜图":风格词条在你脑子里,
|
|
63
|
+
**题材的视觉事实不在**)。真案:SPiCa 站凭词条给的三个候选全跑偏,用户一句
|
|
64
|
+
"要不要搜搜它的设计风格",搜完才发现主题色根本是另一组 —— 这句话该由你先说
|
|
56
65
|
2. 翻译成 2-4 个候选名字(词典在下面,那是你的词汇量)
|
|
57
66
|
3. `AskUserQuestion` 给他挑:label 就是名字,`preview` 放一张 240×140 的 HTML
|
|
58
67
|
小样(全 inline style,演示这个风格的字体 / 配色 / 版式关系)。小样比找张照片
|
|
@@ -69,6 +78,12 @@ description: NoDesign 站点设计方法论 —— 静态站点(手写起步
|
|
|
69
78
|
一次真实对比:搜关键词收益为零,直接看三个站十分钟就定位到三个具体缺口。
|
|
70
79
|
**别搜词,去看站**——这跟上面那条不冲突,一条说的是词,一条说的是版面。
|
|
71
80
|
|
|
81
|
+
⭐ **想到活例子就提出来,深逛之前先征询一句**。命名或试作时想到某个真站 / 某类站
|
|
82
|
+
正是这个风格的活例子,别憋着 —— 顺口提议:"要不要我去逛逛 XX 那类站,把它的
|
|
83
|
+
配色、字体、动效采回来照着做?"(聊天里一句话就行,不用开卡片)。深逛要花几分钟,
|
|
84
|
+
先问再展开;他说不用就直接做,他丢了链接或参考图就直接用不再问。**提议是主动的,
|
|
85
|
+
展开是经他点头的** —— 一次都不提,等于把"找参照"这条路藏起来让他自己想。
|
|
86
|
+
|
|
72
87
|
**怎么看**(2026-08-18 起有了真浏览器,不再只能截一张):
|
|
73
88
|
|
|
74
89
|
⭐ **搜索和浏览器是一套动作,不是两条路**。`web_search` 回答"哪些站值得看",
|
|
@@ -125,10 +140,10 @@ IP、角色、真人、某个具体产品型号、小众品牌 —— 那种情
|
|
|
125
140
|
2-4 个带小样的候选,不是一张风格大全。摊开菜单就退回模板思维了。
|
|
126
141
|
|
|
127
142
|
他已经点了名字("我要拼贴风")的,跳过前两步直接进试作;直接甩了参考图的,
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
铺到第五页跑偏时靠它回锚。
|
|
143
|
+
读图读出那是什么风格、跟他确认一下名字,再进试作。名字定下来之后落锚进长期
|
|
144
|
+
记忆(一条 `type: project` 记忆,名字打头如「风格锚 = 拼贴」,取值写进正文);
|
|
145
|
+
项目级定案经用户点头后进根 `CLAUDE.md` 的「风格档案」节。参照图留在
|
|
146
|
+
`assets/references/` 别删 —— 铺到第五页跑偏时靠它回锚。
|
|
132
147
|
|
|
133
148
|
### 翻译词典 —— 你的词汇量,不是给用户的菜单
|
|
134
149
|
|
|
@@ -211,7 +226,8 @@ CDN 库随便拉(gsap / lenis / three / alpine / htmx),但动效是调味
|
|
|
211
226
|
|
|
212
227
|
## 中文排版基线
|
|
213
228
|
|
|
214
|
-
-
|
|
229
|
+
- 标点跟**正文主体语言**走:中文正文用全角(,。:;?!……),半角逗号冒号在中文里很扎眼;
|
|
230
|
+
英文正文用半角加一个空格,全角标点混进英文句子里同样扎眼。混排按主体那一种算
|
|
215
231
|
- 字体链每段 latin family 后面必须跟 CJK family:
|
|
216
232
|
`'Inter', 'PingFang SC', 'Noto Sans SC', system-ui, sans-serif`
|
|
217
233
|
少了 CJK 那段,换台机器中文就掉到系统默认字体
|
|
@@ -323,8 +339,8 @@ Read `patterns/page-transitions.md` —— **动手写第一个转场之前先
|
|
|
323
339
|
> 构建道(React / vite / Tailwind / 组件库)配方 Read `patterns/build-lane.md`。
|
|
324
340
|
|
|
325
341
|
## 板书(交稿纪律)
|
|
326
|
-
|
|
342
|
+
做完这一轮的东西,写一条板书连上它(`write_on_board near=那张卡` —— near 画「说的是它」那条线,字落在当前纸上):这版是什么 / 为什么这么做 /
|
|
327
343
|
看哪里。改了几处就写几条要点,一条说一件事。同一件东西出了新版本,画一条「改自」线
|
|
328
|
-
(`
|
|
344
|
+
(`edit_board` add_edge derives-from);有参考来源画「取材」。用户在你的板书上标注了,用
|
|
329
345
|
`write_on_board reply_to=` 接在那条下面回。多步任务先 TodoWrite 列步骤 —— 步骤清单会自动上板、
|
|
330
346
|
每步的产物自动连过去。
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: story-craft
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
description: 叙事技法包 —— 剧情卡住、连着几拍在平推、写出来的东西"没味儿"、或者用户说"太套路了"的时候用本 skill。含反公式清单(点名十几种一眼假的桥段和它们的替代路数)、信息差设计、失败骰判据、上钟与代价、把配角写活的办法。不管文风(那是 story-voice),只管这一拍该发生什么。
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 这个 skill 管什么
|
|
8
|
+
|
|
9
|
+
`story-voice` 管**写成什么调子**,这一份管**该发生什么事**。两件事分开:
|
|
10
|
+
文笔再好,一拍下来没人失去什么、没人知道了什么,那就是水。
|
|
11
|
+
|
|
12
|
+
# 一、反公式
|
|
13
|
+
|
|
14
|
+
## 铁律:想到的头两个走向先毙掉
|
|
15
|
+
|
|
16
|
+
第一反应几乎总是公式。这不是你的问题,是"最可能的下一句"这件事本身的性质 ——
|
|
17
|
+
最可能的,就是最多人写过的。
|
|
18
|
+
|
|
19
|
+
**做法**:想到 A 和 B 之后,别急着写,**明确问自己第三条是什么**,判据是
|
|
20
|
+
「合理,但读者想不到」。想不出第三条就退回去问「这一拍如果什么都不发生会怎样」,
|
|
21
|
+
往往能挖出真正该发生的事。
|
|
22
|
+
|
|
23
|
+
## 一眼假的桥段清单(撞到就换)
|
|
24
|
+
|
|
25
|
+
| 公式 | 为什么假 | 换成 |
|
|
26
|
+
|---|---|---|
|
|
27
|
+
| 酒馆里遇险开局 | 它是"该有事发生了"的偷懒解 | 让麻烦是**主动找上门的旧账**,带名字 |
|
|
28
|
+
| 神秘老人给任务 | 信息从天上掉下来 | 信息要有人**不想给**,得换 |
|
|
29
|
+
| 及时救场 | 取消了刚建立的代价 | 救得成但**救错了人**,或者晚一步 |
|
|
30
|
+
| 公式傲娇/口是心非 | 用一个标签替代一个人 | 让他嘴上服软、行动上更狠 |
|
|
31
|
+
| 反派临死前解释动机 | 为了读者方便而破坏人物 | 动机让**第三个人**在别处说出来,说得还不准 |
|
|
32
|
+
| 失忆/身世反转 | 把已建立的东西一笔勾销 | 让秘密**早就摆在桌上**,只是没人当回事 |
|
|
33
|
+
| 大家一起感慨主题 | 角色替作者说话 | 让他们**为这件事吵起来**,谁都不总结 |
|
|
34
|
+
| 梦境/回忆闪回填设定 | 停下故事去讲课 | 把那段设定拆成三句台词,散在三拍里 |
|
|
35
|
+
| 巧合解决困境 | 玩家的选择变得不重要 | 巧合只许**制造**麻烦,不许**解决**麻烦 |
|
|
36
|
+
|
|
37
|
+
## 一条正向的
|
|
38
|
+
|
|
39
|
+
**允许剧情语出惊人。**觉得无聊的时候,往"合理又好玩"的方向多走一步,别缩回安全区。
|
|
40
|
+
读者对平庸的容忍度远低于对冒险的。
|
|
41
|
+
|
|
42
|
+
# 二、信息差是燃料
|
|
43
|
+
|
|
44
|
+
每一拍动笔前问:**在场的每个人各知道什么?从哪知道的?不该知道什么?**
|
|
45
|
+
|
|
46
|
+
这一条值得比别的多花心思。戏的张力几乎全部来自"有人不知道":
|
|
47
|
+
|
|
48
|
+
- **谁蒙在鼓里** —— 读者知道而他不知道,每句话都有第二层意思。
|
|
49
|
+
- **谁的误会还没拆** —— 拆误会的时机是可调度的资源,别急着用掉。
|
|
50
|
+
- **这一拍能不能让某人多知道一点** —— 信息应该是**分次**给的,一次给完戏就散了。
|
|
51
|
+
|
|
52
|
+
⛔ **别为了省事让谁全知。**一个知道所有事的角色是剧情的黑洞。
|
|
53
|
+
|
|
54
|
+
# 三、失败骰判据(跑团的心脏)
|
|
55
|
+
|
|
56
|
+
**失败换信息或代价,成功换新麻烦,两者都不许原地踏步。**
|
|
57
|
+
|
|
58
|
+
失败**别写成"没成功"**,那是最浪费的一种写法。换成:
|
|
59
|
+
|
|
60
|
+
- 他把一个**错误结论说得很自信**(然后别人看穿它)
|
|
61
|
+
- 失败落在**表达**上而不是结果上:最该先说的那句没说成
|
|
62
|
+
- 代价是**暴露了帮过他的人**
|
|
63
|
+
- 账**要到后面几章才结**(现在只留一个记号)
|
|
64
|
+
|
|
65
|
+
成功配一个新麻烦:拿到蜡烛 → 蜡烛开始倒计时;救下人 → 被救的说「你们不该救我」。
|
|
66
|
+
|
|
67
|
+
**给对手也投一次骰。**一边的失败有了具体来源,场面就从"判罚"变成"博弈"。
|
|
68
|
+
|
|
69
|
+
⛔ 骰子永远用 `roll_dice` 真投。编的点数玩家迟早看穿,整桌的信任一次塌完。
|
|
70
|
+
「自然 1 / 自然 20」值得在正文里给一个镜头。
|
|
71
|
+
|
|
72
|
+
# 四、节奏:上钟和跳时间
|
|
73
|
+
|
|
74
|
+
- **连着两拍没有判定、代价或资源变化,就该有东西上桌**:一口钟(时限)、
|
|
75
|
+
一次检定、一个不速之客。沉浸来自"决定有后果",不是文笔。
|
|
76
|
+
- **无聊的过场直接跳时间**:「半天路,日头偏西时望见了村口」一句带过。
|
|
77
|
+
细写留给有戏的地方。**不写无聊剧情是权利,不是偷懒。**
|
|
78
|
+
- **镜头可以切走**:用户的角色这一拍没事干、或者他这边的事不要紧,就切到有事
|
|
79
|
+
发生的那边写,别围着他一个人凑字数。
|
|
80
|
+
|
|
81
|
+
# 五、把配角写活的三条
|
|
82
|
+
|
|
83
|
+
1. **每个人都在忙自己的事**。他出现在这一拍,是因为他自己有理由在这儿,不是因为
|
|
84
|
+
主角需要他。
|
|
85
|
+
2. **别猜人设**:设定里没写到的性格不要现编,默认他是个正常人。反过来,
|
|
86
|
+
**他的反应要显得"他就是自然而然这么想的"**,不刻意突出他的异人之处。
|
|
87
|
+
3. **给他一个跟主线无关的执念**(一双鞋、一笔旧账、一个称呼)。人物的立体感来自
|
|
88
|
+
不服务于剧情的那部分。
|
|
89
|
+
|
|
90
|
+
# 自检(每拍收尾过一遍)
|
|
91
|
+
|
|
92
|
+
- 这一拍**谁失去了什么、谁知道了什么**?两个都没有就是水拍。
|
|
93
|
+
- 我写的走向,是不是我想到的头两个之一?
|
|
94
|
+
- 玩家面前**有没有可按的东西**?(没有就还没写完)
|