@xiaobuyu/nodesign 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/README.md +156 -106
  2. package/bin/nodesign.js +0 -0
  3. package/package.json +1 -1
  4. package/server/api/README.md +45 -45
  5. package/server/api/_guard.js +75 -75
  6. package/server/api/admin.js +187 -187
  7. package/server/api/assets/docx-page.js +103 -103
  8. package/server/api/assets/helpers.js +42 -22
  9. package/server/api/assets/notes.js +194 -144
  10. package/server/api/assets.js +891 -896
  11. package/server/api/board.js +134 -57
  12. package/server/api/browse.js +138 -138
  13. package/server/api/canvas.js +444 -444
  14. package/server/api/chatai.js +324 -324
  15. package/server/api/exports/build-standalone.js +980 -980
  16. package/server/api/exports/cards.js +118 -118
  17. package/server/api/exports/docx-pdf.js +46 -46
  18. package/server/api/exports/export-page.js +142 -142
  19. package/server/api/exports/handoff.js +147 -147
  20. package/server/api/exports.js +690 -690
  21. package/server/api/instruction.js +75 -75
  22. package/server/api/me.js +116 -116
  23. package/server/api/memory.js +185 -185
  24. package/server/api/pending-changes.js +366 -366
  25. package/server/api/plugins.js +164 -164
  26. package/server/api/projects.js +220 -220
  27. package/server/api/publish.js +64 -64
  28. package/server/api/recent.js +73 -73
  29. package/server/api/sessions.js +589 -589
  30. package/server/api/skills.js +77 -77
  31. package/server/api/standalone-fit.js +168 -168
  32. package/server/api/turn-compose.js +180 -180
  33. package/server/api/turn-inflight.js +44 -44
  34. package/server/auth/README.md +17 -17
  35. package/server/auth/middleware.js +138 -138
  36. package/server/auth/origin-guard.js +71 -71
  37. package/server/auth/session.js +108 -108
  38. package/server/auth/tier.js +113 -113
  39. package/server/auth/users-store.js +348 -348
  40. package/server/edit/README.md +29 -29
  41. package/server/engine/README.md +113 -113
  42. package/server/engine/agent/agent-shared.js +550 -550
  43. package/server/engine/agent/auto-mode-default-hard-deny.txt +4 -4
  44. package/server/engine/agent/auto-mode-rules.js +78 -78
  45. package/server/engine/agent/context.js +418 -418
  46. package/server/engine/agent/events.js +465 -464
  47. package/server/engine/agent/hooks/canvas-validate.js +199 -199
  48. package/server/engine/agent/hooks/failure.js +120 -120
  49. package/server/engine/agent/hooks/file-events.js +75 -75
  50. package/server/engine/agent/hooks/lifecycle.js +233 -233
  51. package/server/engine/agent/hooks/post-canvas-focus.js +80 -80
  52. package/server/engine/agent/hooks/post-guidance.js +206 -206
  53. package/server/engine/agent/hooks/post-subagent-report.js +104 -104
  54. package/server/engine/agent/hooks/post-trim.js +58 -58
  55. package/server/engine/agent/hooks/pre-board-neighborhood.js +34 -34
  56. package/server/engine/agent/hooks/pre-defaults.js +84 -84
  57. package/server/engine/agent/hooks/pre-injectors.js +277 -277
  58. package/server/engine/agent/hooks/pre-performance-log-guard.js +78 -78
  59. package/server/engine/agent/hooks/pre-starter-files.js +61 -61
  60. package/server/engine/agent/hooks/pre-workspace-scope-guard.js +78 -78
  61. package/server/engine/agent/hooks/site-validate.js +94 -94
  62. package/server/engine/agent/hooks/tool-prompts.js +31 -31
  63. package/server/engine/agent/hooks/turn-state-memory.js +56 -56
  64. package/server/engine/agent/hooks/user-prompt-submit.js +258 -215
  65. package/server/engine/agent/hooks.js +354 -354
  66. package/server/engine/agent/init-contract.js +69 -69
  67. package/server/engine/agent/isolation.js +159 -159
  68. package/server/engine/agent/model-table.js +292 -292
  69. package/server/engine/agent/plugin-loader.js +266 -266
  70. package/server/engine/agent/prompts/nodesign-prelude.md +388 -336
  71. package/server/engine/agent/prompts/tools/ask-user-question-protocol.md +71 -71
  72. package/server/engine/agent/prompts/tools/direct-edit-protocol.md +98 -98
  73. package/server/engine/agent/prompts/tools/generate-image-cookbook.gemini-gateway.md +583 -583
  74. package/server/engine/agent/prompts/tools/generate-image-cookbook.md +483 -483
  75. package/server/engine/agent/prompts/tools/hybrid-reference.md +100 -100
  76. package/server/engine/agent/prompts/tools/paint-still-cookbook.md +270 -270
  77. package/server/engine/agent/prompts/tools/roll-film-cookbook.md +70 -70
  78. package/server/engine/agent/prompts/tools/site-reference.md +106 -106
  79. package/server/engine/agent/prompts/tools/tweaks-syntax.md +125 -125
  80. package/server/engine/agent/prompts/tools/vision-checker-dispatch.md +48 -48
  81. package/server/engine/agent/session-loop.js +1035 -1024
  82. package/server/engine/agent/session-model.js +164 -164
  83. package/server/engine/agent/skill.js +204 -204
  84. package/server/engine/agent/task-events.js +78 -78
  85. package/server/engine/agents/ds-extractor.md +132 -132
  86. package/server/engine/agents/explorer.md +190 -190
  87. package/server/engine/agents/index.js +230 -230
  88. package/server/engine/agents/schemas/design-system.json +156 -156
  89. package/server/engine/agents/schemas/tweak-schema.json +113 -113
  90. package/server/engine/agents/tweak-proposer.md +127 -127
  91. package/server/engine/agents/vision-checker.md +254 -254
  92. package/server/engine/browse/capture.js +422 -422
  93. package/server/engine/browse/card.js +137 -137
  94. package/server/engine/browse/handover.js +59 -59
  95. package/server/engine/browse/page-digest.js +119 -119
  96. package/server/engine/browse/refs.js +196 -196
  97. package/server/engine/browse/registry.js +307 -307
  98. package/server/engine/browse/screencast.js +170 -170
  99. package/server/engine/browse/state.js +121 -121
  100. package/server/engine/chatai/chat-log.js +79 -79
  101. package/server/engine/chatai/index.js +193 -193
  102. package/server/engine/chatai/openai-compat.js +152 -152
  103. package/server/engine/chatai/orchestrate.js +309 -309
  104. package/server/engine/chatai/perform.js +40 -40
  105. package/server/engine/chatai/summarize.js +79 -79
  106. package/server/engine/mcp/capability-gate.js +52 -52
  107. package/server/engine/mcp/index.js +351 -339
  108. package/server/engine/mcp/param-sanitizer.js +142 -142
  109. package/server/engine/mcp/tools/arrange-on-board.js +124 -124
  110. package/server/engine/mcp/tools/artifact-session.js +278 -278
  111. package/server/engine/mcp/tools/browse-computer.js +421 -421
  112. package/server/engine/mcp/tools/browse-find-batch.js +183 -183
  113. package/server/engine/mcp/tools/browse-screenshot.js +157 -157
  114. package/server/engine/mcp/tools/browse.js +480 -480
  115. package/server/engine/mcp/tools/build-docx.js +101 -101
  116. package/server/engine/mcp/tools/clear-pending-changes.js +99 -99
  117. package/server/engine/mcp/tools/create-on-board.js +152 -155
  118. package/server/engine/mcp/tools/crystallize-skill.js +168 -168
  119. package/server/engine/mcp/tools/edit-sketch.js +167 -0
  120. package/server/engine/mcp/tools/explain-style.js +237 -237
  121. package/server/engine/mcp/tools/export-handoff.js +133 -133
  122. package/server/engine/mcp/tools/expose-tweaks.js +149 -149
  123. package/server/engine/mcp/tools/generate-image.js +842 -842
  124. package/server/engine/mcp/tools/get-computed-styles.js +164 -164
  125. package/server/engine/mcp/tools/get-pending-changes.js +205 -205
  126. package/server/engine/mcp/tools/h3box-ssh.js +84 -84
  127. package/server/engine/mcp/tools/helpers/acquire-page.js +82 -82
  128. package/server/engine/mcp/tools/helpers/motion-lab.js +554 -554
  129. package/server/engine/mcp/tools/helpers/motion-scroll.js +112 -112
  130. package/server/engine/mcp/tools/helpers/perception-page.js +215 -215
  131. package/server/engine/mcp/tools/helpers/reference-download.js +103 -103
  132. package/server/engine/mcp/tools/helpers/rembg-bridge.py +80 -80
  133. package/server/engine/mcp/tools/helpers/shot-pipeline.js +280 -280
  134. package/server/engine/mcp/tools/highlight.js +68 -68
  135. package/server/engine/mcp/tools/list-pages.js +222 -222
  136. package/server/engine/mcp/tools/look-at-board.js +124 -0
  137. package/server/engine/mcp/tools/lookup-tags.js +59 -59
  138. package/server/engine/mcp/tools/navigate-to-page.js +60 -60
  139. package/server/engine/mcp/tools/organize-board.js +64 -64
  140. package/server/engine/mcp/tools/paint-still.js +434 -434
  141. package/server/engine/mcp/tools/pin-to-board.js +130 -130
  142. package/server/engine/mcp/tools/preview-deck.js +130 -130
  143. package/server/engine/mcp/tools/profile-scroll.js +305 -305
  144. package/server/engine/mcp/tools/publish-site.js +102 -102
  145. package/server/engine/mcp/tools/query-elements.js +195 -195
  146. package/server/engine/mcp/tools/read-board.js +190 -103
  147. package/server/engine/mcp/tools/read-document.js +93 -93
  148. package/server/engine/mcp/tools/read-page.js +264 -264
  149. package/server/engine/mcp/tools/read-tavern-json.js +143 -143
  150. package/server/engine/mcp/tools/read-user-view.js +59 -0
  151. package/server/engine/mcp/tools/record-decision.js +140 -140
  152. package/server/engine/mcp/tools/relate-on-board.js +112 -110
  153. package/server/engine/mcp/tools/report-issue.js +115 -115
  154. package/server/engine/mcp/tools/roll-film.js +266 -266
  155. package/server/engine/mcp/tools/screenshot-docx.js +138 -138
  156. package/server/engine/mcp/tools/screenshot-url.js +195 -195
  157. package/server/engine/mcp/tools/screenshot.js +583 -583
  158. package/server/engine/mcp/tools/sketch-on-board.js +337 -0
  159. package/server/engine/mcp/tools/tier-gate.js +96 -96
  160. package/server/engine/mcp/tools/trace-motion.js +215 -215
  161. package/server/engine/mcp/tools/web-search.js +548 -548
  162. package/server/engine/mcp/tools/write-on-board.js +130 -0
  163. package/server/engine/motion/inventory.js +349 -349
  164. package/server/engine/perception/session.js +235 -235
  165. package/server/engine/plugins/nodesign/.claude-plugin/plugin.json +5 -5
  166. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/SKILL.md +199 -192
  167. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/canvas.template.html +667 -667
  168. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/hybrid-grid.md +22 -22
  169. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/image-led-cover.md +25 -25
  170. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/portrait.md +23 -23
  171. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/quote-backdrop.md +21 -21
  172. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/section-divider.md +23 -23
  173. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/text-led.md +21 -21
  174. package/server/engine/plugins/nodesign/skills/docx-craft/SKILL.md +169 -162
  175. package/server/engine/plugins/nodesign/skills/docx-craft/references/token-schema.md +407 -407
  176. package/server/engine/plugins/nodesign/skills/docx-craft//346/226/207/346/241/243.template.json +80 -80
  177. package/server/engine/plugins/nodesign/skills/rp-craft/SKILL.md +235 -228
  178. package/server/engine/plugins/nodesign/skills/rp-craft/patterns//346/274/224/345/207/272/351/241/265-/346/234/200/345/260/217/345/256/236/347/216/260.html +78 -78
  179. package/server/engine/plugins/nodesign/skills/rp-craft//346/274/224/345/207/272.template.js +268 -268
  180. package/server/engine/plugins/nodesign/skills/site-craft/SKILL.md +330 -323
  181. package/server/engine/plugins/nodesign/skills/site-craft/patterns/build-lane.md +134 -134
  182. package/server/engine/plugins/nodesign/skills/site-craft/patterns/cutout-collage.md +61 -61
  183. package/server/engine/plugins/nodesign/skills/site-craft/patterns/mock-app.md +163 -163
  184. package/server/engine/plugins/nodesign/skills/site-craft/patterns/page-transitions.md +86 -86
  185. package/server/engine/runs/active-runs.js +698 -698
  186. package/server/engine/runs/board-tasklist.js +130 -0
  187. package/server/engine/runs/live-turn.js +252 -252
  188. package/server/engine/runs/store.js +364 -364
  189. package/server/engine/runs/turn-relay.js +217 -217
  190. package/server/engine/runtime/workspace.js +164 -164
  191. package/server/index.js +3 -0
  192. package/server/lib/artifact-file-path.js +80 -80
  193. package/server/lib/artifact-target.js +284 -284
  194. package/server/lib/asset-refs.js +239 -239
  195. package/server/lib/async-queue.js +104 -104
  196. package/server/lib/auto-relations.js +130 -130
  197. package/server/lib/binding-types.js +72 -60
  198. package/server/lib/board-graph-export.js +191 -0
  199. package/server/lib/board-groups.js +167 -0
  200. package/server/lib/board-hero.js +76 -0
  201. package/server/lib/board-kind-sizes.js +85 -62
  202. package/server/lib/board-relations.js +133 -133
  203. package/server/lib/browse-proxy.js +180 -180
  204. package/server/lib/canvas-id.js +36 -36
  205. package/server/lib/chalk.js +121 -0
  206. package/server/lib/cover.js +227 -227
  207. package/server/lib/danbooru-tags.js +291 -291
  208. package/server/lib/doc-extract.js +156 -156
  209. package/server/lib/docx/build-from-source.js +260 -260
  210. package/server/lib/docx/build.js +490 -490
  211. package/server/lib/docx/dump-styles.js +287 -287
  212. package/server/lib/docx/fonts/nodesign-cjk.conf +164 -164
  213. package/server/lib/docx/merge-runs.js +129 -129
  214. package/server/lib/docx/numbering.js +218 -218
  215. package/server/lib/docx/order.js +152 -152
  216. package/server/lib/docx/rawzip.js +172 -172
  217. package/server/lib/docx/render.js +92 -92
  218. package/server/lib/docx/text-lint.js +225 -225
  219. package/server/lib/docx/tokens.js +335 -335
  220. package/server/lib/docx/units.js +29 -29
  221. package/server/lib/docx/xml.js +291 -291
  222. package/server/lib/docx-pages.js +187 -187
  223. package/server/lib/export-collect.js +289 -289
  224. package/server/lib/export-package.js +210 -210
  225. package/server/lib/html-srcset.js +145 -145
  226. package/server/lib/image-variant.js +460 -460
  227. package/server/lib/ingress/forward-openai-chat.js +305 -305
  228. package/server/lib/ingress/openai-chat.js +491 -491
  229. package/server/lib/ingress/session-notice.js +66 -66
  230. package/server/lib/ingress/session-routes.js +68 -68
  231. package/server/lib/ingress/slot-probe.js +130 -130
  232. package/server/lib/ingress/upstream-billing.js +52 -52
  233. package/server/lib/ingress/upstream-fail-streak.js +72 -72
  234. package/server/lib/ingress/upstream-truncation.js +48 -48
  235. package/server/lib/issues-store.js +182 -182
  236. package/server/lib/kinds/deck.js +72 -72
  237. package/server/lib/kinds/docx.js +283 -283
  238. package/server/lib/kinds/file-kinds.js +113 -113
  239. package/server/lib/kinds/index.js +202 -202
  240. package/server/lib/kinds/site.js +161 -161
  241. package/server/lib/model-ingress.js +543 -543
  242. package/server/lib/moderation.js +255 -255
  243. package/server/lib/notice-store.js +103 -103
  244. package/server/lib/plugin-install.js +104 -104
  245. package/server/lib/plugin-validator.js +721 -721
  246. package/server/lib/publish-store.js +115 -115
  247. package/server/lib/quick-summary.js +52 -52
  248. package/server/lib/quota.js +270 -270
  249. package/server/lib/rate-window.js +29 -29
  250. package/server/lib/reference-assets.js +92 -92
  251. package/server/lib/region-shot.js +135 -135
  252. package/server/lib/safe-path.js +73 -73
  253. package/server/lib/sdk-session.js +33 -33
  254. package/server/lib/showcase-store.js +92 -92
  255. package/server/lib/site-publish.js +465 -465
  256. package/server/lib/sketch-layout.js +277 -0
  257. package/server/lib/ssrf-guard.js +432 -432
  258. package/server/lib/task-scan.js +158 -158
  259. package/server/lib/tavern-json.js +154 -154
  260. package/server/lib/video-variant.js +237 -237
  261. package/server/lib/workspace-path.js +33 -33
  262. package/server/ops/fix-sdk-musl.mjs +40 -40
  263. package/server/ops/install-macos-fonts.sh +114 -114
  264. package/server/ops/macos-fonts.conf +336 -336
  265. package/server/ops/sandbox-shim/bwrap +57 -57
  266. package/server/projects/assets-summary.js +119 -119
  267. package/server/projects/auto-name.js +53 -53
  268. package/server/projects/board-limits.js +12 -0
  269. package/server/projects/board-sanitize.js +252 -0
  270. package/server/projects/board-store.js +507 -640
  271. package/server/projects/move-entry.js +103 -103
  272. package/server/projects/store.js +270 -270
  273. package/server/projects/ui-config.js +60 -54
  274. package/server/projects/viewpoint-store.js +78 -0
  275. package/server/projects/workspace-templates.js +53 -53
  276. package/server/projects/workspace.js +1025 -1025
  277. package/server/runtime/local-config.js +177 -177
  278. package/server/runtime/profile.js +72 -72
  279. package/server/services/rembg-service.py +334 -334
  280. package/server/shared/README.md +25 -25
  281. package/server/shared/deck.js +54 -54
  282. package/server/shared/time.js +49 -49
  283. package/server/style-pipeline/README.md +53 -53
  284. package/server/ws/broker.js +39 -36
  285. package/server/ws/browse-channel.js +177 -177
  286. package/server/ws/index.js +386 -386
  287. package/web/README.md +89 -89
  288. package/web/dist/assets/BrowserWindow-P_vIdh-G.js +11 -0
  289. package/web/dist/assets/{DeckWindow-4G0xX7P3.js → DeckWindow-BpLv5082.js} +3 -3
  290. package/web/dist/assets/{DocxWindow-BXQsoPkh.js → DocxWindow-DSAU1-tD.js} +4 -4
  291. package/web/dist/assets/MermaidBlock-DR1GikCv.js +313 -0
  292. package/web/dist/assets/SiteWindow-92uBuRRR.js +18 -0
  293. package/web/dist/assets/abnfDiagram-VCTEODGH-uA8Esix4.js +1 -0
  294. package/web/dist/assets/arc-D_khH_xN.js +1 -0
  295. package/web/dist/assets/architectureDiagram-5GKGNRK7-DydJHqOt.js +36 -0
  296. package/web/dist/assets/blockDiagram-NRAW4CY4-B7wBbKiW.js +129 -0
  297. package/web/dist/assets/c4Diagram-UCG6FXSJ-6mrH0x7Y.js +38 -0
  298. package/web/dist/assets/channel-DGkccMO1.js +1 -0
  299. package/web/dist/assets/chunk-2Q5K7J3B-Cuikho5Q.js +1 -0
  300. package/web/dist/assets/chunk-5VM5RSS4-3-KZ5AUz.js +15 -0
  301. package/web/dist/assets/chunk-F27PBJKO-Bkwq2gGU.js +1 -0
  302. package/web/dist/assets/chunk-G27WJ6UU-BLyQzdGE.js +231 -0
  303. package/web/dist/assets/chunk-JWPE2WC7-B7HxxQds.js +1 -0
  304. package/web/dist/assets/chunk-LCL6LL3I-CtXrnUwF.js +206 -0
  305. package/web/dist/assets/chunk-POPQ4Y6H-dxddZlXt.js +1 -0
  306. package/web/dist/assets/chunk-SVP7TREG-DpkmrgHn.js +88 -0
  307. package/web/dist/assets/chunk-XXDRQBXY-BwZ7RbpQ.js +1 -0
  308. package/web/dist/assets/classDiagram-DTDB5LWJ-BGscw3OD.js +1 -0
  309. package/web/dist/assets/classDiagram-v2-JRS7N3AN-BGscw3OD.js +1 -0
  310. package/web/dist/assets/cose-bilkent-JH36ORCC-DGFOsMUt.js +1 -0
  311. package/web/dist/assets/cynefin-OW5HDTMX-DUwn3ehS.js +178 -0
  312. package/web/dist/assets/cynefinDiagram-5FMLGOSQ-DlLAOZ9x.js +62 -0
  313. package/web/dist/assets/cytoscape.esm-BjAbmLdb.js +331 -0
  314. package/web/dist/assets/dagre-3AP2YEHR-CyourLfz.js +4 -0
  315. package/web/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  316. package/web/dist/assets/diagram-S7CK7UJ4-BTMbx2np.js +30 -0
  317. package/web/dist/assets/diagram-UQ7AKVKN-UK94_1-P.js +41 -0
  318. package/web/dist/assets/diagram-VSXAHHWV-C7zS-v9v.js +3 -0
  319. package/web/dist/assets/diagram-VX7I27RA-DKJRa6CK.js +24 -0
  320. package/web/dist/assets/diagram-Z3DM3KII-kUbAfGAp.js +24 -0
  321. package/web/dist/assets/ebnfDiagram-PWID7BFC-CVW16_vb.js +1 -0
  322. package/web/dist/assets/erDiagram-SSCWMZ5O-BRQMFQ5y.js +99 -0
  323. package/web/dist/assets/flowDiagram-A5DVABFB-S34LpLtK.js +168 -0
  324. package/web/dist/assets/ganttDiagram-EL5Y4UJY-BFiqk1-G.js +292 -0
  325. package/web/dist/assets/gitGraphDiagram-WWUBYQGX-LZsrdyyv.js +106 -0
  326. package/web/dist/assets/index-GAamh1p4.js +2152 -0
  327. package/web/dist/assets/infoDiagram-RXCK75RN-0DvN6KIp.js +2 -0
  328. package/web/dist/assets/init-Gi6I4Gst.js +1 -0
  329. package/web/dist/assets/ishikawaDiagram-5VMMS53U-CaY3A-Bx.js +70 -0
  330. package/web/dist/assets/journeyDiagram-EYS64GPL-BBeiaCrj.js +139 -0
  331. package/web/dist/assets/kanban-definition-3QL26DDD-ux42DRXQ.js +89 -0
  332. package/web/dist/assets/layout-CnXiF_NB.js +1 -0
  333. package/web/dist/assets/linear-BMW0u6G6.js +1 -0
  334. package/web/dist/assets/mindmap-definition-FBJOCRG2-hUxSpdKn.js +96 -0
  335. package/web/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  336. package/web/dist/assets/pegDiagram-XKGWAZYB-aCaQPH0w.js +1 -0
  337. package/web/dist/assets/{pending-edit-apply-DTjo2geW.js → pending-edit-apply-AcdOQ9Ij.js} +6 -6
  338. package/web/dist/assets/pieDiagram-E7YTZNPT-CmOEZ8zg.js +39 -0
  339. package/web/dist/assets/quadrantDiagram-AXDQQJYC-VW6fAhsV.js +7 -0
  340. package/web/dist/assets/railroadDiagram-O6MQD6OU-CKJ7Ba5K.js +1 -0
  341. package/web/dist/assets/requirementDiagram-EFPCY7ZU-pNGkq9Vw.js +84 -0
  342. package/web/dist/assets/{rotate-cw-LMT3x1Zj.js → rotate-cw-KAfChbGV.js} +1 -1
  343. package/web/dist/assets/sankeyDiagram-P5KCCOFB-BIMmDTfZ.js +40 -0
  344. package/web/dist/assets/sequenceDiagram-WJ2MYXX4-BBW7wzKY.js +162 -0
  345. package/web/dist/assets/sizeCapture-X5ZJPWSS-DdkXmLYR.js +1 -0
  346. package/web/dist/assets/{square-dashed-mouse-pointer-CBoAkfhi.js → square-dashed-mouse-pointer-CDUlhUP7.js} +1 -1
  347. package/web/dist/assets/stateDiagram-HBIQ2CUA-W313Uz16.js +1 -0
  348. package/web/dist/assets/stateDiagram-v2-4QOOHH4V-DDhJBZzf.js +1 -0
  349. package/web/dist/assets/swimlanes-XN3QIQJK-C29TL26K.js +1 -0
  350. package/web/dist/assets/swimlanesDiagram-VK2B7HYN-BfN-Xdmu.js +8 -0
  351. package/web/dist/assets/timeline-definition-24CTP7MA-CF0JMObX.js +120 -0
  352. package/web/dist/assets/vennDiagram-4TSXK5OY-DrDFsaH3.js +34 -0
  353. package/web/dist/assets/wardleyDiagram-VM6X3IG4-CVrnRIS_.js +78 -0
  354. package/web/dist/assets/xychartDiagram-S5SC5T6Z-BvkN1zsT.js +7 -0
  355. package/web/dist/index.html +17 -17
  356. package/web/dist/assets/BrowserWindow-Dc7J7CYc.js +0 -11
  357. package/web/dist/assets/SiteWindow-D6eS-2gM.js +0 -18
  358. package/web/dist/assets/index-Cbl3ATvp.js +0 -2125
