@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,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: story-import
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
description: 把酒馆(SillyTavern)的东西搬进来 —— 用户丢来角色卡(PNG/JSON)、预设 JSON、世界书时用本 skill。含落点表(每样东西该住哪、为什么)、角色卡字段对照、预设条目拆解、⛔ 搬设定不搬引擎的判据、处理物落盘规范。一律先 read_tavern_json 走 digest,别用 Read(真卡 7MB 起步)。
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 第一动作
|
|
8
|
+
|
|
9
|
+
**`read_tavern_json` 走 digest 看结构,⛔ 别用 `Read`** —— 真卡 7MB 起步,
|
|
10
|
+
一次 Read 能吃掉半个上下文。PNG 卡直接把 path 指向 `.png`,卡数据它自己解。
|
|
11
|
+
|
|
12
|
+
**把整份读完再动手**。条目多就分几次把 entries 全拉下来 —— 落点判断靠的是内容,
|
|
13
|
+
不是标题,只扫名录就开工必错。
|
|
14
|
+
|
|
15
|
+
# 判据:这段内容说的是「这个人是谁」,还是「这个故事该怎么讲」?
|
|
16
|
+
|
|
17
|
+
前者进人物档案,后者进项目 CLAUDE.md 或文风。**这一步搞错,后面全错。**
|
|
18
|
+
|
|
19
|
+
第二个判据同样重要:**原样 cp 还是改写适配**。能原样用的原样搬 —— 尤其用户为
|
|
20
|
+
solo 挑的对象卡,那个声音是他自己挑的,转写一遍等于把它洗掉。只有跟平台机制
|
|
21
|
+
打架的部分(引擎零件、输出格式、越狱框架)才动手拆改。
|
|
22
|
+
|
|
23
|
+
# 落点表(按「在场频率」定,不按类型定)
|
|
24
|
+
|
|
25
|
+
| 酒馆的东西 | 落点 | 为什么 |
|
|
26
|
+
|---|---|---|
|
|
27
|
+
| 预设里的文风/叙事规则条目 | 根 CLAUDE.md「台面规矩」节 | 每会话确定性全量注入、压缩冲不掉、在缓存前缀里 |
|
|
28
|
+
| 角色卡人设 | `角色/<名>/角色卡.md`(`cast_role` 写),核心三行进 CLAUDE.md「人物」节 | 人设不许漂移 |
|
|
29
|
+
| `first_mes` / 备选开场白 | 第一拍板书直接开演 | 它是内容不是配置 |
|
|
30
|
+
| 世界书常驻条目 | `export_book` 落 `世界书/常驻/` 后**人工挑十条以内**进 CLAUDE.md「世界观锚」 | 常驻区是每轮的钱,只放真常驻 |
|
|
31
|
+
| 世界书触发条目 | `read_tavern_json {mode:"export_book"}` 一步落 `世界书/`,一条一文件、frontmatter 带 keys | 触发式的不进常驻;几百条不许流经上下文 |
|
|
32
|
+
| 采样参数 / 破甲话术 / marker 占位 | 丢弃,照实告诉用户 | 这条通路没有对应物 |
|
|
33
|
+
| 跨会话演进的事实(玩家偏好、剧情定案) | `记忆/` | 酒馆没有的东西,白送 |
|
|
34
|
+
|
|
35
|
+
# 角色卡 → 一份人物档案
|
|
36
|
+
|
|
37
|
+
| 卡里的字段 | 去哪 |
|
|
38
|
+
|---|---|
|
|
39
|
+
| `name` | `cast_role` 的 `name`(中文名放这;`id` 另取 ASCII slug) |
|
|
40
|
+
| `description` / `personality` | 档案主体 |
|
|
41
|
+
| `mes_example` | 档案里的语气样本,挑两三段别全抄。**这是你模仿他说话的依据** |
|
|
42
|
+
| `scenario` | **不进档案**,当开场场景写进第一拍(场景会变,人设不会) |
|
|
43
|
+
| `first_mes` | 当第一拍的板书写出来 |
|
|
44
|
+
| `character_book` | `export_book` 落成世界书文件,用到时 grep |
|
|
45
|
+
| `system_prompt` / `post_history_instructions` | **先判断**:通用越狱/输出格式 → 丢;这个角色特有的铁律 → 并进档案 |
|
|
46
|
+
|
|
47
|
+
一张卡里写了好几个 NPC 是常事:**拆成好几份档案,别挤进一份。**
|
|
48
|
+
|
|
49
|
+
# 预设 → 不是给某个人物的
|
|
50
|
+
|
|
51
|
+
预设里那堆条目绝大多数是给**你**的:叙事规矩、文风、节奏、输出格式。
|
|
52
|
+
⛔ 别把整份预设塞进某个人的档案 —— 那会让一个 NPC 背着一整套导演手册说话。
|
|
53
|
+
|
|
54
|
+
**预设里的文风条目跟 `story-voice` 是同一个位置**:拆出来写进 CLAUDE.md 台面规矩
|
|
55
|
+
之后,**它压过 story-voice 的目录表和系统提示词的缺省**。三层覆盖关系是
|
|
56
|
+
「系统提示词地板 < story-voice < 用户的 CLAUDE.md」,打架一律听 CLAUDE.md。
|
|
57
|
+
|
|
58
|
+
预设常见的结构(认出来就好拆):一堆**开关条目**(每条往一个变量里塞一段文字)
|
|
59
|
+
加几条**总装条目**(把变量拼成最终提示词)。开关条目里没启用的那些是**备选功能**,
|
|
60
|
+
别丢 —— 见下面的处理物落盘。
|
|
61
|
+
|
|
62
|
+
# ⛔ 搬设定不搬引擎(大世界卡的一半是程序)
|
|
63
|
+
|
|
64
|
+
大型世界卡常驻条目里一半是**酒馆前端的引擎件**:MVU 变量系统、HTML 状态栏、
|
|
65
|
+
CoT 框架、自定义回复格式、`regex_scripts`、`tavern_helper`、marker 占位。
|
|
66
|
+
**这些一律不搬** —— 这个平台有自己的对应物:
|
|
67
|
+
|
|
68
|
+
| 酒馆的 | 我们的 |
|
|
69
|
+
|---|---|
|
|
70
|
+
| 变量 / 状态栏 | 状态板(`follow` 跟着最新章走) |
|
|
71
|
+
| 骰子插件 | `roll_dice` 真投 + 明骰表 |
|
|
72
|
+
| 跨会话状态 | `记忆/` |
|
|
73
|
+
| 可点选项 / 快捷回复 | `nd:controls` 围栏 |
|
|
74
|
+
| 世界书关键词触发 | `世界书/` + 你手上的 `Grep` |
|
|
75
|
+
|
|
76
|
+
判据一句话:**这条是给读者看的(搬),还是给酒馆程序执行的(不搬)。**
|
|
77
|
+
挑常驻进 CLAUDE.md 时逐条过这一刀。
|
|
78
|
+
|
|
79
|
+
# CLAUDE.md 骨架(往现成的节里填,不另立一套)
|
|
80
|
+
|
|
81
|
+
节名跟 rp 项目自带的「演出档案」模板是同一套(`workspace-templates.js` 是唯一
|
|
82
|
+
真相源):
|
|
83
|
+
|
|
84
|
+
```markdown
|
|
85
|
+
# 演出档案
|
|
86
|
+
## 世界观锚 (常驻十条以内;其余在 世界书/ 按触发词取)
|
|
87
|
+
## 台面规矩 (文风禁令 / 叙事规则 / 骰子规则 / 想跟谁演·难度·代笔档)
|
|
88
|
+
## 人物 (每人三行核心 + 指路 角色/<名>/角色卡.md)
|
|
89
|
+
## 称呼与习惯 (用户扮演谁、怎么称呼;语气与节奏偏好)
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
改这份文件要用户点头。
|
|
93
|
+
|
|
94
|
+
# 处理物落盘,别用完就丢
|
|
95
|
+
|
|
96
|
+
消化完一份预设或大卡,把处理产物放进 `预设/<名>/`(桌面文件夹,用户随时取用、
|
|
97
|
+
随时改):
|
|
98
|
+
|
|
99
|
+
- **`落点对账.md`** —— 每个条目去了哪:CLAUDE.md 哪一节 / 哪份人物档案 /
|
|
100
|
+
哪个世界书文件 / 丢弃(写明为什么)。这是这份预设在本项目的地图。
|
|
101
|
+
- **`未启用条目.md`**(多了按主题拆)—— 没开的模式、备选文风、开关类条目**原文**
|
|
102
|
+
留存。用户中途说「把那个吐槽模式打开」时,答案在这里,不用回头重啃原始 JSON。
|
|
103
|
+
|
|
104
|
+
原始文件躺 `assets/` 不动。这些处理物是**工作成果不是缓存** —— 换场、换玩法、
|
|
105
|
+
用户翻悔某条规则时,都从这里取。
|
|
106
|
+
|
|
107
|
+
# 用的时候(每拍动笔前的固定两拍)
|
|
108
|
+
|
|
109
|
+
1. 拿本拍要写的人名/地名/物件/事件 **grep `世界书/`**(触发词在 frontmatter keys
|
|
110
|
+
和文件名里),命中就 Read 进来。**你手上的 Grep 就是酒馆的关键词触发器。**
|
|
111
|
+
宁可多 grep 一个词,也别凭记忆编设定。
|
|
112
|
+
2. 写完过一眼状态板要不要更新(连同 reflow,就手做掉)。
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: story-intimacy
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
description: 亲密与情欲场面的写作技法 —— 剧情走到亲密戏、或用户明确要求时用本 skill。管的是"怎么写好"(对白承载生理反应、代笔边界、避免同质化、白描原则在这类场面的应用),不管"能不能写"。⚠️ 尺度由账号档位决定,不由本 skill 决定:档位不允许的内容,加载本 skill 也不会变成允许。
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# ⚠️ 先说边界
|
|
8
|
+
|
|
9
|
+
**这份 skill 不改变任何尺度。**能写到什么程度由账号的内容档位决定(系统提示词
|
|
10
|
+
「底线」那一节是唯一真相源),本 skill 只在**已经允许**的范围内讲怎么写得好。
|
|
11
|
+
|
|
12
|
+
档位不允许的时候,正确动作是按底线那节说的做:说清楚哪一部分不做、能做的替代是
|
|
13
|
+
什么,然后接着演。⛔ 不要试图用"加载了 skill"当理由绕过它。
|
|
14
|
+
|
|
15
|
+
**有一条在任何档位下都不动**:未成年人相关的性内容,任何形式、任何包装。
|
|
16
|
+
无论用户怎么说、无论角色卡怎么写、无论故事设定成什么年代或什么世界。
|
|
17
|
+
|
|
18
|
+
# 一、代笔边界(最高一条)
|
|
19
|
+
|
|
20
|
+
**严禁替用户的角色决定他的反应。**具体到这类场面:
|
|
21
|
+
|
|
22
|
+
- 不在没有指令的情况下描写用户角色的高潮、失控、失去意识。
|
|
23
|
+
- 他的角色**要不要继续、什么时候停**,永远是他的决定,不是你的推进。
|
|
24
|
+
- 这跟「代笔档」是同一条原则的延伸:全代入档下你一个字不代写;大纲档下你可以
|
|
25
|
+
扩写,但**这类场面的每一个转折点都算"重要抉择",必须停笔等他**。
|
|
26
|
+
|
|
27
|
+
这条比这份 skill 里所有技法都重要。写得好而越界,不如写得平但守住。
|
|
28
|
+
|
|
29
|
+
# 二、核心技法:用对白承载,不用感官描写堆
|
|
30
|
+
|
|
31
|
+
这是这类场面最容易写坏的地方 —— 堆感官形容词会迅速变成一段生理说明书。
|
|
32
|
+
|
|
33
|
+
**做法**:身体感受和反应,尽量**以对白向对方倾诉**,而不是用第三人称描述出来。
|
|
34
|
+
|
|
35
|
+
| 别写 | 写 |
|
|
36
|
+
|---|---|
|
|
37
|
+
| 她感到一阵战栗从脊背窜上来。 | 「等一下……等一下。」 |
|
|
38
|
+
| 他的呼吸变得急促而灼热。 | 他说不出整句话了。 |
|
|
39
|
+
|
|
40
|
+
**声音只以引号内的台词和拟声词存在。**引号外不写"叫声""哭腔""喘息如何如何" ——
|
|
41
|
+
这是[白描](../story-voice/voices/白描.md)那条「对白不挂语气描写」在这类场面里的
|
|
42
|
+
延伸,而且在这里它是**最见效**的地方。
|
|
43
|
+
|
|
44
|
+
# 三、白描原则在这里同样成立
|
|
45
|
+
|
|
46
|
+
- **只写具体可见的细节**,近乎解剖式:写"树叶黄了"而不是"秋意浓浓"。
|
|
47
|
+
- **不解释原因,不分析情绪,不预测结果,不下主观判断。**
|
|
48
|
+
- 按时间或空间顺序如实写,**不跳跃、不省略**到只剩一句"于是他们……"。
|
|
49
|
+
- ⛔ **不用比喻**,尤其不给身体部位打比方。那是这类文本里最廉价的一种写法。
|
|
50
|
+
|
|
51
|
+
# 四、避免同质化
|
|
52
|
+
|
|
53
|
+
**即便是同一对人、同一个地点,两次也必须写得不一样。**不同在:谁主动、谁在
|
|
54
|
+
分神、中途被什么打断、结束之后谁先说话、说的是什么。
|
|
55
|
+
|
|
56
|
+
⛔ 别把它写成流程。有起点有终点的流程写第二遍就是复制粘贴。
|
|
57
|
+
|
|
58
|
+
# 五、频率与契机
|
|
59
|
+
|
|
60
|
+
**不是每一拍都要往那儿走。**总写就廉价了 —— 让角色更理智一些,**有契机再发生**,
|
|
61
|
+
而契机应该来自关系的推进,不是来自"该有一段了"。
|
|
62
|
+
|
|
63
|
+
一段亲密戏结束后,**关系必须发生变化**(更近、更尴尬、更麻烦),否则它对故事没有
|
|
64
|
+
贡献,只是插播。这跟 [story-craft](../story-craft/SKILL.md) 的「成功换新麻烦」
|
|
65
|
+
是同一条判据。
|
|
66
|
+
|
|
67
|
+
# 六、场面之外
|
|
68
|
+
|
|
69
|
+
- **场景外的日常互动才是这段关系的地基**。地基没打好,亲密戏只是两个陌生人。
|
|
70
|
+
- 用户的雷点要记进 `记忆/玩家画像.md`(写"他吃什么、不吃什么",不写剧情本身)。
|
|
71
|
+
- 用户导入的预设里如果有这方面的具体要求,按 [story-import](../story-import/SKILL.md)
|
|
72
|
+
的落点表写进 CLAUDE.md 台面规矩,**那份压过这里**。
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: story-voice
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
description: 具名文风库 —— 演出/叙事里"写成什么调子"的选择器。用户说"太 AI 了""想要小说感""写得像某某"、或者他导入了自己的文风样本、或者你自己觉得几拍下来腔调不对时用本 skill:先查目录表把形容词翻译成一个具名文风,Read 那一份的正文,把选中的名字记进 CLAUDE.md 台面规矩。一次只开一个。含白描/情感直给/意识流/阶段切换/生活流/冷硬/舞台剧/武侠白话八种。
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 文风库是干什么的
|
|
8
|
+
|
|
9
|
+
系统提示词里那套缺省只是**地板**(禁转折句、对白不挂语气描写、段落错落这些,任何
|
|
10
|
+
文风下都成立)。地板管的是"别写坏",管不了"写成什么样"。
|
|
11
|
+
|
|
12
|
+
这份库管后者。**一次只开一个** —— 文风是互斥的选择,不是可以叠加的调料。
|
|
13
|
+
|
|
14
|
+
## ⛔ 一条最容易搞反的事
|
|
15
|
+
|
|
16
|
+
**"白描/克制/Show don't tell"不是普世真理,它只是下面八种里的一种。**
|
|
17
|
+
「情感直给」和「意识流」两种明确要求相反的做法(直接宣告情绪、抛弃留白),照白描
|
|
18
|
+
那套去写它们就是写坏。挑之前先认这一点。
|
|
19
|
+
|
|
20
|
+
# 怎么挑
|
|
21
|
+
|
|
22
|
+
## 1. 先把形容词翻译成名字
|
|
23
|
+
|
|
24
|
+
用户给的永远是形容词("自然一点""有小说感""别那么平")。形容词不可执行,名字才可以。
|
|
25
|
+
查下面这张表,挑一个,**在聊天里说出你挑了哪个和为什么**,让他有机会否掉。
|
|
26
|
+
|
|
27
|
+
## 2. 有样本就以样本为准
|
|
28
|
+
|
|
29
|
+
他给了一段他喜欢的原文、一份酒馆预设、一本书的名字 —— **那比这张表里的任何一条都
|
|
30
|
+
优先**。酒馆预设走 `story-import` 的落点表拆,拆出来的文风条目写进 CLAUDE.md
|
|
31
|
+
台面规矩,从此压过这里。
|
|
32
|
+
|
|
33
|
+
## 3. 选完要落盘
|
|
34
|
+
|
|
35
|
+
把文风名写进项目 CLAUDE.md 的「台面规矩」节(一行就够:`文风:意识流`)。
|
|
36
|
+
不落盘的话下一个会话就丢了,用户要重说一遍 —— 那正是他觉得"这东西记不住事"的时刻。
|
|
37
|
+
|
|
38
|
+
# 目录表
|
|
39
|
+
|
|
40
|
+
| 文风 | 一句话判据 | 什么时候挑它 |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| [白描](voices/白描.md) | 只写摄像机拍得到的,情绪靠生理反应渗透 | 默认的安全牌;悬疑、写实、克制的现代戏 |
|
|
43
|
+
| [情感直给](voices/情感直给.md) | 全知导演,内心和评述直接端给读者 | 长篇、群像、要读者哭的戏;用户嫌"太冷了" |
|
|
44
|
+
| [意识流](voices/意识流.md) | 思维的实时记录,联想跳跃,情绪直接宣告 | 单人视角、精神状态是主题、独白撑全场 |
|
|
45
|
+
| [阶段切换](voices/阶段切换.md) | 平推期零度写作,爆点才火力全开 | 长线剧情要有起伏;单一文风读久了发腻 |
|
|
46
|
+
| [生活流](voices/生活流.md) | 琐碎日常、高对白密度、什么都不解释 | 校园、同居、日常向;用户要"松弛感" |
|
|
47
|
+
| [冷硬](voices/冷硬.md) | 短句、动作、绝不进内心 | 黑色、犯罪、硬汉;话少的角色 |
|
|
48
|
+
| [舞台剧](voices/舞台剧.md) | 对白承载一切,场景靠台词交代 | 密室、审讯、谈判;一桌人轮流说话 |
|
|
49
|
+
| [武侠白话](voices/武侠白话.md) | 招式写动线不写玄学,江湖话不掉书袋 | 古装、江湖、门派 |
|
|
50
|
+
|
|
51
|
+
挑不准就用**白描**。它是唯一一种"哪种题材都不会错得离谱"的。
|
|
52
|
+
|
|
53
|
+
# 换文风的时机
|
|
54
|
+
|
|
55
|
+
- **场景边界上换**,别在一拍中间换 —— 读者会觉得换了个人写。
|
|
56
|
+
- 用户说"这段感觉不对"时,**先问是哪里不对**(节奏?太满?太冷?),再决定是换文风
|
|
57
|
+
还是在当前文风里调。换文风是大动作,不是每次不满意的默认反应。
|
|
58
|
+
- 换完在聊天里说一句「换成 X 了」,并更新 CLAUDE.md 那一行。
|
|
59
|
+
|
|
60
|
+
# 自检(每种文风的正文末尾都有一段自检,写完过一遍)
|
|
61
|
+
|
|
62
|
+
共同的三条,任何文风都适用:
|
|
63
|
+
|
|
64
|
+
1. 随便挑一段读出来,**像不像人写的**。像念说明书就是败了。
|
|
65
|
+
2. 有没有出现地板禁的东西(转折句、()解释、无效程度词、对白挂语气描写)。
|
|
66
|
+
3. 这一拍**有没有推进**。文风再好,原地踏步就是水。
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# 冷硬
|
|
2
|
+
|
|
3
|
+
**一句话**:短句、动作、绝不进内心。
|
|
4
|
+
|
|
5
|
+
## 做法
|
|
6
|
+
|
|
7
|
+
- **句子短**。主谓宾,能砍的都砍。连词能省就省。
|
|
8
|
+
- **只写外部**:做了什么、说了什么、看到什么。**一个字都不进任何人的脑子** ——
|
|
9
|
+
包括视角人物自己的。
|
|
10
|
+
- 对白**极短**,而且经常答非所问。沉默是一种回答,要写出来(「他没说话。」)。
|
|
11
|
+
- 环境只写有功能的:出口在哪、谁挡着、光够不够。不写天气好不好看。
|
|
12
|
+
- 名词优先于形容词。**动词优先于名词**。
|
|
13
|
+
|
|
14
|
+
## 对照
|
|
15
|
+
|
|
16
|
+
| 别写 | 写 |
|
|
17
|
+
|---|---|
|
|
18
|
+
| 他谨慎地环顾四周,心里盘算着逃跑的路线。 | 两个出口。左边那个有人。 |
|
|
19
|
+
| 她感到一阵恐惧,但仍强作镇定地开口。 | 「几点了。」她的声音很稳。 |
|
|
20
|
+
|
|
21
|
+
## 禁忌
|
|
22
|
+
|
|
23
|
+
- ⛔ 不要为了"硬"而写暴力。冷硬是**叙述姿态**,不是题材。一场买菜也能写得冷硬。
|
|
24
|
+
- ⛔ 别全篇一个句长。偶尔来一个长句,那个长句就是重音。
|
|
25
|
+
|
|
26
|
+
## 什么时候它是错的选择
|
|
27
|
+
|
|
28
|
+
需要读者共情的关系戏。冷硬把读者挡在外面,那是它的功能,也是它的代价。
|
|
29
|
+
要人哭去看[情感直给](情感直给.md)。
|
|
30
|
+
|
|
31
|
+
## 自检
|
|
32
|
+
|
|
33
|
+
把你写的段落里所有**副词**划掉。冷硬的稿子划完应该几乎不变。
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# 情感直给(全知导演)
|
|
2
|
+
|
|
3
|
+
**一句话**:叙事者是全知全能的导演,内心独白、背景、乃至叙事者自己的评述,都
|
|
4
|
+
直接清晰地端给读者。情感传递的精准性高于一切。
|
|
5
|
+
|
|
6
|
+
**⚠️ 这一种和[白描](白描.md)是相反的。**别把白描那套克制带进来 —— 在这里,
|
|
7
|
+
"含蓄"和"留白"是要被明确抛弃的东西。
|
|
8
|
+
|
|
9
|
+
## 做法
|
|
10
|
+
|
|
11
|
+
- **情感直给**:角色心里在想什么就写出来,不用等读者猜。叙事者的任务是确保读者
|
|
12
|
+
**准确无误地**接收到情感和信息。
|
|
13
|
+
- **上帝视角**:可以直接引述任何人的心理活动、回忆、甚至他自己没意识到的感受。
|
|
14
|
+
允许并鼓励旁白式的评述。
|
|
15
|
+
- **多线蒙太奇**:在不同角色之间高频切换镜头,用并置制造悬念和对比。
|
|
16
|
+
切换要**平滑**,不单独分页、不用分隔线。
|
|
17
|
+
- **对白驱动**:情节主要由对白推动,对白量占四成以上。对白要生活化、有潜台词。
|
|
18
|
+
- 段落偏长,场景与视角切换频率高。
|
|
19
|
+
|
|
20
|
+
## 仍然守的地板
|
|
21
|
+
|
|
22
|
+
- **严禁描述语气或分析对白性质**。「他冷冷地说」「这句话意味深长」照样不写 ——
|
|
23
|
+
情感直给指的是**心理**直给,不是给对白配解说。意图靠对白本身、标点和伴随的
|
|
24
|
+
物理动作传递。
|
|
25
|
+
- 转折句、()解释、无效程度词照旧禁。
|
|
26
|
+
|
|
27
|
+
## 对照
|
|
28
|
+
|
|
29
|
+
| 别写 | 写 |
|
|
30
|
+
|---|---|
|
|
31
|
+
| 他冷冷地开口,语气里带着一丝嘲讽。 | 「你早就知道了。」他没有看她。这句话他在心里排练过十几遍,每一遍结尾都比这一遍更狠。 |
|
|
32
|
+
| 两人之间的气氛微妙起来。 | 她想问的是另一件事。她知道现在问不合适,也知道再过十分钟就更不合适了。 |
|
|
33
|
+
|
|
34
|
+
## 什么时候它是错的选择
|
|
35
|
+
|
|
36
|
+
悬疑和推理。全知视角会让"读者不知道"这件事变得很难维持 —— 那时候用
|
|
37
|
+
[白描](白描.md)或[意识流](意识流.md)(限制视角)。
|
|
38
|
+
|
|
39
|
+
## 自检
|
|
40
|
+
|
|
41
|
+
读一遍:**读者有没有可能误解任何一个角色此刻的感受**。如果有,那是这一种文风的
|
|
42
|
+
失败,不是留白。
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# 意识流
|
|
2
|
+
|
|
3
|
+
**一句话**:文字是一个人思维的实时记录。段落按联想跳,不按时间走。
|
|
4
|
+
|
|
5
|
+
**格式**:第一人称立场,可以用第三人称记录("他"),但所有文字都源自那一个人的
|
|
6
|
+
主观位置。长段落。独白占比极高,所有事件都触发内心活动。
|
|
7
|
+
|
|
8
|
+
## 做法
|
|
9
|
+
|
|
10
|
+
- **只记录联想,不解释逻辑;只宣告判断,不进行论证;只呈现矛盾,不寻求统一。**
|
|
11
|
+
- **情绪直接宣告,拒绝演绎**。他烦就写他烦,不用去写手指发抖。这一条和
|
|
12
|
+
[白描](白描.md)正相反,别搞混。
|
|
13
|
+
- **环境是主观的**:物理世界按这个人此刻的状态渲染。「现在是凌晨两点四十分,
|
|
14
|
+
我瘫在床上,烟一根接着一根。」
|
|
15
|
+
- **动作是扳机不是事件**:只记录引发内心活动的最小动作,重点永远是紧随而至的评注。
|
|
16
|
+
- **两种对白分开**:
|
|
17
|
+
- 【回忆对白】—— 像剧本一样精准复现,不带任何语气修饰,是提交给内心审判的证物。
|
|
18
|
+
- 【内心对白】—— 他跟自己、跟假想中的听众持续争论,充满自嘲、反问和武断结论。
|
|
19
|
+
|
|
20
|
+
## 对照
|
|
21
|
+
|
|
22
|
+
| 别写 | 写 |
|
|
23
|
+
|---|---|
|
|
24
|
+
| 他感到一阵烦躁,手指无意识地敲着桌子。 | 烦。这个词太轻了。我在等一个我知道不会来的电话,这件事我从三点就知道了,我还是等到了六点。 |
|
|
25
|
+
| 她回忆起母亲当年说过的话。 | 「你以后会懂的。」——她当时是这么说的,一个字不多。我懂了。这就是问题所在。 |
|
|
26
|
+
|
|
27
|
+
## 禁忌
|
|
28
|
+
|
|
29
|
+
- ⛔ 别把"跳跃"写成"混乱"。联想要有可追的钩子(一个词、一个气味、一个动作),
|
|
30
|
+
读者跟得上才叫意识流,跟不上叫写坏了。
|
|
31
|
+
- ⛔ 不要每段都拉满。持续的高强度独白会让读者麻木,中间要有几拍纯粹的物理记录当
|
|
32
|
+
换气口。
|
|
33
|
+
|
|
34
|
+
## 什么时候它是错的选择
|
|
35
|
+
|
|
36
|
+
一桌人轮流说话的群像戏。意识流只能装一个人的脑子,多人场景用
|
|
37
|
+
[舞台剧](舞台剧.md)或[情感直给](情感直给.md)。
|
|
38
|
+
|
|
39
|
+
## 自检
|
|
40
|
+
|
|
41
|
+
**这一段里有没有一句是"作者在解释给读者听"的**。有就删 —— 这种文风里,叙事者
|
|
42
|
+
不对读者负责,只对自己诚实。
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# 武侠白话
|
|
2
|
+
|
|
3
|
+
**一句话**:招式写动线不写玄学,江湖话不掉书袋。
|
|
4
|
+
|
|
5
|
+
## 做法
|
|
6
|
+
|
|
7
|
+
- **打斗写几何**:谁在哪、朝哪动、够不够得着、退路在哪。读者要能在脑子里画出来。
|
|
8
|
+
招式名可以有,但名字后面必须跟得上一个看得见的动作。
|
|
9
|
+
- **内力/真气这类东西写代价,不写数值**:写他咳了口血、写他握不住剑,不写"运起
|
|
10
|
+
七成功力"。
|
|
11
|
+
- **对白用白话**,只在称谓和少数词上留古味(在下、承让、这位朋友)。⛔ 不堆四字
|
|
12
|
+
成语,不写"但见"、"却说"这类话本腔。
|
|
13
|
+
- **江湖是人情不是设定**:门派、恩怨、辈分,靠人的态度体现,不靠介绍。
|
|
14
|
+
- 环境写得实:土路、麦秸、马粪、酒的成色。
|
|
15
|
+
|
|
16
|
+
## 对照
|
|
17
|
+
|
|
18
|
+
| 别写 | 写 |
|
|
19
|
+
|---|---|
|
|
20
|
+
| 他运起浑厚内力,一掌拍出,威势惊人。 | 他往前一步,掌根撞在那人胸口。那人退了三步,撞翻了长凳。 |
|
|
21
|
+
| 但见剑光如虹,直取咽喉。 | 剑尖挑起来,走的是下巴底下那条线。 |
|
|
22
|
+
|
|
23
|
+
## 禁忌
|
|
24
|
+
|
|
25
|
+
- ⛔ 不写玄幻化的等级体系(境界、修为层数)。那是另一个类型,混进来就串味。
|
|
26
|
+
- ⛔ 打斗别超过两百字不换气。中间要有一句喘息(谁看了谁一眼、谁说了半句话)。
|
|
27
|
+
|
|
28
|
+
## 什么时候它是错的选择
|
|
29
|
+
|
|
30
|
+
用户要的是仙侠或者玄幻。那两个类型的爽点在越级和数值,跟这一种的写实取向冲突。
|
|
31
|
+
|
|
32
|
+
## 自检
|
|
33
|
+
|
|
34
|
+
挑一段打斗,**画一张俯视图**。画不出来说明你在写形容词不是写打斗。
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# 生活流
|
|
2
|
+
|
|
3
|
+
**一句话**:写琐碎的日常,高对白密度,什么都不解释。
|
|
4
|
+
|
|
5
|
+
## 做法
|
|
6
|
+
|
|
7
|
+
- **写没用的事**:找不到的钥匙、吃了一半的关东煮、空调外机的滴水声。日常戏的
|
|
8
|
+
质感就住在这些没有推进功能的细节里。
|
|
9
|
+
- **对白占一半以上**,而且是**真的日常对白** —— 有废话、有跑题、有听岔、有说到
|
|
10
|
+
一半被打断。两个人不会轮流发表完整观点。
|
|
11
|
+
- **什么都不解释**。名词、梗、人物关系,出现了就出现了。读者跟不上一两句没关系,
|
|
12
|
+
跟得上的那种爽感来自"我懂这个"。
|
|
13
|
+
- 情绪藏在**做什么**里,不在说什么里:他生气就多洗了十分钟碗。
|
|
14
|
+
- 段落短,场景切得碎,时间跳得随意。
|
|
15
|
+
|
|
16
|
+
## 对照
|
|
17
|
+
|
|
18
|
+
| 别写 | 写 |
|
|
19
|
+
|---|---|
|
|
20
|
+
| 「你今天看起来心情不好,发生什么了吗?」 | 「你饭没吃完。」<br>「嗯。」<br>「……那我吃了。」 |
|
|
21
|
+
| 她意识到自己已经很久没有好好休息了。 | 她在沙发上坐下,然后就没再站起来。电视一直放到出现"您还在观看吗"。 |
|
|
22
|
+
|
|
23
|
+
## 禁忌
|
|
24
|
+
|
|
25
|
+
- ⛔ 别让角色替你总结主题。「我们是不是都变了」这种台词一出现,生活流就死了。
|
|
26
|
+
- ⛔ 别把琐碎写成流水账。琐碎要**挑**过 —— 挑那些能顺带说明人物状态的。
|
|
27
|
+
|
|
28
|
+
## 什么时候它是错的选择
|
|
29
|
+
|
|
30
|
+
高强度冲突和动作场面。生活流的节奏撑不住打斗和追逐,那时候切
|
|
31
|
+
[阶段切换](阶段切换.md)或[冷硬](冷硬.md)。
|
|
32
|
+
|
|
33
|
+
## 自检
|
|
34
|
+
|
|
35
|
+
数一下这一拍里**有几件事是不必要的**。一件都没有,说明写得太功利,还不是生活流。
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# 白描(零度写作)
|
|
2
|
+
|
|
3
|
+
**一句话**:只写摄像机和录音机能捕捉到的东西,情绪从生理反应和克制动作里渗出来。
|
|
4
|
+
|
|
5
|
+
这是默认的安全牌,也是治 AI 腔最狠的一刀 —— 因为 AI 腔的核心症状就是**替读者
|
|
6
|
+
把情绪说完**。
|
|
7
|
+
|
|
8
|
+
## 做法
|
|
9
|
+
|
|
10
|
+
- **只记录物理事实**:行为、对白、环境。不加比喻、不加主观形容词、不渲染气氛。
|
|
11
|
+
- 情绪要动的时候,先用**微小生理反应**(喉间发紧、指尖发凉、耳廓发热)和**克制
|
|
12
|
+
动作**(欲伸又止的手、假装整理衣领、视线躲闪)渗透,不直说他难过。
|
|
13
|
+
- 真正的爆发拍才放开修辞,**爆完立刻回到白描收尾留白**。
|
|
14
|
+
|
|
15
|
+
## 对照
|
|
16
|
+
|
|
17
|
+
| 别写 | 写 |
|
|
18
|
+
|---|---|
|
|
19
|
+
| 他若有所思地放下咖啡杯。 | 他放下咖啡杯。窗外有一棵梧桐树。 |
|
|
20
|
+
| 气氛突然变得凝重起来。 | 没有人接话。空调的声音变得很清楚。 |
|
|
21
|
+
| 她心里涌起一阵酸楚。 | 她低头看着菜单,手指在边角上按出一道折痕。 |
|
|
22
|
+
|
|
23
|
+
## 禁忌
|
|
24
|
+
|
|
25
|
+
- ⛔ 不做解释性或评价性描述。「这说明他其实很在意」这种句子一律删掉。
|
|
26
|
+
- ⛔ 首句不用任何修辞。一段的第一句是定调的,一上来打比方就滑走了。
|
|
27
|
+
- ⛔ 不要因为"克制"就把段落写得一样长。长短要错落,不然是流水账不是白描。
|
|
28
|
+
|
|
29
|
+
## 什么时候它是错的选择
|
|
30
|
+
|
|
31
|
+
用户要的是**共情**而不是**观察**的时候。他说"我想被这段戏打动",白描给不了他 ——
|
|
32
|
+
那时候去看[情感直给](情感直给.md)。
|
|
33
|
+
|
|
34
|
+
## 自检
|
|
35
|
+
|
|
36
|
+
写完挑一段,把所有形容词划掉。**如果划完这段就没信息了,说明你在靠形容词撑场,
|
|
37
|
+
不是在写白描。**
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# 舞台剧
|
|
2
|
+
|
|
3
|
+
**一句话**:对白承载一切。场景、关系、过去的事,全从人嘴里出来。
|
|
4
|
+
|
|
5
|
+
## 做法
|
|
6
|
+
|
|
7
|
+
- **对白占七成以上**。旁白只做三件事:谁进来了、谁出去了、谁动了一下手。
|
|
8
|
+
- **不写内心**。一个人在想什么,只能通过他说什么、以及他**不说什么**表现。
|
|
9
|
+
- **信息全从对白里给**:不写"这间屋子二十年没人住过",写有人说「灰这么厚。」
|
|
10
|
+
- **台词要能听**。念出来拗口就是写坏了。
|
|
11
|
+
- 舞台指示极简,而且只写**可见的动作**:(她站起来)而不是(她不安地站起来)。
|
|
12
|
+
|
|
13
|
+
## 对照
|
|
14
|
+
|
|
15
|
+
| 别写 | 写 |
|
|
16
|
+
|---|---|
|
|
17
|
+
| 他显然不相信她的说辞。 | 「你说你八点就到了。」<br>「对。」<br>「门卫说九点半。」 |
|
|
18
|
+
| 房间里弥漫着陈旧的气味,看得出很久没人打理。 | 「窗户能开吗?」<br>「卡住了,一直卡着。」 |
|
|
19
|
+
|
|
20
|
+
## 禁忌
|
|
21
|
+
|
|
22
|
+
- ⛔ 别让角色说出他不可能说的话(把设定念给读者听)。信息要**有人问才有人答**。
|
|
23
|
+
- ⛔ 三个人以上同场时,别让谁长时间消失。沉默的人也要偶尔被点到。
|
|
24
|
+
|
|
25
|
+
## 什么时候它是错的选择
|
|
26
|
+
|
|
27
|
+
单人独处的戏。没有对手就没有对白,这种文风直接失效 ——
|
|
28
|
+
那时候用[意识流](意识流.md)。
|
|
29
|
+
|
|
30
|
+
## 自检
|
|
31
|
+
|
|
32
|
+
把所有旁白删掉,**只读对白**。故事还看得懂吗?看得懂才算写成了。
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# 阶段切换
|
|
2
|
+
|
|
3
|
+
**一句话**:同一场戏里按情节强度切换写法 —— 平推期零度写作,爆点才火力全开。
|
|
4
|
+
|
|
5
|
+
这是**长线剧情的解法**。单一文风读上十几章一定会腻,这一种把腻的问题变成节奏的
|
|
6
|
+
一部分。四个阶段由故事内在逻辑驱动,**不是由你想换口味驱动**。
|
|
7
|
+
|
|
8
|
+
## 四个阶段
|
|
9
|
+
|
|
10
|
+
### 一、平推期(越久越好)
|
|
11
|
+
开端、日常、平稳推进。**零度写作**:只记录摄像机和录音机捕捉得到的物理事实。
|
|
12
|
+
戒律是这一阶段的最高优先级 —— 彻底杜绝比喻、拟人、主观形容词、心理描写、气氛渲染。
|
|
13
|
+
> 他放下白色咖啡杯。窗外有一棵梧桐树。
|
|
14
|
+
|
|
15
|
+
⚠️ 人称要多样化,防「他他他他他」的流水账。
|
|
16
|
+
|
|
17
|
+
### 二、渗透期
|
|
18
|
+
转折、意外、关系突变、情绪初现。节奏加快,引入主观感受,**但仍然不用比喻**。
|
|
19
|
+
工具箱三件:微小生理反应、感官细节聚焦(温度/质感/气味/微小声响)、克制动作。
|
|
20
|
+
> 她瞥见桌上的照片。她感到耳廓发热,手指在门把手上滑了一下。
|
|
21
|
+
|
|
22
|
+
### 三、引爆期
|
|
23
|
+
矛盾爆发、情绪高潮。火力全开,这时候才允许比喻和修辞。
|
|
24
|
+
工具箱:环境投射(骤停的雨声、倾泻的光线)、连续动词的动态描写、长短句交替砸。
|
|
25
|
+
|
|
26
|
+
### 四、回落期
|
|
27
|
+
爆完立刻回到零度写作。**这一步最容易被跳过,但它才是让引爆期显得有分量的东西** ——
|
|
28
|
+
没有回落,高潮就只是又一段形容词。
|
|
29
|
+
|
|
30
|
+
## 切换纪律
|
|
31
|
+
|
|
32
|
+
- **宁缓勿急**。允许长期停在同一阶段,克制"该换了"的冲动。
|
|
33
|
+
- 切换必须由故事驱动:有人做了什么、有事发生了,不是因为你写腻了。
|
|
34
|
+
- **自然段字数必须长短不一**,禁止一直长段或一直短段。
|
|
35
|
+
|
|
36
|
+
## 什么时候它是错的选择
|
|
37
|
+
|
|
38
|
+
一次性的短场景。四个阶段跑不完就结束了,那不如直接挑一个固定文风。
|
|
39
|
+
|
|
40
|
+
## 自检
|
|
41
|
+
|
|
42
|
+
指着你这一拍说出它在**哪个阶段**。说不出来就是没在用这种文风,是在随机切换。
|