@topmindspace/tms-skills 2.0.1 → 2.1.0

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 (95) hide show
  1. package/CHANGELOG.md +145 -134
  2. package/README.md +1 -1
  3. package/bin/tms-skills.js +160 -160
  4. package/package.json +48 -48
  5. package/top-ppt-html/README.md +254 -254
  6. package/top-ppt-html/SKILL.md +111 -111
  7. package/top-ppt-html/assets/examples/2026-09-09-architecture-graphite-dark.html +3926 -3926
  8. package/top-ppt-html/assets/examples/2026-09-09-architecture-graphite-dark.model.json +167 -167
  9. package/top-ppt-html/assets/examples/2026-09-09-architecture-spectrum.html +3926 -3926
  10. package/top-ppt-html/assets/examples/2026-09-09-architecture-spectrum.model.json +167 -167
  11. package/top-ppt-html/assets/examples/2026-09-09-presentation-apple-mono.html +4325 -4325
  12. package/top-ppt-html/assets/examples/2026-09-09-presentation-apple-mono.model.json +320 -320
  13. package/top-ppt-html/assets/examples/2026-09-09-presentation-brand-red.html +4325 -4325
  14. package/top-ppt-html/assets/examples/2026-09-09-presentation-brand-red.model.json +320 -320
  15. package/top-ppt-html/assets/examples/2026-09-09-presentation-business-blue.html +4325 -4325
  16. package/top-ppt-html/assets/examples/2026-09-09-presentation-business-blue.model.json +320 -320
  17. package/top-ppt-html/assets/examples/2026-09-09-research-deep-teal.html +5527 -5527
  18. package/top-ppt-html/assets/examples/2026-09-09-research-deep-teal.model.json +913 -913
  19. package/top-ppt-html/assets/examples/2026-09-09-research-indigo-violet.html +5527 -5527
  20. package/top-ppt-html/assets/examples/2026-09-09-research-indigo-violet.model.json +913 -913
  21. package/top-ppt-html/assets/examples/2026-09-09-research-mckinsey.html +5527 -5527
  22. package/top-ppt-html/assets/examples/2026-09-09-research-mckinsey.model.json +913 -913
  23. package/top-ppt-html/assets/examples/2026-09-09-research-warm-sand.html +5527 -5527
  24. package/top-ppt-html/assets/examples/2026-09-09-research-warm-sand.model.json +913 -913
  25. package/top-ppt-html/assets/pptx-export.js +1944 -1944
  26. package/top-ppt-html/assets/style-gallery.html +589 -589
  27. package/top-ppt-html/assets/templates/architecture.html +3728 -3728
  28. package/top-ppt-html/assets/templates/engine.css +840 -840
  29. package/top-ppt-html/assets/templates/presentation.html +3738 -3738
  30. package/top-ppt-html/assets/templates/research.html +4017 -4017
  31. package/top-ppt-html/assets/templates/ui.js +520 -520
  32. package/top-ppt-html/evals/prompts.csv +15 -15
  33. package/top-ppt-html/evals/rubric.schema.json +25 -25
  34. package/top-ppt-html/evals/run_evals.py +220 -220
  35. package/top-ppt-html/evals/trace.example.json +16 -16
  36. package/top-ppt-html/package-lock.json +207 -0
  37. package/top-ppt-html/package.json +35 -35
  38. package/top-ppt-html/references/charts-basic.md +624 -624
  39. package/top-ppt-html/references/charts-discipline.md +108 -108
  40. package/top-ppt-html/references/charts-extended.md +482 -482
  41. package/top-ppt-html/references/charts.md +28 -28
  42. package/top-ppt-html/references/components-atoms.md +624 -624
  43. package/top-ppt-html/references/components.md +30 -30
  44. package/top-ppt-html/references/content-rules.md +490 -490
  45. package/top-ppt-html/references/design-system-engine.md +235 -235
  46. package/top-ppt-html/references/design-system.md +478 -478
  47. package/top-ppt-html/references/failure-modes.md +214 -214
  48. package/top-ppt-html/references/high-fidelity.md +127 -127
  49. package/top-ppt-html/references/icons.md +397 -397
  50. package/top-ppt-html/references/industry-benchmark.md +105 -105
  51. package/top-ppt-html/references/infographics-stats.md +308 -308
  52. package/top-ppt-html/references/infographics-structure.md +226 -226
  53. package/top-ppt-html/references/infographics.md +43 -43
  54. package/top-ppt-html/references/layout-grammar.md +315 -315
  55. package/top-ppt-html/references/layouts-architecture.md +108 -108
  56. package/top-ppt-html/references/layouts-combo.md +600 -600
  57. package/top-ppt-html/references/layouts-research.md +160 -160
  58. package/top-ppt-html/references/modes.md +254 -254
  59. package/top-ppt-html/references/outline-design.md +275 -275
  60. package/top-ppt-html/references/playbook.md +266 -266
  61. package/top-ppt-html/references/pptx-export.md +209 -209
  62. package/top-ppt-html/references/reform-plan.md +252 -252
  63. package/top-ppt-html/references/styles.md +370 -370
  64. package/top-ppt-html/references/tech-design.md +138 -138
  65. package/top-ppt-html/scripts/audit_css.py +109 -109
  66. package/top-ppt-html/scripts/audit_docs.py +176 -176
  67. package/top-ppt-html/scripts/audit_skill.py +220 -220
  68. package/top-ppt-html/scripts/audit_styles.py +351 -351
  69. package/top-ppt-html/scripts/build_examples.py +2276 -2276
  70. package/top-ppt-html/scripts/build_pptx.js +2380 -2380
  71. package/top-ppt-html/scripts/capture_theme_overview.js +78 -78
  72. package/top-ppt-html/scripts/checks_html.py +127 -127
  73. package/top-ppt-html/scripts/cross_verify.py +294 -294
  74. package/top-ppt-html/scripts/env_probe.py +158 -158
  75. package/top-ppt-html/scripts/extract_model.py +210 -210
  76. package/top-ppt-html/scripts/extract_snippet.py +374 -374
  77. package/top-ppt-html/scripts/gen_channel_a.js +214 -214
  78. package/top-ppt-html/scripts/layout-constants.json +3377 -3377
  79. package/top-ppt-html/scripts/layout_slots.json +830 -830
  80. package/top-ppt-html/scripts/lib_layout_regions.js +412 -412
  81. package/top-ppt-html/scripts/measure_height.py +178 -178
  82. package/top-ppt-html/scripts/model-schema.json +547 -547
  83. package/top-ppt-html/scripts/negative_tests.py +307 -307
  84. package/top-ppt-html/scripts/package_skill.py +291 -291
  85. package/top-ppt-html/scripts/prepare_images.py +341 -341
  86. package/top-ppt-html/scripts/probe_image_export.py +188 -188
  87. package/top-ppt-html/scripts/quality_gate.py +301 -301
  88. package/top-ppt-html/scripts/regression.py +308 -308
  89. package/top-ppt-html/scripts/render_compare.py +275 -275
  90. package/top-ppt-html/scripts/render_from_model.py +698 -698
  91. package/top-ppt-html/scripts/scaffold_report.py +1054 -1054
  92. package/top-ppt-html/scripts/section-file-map.json +104 -104
  93. package/top-ppt-html/scripts/sync_runtime.py +662 -662
  94. package/top-ppt-html/scripts/validate_pptx.py +1510 -1510
  95. package/top-ppt-html/scripts/validate_report.py +1456 -1456
