@taloswork/ose-shared 0.1.2 → 0.1.4

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 (237) hide show
  1. package/package.json +3 -3
  2. package/skills/document/SKILL.md +56 -53
  3. package/skills/document/assets/fonts/Archivo-Regular.woff2 +0 -0
  4. package/skills/document/assets/fonts/Archivo-SemiBold.woff2 +0 -0
  5. package/skills/document/assets/fonts/BigShouldersDisplay-Bold.woff2 +0 -0
  6. package/skills/document/assets/fonts/BodoniModa-SemiBold.woff2 +0 -0
  7. package/skills/document/assets/fonts/ChakraPetch-600.woff2 +0 -0
  8. package/skills/document/assets/fonts/CormorantGaramond-SemiBold.woff2 +0 -0
  9. package/skills/document/assets/fonts/DMSerifDisplay-400.woff2 +0 -0
  10. package/skills/document/assets/fonts/Fraunces-SemiBold.woff2 +0 -0
  11. package/skills/document/assets/fonts/GochiHand-Regular.woff2 +0 -0
  12. package/skills/document/assets/fonts/IBMPlexSans-Regular.woff2 +0 -0
  13. package/skills/document/assets/fonts/IBMPlexSans-SemiBold.woff2 +0 -0
  14. package/skills/document/assets/fonts/Inter-Regular.woff2 +0 -0
  15. package/skills/document/assets/fonts/Jost-Regular.woff2 +0 -0
  16. package/skills/document/assets/fonts/Jost-SemiBold.woff2 +0 -0
  17. package/skills/document/assets/fonts/Karla-Regular.woff2 +0 -0
  18. package/skills/document/assets/fonts/Lexend-500.woff2 +0 -0
  19. package/skills/document/assets/fonts/Lora-Regular.woff2 +0 -0
  20. package/skills/document/assets/fonts/Manrope-Bold.woff2 +0 -0
  21. package/skills/document/assets/fonts/Manrope-Regular.woff2 +0 -0
  22. package/skills/document/assets/fonts/Marcellus-Regular.woff2 +0 -0
  23. package/skills/document/assets/fonts/Nunito-700.woff2 +0 -0
  24. package/skills/document/assets/fonts/PlayfairDisplay-600.woff2 +0 -0
  25. package/skills/document/assets/fonts/PublicSans-Regular.woff2 +0 -0
  26. package/skills/document/assets/fonts/Quicksand-600.woff2 +0 -0
  27. package/skills/document/assets/fonts/Sora-Regular.woff2 +0 -0
  28. package/skills/document/assets/fonts/Sora-SemiBold.woff2 +0 -0
  29. package/skills/document/assets/fonts/SpaceGrotesk-500.woff2 +0 -0
  30. package/skills/document/assets/fonts/Syne-700.woff2 +0 -0
  31. package/skills/document/assets/fonts/ZillaSlab-600.woff2 +0 -0
  32. package/skills/document/assets/fonts/fonts.json +316 -0
  33. package/skills/document/bin/deck-build.cjs +273 -5
  34. package/skills/document/bin/doc-gen.cjs +108 -23
  35. package/skills/document/bin/html2pptx.cjs +284 -51
  36. package/skills/document/catalog.json +43 -0
  37. package/skills/document/deck-design.md +191 -0
  38. package/skills/document/layouts/README.md +33 -0
  39. package/skills/document/layouts/banner-columns.tpl +9 -9
  40. package/skills/document/layouts/bento.tpl +3 -3
  41. package/skills/document/layouts/big-stat.tpl +3 -3
  42. package/skills/document/layouts/blocks-2x2.tpl +12 -12
  43. package/skills/document/layouts/brand-values.tpl +5 -5
  44. package/skills/document/layouts/cards-3.tpl +3 -3
  45. package/skills/document/layouts/cards-grid.tpl +3 -3
  46. package/skills/document/layouts/chart-full.tpl +3 -3
  47. package/skills/document/layouts/chart-kpi.tpl +3 -3
  48. package/skills/document/layouts/color-palette.tpl +5 -5
  49. package/skills/document/layouts/comparison.tpl +3 -3
  50. package/skills/document/layouts/concept-hub.tpl +3 -3
  51. package/skills/document/layouts/cover-centered.tpl +1 -1
  52. package/skills/document/layouts/cover-image.tpl +1 -1
  53. package/skills/document/layouts/cover-minimal.tpl +3 -3
  54. package/skills/document/layouts/cover-statement.tpl +3 -3
  55. package/skills/document/layouts/cover.tpl +1 -1
  56. package/skills/document/layouts/data-table.tpl +3 -3
  57. package/skills/document/layouts/dos-donts.tpl +14 -14
  58. package/skills/document/layouts/editorial-panel.tpl +11 -11
  59. package/skills/document/layouts/ending-contact.tpl +1 -1
  60. package/skills/document/layouts/ending.tpl +1 -1
  61. package/skills/document/layouts/funnel.tpl +3 -3
  62. package/skills/document/layouts/gantt.tpl +3 -3
  63. package/skills/document/layouts/hero.tpl +3 -3
  64. package/skills/document/layouts/icon-row.tpl +3 -3
  65. package/skills/document/layouts/image-full.tpl +5 -5
  66. package/skills/document/layouts/image-grid.tpl +3 -3
  67. package/skills/document/layouts/image-left.tpl +3 -3
  68. package/skills/document/layouts/list.tpl +3 -3
  69. package/skills/document/layouts/logo-guidelines.tpl +8 -8
  70. package/skills/document/layouts/map-distribution.tpl +3 -3
  71. package/skills/document/layouts/map-quad.tpl +6 -6
  72. package/skills/document/layouts/matrix-2x2.tpl +3 -3
  73. package/skills/document/layouts/numbered-brief.tpl +12 -12
  74. package/skills/document/layouts/org-tree.tpl +3 -3
  75. package/skills/document/layouts/problem-solution-banner.tpl +7 -7
  76. package/skills/document/layouts/problem-solution.tpl +3 -3
  77. package/skills/document/layouts/pyramid.tpl +3 -3
  78. package/skills/document/layouts/quote-aside.tpl +11 -0
  79. package/skills/document/layouts/quote.tpl +1 -1
  80. package/skills/document/layouts/radar.tpl +3 -3
  81. package/skills/document/layouts/ring-progress.tpl +3 -3
  82. package/skills/document/layouts/section-fullbleed.tpl +3 -3
  83. package/skills/document/layouts/section-image.tpl +1 -1
  84. package/skills/document/layouts/section-stat.tpl +1 -1
  85. package/skills/document/layouts/section.tpl +1 -1
  86. package/skills/document/layouts/slots.json +1 -1
  87. package/skills/document/layouts/split-two-col.tpl +3 -3
  88. package/skills/document/layouts/stats-chart.tpl +3 -3
  89. package/skills/document/layouts/steps-serpentine.tpl +11 -11
  90. package/skills/document/layouts/steps-vertical.tpl +3 -3
  91. package/skills/document/layouts/steps.tpl +3 -3
  92. package/skills/document/layouts/team-row.tpl +4 -4
  93. package/skills/document/layouts/three-kpi.tpl +3 -3
  94. package/skills/document/layouts/timeline.tpl +3 -3
  95. package/skills/document/layouts/title-meta.tpl +5 -5
  96. package/skills/document/layouts/title.tpl +2 -2
  97. package/skills/document/layouts/toc-agenda.tpl +3 -3
  98. package/skills/document/layouts/toc-editorial.tpl +15 -0
  99. package/skills/document/layouts/toc-panel.tpl +4 -4
  100. package/skills/document/layouts/toc.tpl +3 -3
  101. package/skills/document/layouts/transition.tpl +1 -1
  102. package/skills/document/layouts/two-kpi.tpl +3 -3
  103. package/skills/document/layouts/type-specimen.tpl +10 -10
  104. package/skills/document/layouts/versus.tpl +3 -3
  105. package/skills/document/motion/README.md +29 -0
  106. package/skills/document/motion/anthropic.json +29 -0
  107. package/skills/document/motion/apple.json +41 -0
  108. package/skills/document/motion/bistro-warm.json +16 -0
  109. package/skills/document/motion/black-gold.json +29 -0
  110. package/skills/document/motion/board-brief.json +14 -0
  111. package/skills/document/motion/bold-clash.json +16 -0
  112. package/skills/document/motion/branding.json +22 -0
  113. package/skills/document/motion/campus-teal.json +22 -0
  114. package/skills/document/motion/cinereel.json +23 -0
  115. package/skills/document/motion/clinic-care.json +22 -0
  116. package/skills/document/motion/cool.json +41 -0
  117. package/skills/document/motion/dark-glass.json +22 -0
  118. package/skills/document/motion/gov-brief.json +14 -0
  119. package/skills/document/motion/grid-tech.json +16 -0
  120. package/skills/document/motion/hand-drawn.json +23 -0
  121. package/skills/document/motion/ivory-gold.json +22 -0
  122. package/skills/document/motion/legal-slate.json +15 -0
  123. package/skills/document/motion/magazine-ink.json +29 -0
  124. package/skills/document/motion/mckinsey.json +28 -0
  125. package/skills/document/motion/memphis.json +16 -0
  126. package/skills/document/motion/mono.json +21 -0
  127. package/skills/document/motion/neon-cyber.json +42 -0
  128. package/skills/document/motion/olive-gold.json +22 -0
  129. package/skills/document/motion/organic-earth.json +15 -0
  130. package/skills/document/motion/pastel-saas.json +15 -0
  131. package/skills/document/motion/portfolio-noir.json +21 -0
  132. package/skills/document/motion/press-room.json +14 -0
  133. package/skills/document/motion/retro-press.json +15 -0
  134. package/skills/document/motion/sport-arena.json +16 -0
  135. package/skills/document/motion/swiss-grid.json +34 -0
  136. package/skills/document/motion/wedding-blush.json +15 -0
  137. package/skills/document/packs/README.md +28 -0
  138. package/skills/document/packs/board-brief/backdrop.html +4 -0
  139. package/skills/document/packs/board-brief/layouts/cover.tpl +12 -0
  140. package/skills/document/packs/board-brief/layouts/toc-agenda.tpl +20 -0
  141. package/skills/document/packs/board-brief/pack.css +27 -0
  142. package/skills/document/packs/press-room/backdrop.html +4 -0
  143. package/skills/document/packs/press-room/layouts/cover.tpl +12 -0
  144. package/skills/document/packs/press-room/layouts/section.tpl +13 -0
  145. package/skills/document/packs/press-room/pack.css +27 -0
  146. package/skills/document/styles/README.md +65 -16
  147. package/skills/document/styles/_contract-defaults.css +55 -0
  148. package/skills/document/styles/_samples/_groups/biz-premium.webp +0 -0
  149. package/skills/document/styles/_samples/_groups/creative.webp +0 -0
  150. package/skills/document/styles/_samples/_groups/editorial.webp +0 -0
  151. package/skills/document/styles/_samples/_groups/minimal.webp +0 -0
  152. package/skills/document/styles/_samples/_groups/natural.webp +0 -0
  153. package/skills/document/styles/_samples/_groups/tech-future.webp +0 -0
  154. package/skills/document/styles/_samples/anthropic.webp +0 -0
  155. package/skills/document/styles/_samples/apple.webp +0 -0
  156. package/skills/document/styles/_samples/bistro-warm.webp +0 -0
  157. package/skills/document/styles/_samples/black-gold.webp +0 -0
  158. package/skills/document/styles/_samples/board-brief.webp +0 -0
  159. package/skills/document/styles/_samples/bold-clash.webp +0 -0
  160. package/skills/document/styles/_samples/branding.webp +0 -0
  161. package/skills/document/styles/_samples/campus-teal.webp +0 -0
  162. package/skills/document/styles/_samples/cinereel.webp +0 -0
  163. package/skills/document/styles/_samples/clinic-care.webp +0 -0
  164. package/skills/document/styles/_samples/cool.webp +0 -0
  165. package/skills/document/styles/_samples/dark-glass.webp +0 -0
  166. package/skills/document/styles/_samples/gov-brief.webp +0 -0
  167. package/skills/document/styles/_samples/grid-tech.webp +0 -0
  168. package/skills/document/styles/_samples/hand-drawn.webp +0 -0
  169. package/skills/document/styles/_samples/ivory-gold.webp +0 -0
  170. package/skills/document/styles/_samples/legal-slate.webp +0 -0
  171. package/skills/document/styles/_samples/magazine-ink.webp +0 -0
  172. package/skills/document/styles/_samples/mckinsey.webp +0 -0
  173. package/skills/document/styles/_samples/memphis.webp +0 -0
  174. package/skills/document/styles/_samples/mono.webp +0 -0
  175. package/skills/document/styles/_samples/neon-cyber.webp +0 -0
  176. package/skills/document/styles/_samples/olive-gold.webp +0 -0
  177. package/skills/document/styles/_samples/organic-earth.webp +0 -0
  178. package/skills/document/styles/_samples/pastel-saas.webp +0 -0
  179. package/skills/document/styles/_samples/portfolio-noir.webp +0 -0
  180. package/skills/document/styles/_samples/press-room.webp +0 -0
  181. package/skills/document/styles/_samples/retro-press.webp +0 -0
  182. package/skills/document/styles/_samples/sport-arena.webp +0 -0
  183. package/skills/document/styles/_samples/swiss-grid.webp +0 -0
  184. package/skills/document/styles/_samples/wedding-blush.webp +0 -0
  185. package/skills/document/styles/anthropic/backdrop.html +4 -0
  186. package/skills/document/styles/anthropic/skin.css +15 -8
  187. package/skills/document/styles/apple/backdrop.html +4 -1
  188. package/skills/document/styles/apple/skin.css +5 -2
  189. package/skills/document/styles/bistro-warm/backdrop.html +4 -0
  190. package/skills/document/styles/bistro-warm/skin.css +27 -0
  191. package/skills/document/styles/black-gold/backdrop.html +3 -0
  192. package/skills/document/styles/black-gold/skin.css +15 -8
  193. package/skills/document/styles/bold-clash/backdrop.html +4 -0
  194. package/skills/document/styles/bold-clash/skin.css +27 -0
  195. package/skills/document/styles/branding/backdrop.html +4 -0
  196. package/skills/document/styles/branding/skin.css +14 -7
  197. package/skills/document/styles/campus-teal/backdrop.html +3 -0
  198. package/skills/document/styles/campus-teal/skin.css +27 -0
  199. package/skills/document/styles/cinereel/skin.css +28 -10
  200. package/skills/document/styles/clinic-care/backdrop.html +4 -0
  201. package/skills/document/styles/clinic-care/skin.css +27 -0
  202. package/skills/document/styles/cool/backdrop.html +3 -0
  203. package/skills/document/styles/cool/skin.css +5 -2
  204. package/skills/document/styles/dark-glass/backdrop.html +4 -0
  205. package/skills/document/styles/dark-glass/skin.css +27 -0
  206. package/skills/document/styles/gov-brief/backdrop.html +4 -0
  207. package/skills/document/styles/gov-brief/skin.css +27 -0
  208. package/skills/document/styles/grid-tech/backdrop.html +37 -0
  209. package/skills/document/styles/grid-tech/skin.css +27 -0
  210. package/skills/document/styles/hand-drawn/skin.css +16 -8
  211. package/skills/document/styles/ivory-gold/skin.css +21 -8
  212. package/skills/document/styles/legal-slate/backdrop.html +6 -0
  213. package/skills/document/styles/legal-slate/skin.css +27 -0
  214. package/skills/document/styles/magazine-ink/skin.css +7 -2
  215. package/skills/document/styles/mckinsey/backdrop.html +5 -0
  216. package/skills/document/styles/mckinsey/skin.css +5 -2
  217. package/skills/document/styles/memphis/backdrop.html +5 -0
  218. package/skills/document/styles/memphis/skin.css +27 -0
  219. package/skills/document/styles/mono/backdrop.html +6 -0
  220. package/skills/document/styles/mono/skin.css +6 -3
  221. package/skills/document/styles/neon-cyber/backdrop.html +4 -0
  222. package/skills/document/styles/neon-cyber/skin.css +27 -0
  223. package/skills/document/styles/olive-gold/backdrop.html +5 -0
  224. package/skills/document/styles/olive-gold/skin.css +15 -8
  225. package/skills/document/styles/organic-earth/backdrop.html +4 -0
  226. package/skills/document/styles/organic-earth/skin.css +27 -0
  227. package/skills/document/styles/pastel-saas/backdrop.html +4 -0
  228. package/skills/document/styles/pastel-saas/skin.css +27 -0
  229. package/skills/document/styles/portfolio-noir/backdrop.html +4 -0
  230. package/skills/document/styles/portfolio-noir/skin.css +27 -0
  231. package/skills/document/styles/retro-press/backdrop.html +6 -0
  232. package/skills/document/styles/retro-press/skin.css +27 -0
  233. package/skills/document/styles/sport-arena/backdrop.html +4 -0
  234. package/skills/document/styles/sport-arena/skin.css +27 -0
  235. package/skills/document/styles/swiss-grid/skin.css +6 -1
  236. package/skills/document/styles/wedding-blush/backdrop.html +6 -0
  237. package/skills/document/styles/wedding-blush/skin.css +27 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taloswork/ose-shared",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Talos cross-OSE shared library — skills + MCP servers auto-loaded into every OSE (P93 2026-07-27).",
