@xiaobuyu/nodesign 0.0.1

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 (372) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +140 -0
  3. package/bin/nodesign.js +176 -0
  4. package/package.json +104 -0
  5. package/server/api/README.md +45 -0
  6. package/server/api/_guard.js +75 -0
  7. package/server/api/admin.js +187 -0
  8. package/server/api/assets/docx-page.js +103 -0
  9. package/server/api/assets/helpers.js +22 -0
  10. package/server/api/assets/notes.js +144 -0
  11. package/server/api/assets.js +896 -0
  12. package/server/api/board.js +57 -0
  13. package/server/api/browse.js +138 -0
  14. package/server/api/canvas.js +444 -0
  15. package/server/api/chatai.js +324 -0
  16. package/server/api/exports/build-standalone.js +980 -0
  17. package/server/api/exports/cards.js +118 -0
  18. package/server/api/exports/docx-pdf.js +46 -0
  19. package/server/api/exports/export-page.js +142 -0
  20. package/server/api/exports/handoff.js +147 -0
  21. package/server/api/exports.js +690 -0
  22. package/server/api/instruction.js +75 -0
  23. package/server/api/local.js +115 -0
  24. package/server/api/me.js +116 -0
  25. package/server/api/memory.js +185 -0
  26. package/server/api/pending-changes.js +366 -0
  27. package/server/api/plugins.js +164 -0
  28. package/server/api/projects.js +220 -0
  29. package/server/api/publish.js +64 -0
  30. package/server/api/recent.js +73 -0
  31. package/server/api/sessions.js +589 -0
  32. package/server/api/skills.js +77 -0
  33. package/server/api/standalone-fit.js +168 -0
  34. package/server/api/turn-compose.js +180 -0
  35. package/server/api/turn-inflight.js +44 -0
  36. package/server/api/turn.js +669 -0
  37. package/server/auth/README.md +17 -0
  38. package/server/auth/middleware.js +138 -0
  39. package/server/auth/origin-guard.js +71 -0
  40. package/server/auth/session.js +108 -0
  41. package/server/auth/tier.js +113 -0
  42. package/server/auth/users-store.js +348 -0
  43. package/server/edit/README.md +29 -0
  44. package/server/engine/README.md +113 -0
  45. package/server/engine/agent/agent-shared.js +550 -0
  46. package/server/engine/agent/auto-mode-default-hard-deny.txt +4 -0
  47. package/server/engine/agent/auto-mode-rules.js +78 -0
  48. package/server/engine/agent/context.js +418 -0
  49. package/server/engine/agent/events.js +464 -0
  50. package/server/engine/agent/hooks/canvas-validate.js +199 -0
  51. package/server/engine/agent/hooks/failure.js +120 -0
  52. package/server/engine/agent/hooks/file-events.js +75 -0
  53. package/server/engine/agent/hooks/lifecycle.js +233 -0
  54. package/server/engine/agent/hooks/post-canvas-focus.js +80 -0
  55. package/server/engine/agent/hooks/post-guidance.js +206 -0
  56. package/server/engine/agent/hooks/post-subagent-report.js +104 -0
  57. package/server/engine/agent/hooks/post-trim.js +58 -0
  58. package/server/engine/agent/hooks/pre-board-neighborhood.js +34 -0
  59. package/server/engine/agent/hooks/pre-defaults.js +84 -0
  60. package/server/engine/agent/hooks/pre-injectors.js +277 -0
  61. package/server/engine/agent/hooks/pre-performance-log-guard.js +78 -0
  62. package/server/engine/agent/hooks/pre-starter-files.js +61 -0
  63. package/server/engine/agent/hooks/pre-workspace-scope-guard.js +78 -0
  64. package/server/engine/agent/hooks/site-validate.js +94 -0
  65. package/server/engine/agent/hooks/tool-prompts.js +31 -0
  66. package/server/engine/agent/hooks/turn-state-memory.js +56 -0
  67. package/server/engine/agent/hooks/user-prompt-submit.js +215 -0
  68. package/server/engine/agent/hooks.js +354 -0
  69. package/server/engine/agent/init-contract.js +69 -0
  70. package/server/engine/agent/isolation.js +159 -0
  71. package/server/engine/agent/model-context.js +359 -0
  72. package/server/engine/agent/model-table.js +292 -0
  73. package/server/engine/agent/plugin-loader.js +266 -0
  74. package/server/engine/agent/prompts/nodesign-prelude.md +336 -0
  75. package/server/engine/agent/prompts/tools/ask-user-question-protocol.md +71 -0
  76. package/server/engine/agent/prompts/tools/direct-edit-protocol.md +98 -0
  77. package/server/engine/agent/prompts/tools/generate-image-cookbook.gemini-gateway.md +583 -0
  78. package/server/engine/agent/prompts/tools/generate-image-cookbook.md +483 -0
  79. package/server/engine/agent/prompts/tools/hybrid-reference.md +100 -0
  80. package/server/engine/agent/prompts/tools/paint-still-cookbook.md +270 -0
  81. package/server/engine/agent/prompts/tools/roll-film-cookbook.md +70 -0
  82. package/server/engine/agent/prompts/tools/site-reference.md +106 -0
  83. package/server/engine/agent/prompts/tools/tweaks-syntax.md +125 -0
  84. package/server/engine/agent/prompts/tools/vision-checker-dispatch.md +48 -0
  85. package/server/engine/agent/session-loop.js +1024 -0
  86. package/server/engine/agent/session-model.js +164 -0
  87. package/server/engine/agent/skill.js +204 -0
  88. package/server/engine/agent/system-prompts.js +86 -0
  89. package/server/engine/agent/task-events.js +78 -0
  90. package/server/engine/agents/ds-extractor.md +132 -0
  91. package/server/engine/agents/explorer.md +190 -0
  92. package/server/engine/agents/index.js +230 -0
  93. package/server/engine/agents/schemas/design-system.json +156 -0
  94. package/server/engine/agents/schemas/tweak-schema.json +113 -0
  95. package/server/engine/agents/tweak-proposer.md +127 -0
  96. package/server/engine/agents/vision-checker.md +254 -0
  97. package/server/engine/browse/capture.js +422 -0
  98. package/server/engine/browse/card.js +137 -0
  99. package/server/engine/browse/handover.js +59 -0
  100. package/server/engine/browse/page-digest.js +119 -0
  101. package/server/engine/browse/refs.js +196 -0
  102. package/server/engine/browse/registry.js +307 -0
  103. package/server/engine/browse/screencast.js +170 -0
  104. package/server/engine/browse/state.js +121 -0
  105. package/server/engine/chatai/chat-log.js +79 -0
  106. package/server/engine/chatai/index.js +193 -0
  107. package/server/engine/chatai/openai-compat.js +152 -0
  108. package/server/engine/chatai/orchestrate.js +309 -0
  109. package/server/engine/chatai/perform.js +40 -0
  110. package/server/engine/chatai/summarize.js +79 -0
  111. package/server/engine/mcp/capability-gate.js +52 -0
  112. package/server/engine/mcp/index.js +339 -0
  113. package/server/engine/mcp/param-sanitizer.js +142 -0
  114. package/server/engine/mcp/tools/arrange-on-board.js +124 -0
  115. package/server/engine/mcp/tools/artifact-session.js +278 -0
  116. package/server/engine/mcp/tools/browse-computer.js +421 -0
  117. package/server/engine/mcp/tools/browse-find-batch.js +183 -0
  118. package/server/engine/mcp/tools/browse-screenshot.js +157 -0
  119. package/server/engine/mcp/tools/browse.js +480 -0
  120. package/server/engine/mcp/tools/build-docx.js +101 -0
  121. package/server/engine/mcp/tools/clear-pending-changes.js +99 -0
  122. package/server/engine/mcp/tools/create-on-board.js +155 -0
  123. package/server/engine/mcp/tools/crystallize-skill.js +168 -0
  124. package/server/engine/mcp/tools/deliver-files.js +0 -0
  125. package/server/engine/mcp/tools/explain-style.js +237 -0
  126. package/server/engine/mcp/tools/export-handoff.js +133 -0
  127. package/server/engine/mcp/tools/expose-tweaks.js +149 -0
  128. package/server/engine/mcp/tools/generate-image.js +842 -0
  129. package/server/engine/mcp/tools/get-computed-styles.js +164 -0
  130. package/server/engine/mcp/tools/get-pending-changes.js +205 -0
  131. package/server/engine/mcp/tools/h3box-ssh.js +84 -0
  132. package/server/engine/mcp/tools/helpers/acquire-page.js +82 -0
  133. package/server/engine/mcp/tools/helpers/motion-lab.js +554 -0
  134. package/server/engine/mcp/tools/helpers/motion-scroll.js +112 -0
  135. package/server/engine/mcp/tools/helpers/perception-page.js +215 -0
  136. package/server/engine/mcp/tools/helpers/reference-download.js +103 -0
  137. package/server/engine/mcp/tools/helpers/rembg-bridge.py +80 -0
  138. package/server/engine/mcp/tools/helpers/rembg.js +273 -0
  139. package/server/engine/mcp/tools/helpers/shot-pipeline.js +280 -0
  140. package/server/engine/mcp/tools/highlight.js +68 -0
  141. package/server/engine/mcp/tools/list-pages.js +222 -0
  142. package/server/engine/mcp/tools/lookup-tags.js +59 -0
  143. package/server/engine/mcp/tools/navigate-to-page.js +60 -0
  144. package/server/engine/mcp/tools/organize-board.js +64 -0
  145. package/server/engine/mcp/tools/paint-still.js +434 -0
  146. package/server/engine/mcp/tools/pin-to-board.js +130 -0
  147. package/server/engine/mcp/tools/preview-deck.js +130 -0
  148. package/server/engine/mcp/tools/profile-scroll.js +305 -0
  149. package/server/engine/mcp/tools/publish-site.js +102 -0
  150. package/server/engine/mcp/tools/query-elements.js +195 -0
  151. package/server/engine/mcp/tools/read-board.js +103 -0
  152. package/server/engine/mcp/tools/read-document.js +93 -0
  153. package/server/engine/mcp/tools/read-page.js +264 -0
  154. package/server/engine/mcp/tools/read-tavern-json.js +143 -0
  155. package/server/engine/mcp/tools/record-decision.js +140 -0
  156. package/server/engine/mcp/tools/relate-on-board.js +110 -0
  157. package/server/engine/mcp/tools/remove-background.js +391 -0
  158. package/server/engine/mcp/tools/report-issue.js +115 -0
  159. package/server/engine/mcp/tools/roll-film.js +266 -0
  160. package/server/engine/mcp/tools/screenshot-docx.js +138 -0
  161. package/server/engine/mcp/tools/screenshot-url.js +195 -0
  162. package/server/engine/mcp/tools/screenshot.js +583 -0
  163. package/server/engine/mcp/tools/tier-gate.js +96 -0
  164. package/server/engine/mcp/tools/trace-motion.js +215 -0
  165. package/server/engine/mcp/tools/web-search.js +548 -0
  166. package/server/engine/motion/inventory.js +349 -0
  167. package/server/engine/perception/session.js +235 -0
  168. package/server/engine/plugins/nodesign/.claude-plugin/plugin.json +5 -0
  169. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/SKILL.md +192 -0
  170. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/canvas.template.html +667 -0
  171. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/hybrid-grid.md +22 -0
  172. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/image-led-cover.md +25 -0
  173. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/portrait.md +23 -0
  174. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/quote-backdrop.md +21 -0
  175. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/section-divider.md +23 -0
  176. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/text-led.md +21 -0
  177. package/server/engine/plugins/nodesign/skills/docx-craft/SKILL.md +162 -0
  178. package/server/engine/plugins/nodesign/skills/docx-craft/references/token-schema.md +407 -0
  179. package/server/engine/plugins/nodesign/skills/docx-craft//346/226/207/346/241/243.template.json +80 -0
  180. package/server/engine/plugins/nodesign/skills/rp-craft/SKILL.md +228 -0
  181. 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 -0
  182. package/server/engine/plugins/nodesign/skills/rp-craft//346/274/224/345/207/272.template.js +268 -0
  183. package/server/engine/plugins/nodesign/skills/site-craft/SKILL.md +323 -0
  184. package/server/engine/plugins/nodesign/skills/site-craft/patterns/build-lane.md +134 -0
  185. package/server/engine/plugins/nodesign/skills/site-craft/patterns/cutout-collage.md +61 -0
  186. package/server/engine/plugins/nodesign/skills/site-craft/patterns/mock-app.md +163 -0
  187. package/server/engine/plugins/nodesign/skills/site-craft/patterns/page-transitions.md +86 -0
  188. package/server/engine/runs/active-runs.js +698 -0
  189. package/server/engine/runs/live-turn.js +252 -0
  190. package/server/engine/runs/store.js +364 -0
  191. package/server/engine/runs/turn-relay.js +217 -0
  192. package/server/engine/runtime/workspace.js +164 -0
  193. package/server/index.js +235 -0
  194. package/server/lib/artifact-file-path.js +80 -0
  195. package/server/lib/artifact-target.js +284 -0
  196. package/server/lib/asset-refs.js +239 -0
  197. package/server/lib/async-queue.js +104 -0
  198. package/server/lib/auto-relations.js +130 -0
  199. package/server/lib/binding-types.js +60 -0
  200. package/server/lib/board-kind-sizes.js +62 -0
  201. package/server/lib/board-relations.js +133 -0
  202. package/server/lib/browse-proxy.js +180 -0
  203. package/server/lib/canvas-id.js +36 -0
  204. package/server/lib/cover.js +227 -0
  205. package/server/lib/danbooru-tags.js +291 -0
  206. package/server/lib/doc-extract.js +156 -0
  207. package/server/lib/docx/build-from-source.js +260 -0
  208. package/server/lib/docx/build.js +490 -0
  209. package/server/lib/docx/dump-styles.js +287 -0
  210. package/server/lib/docx/fonts/nodesign-cjk.conf +164 -0
  211. package/server/lib/docx/merge-runs.js +129 -0
  212. package/server/lib/docx/numbering.js +218 -0
  213. package/server/lib/docx/order.js +152 -0
  214. package/server/lib/docx/rawzip.js +172 -0
  215. package/server/lib/docx/render.js +92 -0
  216. package/server/lib/docx/text-lint.js +225 -0
  217. package/server/lib/docx/tokens.js +335 -0
  218. package/server/lib/docx/units.js +29 -0
  219. package/server/lib/docx/xml.js +291 -0
  220. package/server/lib/docx-pages.js +187 -0
  221. package/server/lib/export-collect.js +289 -0
  222. package/server/lib/export-package.js +210 -0
  223. package/server/lib/html-srcset.js +145 -0
  224. package/server/lib/image-variant.js +460 -0
  225. package/server/lib/ingress/forward-openai-chat.js +305 -0
  226. package/server/lib/ingress/openai-chat.js +491 -0
  227. package/server/lib/ingress/session-notice.js +66 -0
  228. package/server/lib/ingress/session-routes.js +68 -0
  229. package/server/lib/ingress/slot-probe.js +130 -0
  230. package/server/lib/ingress/upstream-billing.js +52 -0
  231. package/server/lib/ingress/upstream-fail-streak.js +72 -0
  232. package/server/lib/ingress/upstream-truncation.js +48 -0
  233. package/server/lib/issues-store.js +182 -0
  234. package/server/lib/kinds/deck.js +72 -0
  235. package/server/lib/kinds/docx.js +283 -0
  236. package/server/lib/kinds/file-kinds.js +113 -0
  237. package/server/lib/kinds/index.js +202 -0
  238. package/server/lib/kinds/site.js +161 -0
  239. package/server/lib/model-ingress.js +543 -0
  240. package/server/lib/moderation.js +255 -0
  241. package/server/lib/notice-store.js +103 -0
  242. package/server/lib/plugin-install.js +104 -0
  243. package/server/lib/plugin-validator.js +721 -0
  244. package/server/lib/publish-store.js +115 -0
  245. package/server/lib/quick-summary.js +52 -0
  246. package/server/lib/quota.js +270 -0
  247. package/server/lib/rate-window.js +29 -0
  248. package/server/lib/reference-assets.js +92 -0
  249. package/server/lib/region-shot.js +135 -0
  250. package/server/lib/safe-path.js +73 -0
  251. package/server/lib/sdk-session.js +33 -0
  252. package/server/lib/showcase-store.js +92 -0
  253. package/server/lib/site-publish.js +465 -0
  254. package/server/lib/ssrf-guard.js +432 -0
  255. package/server/lib/task-scan.js +158 -0
  256. package/server/lib/tavern-json.js +154 -0
  257. package/server/lib/video-variant.js +237 -0
  258. package/server/lib/workspace-path.js +33 -0
  259. package/server/ops/fix-sdk-musl.mjs +40 -0
  260. package/server/ops/install-macos-fonts.sh +114 -0
  261. package/server/ops/macos-fonts.conf +336 -0
  262. package/server/ops/sandbox-shim/bwrap +57 -0
  263. package/server/projects/assets-summary.js +119 -0
  264. package/server/projects/auto-name.js +53 -0
  265. package/server/projects/board-store.js +640 -0
  266. package/server/projects/move-entry.js +103 -0
  267. package/server/projects/store.js +270 -0
  268. package/server/projects/ui-config.js +54 -0
  269. package/server/projects/workspace-templates.js +53 -0
  270. package/server/projects/workspace.js +1025 -0
  271. package/server/runtime/capabilities.js +153 -0
  272. package/server/runtime/local-config.js +177 -0
  273. package/server/runtime/local-env.js +88 -0
  274. package/server/runtime/platform.js +342 -0
  275. package/server/runtime/profile.js +72 -0
  276. package/server/services/rembg-launcher.js +313 -0
  277. package/server/services/rembg-service.py +334 -0
  278. package/server/shared/README.md +25 -0
  279. package/server/shared/deck.js +54 -0
  280. package/server/shared/time.js +49 -0
  281. package/server/style-pipeline/README.md +53 -0
  282. package/server/ws/broker.js +36 -0
  283. package/server/ws/browse-channel.js +177 -0
  284. package/server/ws/index.js +386 -0
  285. package/web/README.md +89 -0
  286. package/web/dist/assets/BrowserWindow-Dc7J7CYc.js +11 -0
  287. package/web/dist/assets/DeckWindow-4G0xX7P3.js +16 -0
  288. package/web/dist/assets/DocxWindow-BXQsoPkh.js +16 -0
  289. package/web/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  290. package/web/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  291. package/web/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  292. package/web/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  293. package/web/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  294. package/web/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  295. package/web/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  296. package/web/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  297. package/web/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  298. package/web/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  299. package/web/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  300. package/web/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  301. package/web/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  302. package/web/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  303. package/web/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  304. package/web/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  305. package/web/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  306. package/web/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  307. package/web/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  308. package/web/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  309. package/web/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  310. package/web/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  311. package/web/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  312. package/web/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  313. package/web/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  314. package/web/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  315. package/web/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  316. package/web/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  317. package/web/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  318. package/web/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  319. package/web/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  320. package/web/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  321. package/web/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  322. package/web/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  323. package/web/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  324. package/web/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  325. package/web/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  326. package/web/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  327. package/web/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  328. package/web/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  329. package/web/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  330. package/web/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  331. package/web/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  332. package/web/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  333. package/web/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  334. package/web/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  335. package/web/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  336. package/web/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  337. package/web/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  338. package/web/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  339. package/web/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  340. package/web/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  341. package/web/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  342. package/web/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  343. package/web/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  344. package/web/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  345. package/web/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  346. package/web/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  347. package/web/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  348. package/web/dist/assets/SiteWindow-D6eS-2gM.js +18 -0
  349. package/web/dist/assets/again-D8tfgKKO.webp +0 -0
  350. package/web/dist/assets/caveat-nd-CP6HlsNg.woff2 +0 -0
  351. package/web/dist/assets/clock-xJhvfYpS.webp +0 -0
  352. package/web/dist/assets/film-cut-BBKMwH7q.webp +0 -0
  353. package/web/dist/assets/film-still-BZ_DL9Tt.webp +0 -0
  354. package/web/dist/assets/index-C0KUf6Wd.css +1 -0
  355. package/web/dist/assets/index-Cbl3ATvp.js +2125 -0
  356. package/web/dist/assets/ink-desk-BRbxeDsR.webp +0 -0
  357. package/web/dist/assets/ink-night-Bz4BT3XH.webp +0 -0
  358. package/web/dist/assets/ink-portrait-C0DM4V8Q.webp +0 -0
  359. package/web/dist/assets/longcang-regular-C0uvTuKa.woff2 +0 -0
  360. package/web/dist/assets/lxgw-nd-bold-DbRfiTgo.woff2 +0 -0
  361. package/web/dist/assets/lxgw-nd-regular-CpMw9Ehg.woff2 +0 -0
  362. package/web/dist/assets/pending-edit-apply-DTjo2geW.js +31 -0
  363. package/web/dist/assets/question-8H4HSqxh.webp +0 -0
  364. package/web/dist/assets/reject-BaPJqElj.webp +0 -0
  365. package/web/dist/assets/rotate-cw-LMT3x1Zj.js +11 -0
  366. package/web/dist/assets/rp-portrait-CbrGpew2.webp +0 -0
  367. package/web/dist/assets/rp-street-C4jVKjxx.webp +0 -0
  368. package/web/dist/assets/square-dashed-mouse-pointer-CBoAkfhi.js +11 -0
  369. package/web/dist/assets/tangle-DIxHVNuT.webp +0 -0
  370. package/web/dist/assets/thisone-BylZKglV.webp +0 -0
  371. package/web/dist/assets/thumb-DO1wfK1I.webp +0 -0
  372. package/web/dist/index.html +18 -0