@@ -1,228 +1,235 @@
1
- ---
2
- name: rp-craft
3
- version: 0.1.1
4
- description: NoDesign 互动演出(RP)方法论 —— 搭一场角色扮演:编排上下文(编排.yaml 三区模型)、写角色与世界、造演出页前端、串起 chatai 通路。只要用户想角色扮演就用本 skill —— 包括直接说「开一场RP」「我们来玩角色扮演」并当场给出人物设定的情况:你是搭台的场务,不是台上的演员,绝不在设计对话里亲自扮演角色,而是按本 skill 把演出搭成能反复进场的作品(角色在专门的演出页里开口,那条通路便宜得多、也不占设计会话)。也用于把酒馆(SillyTavern)角色卡搬进来。不要用于写小说(那是另一回事,别拿这套硬套)。
5
- ---
6
-
7
- # 一场演出是什么
8
-
9
- 三样东西住在**一个文件夹**里,缺一不可:
10
-
11
- 1. `编排.yaml` —— 上下文的播放单(进模型的一切按它拼)
12
- 2. 设定文件 —— 角色、世界、文风,自由组织,被播放单引用
13
- 3. `index.html` —— 演出页。有它这个文件夹就会被认成站点,用通用站点窗打开
14
-
15
- 对话记录 `对话.jsonl` 和摘要 `摘要.json` 演出中自动生成。**摘要是派生态,永远别手写。**
16
-
17
- 台上说话的是 **chatai**:一次纯补全调用,没有工具、没有会话、改不了任何文件。
18
- 你(agent)只负责搭台和调台,不在台上。演出的每一轮花费按平台单价表记入用户额度。
19
-
20
- # 机制契约(这一节照抄不走样)
21
-
22
- ## 编排.yaml 全貌
23
-
24
- ```yaml
25
- 模型: gemini-3.7-flash # 可省 = 平台默认。摘要可单配便宜的(摘要.模型)
26
- 思考: 低 # 思考档,可省 = 该模型最省的那档。gemini 系 低/中/高、
27
- # claude 系 关/高(开扩展思考);写了模型没有的档不报错,
28
- # 按默认档跑并在回包里说明。摘要另有 摘要.思考,不写就走
29
- # 默认档(压缩不是创作,别给摘要开高思考烧钱)
30
- 最大输出: 400 # RP 短回合是质量旋钮:300–600 合适,放大了戏会水
31
- 上下文预算: 60000 # 输入侧预算:系统层和尾部照给,历史是弹性区被从最旧挤压
32
-
33
- 系统层: # → system 参数。整区冻结,是缓存的本体
34
- - 名字: 身份与规则
35
- 文件: 设定/老芦.md
36
- - 名字: 世界观
37
- 文件: 设定/夜行集市.md
38
- - 名字: 文风
39
- 内容: |
40
- 第二人称现在时,只写可感知的事,结尾留一个能接的动作或问题。
41
-
42
- 历史:
43
- 保留轮数: 40 # 硬上限;预算不够时还会再被挤
44
-
45
- 摘要: # 滚动前情提要:活历史攒到触发轮数就折叠一次
46
- 保留轮数: 12
47
- 触发轮数: 24 # 必须 > 保留轮数,差值是滞回区间
48
- 长度: 500
49
-
50
- 尾部: # → 拼进当轮 user 消息前部。唯一允许每轮变的区
51
- - 名字: 当前场景
52
- 文件: 状态/场景.md # 谁改这个文件,下一轮就生效
53
- - 名字: 交易提醒
54
- 内容: 涉及买卖时报价要具体到铜币数目。
55
- 触发: [买, 卖, 价钱] # 触发词命中最近几轮或当轮输入才插入
56
- # 停用: true # 播放单开关
57
- ```
58
-
59
- 铁律三条:条目 `文件`/`内容` 二选一;**触发条目只能住尾部**(住系统层直接拒开演);
60
- 文件引用不许跑出演出文件夹。配置错了端点会拒演并报人话,照改就是。
61
-
62
- ## 两条 API(演出页用,cookie 同源自动带)
63
-
64
- - `GET /api/projects/<pid>/chatai/log?dir=<文件夹>` → `{records, 摘要, 配置}`,开场铺台用
65
- - `POST /api/projects/<pid>/chatai/turn` body `{dir, input}` → SSE 流:
66
- `data:{delta}`… 最后 `data:{done, text, usage, costUsd}`;错误 `data:{error}`。
67
- 拒绝码:429 太快或额度尽、409 上一轮没回完、403 账号未开通演出通路
68
-
69
- ## 开场白(角色先开口)
70
-
71
- 往 `对话.jsonl` 种第一条记录:
72
-
73
- ```
74
- {"seq":1,"role":"assistant","text":"<开场白>","at":"<ISO时间>"}
75
- ```
76
-
77
- 它不算轮数,够老了会随摘要折叠。用户视角:一进场角色已经在说话。
78
-
79
- # 三区纪律 —— 为什么这么摆
80
-
81
- 顺序即上下文:**稳定的在前吃缓存,易变的在后换自由。** 缓存按字节精确匹配前缀,
82
- 前缀里任何一个字变了,它后面的一切全部重算。
83
-
84
- 反面教材是酒馆的世界书:几百个词条按关键词触发、插在前缀中段,每轮触发集一变
85
- 后面全废 —— 实测 573 条词库缓存命中率 **0%,一轮一美元**。所以这里触发条目被
86
- 结构性关进尾部:尾部本来就在最新对话之后、缓存必然失效的位置,触发集怎么变都
87
- 伤不到前缀。
88
-
89
- 「每轮允许多大范围变化」是用户的取舍旋钮,空间化了:一段内容放系统层 = 冻住换
90
- 缓存,挪尾部 = 放开换灵活。用户要"自由一点",就是把东西往尾部挪。
91
-
92
- # 特化菜谱(参考,不当分类)
93
-
94
- **身份与规则**(系统层第一条):演谁、对用户用什么人称、回合怎么接(只推进一拍,
95
- 别替用户行动)、回复长度、这场戏的禁区。这一条的质量决定八成体验。
96
-
97
- **世界观:整本冻结,别切条。** 这条路是 1M 窗口 + 便宜的 flash,几万字设定冻在
98
- 系统层一次写进缓存,比切几百条按关键词捞又稳又便宜。酒馆玩家的切条肌肉记忆是
99
- 8k 窗口时代逼出来的,别带过来。
100
-
101
- **文风锚**:三五条"怎么写"的约束 + 一小段范文,比一堆形容词管用。范文是最强的锚。
102
-
103
- **状态文件当活道具**:`状态/场景.md` 这类尾部条目,演出中你或用户改文件就等于
104
- 改状态,不需要任何变量系统。要推进剧情就改状态文件——**不要去读 `对话.jsonl`**
105
- (见下方隐私纪律;平台也会拦)。用户想跟你讨论某段戏,会自己粘贴过来。
106
-
107
- **触发条目 = 导演小纸条**,一场十条以内:战斗时收紧节奏、某个名字出现时提醒一段
108
- 旧怨。它是"到了这一幕才递的条子",不是知识检索。
109
-
110
- # 从酒馆搬东西进来
111
-
112
- ⚠️ **任何酒馆导出的 JSON 都先用 `read_tavern_json`,不要用 Read。** 真样本
113
- (一份社区预设)464KB、210 条提示词而启用的只有 56 条 —— Read 一次就是十几万
114
- token 进上下文,换回来的绝大部分是停用的备选。工具两步走:`mode="digest"` 看结构
115
- (名字/角色/字数/一句引子),挑好了再 `mode="fetch"` + `entries=[…]` 拿正文。它只读不写,怎么分组
116
- 是你的判断。
117
-
118
- 酒馆导出的 JSON 有三种,别搞混:
119
-
120
- ## ① 预设(Chat Completion preset)—— `prompts[]` + `prompt_order[]`
121
-
122
- **它跟 `编排.yaml` 是同一类东西**:管的是"每次请求怎么拼上下文 + 采样参数",
123
- 里面没有角色也没有剧情。搬法:
124
-
125
- 1. `read_tavern_json` 摘要 → 看清启用了哪些、顺序如何。
126
- 2. 跟用户过一遍**分歧点**(预设通常把同一功能备了好几版只开一个):文风、
127
- 思维链、人称、对白量、NSFW 档。问"这几个开关你要哪一档",不要自己替他选。
128
- 3. `mode="fetch"` 拿选中条目的正文,按功能并成两三份设定文件(例:
129
- `设定/规则.md`、`设定/文风.md`、`设定/思维链.md`),**顺序照抄原顺序**,
130
- 全部进**系统层**(它们每轮不变,正是缓存本体)。
131
- 4. **丢掉**:marker 占位条(角色描述/性格/场景/Chat History —— 我们由
132
- 编排.yaml 自己管历史和角色)、0 字的分节标题、以及针对特定平台的破甲话术
133
- (这条通路不过内容审查,尺度由账号档位定,那些绕过话术在这儿没有意义,
134
- 还白占前缀)。
135
- 5. 采样参数(temperature / top_p / 各种惩罚)**我们没有这些旋钮**,照实告诉
136
- 用户:这边能调的是 模型 / 思考档 / 最大输出 / 上下文预算。预设里的
137
- `openai_max_tokens` 可以参考着填 `最大输出`,但 RP 短回合 300–600 更好。
138
-
139
- 一个真数字供你估:那份 56 条的预设,正文合计约 9.8k 字符 ≈ 4–5k token 常驻前缀。
140
- 搬进系统层没问题,但要跟用户说清这是每轮都在的开销。
141
-
142
- ## ② 角色卡(V2/V3)—— `spec: chara_card_v2` 或有 `first_mes`
143
-
144
- `description/personality/scenario` 并成一份角色文件进系统层;`first_mes` 种成
145
- 开场白(往 `对话.jsonl` 写 assistant seq 1);`mes_example` 提炼进文风锚;
146
- `alternate_greetings` 问用户要哪一条。`character_book` 见下。
147
-
148
- ## ③ 世界书(lorebook)—— `entries`
149
-
150
- constant 的并进世界观正文(系统层);带 keys 的挑**十条以内**做成尾部触发条目
151
- (`触发: [关键词…]`),其余并进世界观。别把整本世界书搬成触发条目 —— 触发条目
152
- 住尾部是为了缓存稳定,几十条一起塞进去就把尾部撑成第二个前缀了。
153
-
154
- # 建场流程
155
-
156
- 1. **先问再动手**:题材与基调、角色是谁跟用户什么关系、文风参照(有没有喜欢的
157
- 作品口吻)、回复长短、禁区、谁先开口。两三个问题一起问,别拷问。
158
- 2. 落设定文件和 `编排.yaml`,要开场白就种上。
159
- 3. 造前端,两件事分开做:
160
- - **管线不用自己写,也不用去找**:加载本 skill 时平台已经把 `演出.template.js`
161
- 拷进工作区根,直接 `cp 演出.template.js <演出文件夹>/演出.js`,**一个字都别改**。
162
- URL 自省、铺场、SSE 跨分片解析、错误话术、中断、输入法回车、滚动锚定、
163
- 摘要提示、隐私声明自检、探针模式全在里面 —— 这些是协议不是设计,现写必错
164
- (真页面统计:三张手写的里两张漏了隐私声明和探针分支,还有一张每来一片就
165
- 抢滚动,用户往上翻看前情会被拽回底部)。
166
- - **皮肤自己长**:`index.html` 按题材重设计 —— 字体、色纸、气泡形态、台面装饰
167
- 都是戏的一部分,手机窄屏必须能玩。接管线只需要回答"一条消息长什么样":
168
-
169
- ```html
170
- <!-- ⚠️ classic script,**不许写 type="module"**:你自检截图走 file://,
171
- ES module 在那儿被当跨源拦掉,整页脚本一起死 -->
172
- <script src="演出.js"></script>
173
- <script>
174
- const 台 = document.getElementById('台');
175
- const 条 = (cls, 文) => { const el = document.createElement('div');
176
- el.className = cls; el.textContent = 文; 台.appendChild(el); return el; };
177
- ND演出.挂载({
178
- 台,
179
- 输入: document.getElementById('输入'),
180
- 发送钮: document.getElementById('发送'),
181
- 画: {
182
- 用户: (文) => 条('回合 用户', 文),
183
- 演出: () => { const el = 条('回合 演出 等', '');
184
- return { 写: (全) => { el.classList.remove('等'); el.textContent = 全; },
185
- 完成: (全) => { el.classList.remove('等'); el.textContent = 全; },
186
- 撤: () => el.remove() }; },
187
- 提示: (文) => 条('提示', 文),
188
- 出错: (文) => 条('出错', 文),
189
- },
190
- });
191
- </script>
192
- ```
193
-
194
- `写(全文)` 每来一片调一次,给的是**到目前为止的全文**不是增量,直接
195
- `textContent = 全文` 最省事。想看一整张能跑的皮肤范例:
196
- `patterns/演出页-最小实现.html`(找不到就算了,上面这段就够接)。
197
-
198
- 4. 自检:screenshot 演出页,确认铺场正常、开场白在台上。第一轮留给用户开。
199
- 5. 告诉用户:点开这个文件夹的站点窗就能进场;想调口味(换文风、改场景、挪冻结
200
- 范围)随时叫你改 —— 你就是这场戏的场务。
201
-
202
- # 价钱小抄(跟用户聊配置时用)
203
-
204
- gemini-3.7-flash:$0.75/M 入、$3.75/M 出(促销价,思考 token 计入输出且关不掉,
205
- 实测约为正文的三倍半);claude-sonnet:$3/$15。一轮典型 RP(几千字上下文、几百字
206
- 回复)flash 约 $0.003–0.008。预算紧就守住:最大输出别超 600、上下文预算 4–6 万。
207
-
208
- 思考档不是免费的旋钮:思考 token 一律按输出价计。gemini 三档实测差异有限(别拿它
209
- 当质量保证),claude 的「高」是真开扩展思考、一轮更贵。用户没提就别自作主张往上调。
210
-
211
- # 隐私纪律(跟机制契约同级,照办)
212
-
213
- 演出记录是用户的隐私:**台词只活在 chatai 通路里,永远不进你的上下文。**
214
-
215
- - **不读 `对话.jsonl` / `摘要.json`**(Read/Grep 会被平台拦下)。调度剧情的接口
216
- 是 状态/ 文件;用户想给你看片段会自己粘贴——主动粘贴即知情同意。
217
- - 这两道保险住在 `演出.js` 里,改皮时**不许删也不许改**:`<meta name="nd-privacy">`
218
- (用户在演出页上标注元素时,平台据此剥文本只发结构给你;模块发现页面没有会
219
- 自己补一条);探针分支(显式带 `?nd_probe=1` 打开时渲样例台账——⚠️ 你的自检截图走 http、跟用户预览同源,**不会**自动进这个分支;你看到的就是用户看到的,别把真问题当样例——
220
- screenshot 走的就是 file://,所以你看到的是样例,那是**正常的**,不是页面坏了,
221
- 别去"修")。
222
- - 自检截图想看特定版面状态:`artifact_open` 开进会话真的点到那一步再量(量具带 `live:true`),或 `beforeShot` 塞假台账 —— 两条都行,别想办法弄真记录。
223
-
224
- # 边界
225
-
226
- - 页面里永远不出现任何密钥(不需要:端点靠 cookie)。
227
- - 页面不做定时轮询、自动重发 —— 限频闸会拦,但根上就别写。
228
- - 演出内容平台不审(chatai 无工具无副作用),尺度是用户和角色设定之间的事。
1
+ ---
2
+ name: rp-craft
3
+ version: 0.1.1
4
+ description: NoDesign 互动演出(RP)方法论 —— 搭一场角色扮演:编排上下文(编排.yaml 三区模型)、写角色与世界、造演出页前端、串起 chatai 通路。只要用户想角色扮演就用本 skill —— 包括直接说「开一场RP」「我们来玩角色扮演」并当场给出人物设定的情况:你是搭台的场务,不是台上的演员,绝不在设计对话里亲自扮演角色,而是按本 skill 把演出搭成能反复进场的作品(角色在专门的演出页里开口,那条通路便宜得多、也不占设计会话)。也用于把酒馆(SillyTavern)角色卡搬进来。不要用于写小说(那是另一回事,别拿这套硬套)。
5
+ ---
6
+
7
+ # 一场演出是什么
8
+
9
+ 三样东西住在**一个文件夹**里,缺一不可:
10
+
11
+ 1. `编排.yaml` —— 上下文的播放单(进模型的一切按它拼)
12
+ 2. 设定文件 —— 角色、世界、文风,自由组织,被播放单引用
13
+ 3. `index.html` —— 演出页。有它这个文件夹就会被认成站点,用通用站点窗打开
14
+
15
+ 对话记录 `对话.jsonl` 和摘要 `摘要.json` 演出中自动生成。**摘要是派生态,永远别手写。**
16
+
17
+ 台上说话的是 **chatai**:一次纯补全调用,没有工具、没有会话、改不了任何文件。
18
+ 你(agent)只负责搭台和调台,不在台上。演出的每一轮花费按平台单价表记入用户额度。
19
+
20
+ # 机制契约(这一节照抄不走样)
21
+
22
+ ## 编排.yaml 全貌
23
+
24
+ ```yaml
25
+ 模型: gemini-3.7-flash # 可省 = 平台默认。摘要可单配便宜的(摘要.模型)
26
+ 思考: 低 # 思考档,可省 = 该模型最省的那档。gemini 系 低/中/高、
27
+ # claude 系 关/高(开扩展思考);写了模型没有的档不报错,
28
+ # 按默认档跑并在回包里说明。摘要另有 摘要.思考,不写就走
29
+ # 默认档(压缩不是创作,别给摘要开高思考烧钱)
30
+ 最大输出: 400 # RP 短回合是质量旋钮:300–600 合适,放大了戏会水
31
+ 上下文预算: 60000 # 输入侧预算:系统层和尾部照给,历史是弹性区被从最旧挤压
32
+
33
+ 系统层: # → system 参数。整区冻结,是缓存的本体
34
+ - 名字: 身份与规则
35
+ 文件: 设定/老芦.md
36
+ - 名字: 世界观
37
+ 文件: 设定/夜行集市.md
38
+ - 名字: 文风
39
+ 内容: |
40
+ 第二人称现在时,只写可感知的事,结尾留一个能接的动作或问题。
41
+
42
+ 历史:
43
+ 保留轮数: 40 # 硬上限;预算不够时还会再被挤
44
+
45
+ 摘要: # 滚动前情提要:活历史攒到触发轮数就折叠一次
46
+ 保留轮数: 12
47
+ 触发轮数: 24 # 必须 > 保留轮数,差值是滞回区间
48
+ 长度: 500
49
+
50
+ 尾部: # → 拼进当轮 user 消息前部。唯一允许每轮变的区
51
+ - 名字: 当前场景
52
+ 文件: 状态/场景.md # 谁改这个文件,下一轮就生效
53
+ - 名字: 交易提醒
54
+ 内容: 涉及买卖时报价要具体到铜币数目。
55
+ 触发: [买, 卖, 价钱] # 触发词命中最近几轮或当轮输入才插入
56
+ # 停用: true # 播放单开关
57
+ ```
58
+
59
+ 铁律三条:条目 `文件`/`内容` 二选一;**触发条目只能住尾部**(住系统层直接拒开演);
60
+ 文件引用不许跑出演出文件夹。配置错了端点会拒演并报人话,照改就是。
61
+
62
+ ## 两条 API(演出页用,cookie 同源自动带)
63
+
64
+ - `GET /api/projects/<pid>/chatai/log?dir=<文件夹>` → `{records, 摘要, 配置}`,开场铺台用
65
+ - `POST /api/projects/<pid>/chatai/turn` body `{dir, input}` → SSE 流:
66
+ `data:{delta}`… 最后 `data:{done, text, usage, costUsd}`;错误 `data:{error}`。
67
+ 拒绝码:429 太快或额度尽、409 上一轮没回完、403 账号未开通演出通路
68
+
69
+ ## 开场白(角色先开口)
70
+
71
+ 往 `对话.jsonl` 种第一条记录:
72
+
73
+ ```
74
+ {"seq":1,"role":"assistant","text":"<开场白>","at":"<ISO时间>"}
75
+ ```
76
+
77
+ 它不算轮数,够老了会随摘要折叠。用户视角:一进场角色已经在说话。
78
+
79
+ # 三区纪律 —— 为什么这么摆
80
+
81
+ 顺序即上下文:**稳定的在前吃缓存,易变的在后换自由。** 缓存按字节精确匹配前缀,
82
+ 前缀里任何一个字变了,它后面的一切全部重算。
83
+
84
+ 反面教材是酒馆的世界书:几百个词条按关键词触发、插在前缀中段,每轮触发集一变
85
+ 后面全废 —— 实测 573 条词库缓存命中率 **0%,一轮一美元**。所以这里触发条目被
86
+ 结构性关进尾部:尾部本来就在最新对话之后、缓存必然失效的位置,触发集怎么变都
87
+ 伤不到前缀。
88
+
89
+ 「每轮允许多大范围变化」是用户的取舍旋钮,空间化了:一段内容放系统层 = 冻住换
90
+ 缓存,挪尾部 = 放开换灵活。用户要"自由一点",就是把东西往尾部挪。
91
+
92
+ # 特化菜谱(参考,不当分类)
93
+
94
+ **身份与规则**(系统层第一条):演谁、对用户用什么人称、回合怎么接(只推进一拍,
95
+ 别替用户行动)、回复长度、这场戏的禁区。这一条的质量决定八成体验。
96
+
97
+ **世界观:整本冻结,别切条。** 这条路是 1M 窗口 + 便宜的 flash,几万字设定冻在
98
+ 系统层一次写进缓存,比切几百条按关键词捞又稳又便宜。酒馆玩家的切条肌肉记忆是
99
+ 8k 窗口时代逼出来的,别带过来。
100
+
101
+ **文风锚**:三五条"怎么写"的约束 + 一小段范文,比一堆形容词管用。范文是最强的锚。
102
+
103
+ **状态文件当活道具**:`状态/场景.md` 这类尾部条目,演出中你或用户改文件就等于
104
+ 改状态,不需要任何变量系统。要推进剧情就改状态文件——**不要去读 `对话.jsonl`**
105
+ (见下方隐私纪律;平台也会拦)。用户想跟你讨论某段戏,会自己粘贴过来。
106
+
107
+ **触发条目 = 导演小纸条**,一场十条以内:战斗时收紧节奏、某个名字出现时提醒一段
108
+ 旧怨。它是"到了这一幕才递的条子",不是知识检索。
109
+
110
+ # 从酒馆搬东西进来
111
+
112
+ ⚠️ **任何酒馆导出的 JSON 都先用 `read_tavern_json`,不要用 Read。** 真样本
113
+ (一份社区预设)464KB、210 条提示词而启用的只有 56 条 —— Read 一次就是十几万
114
+ token 进上下文,换回来的绝大部分是停用的备选。工具两步走:`mode="digest"` 看结构
115
+ (名字/角色/字数/一句引子),挑好了再 `mode="fetch"` + `entries=[…]` 拿正文。它只读不写,怎么分组
116
+ 是你的判断。
117
+
118
+ 酒馆导出的 JSON 有三种,别搞混:
119
+
120
+ ## ① 预设(Chat Completion preset)—— `prompts[]` + `prompt_order[]`
121
+
122
+ **它跟 `编排.yaml` 是同一类东西**:管的是"每次请求怎么拼上下文 + 采样参数",
123
+ 里面没有角色也没有剧情。搬法:
124
+
125
+ 1. `read_tavern_json` 摘要 → 看清启用了哪些、顺序如何。
126
+ 2. 跟用户过一遍**分歧点**(预设通常把同一功能备了好几版只开一个):文风、
127
+ 思维链、人称、对白量、NSFW 档。问"这几个开关你要哪一档",不要自己替他选。
128
+ 3. `mode="fetch"` 拿选中条目的正文,按功能并成两三份设定文件(例:
129
+ `设定/规则.md`、`设定/文风.md`、`设定/思维链.md`),**顺序照抄原顺序**,
130
+ 全部进**系统层**(它们每轮不变,正是缓存本体)。
131
+ 4. **丢掉**:marker 占位条(角色描述/性格/场景/Chat History —— 我们由
132
+ 编排.yaml 自己管历史和角色)、0 字的分节标题、以及针对特定平台的破甲话术
133
+ (这条通路不过内容审查,尺度由账号档位定,那些绕过话术在这儿没有意义,
134
+ 还白占前缀)。
135
+ 5. 采样参数(temperature / top_p / 各种惩罚)**我们没有这些旋钮**,照实告诉
136
+ 用户:这边能调的是 模型 / 思考档 / 最大输出 / 上下文预算。预设里的
137
+ `openai_max_tokens` 可以参考着填 `最大输出`,但 RP 短回合 300–600 更好。
138
+
139
+ 一个真数字供你估:那份 56 条的预设,正文合计约 9.8k 字符 ≈ 4–5k token 常驻前缀。
140
+ 搬进系统层没问题,但要跟用户说清这是每轮都在的开销。
141
+
142
+ ## ② 角色卡(V2/V3)—— `spec: chara_card_v2` 或有 `first_mes`
143
+
144
+ `description/personality/scenario` 并成一份角色文件进系统层;`first_mes` 种成
145
+ 开场白(往 `对话.jsonl` 写 assistant seq 1);`mes_example` 提炼进文风锚;
146
+ `alternate_greetings` 问用户要哪一条。`character_book` 见下。
147
+
148
+ ## ③ 世界书(lorebook)—— `entries`
149
+
150
+ constant 的并进世界观正文(系统层);带 keys 的挑**十条以内**做成尾部触发条目
151
+ (`触发: [关键词…]`),其余并进世界观。别把整本世界书搬成触发条目 —— 触发条目
152
+ 住尾部是为了缓存稳定,几十条一起塞进去就把尾部撑成第二个前缀了。
153
+
154
+ # 建场流程
155
+
156
+ 1. **先问再动手**:题材与基调、角色是谁跟用户什么关系、文风参照(有没有喜欢的
157
+ 作品口吻)、回复长短、禁区、谁先开口。两三个问题一起问,别拷问。
158
+ 2. 落设定文件和 `编排.yaml`,要开场白就种上。
159
+ 3. 造前端,两件事分开做:
160
+ - **管线不用自己写,也不用去找**:加载本 skill 时平台已经把 `演出.template.js`
161
+ 拷进工作区根,直接 `cp 演出.template.js <演出文件夹>/演出.js`,**一个字都别改**。
162
+ URL 自省、铺场、SSE 跨分片解析、错误话术、中断、输入法回车、滚动锚定、
163
+ 摘要提示、隐私声明自检、探针模式全在里面 —— 这些是协议不是设计,现写必错
164
+ (真页面统计:三张手写的里两张漏了隐私声明和探针分支,还有一张每来一片就
165
+ 抢滚动,用户往上翻看前情会被拽回底部)。
166
+ - **皮肤自己长**:`index.html` 按题材重设计 —— 字体、色纸、气泡形态、台面装饰
167
+ 都是戏的一部分,手机窄屏必须能玩。接管线只需要回答"一条消息长什么样":
168
+
169
+ ```html
170
+ <!-- ⚠️ classic script,**不许写 type="module"**:你自检截图走 file://,
171
+ ES module 在那儿被当跨源拦掉,整页脚本一起死 -->
172
+ <script src="演出.js"></script>
173
+ <script>
174
+ const 台 = document.getElementById('台');
175
+ const 条 = (cls, 文) => { const el = document.createElement('div');
176
+ el.className = cls; el.textContent = 文; 台.appendChild(el); return el; };
177
+ ND演出.挂载({
178
+ 台,
179
+ 输入: document.getElementById('输入'),
180
+ 发送钮: document.getElementById('发送'),
181
+ 画: {
182
+ 用户: (文) => 条('回合 用户', 文),
183
+ 演出: () => { const el = 条('回合 演出 等', '');
184
+ return { 写: (全) => { el.classList.remove('等'); el.textContent = 全; },
185
+ 完成: (全) => { el.classList.remove('等'); el.textContent = 全; },
186
+ 撤: () => el.remove() }; },
187
+ 提示: (文) => 条('提示', 文),
188
+ 出错: (文) => 条('出错', 文),
189
+ },
190
+ });
191
+ </script>
192
+ ```
193
+
194
+ `写(全文)` 每来一片调一次,给的是**到目前为止的全文**不是增量,直接
195
+ `textContent = 全文` 最省事。想看一整张能跑的皮肤范例:
196
+ `patterns/演出页-最小实现.html`(找不到就算了,上面这段就够接)。
197
+
198
+ 4. 自检:screenshot 演出页,确认铺场正常、开场白在台上。第一轮留给用户开。
199
+ 5. 告诉用户:点开这个文件夹的站点窗就能进场;想调口味(换文风、改场景、挪冻结
200
+ 范围)随时叫你改 —— 你就是这场戏的场务。
201
+
202
+ # 价钱小抄(跟用户聊配置时用)
203
+
204
+ gemini-3.7-flash:$0.75/M 入、$3.75/M 出(促销价,思考 token 计入输出且关不掉,
205
+ 实测约为正文的三倍半);claude-sonnet:$3/$15。一轮典型 RP(几千字上下文、几百字
206
+ 回复)flash 约 $0.003–0.008。预算紧就守住:最大输出别超 600、上下文预算 4–6 万。
207
+
208
+ 思考档不是免费的旋钮:思考 token 一律按输出价计。gemini 三档实测差异有限(别拿它
209
+ 当质量保证),claude 的「高」是真开扩展思考、一轮更贵。用户没提就别自作主张往上调。
210
+
211
+ # 隐私纪律(跟机制契约同级,照办)
212
+
213
+ 演出记录是用户的隐私:**台词只活在 chatai 通路里,永远不进你的上下文。**
214
+
215
+ - **不读 `对话.jsonl` / `摘要.json`**(Read/Grep 会被平台拦下)。调度剧情的接口
216
+ 是 状态/ 文件;用户想给你看片段会自己粘贴——主动粘贴即知情同意。
217
+ - 这两道保险住在 `演出.js` 里,改皮时**不许删也不许改**:`<meta name="nd-privacy">`
218
+ (用户在演出页上标注元素时,平台据此剥文本只发结构给你;模块发现页面没有会
219
+ 自己补一条);探针分支(显式带 `?nd_probe=1` 打开时渲样例台账——⚠️ 你的自检截图走 http、跟用户预览同源,**不会**自动进这个分支;你看到的就是用户看到的,别把真问题当样例——
220
+ screenshot 走的就是 file://,所以你看到的是样例,那是**正常的**,不是页面坏了,
221
+ 别去"修")。
222
+ - 自检截图想看特定版面状态:`artifact_open` 开进会话真的点到那一步再量(量具带 `live:true`),或 `beforeShot` 塞假台账 —— 两条都行,别想办法弄真记录。
223
+
224
+ # 边界
225
+
226
+ - 页面里永远不出现任何密钥(不需要:端点靠 cookie)。
227
+ - 页面不做定时轮询、自动重发 —— 限频闸会拦,但根上就别写。
228
+ - 演出内容平台不审(chatai 无工具无副作用),尺度是用户和角色设定之间的事。
229
+
230
+ ## 板书(交稿纪律)
231
+ 做完这一轮的东西,在它旁边写一条板书(`write_on_board near=那张卡`):这版是什么 / 为什么这么做 /
232
+ 看哪里。改了几处就写几条要点,一条说一件事。同一件东西出了新版本,画一条「改自」线
233
+ (`relate_on_board` derives-from);有参考来源画「取材」。用户在你的板书上标注了,用
234
+ `write_on_board reply_to=` 接在那条下面回。多步任务先 TodoWrite 列步骤 —— 步骤清单会自动上板、
235
+ 每步的产物自动连过去。
@@ -1,78 +1,78 @@
1
- <!doctype html>
2
- <html lang="zh">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <!-- 隐私声明:平台据它把标注里的文本剥成占位符再发给 agent。
7
- 演出.js 发现没有会自己补一条,但**自己写上更好**(不依赖脚本跑起来) -->
8
- <meta name="nd-privacy" content="演出">
9
- <title>演出</title>
10
- <style>
11
- /* ── 这一整块是"皮肤",按题材整个重画:字体、色纸、气泡形态都是戏的一部分 ── */
12
- :root { --纸: #F4EFE4; --墨: #2B2117; --淡: #8A7A62; }
13
- * { box-sizing: border-box; }
14
- body { margin: 0; height: 100dvh; display: flex; flex-direction: column;
15
- background: var(--纸); color: var(--墨);
16
- font: 16px/1.85 "Songti SC", "Noto Serif CJK SC", serif; }
17
- #台 { flex: 1; overflow-y: auto; padding: 24px 18px 8px; max-width: 720px; width: 100%; margin: 0 auto; }
18
- .回合 { margin: 0 0 18px; white-space: pre-wrap; }
19
- .回合.用户 { color: var(--淡); }
20
- .回合.用户::before { content: "› "; }
21
- .等::after { content: "…"; opacity: .5; }
22
- .提示, .出错 { font-size: 13px; margin: 10px 0; }
23
- .提示 { color: var(--淡); }
24
- .出错 { color: #A8362B; }
25
- form { display: flex; gap: 10px; padding: 12px 18px 18px; max-width: 720px; width: 100%; margin: 0 auto; }
26
- textarea { flex: 1; resize: none; height: 44px; padding: 10px 12px; font: inherit; font-size: 15px;
27
- background: #fff8; border: 1px solid #0002; border-radius: 2px; outline: none; color: inherit; }
28
- button { padding: 0 18px; font: inherit; font-size: 14px; letter-spacing: .2em;
29
- background: var(--墨); color: var(--纸); border: 0; border-radius: 2px; cursor: pointer; }
30
- button:disabled { background: var(--淡); cursor: default; }
31
- </style>
32
- </head>
33
- <body>
34
- <div id="台"></div>
35
- <form id="条" autocomplete="off">
36
- <textarea id="输入" rows="1" placeholder="你做什么、说什么…"></textarea>
37
- <button id="发送" type="submit">进</button>
38
- </form>
39
-
40
- <!-- ⚠️ classic script,**不要写 type="module"**:agent 自检截图走 file://,
41
- ES module 在 file: 下会被当跨源拦掉,整页脚本一起死 -->
42
- <script src="演出.js"></script>
43
- <script>
44
- const 台 = document.getElementById('台');
45
-
46
- /** 皮肤只需要回答"一条消息长什么样",管线的事一件都不用管 */
47
- function 条(cls, 文) {
48
- const el = document.createElement('div');
49
- el.className = cls;
50
- el.textContent = 文;
51
- 台.appendChild(el);
52
- return el;
53
- }
54
-
55
- const 场 = ND演出.挂载({
56
- 台,
57
- 输入: document.getElementById('输入'),
58
- 发送钮: document.getElementById('发送'),
59
- 画: {
60
- 用户: (文) => 条('回合 用户', 文),
61
- 演出: () => {
62
- const el = 条('回合 演出 等', '');
63
- return {
64
- 写: (全文) => { el.classList.remove('等'); el.textContent = 全文; },
65
- 完成: (全文) => { el.classList.remove('等'); el.textContent = 全文; },
66
- 撤: () => el.remove(),
67
- };
68
- },
69
- 提示: (文) => 条('提示', 文),
70
- 出错: (文) => 条('出错', 文),
71
- },
72
- });
73
-
74
- // 表单提交也走同一个口(回车已由 演出.js 接管,含输入法判定)
75
- document.getElementById('条').addEventListener('submit', (e) => { e.preventDefault(); 场.发送(); });
76
- </script>
77
- </body>
78
- </html>
1
+ <!doctype html>
2
+ <html lang="zh">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <!-- 隐私声明:平台据它把标注里的文本剥成占位符再发给 agent。
7
+ 演出.js 发现没有会自己补一条,但**自己写上更好**(不依赖脚本跑起来) -->
8
+ <meta name="nd-privacy" content="演出">
9
+ <title>演出</title>
10
+ <style>
11
+ /* ── 这一整块是"皮肤",按题材整个重画:字体、色纸、气泡形态都是戏的一部分 ── */
12
+ :root { --纸: #F4EFE4; --墨: #2B2117; --淡: #8A7A62; }
13
+ * { box-sizing: border-box; }
14
+ body { margin: 0; height: 100dvh; display: flex; flex-direction: column;
15
+ background: var(--纸); color: var(--墨);
16
+ font: 16px/1.85 "Songti SC", "Noto Serif CJK SC", serif; }
17
+ #台 { flex: 1; overflow-y: auto; padding: 24px 18px 8px; max-width: 720px; width: 100%; margin: 0 auto; }
18
+ .回合 { margin: 0 0 18px; white-space: pre-wrap; }
19
+ .回合.用户 { color: var(--淡); }
20
+ .回合.用户::before { content: "› "; }
21
+ .等::after { content: "…"; opacity: .5; }
22
+ .提示, .出错 { font-size: 13px; margin: 10px 0; }
23
+ .提示 { color: var(--淡); }
24
+ .出错 { color: #A8362B; }
25
+ form { display: flex; gap: 10px; padding: 12px 18px 18px; max-width: 720px; width: 100%; margin: 0 auto; }
26
+ textarea { flex: 1; resize: none; height: 44px; padding: 10px 12px; font: inherit; font-size: 15px;
27
+ background: #fff8; border: 1px solid #0002; border-radius: 2px; outline: none; color: inherit; }
28
+ button { padding: 0 18px; font: inherit; font-size: 14px; letter-spacing: .2em;
29
+ background: var(--墨); color: var(--纸); border: 0; border-radius: 2px; cursor: pointer; }
30
+ button:disabled { background: var(--淡); cursor: default; }
31
+ </style>
32
+ </head>
33
+ <body>
34
+ <div id="台"></div>
35
+ <form id="条" autocomplete="off">
36
+ <textarea id="输入" rows="1" placeholder="你做什么、说什么…"></textarea>
37
+ <button id="发送" type="submit">进</button>
38
+ </form>
39
+
40
+ <!-- ⚠️ classic script,**不要写 type="module"**:agent 自检截图走 file://,
41
+ ES module 在 file: 下会被当跨源拦掉,整页脚本一起死 -->
42
+ <script src="演出.js"></script>
43
+ <script>
44
+ const 台 = document.getElementById('台');
45
+
46
+ /** 皮肤只需要回答"一条消息长什么样",管线的事一件都不用管 */
47
+ function 条(cls, 文) {
48
+ const el = document.createElement('div');
49
+ el.className = cls;
50
+ el.textContent = 文;
51
+ 台.appendChild(el);
52
+ return el;
53
+ }
54
+
55
+ const 场 = ND演出.挂载({
56
+ 台,
57
+ 输入: document.getElementById('输入'),
58
+ 发送钮: document.getElementById('发送'),
59
+ 画: {
60
+ 用户: (文) => 条('回合 用户', 文),
61
+ 演出: () => {
62
+ const el = 条('回合 演出 等', '');
63
+ return {
64
+ 写: (全文) => { el.classList.remove('等'); el.textContent = 全文; },
65
+ 完成: (全文) => { el.classList.remove('等'); el.textContent = 全文; },
66
+ 撤: () => el.remove(),
67
+ };
68
+ },
69
+ 提示: (文) => 条('提示', 文),
70
+ 出错: (文) => 条('出错', 文),
71
+ },
72
+ });
73
+
74
+ // 表单提交也走同一个口(回车已由 演出.js 接管,含输入法判定)
75
+ document.getElementById('条').addEventListener('submit', (e) => { e.preventDefault(); 场.发送(); });
76
+ </script>
77
+ </body>
78
+ </html>