5
5
  "type": "module",
6
6
  "files": [
@@ -10,6 +10,6 @@
10
10
  "publishConfig": {
11
11
  "access": "public"
12
12
  },
13
- "_talosPublishHash": "sha256-T36gm46DynkzOQOg4I0N8sK_-SP1h0kOm1929zOwv9U",
14
- "_talosPublishedAt": "2026-09-02T17:54:52.828Z"
13
+ "_talosPublishHash": "sha256-7or_mcdSHbKlZLnkDnnjf-71hdL7A895HrWVqUGALOo",
14
+ "_talosPublishedAt": "2026-09-03T17:22:12.823Z"
15
15
  }
@@ -40,56 +40,59 @@ script only when:
40
40
  document files via these scripts — never hand-write a python / ReportLab /
41
41
  LibreOffice script for document output.
42
42
  **Any deck/presentation(路演/汇报/评审/宣讲/pitch/roadshow/介绍 PPT)**:
43
- **CLARIFY FIRST — HARD GATE (applies to EVERY deck).** Before authoring
44
- anything, UNLESS the user already gave them or said "你决定/you decide", you
45
- MUST ask — in **ONE AskUserQuestion call with these FOUR questions** — and wait
46
- for answers (the tool allows up to 4 questions per call — use all four; do NOT
47
- split into a second call and do NOT drop the style question):
48
- **(1) content source** (提供材料 / 联网调研 / 自由创作); **(2) scenario** (pitch /
49
- 内审 / 销售 / 讲座 / 发布会 / 培训 / 大会 — sets tone, density, required sections);
50
- **(3) style — pick ONE skin.** By DEFAULT show **ALL 13 skins as image-card options**
51
- (anthropic · apple · black-gold · branding · cinereel · cool · hand-drawn · ivory-gold ·
52
- magazine-ink · mckinsey · mono · olive-gold · swiss-grid) — **never a 3–5 shortlist.**
53
- Image-card picks are capped at **16**, so the 4-option TEXT cap that governs Q2 does NOT
54
- apply here; emit **one card per skin, all 13, every time** (+ the template card below =
55
- 14 cards). If you catch yourself sending fewer than 13 skin cards, you mis-applied the
56
- text cap — send all 13.
57
- One option per skin `{ label: skin 名, description: <the skin's **picker one-liner**
58
- from styles/README.md, copied VERBATIM — one short line, must NOT wrap, no 首选/风/
59
- keynote padding>, imagePath: <absolute path to styles/_samples/<skin>.webp under the
60
- skill dir> }`. **The `适用场景` column is for MATCHING a skin to the scenario ONLY —
61
- never copy it (or synthesize from it) into the shown `description`; the description is
62
- the fixed picker one-liner, nothing else.** Those sample images are
63
- **PRE-RENDERED** WebP (a fixed cover + content page stacked per skin, all the same size)
64
- and shipped with the skill — pass them straight through as `imagePath`; do NOT
65
- render anything at question time. (The picker UI lays the cards out itself; the skill
66
- only supplies the options + images.) `styles/README.md` lists each skin's 适用场景 +
67
- light/dark; order the cards best-fit-for-scenario first, but show them all.
68
- **ALSO add one more option AFTER the skins** so the user can bring their OWN template:
69
- `{ label: "使用我的模板文件", description: "复用现成 PPT 的版式/风格", filePick: "file" }`
70
- (no imagePath — it renders as a folder card). Clicking it opens a native file picker
71
- and the chosen **path** becomes the Q3 answer; when the answer is a path (not a skin
72
- name), route to the reuse path — `pptx-tokenize`/`pptx-theme` (rewrite.md B2), NOT one
73
- of the skins.
74
- This custom-template card is required both for the initial four-question gate and
75
- whenever the user later asks to reselect/change the PPT style; never omit it from
76
- a skin gallery.
77
- **(4) slide count.**
78
- **Keep the call LEAN — it streams in full before the panel becomes interactive,
79
- so every extra token is dead wait.** Questions (1)(2)(4) pass options as **bare
80
- label strings** (e.g. `["提供材料","联网调研","自由创作"]`) — NO per-option
81
- `description`/`detail` objects; each question stem is ONE short sentence. The ONLY
82
- descriptions in the whole call are Q3's fixed skin one-liners. Skip any chat
83
- preamble before the tool (or keep it to a single short line) — the questions speak
84
- for themselves.
85
- Every question carries an implicit "其他/自定义" free-text escape (the panel adds
86
- it). If they respond with a question/correction instead of a pick, answer it,
87
- then re-ask. Do NOT drop the style question or waive the gate by judging the deck
88
- "small/quick" — only an explicit user spec or "你决定" skips it.
89
-
90
- **Pick the skin** (in this order): a remembered deck-skin preference → user named
91
- a style → match `styles/README.md` by 适用场景 → **otherwise default to `cool`**
92
- (酷炫深色). Use `mckinsey` / `mono` when the user asks clean/formal/light. Never
43
+ **CLARIFY FIRST — HARD GATE (applies to EVERY deck).** Before authoring, collect
44
+ three brief fields: **(1) content source** (提供材料 / 联网调研 / 自由创作);
45
+ **(2) scenario** (pitch / 内审 / 销售 / 讲座 / 发布会 / 培训 / 大会 — sets tone,
46
+ density, required sections); **(3) slide count.** Ask only for fields the user did
47
+ not already supply, in **ONE AskUserQuestion call with at most THREE questions**, and
48
+ wait for the answers. If all three are already known, do not ask them again.
49
+
50
+ **STYLE PICKER — ONE RESULT PER IMAGE, SCENARIO-RANKED.** After the scenario is
51
+ known, read the skill directory's **current `catalog.json` from disk immediately
52
+ before building the picker**. Never reuse a catalog listing from earlier conversation
53
+ context and never infer pack availability by scanning `packs/`. If the current catalog
54
+ cannot be read or parsed, stop and report that exact error instead of presenting stale
55
+ options.
56
+
57
+ Unless the user already named an entry id/name, supplied a template file, or explicitly
58
+ said **"无需展示模板,直接替我选定风格"**, send one single-question image-card picker:
59
+
60
+ - Rank **entries**, not groups, against the confirmed scenario and the user's requested
61
+ tone. Show at most 8 recommended entries. A scenario-matching `kind === "pack"` ranks
62
+ before matching skins; include at least one matching pack whenever one exists.
63
+ - Every image card maps to exactly one final entry and uses
64
+ `{ label: entry.kind === "pack" ? "PACK · " + entry.name_cn : entry.name_cn,
65
+ description: entry.oneliner, imagePath: <skill目录下entry.sample的绝对路径> }`.
66
+ Copy `entry.oneliner` verbatim. Never use `group.sample` in this default picker.
67
+ - Append `{ label: "查看全部风格", description: "一次查看全部模板" }`, then
68
+ `{ label: "使用我的模板文件", description: "复用现成 PPT 的版式/风格",
69
+ filePick: "file" }` as the final option.
70
+
71
+ **"按场景推荐/你推荐" means rank the cards and still ask.** It does NOT waive the
72
+ picker. Only the explicit no-picker wording above authorizes automatic selection.
73
+ Do not waive this gate because the deck is small or quick.
74
+
75
+ If the user chooses **查看全部风格**, immediately show **every current
76
+ `catalog.entries` item in one single-question image-card picker** using the same label,
77
+ description, and imagePath rule above. Preserve catalog order, keep `PACK ·` visible,
78
+ and append the custom-template file card. Do not ask for a group, paginate, or return to
79
+ any category/second-level picker; the browse-all action must expose final selectable
80
+ templates directly.
81
+
82
+ Samples are pre-rendered WebP files shipped with the skill: pass their absolute paths
83
+ directly and do not render anything during the question. The selected `entry.id` is the
84
+ `--style` value: `html2pptx deck.html out.pptx --style <id>`. Skin and pack use the same
85
+ render command; `catalog.json` resolves their different asset directories.
86
+
87
+ **Keep both calls LEAN.** The content/scenario/count questions use bare label strings,
88
+ no per-option descriptions; every question stem is one short sentence. Skip chat
89
+ preambles or keep one short line. Every question has the panel's implicit custom-text
90
+ escape. If the user responds with a correction or question, handle it and re-ask.
91
+
92
+ **Automatic choice, only when explicitly authorized:** rank by a remembered preference,
93
+ an exact user-named style, scenario match, a matching pack before a matching skin, then
94
+ `entry.mode` when the user asked for clean/formal/light/dark. Never hardcode a family id:
95
+ `catalog.json` is the only roster; `styles/README.md` is explanatory only. Never render
93
96
  unstyled. After the user confirms, save the preference to memory.