@@ -1,547 +1,547 @@
1
- {
2
- "$comment": "TopPPT HTML · REPORT_MODEL DSL schema 单源。双端同源:scripts/sync_runtime.py 把本文件注入 assets/pptx-export.js 的 __TOPPPT_SCHEMA__ 标记块(浏览器端 validateModel);scripts/extract_model.py 直接读本文件做本地校验。禁止在两端手写副本。字段路径约定:'a.b:c' 中 ':array' 要求非空数组,':str' 要求非空字符串,无后缀仅做真值检查;'anyof:a|b:c' 表示「任一满足即通过」(用于素材图片页:src / items / placeholder 三选一)。pageTypes[].modes = 该页型允许的模式(越界仅告警,不阻断)。commonSectionFields 为任意页型可选的通用字段(flags = 待核实标注清单,image = 素材图片/配图占位)。chartTypes = 图表类型白名单(起含原生与形状两条通道,通道归属见 scripts/layout-constants.json 的 charts.registry)。图片规格与占位约定见同文件 imageSpec。",
3
- "version": "9.1",
4
- "modes": [
5
- "presentation",
6
- "research",
7
- "architecture"
8
- ],
9
- "model": {
10
- "required": [
11
- "title",
12
- "sections:array",
13
- "closing.title",
14
- "closing.points:array"
15
- ],
16
- "optional": [
17
- "mode",
18
- "style",
19
- "theme",
20
- "subtitle",
21
- "meta",
22
- "agenda:array"
23
- ],
24
- "agendaMin": {
25
- "presentation": 3,
26
- "research": 3,
27
- "architecture": 0
28
- },
29
- "sectionsMin": 1,
30
- "sectionsRecommended": 3,
31
- "agendaComfortMax": 16
32
- },
33
- "commonSectionFields": [
34
- "eyebrow",
35
- "title",
36
- "lead",
37
- "soWhat",
38
- "footnote",
39
- "flags",
40
- "image",
41
- "exhibitNo",
42
- "layoutPreset"
43
- ],
44
- "flagsHint": "flags = 待核实/待二次修改条目字符串数组(如 '2027 增速 xx%(口径未定)');渲染为 accent 强调色标注行,提示用户核对。",
45
- "imageHint": "image = 素材图片/配图占位对象。三选一必填:src(用户图,data: 内联或相对路径,零外链铁律禁 http(s))|items(多图版式:grid/compare/wall,元素 {src?, alt?, caption?, placeholder?})|placeholder:true(无图时出配图占位,原生形状渲染、pictures 不增)。其余可选:layout(full/half/bleed/grid/compare/wall,见 layout-constants.json imageSpec.layouts)、fit(cover 默认 / contain)、caption、alt、hint、ratio。",
46
- "imageLayoutHint": "layout 与 HTML 版式对应:full=版心全宽图|half=左图右注(points 为右栏注解)|bleed=通栏出血|grid=多图网格(items 2/3/4/6 张)|compare=双图 A/B 对比(items 2 张)|wall=Logo 墙(items 3–12 张小图)。占位符标签文本由双引擎按 imageSpec 拼同一串,保证 A/B 通道逐页文本一致。",
47
- "chartTypes": [
48
- "bar",
49
- "hbar",
50
- "stack",
51
- "stackline",
52
- "line",
53
- "dualline",
54
- "area",
55
- "donut",
56
- "multidonut",
57
- "pie",
58
- "radar",
59
- "scatter",
60
- "bubble",
61
- "waterfall",
62
- "gauge",
63
- "pareto",
64
- "funnel",
65
- "gantt",
66
- "vsbar",
67
- "progress",
68
- "sparkline",
69
- "slope",
70
- "dumbbell",
71
- "lollipop",
72
- "dotplot",
73
- "bulletchart",
74
- "waffle",
75
- "radialbar",
76
- "rose",
77
- "candlestick"
78
- ],
79
- "chartTypesHint": "chart.type 可取值 = 本表(30 类:16 原生 + 14 形状还原)。其余 6 类复杂信息图(sankey/treemap/boxplot/network/marimekko/streamgraph)是**专属页型**而非 chart.type——它们要按列/段/节点等结构化载荷表达,故走 sections[].type。不变量:charts.registry.types == chartTypes ∪ 上述 6 类页型(sync_runtime.py 校验)。",
80
- "chartDataTable": {
81
- "$comment": "数据表策略:图表页的数据可追溯开关。notes = 数据写入演讲者备注(默认,零版面占用);inline = 页内附原生小字号表格;appendix = 自动生成附录数据页(原生表格);off = 不附(仅 sparkline 这类纯装饰微图允许)。pptx=shape 的非原生图表至少 notes。",
82
- "enum": [
83
- "notes",
84
- "inline",
85
- "appendix",
86
- "off"
87
- ],
88
- "default": "notes",
89
- "rule": "非原生图表(registry.pptx=shape)的 dataTable 不得为 off;缺失时按 registry 默认值补齐。"
90
- },
91
- "pageTypes": {
92
- "points": {
93
- "label": "要点列表页",
94
- "modes": [
95
- "presentation",
96
- "research",
97
- "architecture"
98
- ],
99
- "required": [
100
- "points:array"
101
- ],
102
- "optional": [
103
- "metrics:array"
104
- ]
105
- },
106
- "metrics": {
107
- "label": "指标带页(4–6 个核心数字)",
108
- "modes": [
109
- "presentation",
110
- "research"
111
- ],
112
- "required": [
113
- "metrics:array"
114
- ]
115
- },
116
- "kpi": {
117
- "label": "大数指标页(hero 大数字 + 支撑指标行)",
118
- "modes": [
119
- "presentation",
120
- "research"
121
- ],
122
- "required": [
123
- "hero:array"
124
- ],
125
- "optional": [
126
- "metrics:array"
127
- ]
128
- },
129
- "table": {
130
- "label": "对比表页",
131
- "modes": [
132
- "presentation",
133
- "research",
134
- "architecture"
135
- ],
136
- "required": [
137
- "table.head:array",
138
- "table.rows:array"
139
- ],
140
- "optional": [
141
- "table.colW:array"
142
- ]
143
- },
144
- "timeline": {
145
- "label": "时间线 / 路线页",
146
- "modes": [
147
- "presentation",
148
- "research"
149
- ],
150
- "required": [
151
- "phases:array"
152
- ]
153
- },
154
- "steps": {
155
- "label": "步骤条页(N 步横排 + 箭头,可分组)",
156
- "modes": [
157
- "presentation",
158
- "research",
159
- "architecture"
160
- ],
161
- "required": [
162
- "steps:array"
163
- ],
164
- "optional": [
165
- "groups:array",
166
- "note"
167
- ]
168
- },
169
- "bar": {
170
- "label": "图表页(chart.type 见 chartTypes;native 通道走原生数据图表,shape 通道走高保真形状还原 + 数据表)",
171
- "modes": [
172
- "presentation",
173
- "research"
174
- ],
175
- "required": [
176
- "chart.labels:array",
177
- "chart.values:array"
178
- ],
179
- "optional": [
180
- "chart.type",
181
- "chart.series:array",
182
- "chart.points:array",
183
- "chart.max",
184
- "chart.unit",
185
- "chart.colors:array",
186
- "chart.start:array",
187
- "chart.target:array",
188
- "chart.dataTable",
189
- "note"
190
- ]
191
- },
192
- "donut": {
193
- "label": "环形图页(原生 pie 楔形 + 图例)",
194
- "modes": [
195
- "presentation",
196
- "research"
197
- ],
198
- "required": [
199
- "chart.labels:array",
200
- "chart.values:array"
201
- ],
202
- "optional": [
203
- "chart.unit",
204
- "chart.centerLabel",
205
- "chart.colors:array",
206
- "chart.dataTable",
207
- "note"
208
- ]
209
- },
210
- "heatmap": {
211
- "label": "热力矩阵页(行 × 列 + 强度色阶)",
212
- "modes": [
213
- "presentation",
214
- "research"
215
- ],
216
- "required": [
217
- "rowHeads:array",
218
- "colHeads:array",
219
- "cells:array"
220
- ],
221
- "optional": [
222
- "unit",
223
- "scaleLabel:array",
224
- "note"
225
- ]
226
- },
227
- "bullet": {
228
- "label": "达成对比页(实际 vs 目标条)",
229
- "modes": [
230
- "presentation",
231
- "research"
232
- ],
233
- "required": [
234
- "items:array"
235
- ],
236
- "optional": [
237
- "unit",
238
- "max",
239
- "note"
240
- ]
241
- },
242
- "pyramid": {
243
- "label": "金字塔页(层级递进,顶层最窄)",
244
- "modes": [
245
- "presentation",
246
- "research",
247
- "architecture"
248
- ],
249
- "required": [
250
- "levels:array"
251
- ],
252
- "optional": [
253
- "note"
254
- ]
255
- },
256
- "image": {
257
- "label": "素材图片页(full/half/bleed/grid/compare/wall,效果与位置锁定;支持配图占位)",
258
- "modes": [
259
- "presentation",
260
- "research",
261
- "architecture"
262
- ],
263
- "required": [
264
- "anyof:image.src:str|image.items:array|image.placeholder"
265
- ],
266
- "optional": [
267
- "image.caption",
268
- "image.alt",
269
- "image.layout",
270
- "image.fit",
271
- "image.ratio",
272
- "image.hint",
273
- "points:array",
274
- "note"
275
- ]
276
- },
277
- "cards": {
278
- "label": "卡片网格页(cards 元素须为 {title, points:[[k,v]…]},不接受元组)",
279
- "modes": [
280
- "presentation",
281
- "research"
282
- ],
283
- "required": [
284
- "cards:array"
285
- ],
286
- "optional": [
287
- "columns"
288
- ]
289
- },
290
- "split": {
291
- "label": "双区组合页(left / right 各可为 要点|图表|表格|图片:type = points(默认)| table | image | 图表类型名;图表/表格字段直接挂在对应侧)",
292
- "modes": [
293
- "presentation",
294
- "research"
295
- ],
296
- "required": [
297
- "anyof:left.points:array|left.type:str"
298
- ],
299
- "optional": [
300
- "left.cap",
301
- "left.image",
302
- "left.labels:array",
303
- "left.values:array",
304
- "left.series:array",
305
- "left.points:array",
306
- "left.max",
307
- "left.unit",
308
- "left.colors:array",
309
- "left.dataTable",
310
- "left.head:array",
311
- "left.rows:array",
312
- "left.colW:array",
313
- "right.type",
314
- "right.cap",
315
- "right.image",
316
- "right.labels:array",
317
- "right.values:array",
318
- "right.series:array",
319
- "right.points:array",
320
- "right.max",
321
- "right.unit",
322
- "right.colors:array",
323
- "right.dataTable",
324
- "right.head:array",
325
- "right.rows:array",
326
- "right.colW:array"
327
- ]
328
- },
329
- "comparison": {
330
- "label": "对比页(左右双栏 + 可选结论条)",
331
- "modes": [
332
- "presentation",
333
- "research"
334
- ],
335
- "required": [
336
- "left.title",
337
- "left.points:array",
338
- "right.title",
339
- "right.points:array"
340
- ],
341
- "optional": [
342
- "verdict"
343
- ]
344
- },
345
- "quote": {
346
- "label": "引用 / 金句页(深色全幅)",
347
- "modes": [
348
- "presentation",
349
- "research"
350
- ],
351
- "required": [
352
- "quote",
353
- "author"
354
- ],
355
- "optional": [
356
- "context"
357
- ]
358
- },
359
- "diagram": {
360
- "label": "分层架构页(architecture 模式走全幅几何)",
361
- "modes": [
362
- "presentation",
363
- "research",
364
- "architecture"
365
- ],
366
- "required": [
367
- "layers:array"
368
- ],
369
- "optional": [
370
- "legend:array"
371
- ]
372
- },
373
- "exhibit": {
374
- "label": "Exhibit 编号图表页(research R2)",
375
- "modes": [
376
- "research"
377
- ],
378
- "required": [
379
- "chart.labels:array",
380
- "chart.values:array"
381
- ],
382
- "optional": [
383
- "exhibitNo",
384
- "chart.type",
385
- "chart.series:array",
386
- "chart.points:array",
387
- "chart.max",
388
- "chart.unit",
389
- "chart.colors:array",
390
- "chart.dataTable",
391
- "note"
392
- ]
393
- },
394
- "twocol": {
395
- "label": "双栏论证页(research R1)",
396
- "modes": [
397
- "research"
398
- ],
399
- "required": [
400
- "paragraphs:array"
401
- ]
402
- },
403
- "threecol": {
404
- "label": "三栏证据页(research R6)",
405
- "modes": [
406
- "research"
407
- ],
408
- "required": [
409
- "paragraphs:array"
410
- ]
411
- },
412
- "halftable": {
413
- "label": "半表半图页(research R7)",
414
- "modes": [
415
- "research"
416
- ],
417
- "required": [
418
- "table.head:array",
419
- "table.rows:array",
420
- "chart.labels:array",
421
- "chart.values:array"
422
- ],
423
- "optional": [
424
- "table.colW:array",
425
- "chart.type",
426
- "chart.series:array",
427
- "chart.points:array",
428
- "chart.max",
429
- "chart.unit",
430
- "chart.colors:array",
431
- "chart.dataTable",
432
- "note"
433
- ]
434
- },
435
- "matrix": {
436
- "label": "矩阵图页(research R8)",
437
- "modes": [
438
- "research"
439
- ],
440
- "required": [
441
- "rowHeads:array",
442
- "colHeads:array",
443
- "cells:array"
444
- ]
445
- },
446
- "lane": {
447
- "label": "泳道页(architecture A2)",
448
- "modes": [
449
- "architecture"
450
- ],
451
- "required": [
452
- "lanes:array"
453
- ]
454
- },
455
- "sankey": {
456
- "label": "桑基图页(节点-流带,流向与流量)",
457
- "modes": [
458
- "research",
459
- "architecture"
460
- ],
461
- "required": [
462
- "flows:array"
463
- ],
464
- "optional": [
465
- "unit",
466
- "chart.dataTable",
467
- "note"
468
- ]
469
- },
470
- "treemap": {
471
- "label": "树图页(面积编码的层级构成)",
472
- "modes": [
473
- "research",
474
- "architecture"
475
- ],
476
- "required": [
477
- "items:array"
478
- ],
479
- "optional": [
480
- "unit",
481
- "chart.dataTable",
482
- "note"
483
- ]
484
- },
485
- "boxplot": {
486
- "label": "箱线图页(分布对比:min/q1/median/q3/max)",
487
- "modes": [
488
- "research",
489
- "architecture"
490
- ],
491
- "required": [
492
- "groups:array"
493
- ],
494
- "optional": [
495
- "unit",
496
- "chart.dataTable",
497
- "note"
498
- ]
499
- },
500
- "network": {
501
- "label": "关系网络页(节点-边拓扑)",
502
- "modes": [
503
- "research",
504
- "architecture"
505
- ],
506
- "required": [
507
- "nodes:array",
508
- "edges:array"
509
- ],
510
- "optional": [
511
- "chart.dataTable",
512
- "note"
513
- ]
514
- },
515
- "marimekko": {
516
- "label": "马赛克图页(列宽 × 列高双重编码)",
517
- "modes": [
518
- "research",
519
- "architecture"
520
- ],
521
- "required": [
522
- "cols:array",
523
- "cells:array"
524
- ],
525
- "optional": [
526
- "unit",
527
- "chart.dataTable",
528
- "note"
529
- ]
530
- },
531
- "streamgraph": {
532
- "label": "流带图页(时间上的构成演变)",
533
- "modes": [
534
- "research",
535
- "architecture"
536
- ],
537
- "required": [
538
- "series:array"
539
- ],
540
- "optional": [
541
- "labels:array",
542
- "chart.dataTable",
543
- "note"
544
- ]
545
- }
546
- }
547
- }
1
+ {
2
+ "$comment": "TopPPT HTML · REPORT_MODEL DSL schema 单源。双端同源:scripts/sync_runtime.py 把本文件注入 assets/pptx-export.js 的 __TOPPPT_SCHEMA__ 标记块(浏览器端 validateModel);scripts/extract_model.py 直接读本文件做本地校验。禁止在两端手写副本。字段路径约定:'a.b:c' 中 ':array' 要求非空数组,':str' 要求非空字符串,无后缀仅做真值检查;'anyof:a|b:c' 表示「任一满足即通过」(用于素材图片页:src / items / placeholder 三选一)。pageTypes[].modes = 该页型允许的模式(越界仅告警,不阻断)。commonSectionFields 为任意页型可选的通用字段(flags = 待核实标注清单,image = 素材图片/配图占位)。chartTypes = 图表类型白名单(起含原生与形状两条通道,通道归属见 scripts/layout-constants.json 的 charts.registry)。图片规格与占位约定见同文件 imageSpec。",
3
+ "version": "9.1",
4
+ "modes": [
5
+ "presentation",
6
+ "research",
7
+ "architecture"
8
+ ],
9
+ "model": {
10
+ "required": [
11
+ "title",
12
+ "sections:array",
13
+ "closing.title",
14
+ "closing.points:array"
15
+ ],
16
+ "optional": [
17
+ "mode",
18
+ "style",
19
+ "theme",
20
+ "subtitle",
21
+ "meta",
22
+ "agenda:array"
23
+ ],
24
+ "agendaMin": {
25
+ "presentation": 3,
26
+ "research": 3,
27
+ "architecture": 0
28
+ },
29
+ "sectionsMin": 1,
30
+ "sectionsRecommended": 3,
31
+ "agendaComfortMax": 16
32
+ },
33
+ "commonSectionFields": [
34
+ "eyebrow",
35
+ "title",
36
+ "lead",
37
+ "soWhat",
38
+ "footnote",
39
+ "flags",
40
+ "image",
41
+ "exhibitNo",
42
+ "layoutPreset"
43
+ ],
44
+ "flagsHint": "flags = 待核实/待二次修改条目字符串数组(如 '2027 增速 xx%(口径未定)');渲染为 accent 强调色标注行,提示用户核对。",
45
+ "imageHint": "image = 素材图片/配图占位对象。三选一必填:src(用户图,data: 内联或相对路径,零外链铁律禁 http(s))|items(多图版式:grid/compare/wall,元素 {src?, alt?, caption?, placeholder?})|placeholder:true(无图时出配图占位,原生形状渲染、pictures 不增)。其余可选:layout(full/half/bleed/grid/compare/wall,见 layout-constants.json imageSpec.layouts)、fit(cover 默认 / contain)、caption、alt、hint、ratio。",
46
+ "imageLayoutHint": "layout 与 HTML 版式对应:full=版心全宽图|half=左图右注(points 为右栏注解)|bleed=通栏出血|grid=多图网格(items 2/3/4/6 张)|compare=双图 A/B 对比(items 2 张)|wall=Logo 墙(items 3–12 张小图)。占位符标签文本由双引擎按 imageSpec 拼同一串,保证 A/B 通道逐页文本一致。",
47
+ "chartTypes": [
48
+ "bar",
49
+ "hbar",
50
+ "stack",
51
+ "stackline",
52
+ "line",
53
+ "dualline",
54
+ "area",
55
+ "donut",
56
+ "multidonut",
57
+ "pie",
58
+ "radar",
59
+ "scatter",
60
+ "bubble",
61
+ "waterfall",
62
+ "gauge",
63
+ "pareto",
64
+ "funnel",
65
+ "gantt",
66
+ "vsbar",
67
+ "progress",
68
+ "sparkline",
69
+ "slope",
70
+ "dumbbell",
71
+ "lollipop",
72
+ "dotplot",
73
+ "bulletchart",
74
+ "waffle",
75
+ "radialbar",
76
+ "rose",
77
+ "candlestick"
78
+ ],
79
+ "chartTypesHint": "chart.type 可取值 = 本表(30 类:16 原生 + 14 形状还原)。其余 6 类复杂信息图(sankey/treemap/boxplot/network/marimekko/streamgraph)是**专属页型**而非 chart.type——它们要按列/段/节点等结构化载荷表达,故走 sections[].type。不变量:charts.registry.types == chartTypes ∪ 上述 6 类页型(sync_runtime.py 校验)。",
80
+ "chartDataTable": {
81
+ "$comment": "数据表策略:图表页的数据可追溯开关。notes = 数据写入演讲者备注(默认,零版面占用);inline = 页内附原生小字号表格;appendix = 自动生成附录数据页(原生表格);off = 不附(仅 sparkline 这类纯装饰微图允许)。pptx=shape 的非原生图表至少 notes。",
82
+ "enum": [
83
+ "notes",
84
+ "inline",
85
+ "appendix",
86
+ "off"
87
+ ],
88
+ "default": "notes",
89
+ "rule": "非原生图表(registry.pptx=shape)的 dataTable 不得为 off;缺失时按 registry 默认值补齐。"
90
+ },
91
+ "pageTypes": {
92
+ "points": {
93
+ "label": "要点列表页",
94
+ "modes": [
95
+ "presentation",
96
+ "research",
97
+ "architecture"
98
+ ],
99
+ "required": [
100
+ "points:array"
101
+ ],
102
+ "optional": [
103
+ "metrics:array"
104
+ ]
105
+ },
106
+ "metrics": {
107
+ "label": "指标带页(4–6 个核心数字)",
108
+ "modes": [
109
+ "presentation",
110
+ "research"
111
+ ],
112
+ "required": [
113
+ "metrics:array"
114
+ ]
115
+ },
116
+ "kpi": {
117
+ "label": "大数指标页(hero 大数字 + 支撑指标行)",
118
+ "modes": [
119
+ "presentation",
120
+ "research"
121
+ ],
122
+ "required": [
123
+ "hero:array"
124
+ ],
125
+ "optional": [
126
+ "metrics:array"
127
+ ]
128
+ },
129
+ "table": {
130
+ "label": "对比表页",
131
+ "modes": [
132
+ "presentation",
133
+ "research",
134
+ "architecture"
135
+ ],
136
+ "required": [
137
+ "table.head:array",
138
+ "table.rows:array"
139
+ ],
140
+ "optional": [
141
+ "table.colW:array"
142
+ ]
143
+ },
144
+ "timeline": {
145
+ "label": "时间线 / 路线页",
146
+ "modes": [
147
+ "presentation",
148
+ "research"
149
+ ],
150
+ "required": [
151
+ "phases:array"
152
+ ]
153
+ },
154
+ "steps": {
155
+ "label": "步骤条页(N 步横排 + 箭头,可分组)",
156
+ "modes": [
157
+ "presentation",
158
+ "research",
159
+ "architecture"
160
+ ],
161
+ "required": [
162
+ "steps:array"
163
+ ],
164
+ "optional": [
165
+ "groups:array",
166
+ "note"
167
+ ]
168
+ },
169
+ "bar": {
170
+ "label": "图表页(chart.type 见 chartTypes;native 通道走原生数据图表,shape 通道走高保真形状还原 + 数据表)",
171
+ "modes": [
172
+ "presentation",
173
+ "research"
174
+ ],
175
+ "required": [
176
+ "chart.labels:array",
177
+ "chart.values:array"
178
+ ],
179
+ "optional": [
180
+ "chart.type",
181
+ "chart.series:array",
182
+ "chart.points:array",
183
+ "chart.max",
184
+ "chart.unit",
185
+ "chart.colors:array",
186
+ "chart.start:array",
187
+ "chart.target:array",
188
+ "chart.dataTable",
189
+ "note"
190
+ ]
191
+ },
192
+ "donut": {
193
+ "label": "环形图页(原生 pie 楔形 + 图例)",
194
+ "modes": [
195
+ "presentation",
196
+ "research"
197
+ ],
198
+ "required": [
199
+ "chart.labels:array",
200
+ "chart.values:array"
201
+ ],
202
+ "optional": [
203
+ "chart.unit",
204
+ "chart.centerLabel",
205
+ "chart.colors:array",
206
+ "chart.dataTable",
207
+ "note"
208
+ ]
209
+ },
210
+ "heatmap": {
211
+ "label": "热力矩阵页(行 × 列 + 强度色阶)",
212
+ "modes": [
213
+ "presentation",
214
+ "research"
215
+ ],
216
+ "required": [
217
+ "rowHeads:array",
218
+ "colHeads:array",
219
+ "cells:array"
220
+ ],
221
+ "optional": [
222
+ "unit",
223
+ "scaleLabel:array",
224
+ "note"
225
+ ]
226
+ },
227
+ "bullet": {
228
+ "label": "达成对比页(实际 vs 目标条)",
229
+ "modes": [
230
+ "presentation",
231
+ "research"
232
+ ],
233
+ "required": [
234
+ "items:array"
235
+ ],
236
+ "optional": [
237
+ "unit",
238
+ "max",
239
+ "note"
240
+ ]
241
+ },
242
+ "pyramid": {
243
+ "label": "金字塔页(层级递进,顶层最窄)",
244
+ "modes": [
245
+ "presentation",
246
+ "research",
247
+ "architecture"
248
+ ],
249
+ "required": [
250
+ "levels:array"
251
+ ],
252
+ "optional": [
253
+ "note"
254
+ ]
255
+ },
256
+ "image": {
257
+ "label": "素材图片页(full/half/bleed/grid/compare/wall,效果与位置锁定;支持配图占位)",
258
+ "modes": [
259
+ "presentation",
260
+ "research",
261
+ "architecture"
262
+ ],
263
+ "required": [
264
+ "anyof:image.src:str|image.items:array|image.placeholder"
265
+ ],
266
+ "optional": [
267
+ "image.caption",
268
+ "image.alt",
269
+ "image.layout",
270
+ "image.fit",
271
+ "image.ratio",
272
+ "image.hint",
273
+ "points:array",
274
+ "note"
275
+ ]
276
+ },
277
+ "cards": {
278
+ "label": "卡片网格页(cards 元素须为 {title, points:[[k,v]…]},不接受元组)",
279
+ "modes": [
280
+ "presentation",
281
+ "research"
282
+ ],
283
+ "required": [
284
+ "cards:array"
285
+ ],
286
+ "optional": [
287
+ "columns"
288
+ ]
289
+ },
290
+ "split": {
291
+ "label": "双区组合页(left / right 各可为 要点|图表|表格|图片:type = points(默认)| table | image | 图表类型名;图表/表格字段直接挂在对应侧)",
292
+ "modes": [
293
+ "presentation",
294
+ "research"
295
+ ],
296
+ "required": [
297
+ "anyof:left.points:array|left.type:str"
298
+ ],
299
+ "optional": [
300
+ "left.cap",
301
+ "left.image",
302
+ "left.labels:array",
303
+ "left.values:array",
304
+ "left.series:array",
305
+ "left.points:array",
306
+ "left.max",
307
+ "left.unit",
308
+ "left.colors:array",
309
+ "left.dataTable",
310
+ "left.head:array",
311
+ "left.rows:array",
312
+ "left.colW:array",
313
+ "right.type",
314
+ "right.cap",
315
+ "right.image",
316
+ "right.labels:array",
317
+ "right.values:array",
318
+ "right.series:array",
319
+ "right.points:array",
320
+ "right.max",
321
+ "right.unit",
322
+ "right.colors:array",
323
+ "right.dataTable",
324
+ "right.head:array",
325
+ "right.rows:array",
326
+ "right.colW:array"
327
+ ]
328
+ },
329
+ "comparison": {
330
+ "label": "对比页(左右双栏 + 可选结论条)",
331
+ "modes": [
332
+ "presentation",
333
+ "research"
334
+ ],
335
+ "required": [
336
+ "left.title",
337
+ "left.points:array",
338
+ "right.title",
339
+ "right.points:array"
340
+ ],
341
+ "optional": [
342
+ "verdict"
343
+ ]
344
+ },
345
+ "quote": {
346
+ "label": "引用 / 金句页(深色全幅)",
347
+ "modes": [
348
+ "presentation",
349
+ "research"
350
+ ],
351
+ "required": [
352
+ "quote",
353
+ "author"
354
+ ],
355
+ "optional": [
356
+ "context"
357
+ ]
358
+ },
359
+ "diagram": {
360
+ "label": "分层架构页(architecture 模式走全幅几何)",
361
+ "modes": [
362
+ "presentation",
363
+ "research",
364
+ "architecture"
365
+ ],
366
+ "required": [
367
+ "layers:array"
368
+ ],
369
+ "optional": [
370
+ "legend:array"
371
+ ]
372
+ },
373
+ "exhibit": {
374
+ "label": "Exhibit 编号图表页(research R2)",
375
+ "modes": [
376
+ "research"
377
+ ],
378
+ "required": [
379
+ "chart.labels:array",
380
+ "chart.values:array"
381
+ ],
382
+ "optional": [
383
+ "exhibitNo",
384
+ "chart.type",
385
+ "chart.series:array",
386
+ "chart.points:array",
387
+ "chart.max",
388
+ "chart.unit",
389
+ "chart.colors:array",
390
+ "chart.dataTable",
391
+ "note"
392
+ ]
393
+ },
394
+ "twocol": {
395
+ "label": "双栏论证页(research R1)",
396
+ "modes": [
397
+ "research"
398
+ ],
399
+ "required": [
400
+ "paragraphs:array"
401
+ ]
402
+ },
403
+ "threecol": {
404
+ "label": "三栏证据页(research R6)",
405
+ "modes": [
406
+ "research"
407
+ ],
408
+ "required": [
409
+ "paragraphs:array"
410
+ ]
411
+ },
412
+ "halftable": {
413
+ "label": "半表半图页(research R7)",
414
+ "modes": [
415
+ "research"
416
+ ],
417
+ "required": [
418
+ "table.head:array",
419
+ "table.rows:array",
420
+ "chart.labels:array",
421
+ "chart.values:array"
422
+ ],
423
+ "optional": [
424
+ "table.colW:array",
425
+ "chart.type",
426
+ "chart.series:array",
427
+ "chart.points:array",
428
+ "chart.max",
429
+ "chart.unit",
430
+ "chart.colors:array",
431
+ "chart.dataTable",
432
+ "note"
433
+ ]
434
+ },
435
+ "matrix": {
436
+ "label": "矩阵图页(research R8)",
437
+ "modes": [
438
+ "research"
439
+ ],
440
+ "required": [
441
+ "rowHeads:array",
442
+ "colHeads:array",
443
+ "cells:array"
444
+ ]
445
+ },
446
+ "lane": {
447
+ "label": "泳道页(architecture A2)",
448
+ "modes": [
449
+ "architecture"
450
+ ],
451
+ "required": [
452
+ "lanes:array"
453
+ ]
454
+ },
455
+ "sankey": {
456
+ "label": "桑基图页(节点-流带,流向与流量)",
457
+ "modes": [
458
+ "research",
459
+ "architecture"
460
+ ],
461
+ "required": [
462
+ "flows:array"
463
+ ],
464
+ "optional": [
465
+ "unit",
466
+ "chart.dataTable",
467
+ "note"
468
+ ]
469
+ },
470
+ "treemap": {
471
+ "label": "树图页(面积编码的层级构成)",
472
+ "modes": [
473
+ "research",
474
+ "architecture"
475
+ ],
476
+ "required": [
477
+ "items:array"
478
+ ],
479
+ "optional": [
480
+ "unit",
481
+ "chart.dataTable",
482
+ "note"
483
+ ]
484
+ },
485
+ "boxplot": {
486
+ "label": "箱线图页(分布对比:min/q1/median/q3/max)",
487
+ "modes": [
488
+ "research",
489
+ "architecture"
490
+ ],
491
+ "required": [
492
+ "groups:array"
493
+ ],
494
+ "optional": [
495
+ "unit",
496
+ "chart.dataTable",
497
+ "note"
498
+ ]
499
+ },
500
+ "network": {
501
+ "label": "关系网络页(节点-边拓扑)",
502
+ "modes": [
503
+ "research",
504
+ "architecture"
505
+ ],
506
+ "required": [
507
+ "nodes:array",
508
+ "edges:array"
509
+ ],
510
+ "optional": [
511
+ "chart.dataTable",
512
+ "note"
513
+ ]
514
+ },
515
+ "marimekko": {
516
+ "label": "马赛克图页(列宽 × 列高双重编码)",
517
+ "modes": [
518
+ "research",
519
+ "architecture"
520
+ ],
521
+ "required": [
522
+ "cols:array",
523
+ "cells:array"
524
+ ],
525
+ "optional": [
526
+ "unit",
527
+ "chart.dataTable",
528
+ "note"
529
+ ]
530
+ },
531
+ "streamgraph": {
532
+ "label": "流带图页(时间上的构成演变)",
533
+ "modes": [
534
+ "research",
535
+ "architecture"
536
+ ],
537
+ "required": [
538
+ "series:array"
539
+ ],
540
+ "optional": [
541
+ "labels:array",
542
+ "chart.dataTable",
543
+ "note"
544
+ ]
545
+ }
546
+ }
547
+ }