@@ -0,0 +1,407 @@
1
+ # 文档.json 字段全集
2
+
3
+ 这份文件回答一个问题:**写 `文档.json` 时哪些键是真的、值能填什么。**
4
+
5
+ 引擎的 schema 是**闭合**的——不认识的键直接报错,不会静默吞掉。所以这里列全了,
6
+ 列外的键写上去就是构建失败。(唯一例外是 `_` 开头的键,那是给你写注释用的,
7
+ 构建前会被剥掉。)
8
+
9
+ 一句话架构:**`文档.json` 是真相源,`.docx` 是构建产物。** 永远改 JSON 再
10
+ `build_docx`,不要去改 `.docx`。
11
+
12
+ ---
13
+
14
+ ## 顶层
15
+
16
+ ```jsonc
17
+ {
18
+ "v": 1, // 必填,只能是 1
19
+ "preset": "办公标准", // 可选,见下。省略则必须自己给全 tokens
20
+ "tokens": { ... }, // 可选,覆盖 preset 的部分字段(深合并)
21
+ "content": [ ... ], // 必填,正文块数组,空数组会被拒
22
+ "header": ... , // 可选,页眉
23
+ "footer": ... // 可选,页脚
24
+ }
25
+ ```
26
+
27
+ `preset` 三选一,就是三种排版传统,不是三种"主题":
28
+
29
+ | preset | 什么时候用 |
30
+ |---|---|
31
+ | `办公标准` | 通用中文文档:报告、方案、说明、简历 |
32
+ | `公文` | 按 GB/T 9704-2012 排的党政机关公文(仿宋三号正文、黑体标题) |
33
+ | `学术论文` | 论文体例:宋体小四、行距、章节编号感 |
34
+
35
+ `tokens` 是在 preset 上**深合并**,只写要改的那部分。不写 preset 就得把
36
+ `page` / `fonts` / `base` / `styles` 全部自己给齐。
37
+
38
+ ---
39
+
40
+ ## tokens.page
41
+
42
+ ```jsonc
43
+ "page": {
44
+ "size": "A4", // A4 | A3 | Letter | B5 | {wTwip, hTwip}
45
+ "landscape": false,
46
+ "marginsTwip": { "top": 1440, "bottom": 1440, "left": 1800, "right": 1800,
47
+ "header": 851, "footer": 992, "gutter": 0 },
48
+ "docGrid": { "type": "lines", "linePitchTwip": 312 } // 或 null
49
+ }
50
+ ```
51
+
52
+ 单位换算:**1 磅 = 20 twip,1 厘米 ≈ 567 twip,1 英寸 = 1440 twip**。
53
+ 页边距 2.54cm = 1440,3.17cm = 1800。
54
+
55
+ `docGrid` 是中文排版的行网格(每页固定行数那种感觉),`null` 关掉。
56
+
57
+ ## tokens.lang
58
+
59
+ ```jsonc
60
+ "lang": { "latin": "en-US", "eastAsia": "zh-CN" }
61
+ ```
62
+
63
+ ## tokens.fonts —— 字体槽
64
+
65
+ ⭐ **这是最容易写错的一处。** `fonts` 定义**具名槽**,风格里的 `run.font`
66
+ 填的是**槽名**,不是字体名:
67
+
68
+ ```jsonc
69
+ "fonts": {
70
+ "正文": { "eastAsia": "宋体", "ascii": "Times New Roman", "hAnsi": "Times New Roman" },
71
+ "标题": { "eastAsia": "黑体", "ascii": "Times New Roman", "hAnsi": "Times New Roman" },
72
+ "等宽": { "eastAsia": "宋体", "ascii": "Consolas", "hAnsi": "Consolas" }
73
+ }
74
+ ```
75
+
76
+ 然后 `"run": { "font": "正文" }`。槽名随便起(中文也行),但**必须先在 `fonts`
77
+ 里注册**,否则报 `no such font slot`。
78
+
79
+ 槽内四个位置各只能填**一个字体名,没有 fallback 链**(OOXML 就是这么规定的):
80
+ - `eastAsia` 中日韩字符走这个
81
+ - `ascii` 拉丁字母数字走这个
82
+ - `hAnsi` 扩展拉丁,一般跟 `ascii` 填一样
83
+ - `cs` 复杂文种,中文文档基本用不到
84
+
85
+ `eastAsia` 请填**中文 Windows 一定有的**:宋体 / 黑体 / 微软雅黑 / 楷体 / 仿宋。
86
+ 服务器渲染时会用替身字体(宋体→Noto Serif CJK 等),但用户在自己的 Word 里
87
+ 打开时用的是真字体,所以这里要按用户机器上有什么来填。
88
+
89
+ ## tokens.base —— 全文默认(docDefaults)
90
+
91
+ ```jsonc
92
+ "base": {
93
+ "sizePt": "小四", // 数字(磅)或字号名,见下表
94
+ "color": "000000", // RRGGBB,不带 #
95
+ "font": "正文", // 槽名,或直接写 {eastAsia, ascii, ...}
96
+ "spacing": { "line": 1.5, "lineRule": "multiple", "beforePt": 0, "afterPt": 0 },
97
+ "kernPt": 1,
98
+ "cjk": { "kinsoku": true, "autoSpaceDE": true, "autoSpaceDN": true,
99
+ "adjustRightInd": true, "snapToGrid": true, "overflowPunct": true,
100
+ "wordWrap": true }
101
+ }
102
+ ```
103
+
104
+ `cjk` 那组是中文排版开关:`kinsoku` 避头尾(标点不许出现在行首)、
105
+ `autoSpaceDE/DN` 中英文和中数字之间自动加空隙、`overflowPunct` 标点悬挂。
106
+ 中文文档基本全开。
107
+
108
+ ### 字号名表
109
+
110
+ | 名 | 磅 | 名 | 磅 | 名 | 磅 | 名 | 磅 |
111
+ |---|---|---|---|---|---|---|---|
112
+ | 初号 | 42 | 小初 | 36 | 一号 | 26 | 小一 | 24 |
113
+ | 二号 | 22 | 小二 | 18 | 三号 | 16 | 小三 | 15 |
114
+ | 四号 | 14 | 小四 | 12 | 五号 | 10.5 | 小五 | 9 |
115
+ | 六号 | 7.5 | 小六 | 6.5 | 七号 | 5.5 | 八号 | 5 |
116
+
117
+ 写别的中文名(比如"小四号")会报 `unknown 字号`。也可以直接写数字磅值。
118
+
119
+ ---
120
+
121
+ ## tokens.styles —— 命名风格
122
+
123
+ `styles` 是一张 `styleId → Style` 的表。styleId 是你在 content 里用
124
+ `"style": "..."` 引用的名字。
125
+
126
+ ⭐ **有几个 id 是有魔法的**:`Normal`(正文默认)、`Heading1`…`Heading9`
127
+ (Word 认它们是标题,导航窗格和目录靠这个)、`Title`、`Quote`。自定义 id
128
+ 随便起。
129
+
130
+ 一条 Style 的**全部**合法键:
131
+
132
+ ```jsonc
133
+ "Heading1": {
134
+ "type": "paragraph", // paragraph | character | table
135
+ "name": "heading 1", // Word UI 里显示的名。内置名有魔法含义,别乱改
136
+ "basedOn": "Normal", // 继承谁(必须是已存在的 styleId)
137
+ "next": "Normal", // 敲回车后下一段用哪个风格
138
+ "link": "...", // 段落风格 ↔ 字符风格的配对
139
+ "qFormat": true, // 在 Word 的风格快速库里露出
140
+ "uiPriority": 9,
141
+ "run": { ... }, // 字符级
142
+ "para": { ... }, // 段落级
143
+ "extraXml": { "pPr": "...", "rPr": "..." } // 原样并入的 XML(外来文档透传用)
144
+ }
145
+ ```
146
+
147
+ ### style.run —— 字符级(14 个键)
148
+
149
+ | 键 | 值 |
150
+ |---|---|
151
+ | `font` | 字体槽名,或 `{eastAsia, ascii, hAnsi, cs}` |
152
+ | `sizePt` | 数字(磅)或字号名 |
153
+ | `bold` `italic` | true / false |
154
+ | `color` | `"RRGGBB"`,不带 `#` |
155
+ | `underline` | `true` / `"single"` / `"double"` / `"dotted"` / `"wave"` … |
156
+ | `strike` | true |
157
+ | `caps` `smallCaps` | true(全大写 / 小型大写,只对拉丁有意义) |
158
+ | `vertAlign` | `"superscript"` / `"subscript"` |
159
+ | `em` | 着重号:`"dot"`(中文最常用的点) / `"comma"` / `"circle"` / `"underDot"` |
160
+ | `kernPt` | 字距调整起始磅值 |
161
+ | `spacingTwip` | 字符间距(twip,可负) |
162
+ | `highlight` | 荧光笔色名,如 `"yellow"` |
163
+
164
+ ### style.para —— 段落级(14 个键)
165
+
166
+ | 键 | 值 |
167
+ |---|---|
168
+ | `align` | `"left"` / `"center"` / `"right"` / `"both"`(两端对齐,中文正文常用) / `"distribute"`(分散对齐) |
169
+ | `outlineLevel` | 0-8。⭐ **这个才是让标题成为"真标题"的东西**,Word 的导航窗格和自动目录只看它 |
170
+ | `indent` | `{firstLineChars, firstLineTwip, hangingChars, hangingTwip, leftChars, leftTwip, rightChars, rightTwip}` |
171
+ | `spacing` | `{beforePt, afterPt, beforeLines, afterLines, line, lineRule}` |
172
+ | `keepNext` | true = 与下段同页(标题必备,否则标题会孤零零留在页尾) |
173
+ | `keepLines` | true = 段内不跨页 |
174
+ | `pageBreakBefore` | true = 段前分页 |
175
+ | `widowControl` | 孤行控制 |
176
+ | `contextualSpacing` | true = 同风格相邻段之间不加段间距(列表用) |
177
+ | `borders` | `{top/bottom/left/right: {style, sizePt8, color, spacePt}}`,`sizePt8` 单位是 1/8 磅 |
178
+ | `shading` | `"RRGGBB"` 底纹 |
179
+ | `tabs` | `[{pos: twip, val: "left"/"center"/"right"/"decimal", leader: "dot"}]` |
180
+ | `cjk` | 覆盖 `base.cjk` 的同名开关 |
181
+ | `list` | `"梯队名"` 或 `{name, level}` —— 挂自动编号,梯队在 `tokens.numbering` 里定义(见下) |
182
+
183
+ **缩进用 `Chars` 后缀那一组更稳**:`firstLineChars: 200` = 首行缩进 **2 个字**,
184
+ 字号变了缩进跟着变;写 `firstLineTwip: 480` 则是写死的物理长度,改字号就错位。
185
+ (`Chars` 的单位是百分之一字,所以 2 字 = 200。)
186
+
187
+ ⚠️ **`firstLine*` 和 `hanging*` 互斥(引擎会拦)**。它们在 OOXML 里是同一个
188
+ 属性的正负两面 —— 悬挂就是负的首行缩进。要悬挂缩进**只写 `hanging*`**,
189
+ 它天然含「首行回到左缘」,不用(也不能)再补 `firstLineChars: 0` 去清继承:
190
+
191
+ ```jsonc
192
+ { "leftChars": 450, "hangingChars": 450 } // ✅ 悬挂缩进
193
+ { "firstLineChars": 0, "leftChars": 450, "hangingChars": 450 } // ❌ 会被拒
194
+ ```
195
+
196
+ **行距的坑(引擎会拦,但先说清楚)**:
197
+ ```jsonc
198
+ "spacing": { "line": 1.5, "lineRule": "multiple" } // ✅ 1.5 倍行距
199
+ "spacing": { "line": 360, "lineRule": "exact" } // ✅ 固定 18 磅(360 twip 不是磅!这里 line 的单位是磅)
200
+ "spacing": { "line": 360, "lineRule": "auto" } // ❌ auto 不是合法值
201
+ ```
202
+ `lineRule` 只有三个值:`multiple`(`line` 是倍数)、`exact`、`atLeast`
203
+ (后两个 `line` 是磅)。写 `auto` 会被拒——它在 CSS 和 OOXML 里都存在,
204
+ 特别容易顺手打出来,但这个引擎不认。
205
+
206
+ ⚠️ **页数敏感的文档(简历「必须两页」、公文)行距用 `exact`/`atLeast`,别用
207
+ `multiple`**:multiple 乘的是字体自带行高,预览替身和用户机器上的真字体不一样高
208
+ ——预览里刚好排满的页,真 Word 里会多出几行、尾巴溢成新页(2026-08-19 实证:
209
+ 2 页简历在 Word 里变 4 页)。雅黑/等线档的替身(MiSans,系数 1.326)已与真微软
210
+ 雅黑(1.32)对齐,Windows Word 基本同高;但宋体等其它档、以及 Mac 上替到苹方
211
+ (≈1.4)仍有差 —— 军规不变。换算参考:想要预览现在的行高,
212
+ `exact ≈ 字号 × 原倍数 × 行高系数`(雅黑档 ≈1.33、宋体档 ≈1.24)。
213
+
214
+ ---
215
+
216
+ ## content —— 正文块
217
+
218
+ `content` 是块数组,块只有**三种** `t`:
219
+
220
+ ### `{"t": "p"}` 段落
221
+
222
+ ```jsonc
223
+ { "t": "p", "style": "Heading1", "text": "第一章 绪论" }
224
+
225
+ { "t": "p", "style": "Normal", "runs": [
226
+ "这段里有",
227
+ { "text": "加粗的字", "bold": true },
228
+ "和",
229
+ { "text": "红色的字", "color": "CC0000" },
230
+ { "br": true },
231
+ "换行之后的内容。第 ", { "fld": "PAGE" }, " 页。"
232
+ ] }
233
+ ```
234
+
235
+ - `text` 和 `runs` 二选一。`runs` 里字符串 = 纯文本 run,对象 = 带格式的 run
236
+ - run 对象的键 = 上面 **style.run 那 14 个** + `text` + `br` + `fld` + `link`
237
+ - `br`: `true` 换行;`"page"` 分页符;`"column"` 分栏符
238
+ - `fld`: 域。目前只有 `"PAGE"`(当前页码)和 `"NUMPAGES"`(总页数),
239
+ **写在页脚里**,别手打数字——手打的"1"在第二页还是 1
240
+ - `link`: 超链接目标,配着 `text` 用。要带协议的完整地址
241
+ (`https://` / `mailto:` / `tel:`)。**视觉不会自动变**——想要经典的蓝色
242
+ 下划线就照常写 `color` / `underline`,中文简历那种「可点但不染色」什么都
243
+ 不用加。只在正文(含表格)里可用,页眉页脚暂不支持
244
+
245
+ ```jsonc
246
+ { "t": "p", "runs": [
247
+ "联系: ",
248
+ { "text": "github.com/Xiaokebuyu", "link": "https://github.com/Xiaokebuyu" },
249
+ " | ",
250
+ { "text": "hi@example.com", "link": "mailto:hi@example.com", "color": "1155CC", "underline": true }
251
+ ] }
252
+ ```
253
+
254
+ ⭐ **块级直接格式是平铺在块上的,没有 `para` 包层**:
255
+
256
+ ```jsonc
257
+ { "t": "p", "align": "center", "indent": { "firstLineChars": 0 } } // ✅
258
+ { "t": "p", "para": { "align": "center" } } // ❌ 现在会报错
259
+ ```
260
+
261
+ 块上可以直接写 `style.para` 的那 13 个键 + `sizePt`,用来给单独一段开小灶。
262
+ 写成 `"para": {...}` **会被拒**(2026-08-18 起 content 和页眉页脚都过闭合校验)。
263
+ 在那之前它是"不报错也不生效"——最难发现的一类错,起手模板自己教错过一次。
264
+
265
+ ### `{"t": "table"}` 表格
266
+
267
+ ```jsonc
268
+ { "t": "table",
269
+ "widthsTwip": [2000, 4000, 2400], // 每列宽,长度 = 列数
270
+ "rows": [
271
+ ["表头一", "表头二", "表头三"],
272
+ [{ "text": "带底纹的格", "shading": "F2F2F2" }, "普通格", "普通格"]
273
+ ] }
274
+ ```
275
+
276
+ - 单元格是字符串(纯文本)或对象(对象的键 = 一个段落块的键 + `shading`)
277
+ - 列宽单位 twip,**总和要等于版心宽度**(A4 默认边距下约 8306 twip),
278
+ 否则表格会歪出版心
279
+
280
+ ### `{"t": "pageBreak"}` 分页
281
+
282
+ ```jsonc
283
+ { "t": "pageBreak" }
284
+ ```
285
+
286
+ ---
287
+
288
+ ## header / footer
289
+
290
+ 两种写法:
291
+
292
+ ```jsonc
293
+ "header": "机密 · 内部资料", // 字符串 = 一行纯文字
294
+ "footer": [ // 数组 = 完整控制,元素是段落块
295
+ { "t": "p", "align": "center",
296
+ "runs": [ { "text": "— " }, { "fld": "PAGE" }, { "text": " —" } ] }
297
+ ]
298
+ ```
299
+
300
+ ⚠️ 页眉页脚里**不要放表格**。它不会报错 —— 每个块都走 `buildPara`,表格块会
301
+ 变成一个**空段落**(又是一次「写了没生效」)。要横向排布就用制表位或多个 run。
302
+
303
+ ---
304
+
305
+ ## 引擎当前做不到的(诚实边界)
306
+
307
+ - ~~自动编号~~ **已支持**(2026-08-18),见下面的 numbering 一节
308
+ - ~~超链接~~ **已支持**(2026-08-19,run 上的 `link` 键,见 content 一节);
309
+ **页眉页脚里的超链接**仍做不到(要单独的关系表)
310
+ - **自动目录**:可以用 `fld` 插 TOC 域,但内容要用户在 Word 里按 F9 更新域
311
+ 才会生成;我们的渲染预览里它显示的是占位文案
312
+ - **图片**:还没接
313
+ - **编辑外来 .docx**:还没做。外来文档几乎不用命名样式(全是直排格式),
314
+ 重建 styles.xml 对它们不起作用
315
+
316
+ ---
317
+
318
+ ## tokens.numbering —— 自动编号
319
+
320
+ ```jsonc
321
+ "numbering": {
322
+ "条款": "公文条款", // 用内置梯队(推荐)
323
+ "要点": "圈码",
324
+ "自定义": { "levels": [ // 或者自己写
325
+ { "fmt": "ideographTraditional", "text": "%1、", "firstLine": 2, "suff": "nothing" }
326
+ ] }
327
+ }
328
+ ```
329
+
330
+ 段落上引用(**按名字,不按数字** —— numId 是 OOXML 的实现细节,引擎替你算):
331
+
332
+ ```jsonc
333
+ { "t": "p", "style": "Normal", "list": { "name": "条款", "ilvl": 0 }, "text": "总体要求" }
334
+ { "t": "p", "style": "Normal", "list": "要点", "text": "单层可以简写" }
335
+ ```
336
+
337
+ ⚠️ 引用一个没定义过的名字会**直接报错**(以前会产出一个指向空处的 numId,Word
338
+ 打开可能报文档损坏)。
339
+
340
+ ### 四个内置梯队
341
+
342
+ | 名字 | 形状 | 缩进形态 |
343
+ |---|---|---|
344
+ | `公文条款` | 一、→(一)→ 1. →(1) | 首行缩进两字、文字紧跟编号、**折行顶格** |
345
+ | `数字条款` | 1. → 1.1 → 1.1.1 | **悬挂缩进**,折行对齐到文字起点 |
346
+ | `圈码` | ①②③ | 悬挂一字,编号后无间隔 |
347
+ | `项目符号` | ●→○→▪ | 悬挂 |
348
+
349
+ ⭐ **两种缩进形态的差别决定折行去哪儿**,这不是审美问题:中文公文的层级标题
350
+ 折行要**回到左边距**(顶格),技术文档的 `1.1.1` 折行要**对齐到文字起点**(整块
351
+ 看起来是对齐的)。选错了整篇文档的观感就不对。
352
+
353
+ ### 自己写一级的全部键
354
+
355
+ | 键 | 值 |
356
+ |---|---|
357
+ | `fmt` | 编号格式,见下表 |
358
+ | `text` | 编号长什么样。`%N` 是第 N 级的当前值 —— `"%1、"` 出「一、」,`"%1.%2"` 出「1.1」。**非 bullet 的必须含 `%N`**,否则编号值根本不出现(引擎会拦) |
359
+ | `indent` | 左缩进,单位**字**(不是磅不是英寸) |
360
+ | `hanging` | 悬挂量,单位字 |
361
+ | `firstLine` | 首行缩进,单位字。**跟 `hanging` 二选一** —— 给了它就是首行缩进形态 |
362
+ | `indentTwip` / `hangingTwip` / `firstLineTwip` | 同上但直接给 twip(要精确控制时用) |
363
+ | `start` | 起始值,默认 1 |
364
+ | `align` | `left`(默认)/ `center` / `right` |
365
+ | `suff` | 编号和文字之间放什么:`tab`(默认)/ `space` / `nothing`。⭐ **中文编号自带全角标点(一、/(一)/①),一律用 `nothing`** —— 默认的 tab 会跳到下一个制表位,「一、」后面会空出一大截 |
366
+
367
+ ### 支持的 fmt
368
+
369
+ `decimal` 1 2 3 · `chineseCounting` 一 二 三 · `chineseCountingThousand` ·
370
+ `ideographDigital` 一 二 三 · `ideographTraditional` 甲 乙 丙 ·
371
+ `decimalEnclosedCircle` ①②③ · `decimalEnclosedParen` ⑴⑵⑶ ·
372
+ `decimalEnclosedFullstop` ⒈⒉⒊ · `lowerLetter` / `upperLetter` /
373
+ `lowerRoman` / `upperRoman` · `bullet` · `none`
374
+
375
+ 列外的写上去会被拒 —— ISO 29500 里有六十多个格式,全放开只会让人写出 Word
376
+ 显示不出来的东西。
377
+
378
+ ---
379
+
380
+ ## 常见错法对照
381
+
382
+ | 写了什么 | 会怎样 | 正确写法 |
383
+ |---|---|---|
384
+ | `"para": { "border": {...} }` | `unknown key border` | 键是**复数** `borders` |
385
+ | `"run": { "font": "宋体" }` | `no such font slot '宋体'` | `font` 填**槽名**;槽要先在 `fonts` 里注册 |
386
+ | `"styles": { "X": { "numbering": ... } }` | `unknown key numbering` | `numbering` 是**顶层**键(跟 `styles` 平级,不在 `styles` 里面),风格里用的是 `para.list` |
387
+ | 块上写 `"para": { "align": ... }` | 报 `unknown key para` | 平铺:`{ "t": "p", "align": ... }` |
388
+ | 页眉/页脚里写 `"para": {...}` | 报 `unknown key para` | 跟 content 同一套写法,键平铺在块上 |
389
+ | `"indent": { "firstLineChars": 0, "hangingChars": 450 }` | 被拒(互斥) | 悬挂只写 `{ "hangingChars": 450 }`,不用清 firstLine |
390
+ | `"link": "github.com/x"` | 被拒(没协议) | `"link": "https://github.com/x"` |
391
+ | `"lineRule": "auto"` | 被拒 | `multiple` / `exact` / `atLeast` |
392
+ | `"color": "#CC0000"` | 颜色不对 | 不带 `#`:`"CC0000"` |
393
+ | `"sizePt": "小四号"` | `unknown 字号` | `"小四"` |
394
+
395
+ ---
396
+
397
+ ## 改完怎么验
398
+
399
+ `build_docx` 成功 ≠ 排版对。**必须 `screenshot_canvas` 看一眼渲出来的页图**——
400
+ 它是服务端用 LibreOffice 真渲的。三条已知失真:中文是替身字体(判版式可以、
401
+ 判具体字形不行),TOC 域显示占位文案(PAGE 域是正常求值的,页脚看到几就是几)。
402
+
403
+ 构建返回里还带一段**排版/符号体检**(渲染看不出来的那层):重复标点、括号
404
+ 全半角配对、中文后跟半角标点这类按 GB/T 15834 基本可断定的问题,加上数字单位
405
+ 空隙、中西文空格/斜杠/日期连接号的**全文一致性**(两种写法并存才报,全文统一
406
+ 不报)。它只提醒不挡构建 —— 错误档的通常该改,建议档是惯例,跟用户的写法
407
+ 偏好冲突时以用户为准;改了文字记得重新 build。
@@ -0,0 +1,80 @@
1
+ {
2
+ "_说明": [
3
+ "这是 build_docx 的源文件。改这份 JSON,然后 build_docx,然后 screenshot 看。",
4
+ "永远不要直接改构建出来的 .docx —— 下一次 build 会把手改抹掉。",
5
+ "下划线开头的键是给人看的注释,构建时会被忽略。",
6
+ "字段全集见 skill 的 references/token-schema.md。"
7
+ ],
8
+
9
+ "_preset说明": "词典条目:办公标准 / 公文 / 学术论文。它是起点不是菜单——要别的版式就在 tokens 里覆写,或者干脆删掉这行给完整 token 表。",
10
+ "preset": "办公标准",
11
+
12
+ "_tokens说明": "在 preset 之上覆写。schema 是闭合的:写了没登记过的字段名会直接报错,因为「写了没生效」比「没写」更坏。",
13
+ "tokens": {
14
+ "_numbering说明": "自动编号:起个名字挂一个内置梯队(公文条款 / 数字条款 / 圈码 / 项目符号),段落上写 list 引用它。⭐ 别手打 1. 2. —— 用户插一条就断号。梯队形状与自定义写法见 references/token-schema.md。",
15
+ "numbering": { "条款": "公文条款", "要点": "圈码" },
16
+
17
+ "page": {
18
+ "size": "A4",
19
+ "_marginsTwip说明": "1 厘米 = 567 twip。这里是上下 2.54cm、左右 3.17cm(Word 默认)",
20
+ "marginsTwip": { "top": 1440, "bottom": 1440, "left": 1800, "right": 1800 }
21
+ },
22
+ "_fonts说明": "⭐eastAsia 槽是中文字体的唯一入口。只写 ascii 等于没给中文指定字体,Word 会自己替一个,你控制不了。点名要点用户 Windows 上一定有的字体。",
23
+ "fonts": {
24
+ "正文": { "eastAsia": "宋体", "ascii": "Times New Roman", "hAnsi": "Times New Roman", "cs": "Times New Roman" },
25
+ "标题": { "eastAsia": "黑体", "ascii": "Arial", "hAnsi": "Arial", "cs": "Arial" }
26
+ },
27
+ "styles": {
28
+ "Normal": {
29
+ "type": "paragraph",
30
+ "name": "Normal",
31
+ "run": { "font": "正文", "sizePt": "小四" },
32
+ "para": {
33
+ "_indent说明": "firstLineChars 200 = 首行缩进两字符,随字号缩放。别用固定磅值。",
34
+ "indent": { "firstLineChars": 200 },
35
+ "_spacing说明": "⚠️lineRule='multiple' 时 line 是**倍数**(1.5 = 1.5 倍行距);'exact'/'atLeast' 时 line 才是磅值。写混了会得到每行五英寸高。中文正文传统是「缩进不留白」——首行缩进和段间距二选一,都上会松垮。",
36
+ "spacing": { "line": 1.5, "lineRule": "multiple" }
37
+ }
38
+ },
39
+ "Heading1": {
40
+ "type": "paragraph",
41
+ "name": "heading 1",
42
+ "basedOn": "Normal",
43
+ "next": "Normal",
44
+ "qFormat": true,
45
+ "run": { "font": "标题", "sizePt": "三号", "bold": true },
46
+ "para": {
47
+ "_outlineLevel说明": "⭐必须有它,标题才是真标题:导航窗格认它、TOC 靠它生成。把一行字调大加粗不算标题。",
48
+ "outlineLevel": 0,
49
+ "_firstLineChars说明": "⭐标题必须显式清零缩进——basedOn Normal 会把正文的首行缩进继承过来,这是中文用户在 Word 里天天骂的那个现象。",
50
+ "indent": { "firstLineChars": 0 },
51
+ "spacing": { "beforePt": 12, "afterPt": 6 }
52
+ }
53
+ }
54
+ }
55
+ },
56
+
57
+ "_content说明": "块类型只有三种:{t:'p'} 段落、{t:'table'} 表格、{t:'pageBreak'} 分页。段落用 text 给纯文本,用 runs 给混合格式。",
58
+ "content": [
59
+ { "t": "p", "style": "Heading1", "text": "一、这里是一级标题" },
60
+ { "t": "p", "style": "Normal", "text": "这里是正文。首行会缩进两个字符,行距是单倍的 1.5 倍。中文和 Latin text 混排时引擎会自动处理间距。" },
61
+ { "t": "p", "style": "Normal", "runs": [
62
+ { "text": "runs 写法可以在一段里混格式:" },
63
+ { "text": "这几个字是粗的", "bold": true },
64
+ { "text": ",这几个字换了楷体", "font": "标题" },
65
+ { "text": "。中文不要用斜体,Word 的中文斜体是把字硬拉斜,很难看——强调改用加粗、换字体或着重号。" }
66
+ ] },
67
+ { "t": "p", "style": "Normal", "text": "自动编号长这样(改 list 的 name 换梯队):" },
68
+ { "t": "p", "style": "Normal", "list": { "name": "条款", "ilvl": 0 }, "text": "第一层用的是「公文条款」梯队" },
69
+ { "t": "p", "style": "Normal", "list": { "name": "条款", "ilvl": 1 }, "text": "第二层会自己变成(一)(二)" },
70
+ { "t": "p", "style": "Normal", "list": "要点", "text": "单层梯队可以直接写名字" }
71
+ ],
72
+
73
+ "_块级格式说明": "块上的直接格式**平铺**在块上(align / indent / spacing …),没有 para 包层——写成 \"para\": {…} 不报错但一点效果都没有。字段全集见 references/token-schema.md。",
74
+
75
+ "_页眉页脚说明": "字符串 = 一行纯文字;块数组 = 完整控制。页码是域不是你手写的数字:{fld:'PAGE'},写死 '1' 的页脚在第二页还是 1。",
76
+ "footer": [
77
+ { "t": "p", "style": "Normal", "align": "center", "indent": { "firstLineChars": 0 },
78
+ "runs": [ { "text": "— " }, { "fld": "PAGE" }, { "text": " —" } ] }
79
+ ]
80
+ }