94
97
 
95
98
  **Custom style (user picked 其他/自定义 on Q3)** — clarify which route, **prefer B
@@ -101,9 +104,9 @@ script only when:
101
104
  palette → fill the class contract; see deck-design "build a skin from a reference
102
105
  image"). *(A deck given here is for its STYLE — distinct from a deck given as
103
106
  content, which is text-only; see content-pipeline Q1.)*
104
- - **A — map to the nearest of the 13 skins** (they only described a vibe): pick the
107
+ - **A — map to the nearest of catalog 里的族** (they only described a vibe): pick the
105
108
  closest, render its sample, confirm.
106
- - **C — tweak an existing skin** ("cool 但换绿色"): clone it, swap accent/palette or
109
+ - **C — tweak an existing skin** ("刚才那个族但换绿色"): clone it, swap accent/palette or
107
110
  flip light↔dark.
108
111
  Then render a cover+content sample of the result and confirm (same image-card step as
109
112
  a normal pick) before authoring; save the resulting preference to memory.
@@ -218,7 +221,7 @@ Fidelity-decision self-correct, but pointed at your OWN output:
218
221
  - `bin/xlsx-recalc.cjs <in.xlsx> <out.xlsx>` — re-evaluate all formulas (HyperFormula) and cache the results, keeping the formulas. Use when a spreadsheet's formula cells show stale/blank values.
219
222
  - `bin/doc-run.cjs <script.js> [args…]` — run a custom Node script with the engine's libraries bundled in (`require("pptxgenjs"|"docx"|"xlsx"|"pdf-lib"|"jszip"|"pizzip"|"hyperformula")` guaranteed on any machine; `--list` prints the registry). The long-tail escape hatch when no verb fits — see rewrite.md "Custom scripts"; ALWAYS doc-validate the output.
220
223
  - `bin/html2pptx.cjs <deck.html|snapshot.layout.json> <out.pptx> [--style <skin>] [--backdrop <variant>] [--theme <theme.json>] [--editable] [--rasterize]` — **THE deck path**: write slide HTML (`<section class="slide" data-layout="…">` on a 1280×720 canvas), Chromium lays it out → NATIVE editable pptx. **Compose from `layouts/*.tpl` (structure) + `--style <skin>` (paint)** — the preferred structure/skin split (`styles/README.md`); `--style` injects the skin's CSS, fills each `.slide-backdrop`, colors `data-chart` from the skin. `--backdrop <variant>` picks a signature backdrop. **DEFAULT = hybrid**: each slide's visuals bake into a full-fidelity raster backdrop with native EDITABLE text on top; auto-falls back to plain native if backdrop capture is unavailable. `--editable` = plain native only (effects flatten). `--rasterize` = full image slides (ZERO editability — tell the user). Advisory warnings on hardcoded brand colors + repeated layouts (P3). Runs in the app's Chromium OR bundled headless Chromium (Playwright) — works off-app (CI/cloud); layout JSON works anywhere. **Tailwind + `size="1".."7"` scale available** (vendored offline). See deck-design.md + layouts/README.md. `[--theme <theme.json>]` is the legacy path (superseded by `--style`). **Don't confuse the two `--style` flags:** html2pptx's `--style` = the whole deck **skin** (backgrounds, cards, the lot); doc-gen's `--style` on **docx/pdf** is a different, narrower flag that borrows only the skin's ONE accent color onto black-text paper (a document, not a deck).
221
- - `bin/deck-build.cjs <spec.json> <deck.html>` — **THE FAST deck path** for catalog slides: emit a COMPACT spec (per slide a `layout` id + its content `slots` `{…}`, plus `rows` for list/figure layouts and an optional `chart`) and this reads each `layouts/<id>.tpl`, fills it, and assembles `deck.html` — so you stream ~content only, not ~40KB of boilerplate HTML (much faster). Then `html2pptx deck.html out.pptx --style <spec.style>` as usual. **What each layout takes is in `layouts/slots.json`** (`slots` + `rows` per layout; `"chart":"derived"` means the layout BUILDS its chart from its rows — pass rows, never `chart`). Un-filled slots fall back to the template default, but a spec the catalog can't satisfy (unknown layout/slot/field, a `rows` block with no data, a figure row missing its numbers) **exits 1 and writes nothing** — fix the spec rather than shipping demo data. For a **bespoke** slide the catalog can't express, hand-author that ONE `<section>` and append it to deck.html (deck-build handles the catalog slides). spec: `{ "style":"cool", "slides":[ {"layout":"cover","slots":{"title":"…"}}, {"layout":"chart-kpi","slots":{…},"chart":{…}}, {"layout":"gantt","slots":{…},"rows":{"cols":[{"label":"Q1"}],"tasks":[{"name":"调研","from":1,"to":2}]}} ] }`.
224
+ - `bin/deck-build.cjs <spec.json> <deck.html>` — **THE FAST deck path** for catalog slides: emit a COMPACT spec (per slide a `layout` id + its content `slots` `{…}`, plus `rows` for list/figure layouts and an optional `chart`) and this reads each `layouts/<id>.tpl`, fills it, and assembles `deck.html` — so you stream ~content only, not ~40KB of boilerplate HTML (much faster). Then `html2pptx deck.html out.pptx --style <spec.style>` as usual. **What each layout takes is in `layouts/slots.json`** (`slots` + `rows` per layout; `"chart":"derived"` means the layout BUILDS its chart from its rows — pass rows, never `chart`). Un-filled slots fall back to the template default, but a spec the catalog can't satisfy (unknown layout/slot/field, a `rows` block with no data, a figure row missing its numbers) **exits 1 and writes nothing** — fix the spec rather than shipping demo data. For a **bespoke** slide the catalog can't express, hand-author that ONE `<section>` and append it to deck.html (deck-build handles the catalog slides). spec: `{ "style":"<catalog entry id>", "slides":[ {"layout":"cover","slots":{"title":"…"}}, {"layout":"chart-kpi","slots":{…},"chart":{…}}, {"layout":"gantt","slots":{…},"rows":{"cols":[{"label":"Q1"}],"tasks":[{"name":"调研","from":1,"to":2}]}} ] }`.
222
225
 
223
226
  All scripts are Node and print a machine-readable result plus a human note. On a
224
227
  missing dependency or unreadable file they exit non-zero with a clear message —
@@ -0,0 +1,316 @@
1
+ {
2
+ "_comment": "Single source of truth for the skill's bundled font set. Consumed by bin-src/html2pptx.mjs (base64 @font-face injection at render) and by scripts/deck-skin-samples.mjs + scripts/deck-fidelity.mjs (served from disk via page.route). Add a face HERE, drop the .woff2 beside it, and every renderer picks it up — never inline a base64 @font-face into a skin.css. `substitutesInvisibly: true` marks a neutral grotesque: it is NOT on any OS, so the native pptx text layer swaps it for Helvetica/Arial, but the swap differs by a hair and no reader would name it — such a face may lead a skin unbaked. A serif or display face is the opposite call: bake every rule that uses it, or the audience sees a different font (deck-layouts.test.ts enforces both directions, and gen-skin refuses a family that gets it wrong).",
3
+ "cjkUnicodeRange": "U+2E80-2EFF,U+3000-303F,U+3040-30FF,U+3200-4DBF,U+4E00-9FFF,U+F900-FAFF,U+FE30-FE4F,U+FF00-FFEF",
4
+ "cjk": [
5
+ {
6
+ "file": "NotoSansSC.woff2",
7
+ "families": [
8
+ "PingFang SC",
9
+ "Hiragino Sans GB",
10
+ "Microsoft YaHei",
11
+ "Noto Sans SC",
12
+ "Noto Sans CJK SC",
13
+ "Source Han Sans SC",
14
+ "WenQuanYi Zen Hei"
15
+ ]
16
+ },
17
+ {
18
+ "file": "NotoSerifSC.woff2",
19
+ "families": [
20
+ "Songti SC",
21
+ "STSong",
22
+ "SimSun",
23
+ "Noto Serif SC",
24
+ "Noto Serif CJK SC",
25
+ "Source Han Serif SC"
26
+ ]
27
+ }
28
+ ],
29
+ "latin": [
30
+ {
31
+ "file": "Anton-Regular.woff2",
32
+ "families": [
33
+ "Anton"
34
+ ],
35
+ "note": "Ultra-condensed display face. cinereel + ivory-gold use it for --font-head and BAKE their titles, which is why it survives into the pptx. Also staged into the xhs skill by scripts/build-xhs-skills.mjs.",
36
+ "license": "SIL OFL 1.1 (Google Fonts)"
37
+ },
38
+ {
39
+ "file": "Inter-Regular.woff2",
40
+ "families": [
41
+ "Inter"
42
+ ],
43
+ "license": "SIL OFL 1.1 (Google Fonts)",
44
+ "note": "Neutral UI grotesque. swiss-grid asks for it as its whole type system, ivory-gold as --font-body. Neither OS ships it, so before this entry even the backdrop/preview render fell back to Helvetica/Arial. Their native text still does — see _scope.",
45
+ "substitutesInvisibly": true
46
+ },
47
+ {
48
+ "file": "GochiHand-Regular.woff2",
49
+ "families": [
50
+ "Gochi Hand"
51
+ ],
52
+ "license": "Apache License 2.0 (Google Fonts)",
53
+ "note": "Handwriting face, hand-drawn's signature marker-pen heading. Latin-only, so a CJK deck barely shows it; and hand-drawn does NOT bake its titles, so the native text layer still resolves the stack's `cursive` keyword (LibreOffice → Snell Roundhand). Bundling fixes the backdrop/preview render only — see _scope."
54
+ },
55
+ {
56
+ "file": "BigShouldersDisplay-Bold.woff2",
57
+ "families": [
58
+ "Big Shoulders Display"
59
+ ],
60
+ "weight": "700",
61
+ "license": "SIL OFL 1.1 (Google Fonts)",
62
+ "note": "Ultra-condensed display face, narrower and more open-countered than Anton. cinereel's --font-head; picked to match the slidescarnival music-video template this skin is modelled on. Every rule that uses it is baked."
63
+ },
64
+ {
65
+ "file": "Jost-Regular.woff2",
66
+ "families": [
67
+ "Jost"
68
+ ],
69
+ "weight": "400",
70
+ "license": "SIL OFL 1.1 (Google Fonts)",
71
+ "note": "Geometric sans, cinereel's --font-body. Body copy is NOT baked (it must stay editable/searchable), so the native pptx text layer still substitutes — this face governs the backdrop and previews. See deck-design.md § Fonts.",
72
+ "substitutesInvisibly": true
73
+ },
74
+ {
75
+ "file": "Jost-SemiBold.woff2",
76
+ "families": [
77
+ "Jost"
78
+ ],
79
+ "weight": "600",
80
+ "license": "SIL OFL 1.1 (Google Fonts)",
81
+ "note": "The 600 companion, so bold body runs (.toc-title etc.) use a real semibold instead of a synthesised smear.",
82
+ "substitutesInvisibly": true
83
+ },
84
+ {
85
+ "file": "Fraunces-SemiBold.woff2",
86
+ "families": [
87
+ "Fraunces"
88
+ ],
89
+ "weight": "600",
90
+ "license": "SIL OFL 1.1 (Google Fonts)",
91
+ "note": "anthropic 标题。有机人文衬线,替下与 black-gold/branding 共用的 Georgia。"
92
+ },
93
+ {
94
+ "file": "PublicSans-Regular.woff2",
95
+ "families": [
96
+ "Public Sans"
97
+ ],
98
+ "weight": "400",
99
+ "license": "SIL OFL 1.1 (Google Fonts)",
100
+ "note": "anthropic 正文。",
101
+ "substitutesInvisibly": true
102
+ },
103
+ {
104
+ "file": "Manrope-Regular.woff2",
105
+ "families": [
106
+ "Manrope"
107
+ ],
108
+ "weight": "400",
109
+ "license": "SIL OFL 1.1 (Google Fonts)",
110
+ "note": "apple 正文。",
111
+ "substitutesInvisibly": true
112
+ },
113
+ {
114
+ "file": "Manrope-Bold.woff2",
115
+ "families": [
116
+ "Manrope"
117
+ ],
118
+ "weight": "700",
119
+ "license": "SIL OFL 1.1 (Google Fonts)",
120
+ "note": "apple 标题。几何圆润无衬线,产品发布会的舞台感。",
121
+ "substitutesInvisibly": true
122
+ },
123
+ {
124
+ "file": "BodoniModa-SemiBold.woff2",
125
+ "families": [
126
+ "Bodoni Moda"
127
+ ],
128
+ "weight": "600",
129
+ "license": "SIL OFL 1.1 (Google Fonts)",
130
+ "note": "black-gold 标题。高反差 didone,金融年报/奢侈品的经典。"
131
+ },
132
+ {
133
+ "file": "Lora-Regular.woff2",
134
+ "families": [
135
+ "Lora"
136
+ ],
137
+ "weight": "400",
138
+ "license": "SIL OFL 1.1 (Google Fonts)",
139
+ "note": "black-gold 正文衬线。"
140
+ },
141
+ {
142
+ "file": "CormorantGaramond-SemiBold.woff2",
143
+ "families": [
144
+ "Cormorant Garamond"
145
+ ],
146
+ "weight": "600",
147
+ "license": "SIL OFL 1.1 (Google Fonts)",
148
+ "note": "branding 标题。低反差优雅 garalde,品牌手册/美妆。"
149
+ },
150
+ {
151
+ "file": "Karla-Regular.woff2",
152
+ "families": [
153
+ "Karla"
154
+ ],
155
+ "weight": "400",
156
+ "license": "SIL OFL 1.1 (Google Fonts)",
157
+ "note": "branding + olive-gold 正文。带点个性的 grotesque。",
158
+ "substitutesInvisibly": true
159
+ },
160
+ {
161
+ "file": "Sora-Regular.woff2",
162
+ "families": [
163
+ "Sora"
164
+ ],
165
+ "weight": "400",
166
+ "license": "SIL OFL 1.1 (Google Fonts)",
167
+ "note": "cool 正文。",
168
+ "substitutesInvisibly": true
169
+ },
170
+ {
171
+ "file": "Sora-SemiBold.woff2",
172
+ "families": [
173
+ "Sora"
174
+ ],
175
+ "weight": "600",
176
+ "license": "SIL OFL 1.1 (Google Fonts)",
177
+ "note": "cool 标题。几何科技感,替下与 olive-gold 共用的 Avenir Next。",
178
+ "substitutesInvisibly": true
179
+ },
180
+ {
181
+ "file": "IBMPlexSans-Regular.woff2",
182
+ "families": [
183
+ "IBM Plex Sans"
184
+ ],
185
+ "weight": "400",
186
+ "license": "SIL OFL 1.1 (Google Fonts)",
187
+ "note": "mckinsey 正文。",
188
+ "substitutesInvisibly": true
189
+ },
190
+ {
191
+ "file": "IBMPlexSans-SemiBold.woff2",
192
+ "families": [
193
+ "IBM Plex Sans"
194
+ ],
195
+ "weight": "600",
196
+ "license": "SIL OFL 1.1 (Google Fonts)",
197
+ "note": "mckinsey 标题。企业/咨询语气,替下与 apple/mono 共用的 Helvetica Neue。",
198
+ "substitutesInvisibly": true
199
+ },
200
+ {
201
+ "file": "Archivo-Regular.woff2",
202
+ "families": [
203
+ "Archivo"
204
+ ],
205
+ "weight": "400",
206
+ "license": "SIL OFL 1.1 (Google Fonts)",
207
+ "note": "mono 正文。",
208
+ "substitutesInvisibly": true
209
+ },
210
+ {
211
+ "file": "Archivo-SemiBold.woff2",
212
+ "families": [
213
+ "Archivo"
214
+ ],
215
+ "weight": "600",
216
+ "license": "SIL OFL 1.1 (Google Fonts)",
217
+ "note": "mono 标题。骨架清晰的中性 grotesque,极简报告。",
218
+ "substitutesInvisibly": true
219
+ },
220
+ {
221
+ "file": "Marcellus-Regular.woff2",
222
+ "families": [
223
+ "Marcellus"
224
+ ],
225
+ "weight": "400",
226
+ "license": "SIL OFL 1.1 (Google Fonts)",
227
+ "note": "olive-gold 标题。古典罗马体大写,证书/招商的仪式感。"
228
+ },
229
+ {
230
+ "file": "SpaceGrotesk-500.woff2",
231
+ "families": [
232
+ "Space Grotesk"
233
+ ],
234
+ "weight": "500",
235
+ "license": "SIL OFL 1.1 (Google Fonts)",
236
+ "substitutesInvisibly": true,
237
+ "note": "Neutral-with-a-quirk grotesque (flat-sided o, angled terminals). dark-glass 的 --font-head。落到 Helvetica 只丢那点怪味,不烤。"
238
+ },
239
+ {
240
+ "file": "Syne-700.woff2",
241
+ "families": [
242
+ "Syne"
243
+ ],
244
+ "weight": "700",
245
+ "license": "SIL OFL 1.1 (Google Fonts)",
246
+ "note": "Extended geometric display,字宽与字重都反常规 —— memphis 的招牌。展示体,必烤。"
247
+ },
248
+ {
249
+ "file": "DMSerifDisplay-400.woff2",
250
+ "families": [
251
+ "DM Serif Display"
252
+ ],
253
+ "weight": "400",
254
+ "license": "SIL OFL 1.1 (Google Fonts)",
255
+ "note": "High-contrast display serif,retro-press 的标题脸。展示衬线,必烤。"
256
+ },
257
+ {
258
+ "file": "Quicksand-600.woff2",
259
+ "families": [
260
+ "Quicksand"
261
+ ],
262
+ "weight": "600",
263
+ "license": "SIL OFL 1.1 (Google Fonts)",
264
+ "substitutesInvisibly": true,
265
+ "note": "Rounded geometric sans,pastel-saas 的柔和标题。圆角是它唯一的怪味,落到 Helvetica 不至于换风格,不烤。"
266
+ },
267
+ {
268
+ "file": "ChakraPetch-600.woff2",
269
+ "families": [
270
+ "Chakra Petch"
271
+ ],
272
+ "weight": "600",
273
+ "license": "SIL OFL 1.1 (Google Fonts)",
274
+ "note": "Squared techno face,neon-grid 一类硬科技族的标题脸。展示体,必烤。"
275
+ },
276
+ {
277
+ "file": "Lexend-500.woff2",
278
+ "families": [
279
+ "Lexend"
280
+ ],
281
+ "weight": "500",
282
+ "license": "SIL OFL 1.1 (Google Fonts)",
283
+ "substitutesInvisibly": true,
284
+ "note": "为可读性设计的中性无衬线(字宽略放)。campus-teal 的标题脸;落到 Helvetica 只丢那点从容,不烤。"
285
+ },
286
+ {
287
+ "file": "Nunito-700.woff2",
288
+ "families": [
289
+ "Nunito"
290
+ ],
291
+ "weight": "700",
292
+ "license": "SIL OFL 1.1 (Google Fonts)",
293
+ "substitutesInvisibly": true,
294
+ "note": "圆角人文无衬线,clinic-care 的标题脸。圆角是它唯一的怪味,不至于换风格,不烤。"
295
+ },
296
+ {
297
+ "file": "PlayfairDisplay-600.woff2",
298
+ "families": [
299
+ "Playfair Display"
300
+ ],
301
+ "weight": "600",
302
+ "license": "SIL OFL 1.1 (Google Fonts)",
303
+ "note": "高反差过渡期衬线,wedding-blush 的标题脸。展示衬线,必烤。"
304
+ },
305
+ {
306
+ "file": "ZillaSlab-600.woff2",
307
+ "families": [
308
+ "Zilla Slab"
309
+ ],
310
+ "weight": "600",
311
+ "license": "SIL OFL 1.1 (Google Fonts)",
312
+ "note": "板衬线,bistro-warm 的标题脸 —— 菜单/招牌的口吻。衬线,必烤。"
313
+ }
314
+ ],
315
+ "_scope": "These faces are injected as @font-face and therefore apply to the BROWSER render only — the raster backdrop, any --talos-bake:1 text, --rasterize output and styles/_samples previews. They do NOT reach the NATIVE pptx text layer: there a run carries only a typeface NAME, and the consuming app (PowerPoint / LibreOffice) substitutes whatever it has. So bundling a face makes a skin's own rendering correct, but a native title still needs --talos-bake:1 (see cinereel) or an OOXML embed via bin/pptx-embed-fonts.cjs to survive into the deck the audience opens."
316
+ }