@topmindspace/tms-skills 2.0.1 → 2.0.2

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 (98) hide show
  1. package/CHANGELOG.md +139 -134
  2. package/bin/tms-skills.js +160 -160
  3. package/package.json +48 -48
  4. package/top-ppt-html/README.md +254 -254
  5. package/top-ppt-html/SKILL.md +111 -111
  6. package/top-ppt-html/assets/examples/2026-09-09-architecture-graphite-dark.html +3873 -3926
  7. package/top-ppt-html/assets/examples/2026-09-09-architecture-graphite-dark.model.json +167 -167
  8. package/top-ppt-html/assets/examples/2026-09-09-architecture-spectrum.html +3873 -3926
  9. package/top-ppt-html/assets/examples/2026-09-09-architecture-spectrum.model.json +167 -167
  10. package/top-ppt-html/assets/examples/2026-09-09-presentation-apple-mono.html +4272 -4325
  11. package/top-ppt-html/assets/examples/2026-09-09-presentation-apple-mono.model.json +320 -320
  12. package/top-ppt-html/assets/examples/2026-09-09-presentation-brand-red.html +4272 -4325
  13. package/top-ppt-html/assets/examples/2026-09-09-presentation-brand-red.model.json +320 -320
  14. package/top-ppt-html/assets/examples/2026-09-09-presentation-business-blue.html +4272 -4325
  15. package/top-ppt-html/assets/examples/2026-09-09-presentation-business-blue.model.json +320 -320
  16. package/top-ppt-html/assets/examples/2026-09-09-research-deep-teal.html +5474 -5527
  17. package/top-ppt-html/assets/examples/2026-09-09-research-deep-teal.model.json +913 -913
  18. package/top-ppt-html/assets/examples/2026-09-09-research-indigo-violet.html +5474 -5527
  19. package/top-ppt-html/assets/examples/2026-09-09-research-indigo-violet.model.json +913 -913
  20. package/top-ppt-html/assets/examples/2026-09-09-research-mckinsey.html +5474 -5527
  21. package/top-ppt-html/assets/examples/2026-09-09-research-mckinsey.model.json +913 -913
  22. package/top-ppt-html/assets/examples/2026-09-09-research-warm-sand.html +5474 -5527
  23. package/top-ppt-html/assets/examples/2026-09-09-research-warm-sand.model.json +913 -913
  24. package/top-ppt-html/assets/pptx-export.js +1944 -1944
  25. package/top-ppt-html/assets/style-gallery.html +559 -589
  26. package/top-ppt-html/assets/templates/architecture.html +3675 -3728
  27. package/top-ppt-html/assets/templates/engine.css +787 -840
  28. package/top-ppt-html/assets/templates/presentation.html +3685 -3738
  29. package/top-ppt-html/assets/templates/research.html +3964 -4017
  30. package/top-ppt-html/assets/templates/ui.js +520 -520
  31. package/top-ppt-html/assets/theme-overview-architecture.png +0 -0
  32. package/top-ppt-html/assets/theme-overview-presentation.png +0 -0
  33. package/top-ppt-html/assets/theme-overview-research.png +0 -0
  34. package/top-ppt-html/assets/theme-overview.png +0 -0
  35. package/top-ppt-html/evals/prompts.csv +15 -15
  36. package/top-ppt-html/evals/rubric.schema.json +25 -25
  37. package/top-ppt-html/evals/run_evals.py +220 -220
  38. package/top-ppt-html/evals/trace.example.json +16 -16
  39. package/top-ppt-html/package-lock.json +175 -0
  40. package/top-ppt-html/package.json +30 -35
  41. package/top-ppt-html/references/charts-basic.md +624 -624
  42. package/top-ppt-html/references/charts-discipline.md +108 -108
  43. package/top-ppt-html/references/charts-extended.md +482 -482
  44. package/top-ppt-html/references/charts.md +28 -28
  45. package/top-ppt-html/references/components-atoms.md +624 -624
  46. package/top-ppt-html/references/components.md +30 -30
  47. package/top-ppt-html/references/content-rules.md +490 -490
  48. package/top-ppt-html/references/design-system-engine.md +235 -235
  49. package/top-ppt-html/references/design-system.md +471 -478
  50. package/top-ppt-html/references/failure-modes.md +214 -214
  51. package/top-ppt-html/references/high-fidelity.md +127 -127
  52. package/top-ppt-html/references/icons.md +397 -397
  53. package/top-ppt-html/references/industry-benchmark.md +105 -105
  54. package/top-ppt-html/references/infographics-stats.md +308 -308
  55. package/top-ppt-html/references/infographics-structure.md +226 -226
  56. package/top-ppt-html/references/infographics.md +43 -43
  57. package/top-ppt-html/references/layout-grammar.md +315 -315
  58. package/top-ppt-html/references/layouts-architecture.md +108 -108
  59. package/top-ppt-html/references/layouts-combo.md +600 -600
  60. package/top-ppt-html/references/layouts-research.md +160 -160
  61. package/top-ppt-html/references/modes.md +254 -254
  62. package/top-ppt-html/references/outline-design.md +275 -275
  63. package/top-ppt-html/references/playbook.md +266 -266
  64. package/top-ppt-html/references/pptx-export.md +209 -209
  65. package/top-ppt-html/references/reform-plan.md +252 -252
  66. package/top-ppt-html/references/styles.md +336 -370
  67. package/top-ppt-html/references/tech-design.md +138 -138
  68. package/top-ppt-html/scripts/audit_css.py +109 -109
  69. package/top-ppt-html/scripts/audit_docs.py +176 -176
  70. package/top-ppt-html/scripts/audit_skill.py +220 -220
  71. package/top-ppt-html/scripts/audit_styles.py +293 -351
  72. package/top-ppt-html/scripts/build_examples.py +2276 -2276
  73. package/top-ppt-html/scripts/build_pptx.js +2380 -2380
  74. package/top-ppt-html/scripts/capture_theme_overview.js +78 -78
  75. package/top-ppt-html/scripts/checks_html.py +127 -127
  76. package/top-ppt-html/scripts/cross_verify.py +294 -294
  77. package/top-ppt-html/scripts/env_probe.py +158 -158
  78. package/top-ppt-html/scripts/extract_model.py +210 -210
  79. package/top-ppt-html/scripts/extract_snippet.py +374 -374
  80. package/top-ppt-html/scripts/gen_channel_a.js +214 -214
  81. package/top-ppt-html/scripts/layout-constants.json +3309 -3377
  82. package/top-ppt-html/scripts/layout_slots.json +830 -830
  83. package/top-ppt-html/scripts/lib_layout_regions.js +412 -412
  84. package/top-ppt-html/scripts/measure_height.py +178 -178
  85. package/top-ppt-html/scripts/model-schema.json +547 -547
  86. package/top-ppt-html/scripts/negative_tests.py +307 -307
  87. package/top-ppt-html/scripts/package_skill.py +291 -291
  88. package/top-ppt-html/scripts/prepare_images.py +341 -341
  89. package/top-ppt-html/scripts/probe_image_export.py +188 -188
  90. package/top-ppt-html/scripts/quality_gate.py +301 -301
  91. package/top-ppt-html/scripts/regression.py +307 -308
  92. package/top-ppt-html/scripts/render_compare.py +275 -275
  93. package/top-ppt-html/scripts/render_from_model.py +698 -698
  94. package/top-ppt-html/scripts/scaffold_report.py +1054 -1054
  95. package/top-ppt-html/scripts/section-file-map.json +104 -104
  96. package/top-ppt-html/scripts/sync_runtime.py +662 -662
  97. package/top-ppt-html/scripts/validate_pptx.py +1510 -1510
  98. package/top-ppt-html/scripts/validate_report.py +1456 -1456
package/CHANGELOG.md CHANGED
@@ -1,134 +1,139 @@
1
- # Changelog
2
-
3
- 所有 monorepo 变更记录见本文件。
4
-
5
- ## 2.0.1 — 2026-09-24(文档 + 发布链路)
6
-
7
- ### Changed
8
- - 文档全面对齐「双通道分发」:npm [`@topmindspace/tms-skills`](https://www.npmjs.com/package/@topmindspace/tms-skills) 已公开发布(`2.0.0` 起),GitHub 直装仍可用。
9
- - 明确 **GitHub ≠ npm 自动同步**:push 不更新 npm;**tag `v*` → `release.yml` 自动 npm publish**。
10
- - `release.yml` 启用 npm 发布步骤(Secret `NPM_TOKEN`);`docs/PUBLISHING.md` 补版本策略、打包矩阵 npm 列、排错表。
11
-
12
- ## 2.0.0 — 2026-09-24(技能 9.1.0 · 仓库/技能更名 + 层级扁平化)
13
-
14
- ### Published
15
- - 首次发布公共 npm:[`@topmindspace/tms-skills@2.0.0`](https://www.npmjs.com/package/@topmindspace/tms-skills)
16
- - 安装:`npx @topmindspace/tms-skills install top-ppt-html`
17
-
18
- ### Changed
19
- - **仓库更名**:GitHub `topmindspace/topskills` → **`topmindspace/tms-skills`**(旧 URL 301);本地根目录、`git remote`、npm 包名 `@topmindspace/tms-skills`、CLI `tms-skills` / `bin/tms-skills.js` 全部对齐。
20
- - **技能更名**:`top-slides-expert` / TopSlides Expert → **`top-ppt-html` / TopPPT HTML**(目录、frontmatter `name`、分发包、文档一致)。
21
- - **注入标记**:`__TOPSLIDES_*__` → `__TOPPPT_*__`;**环境变量**:`TOP_SLIDES_*` → `TOP_PPT_*`;**JS API**:`TopSlidesPptx` → `TopPptHtml`。
22
- - **层级扁平化**:移除冗余的 `skills/` 中间层,技能目录直接放在仓库根(`top-ppt-html/`);安装器改为扫描根目录下含 `SKILL.md` 的技能目录。
23
- - 版本:技能 `9.0.1` → **`9.1.0`**(`layout-constants.json` `version: 9.1`);monorepo `1.1.1` → **`2.0.0`**(包名/CLI/结构破坏性变更)。
24
-
25
- ### Migration
26
- | Old | New |
27
- |-----|-----|
28
- | repo `topmindspace/topskills` | `topmindspace/tms-skills` |
29
- | npm `@topmindspace/topskills` | `@topmindspace/tms-skills` |
30
- | CLI `topskills` / `bin/topskills.js` | `tms-skills` / `bin/tms-skills.js` |
31
- | skill id / dir `top-slides-expert` | `top-ppt-html` |
32
- | brand `TopSlides Expert` | `TopPPT HTML` |
33
- | `skills/<id>/` | `<id>/`(仓库根) |
34
- | `__TOPSLIDES_*__` markers | `__TOPPPT_*__` |
35
- | `TOP_SLIDES_*` env | `TOP_PPT_*` |
36
- | `TopSlidesPptx` | `TopPptHtml` |
37
-
38
- 无静默别名;旧标识见 `docs/PUBLISHING.md` 废弃清单,仅 CHANGELOG / 迁移说明可提及。
39
-
40
- ## 1.1.1 — 2026-09-23(技能 9.0.1 · PPTX 往返与双形态修复)
41
-
42
- ### Fixed
43
- - **PPTX 双形态载荷静默丢字**:`build_pptx.js` / `pptx-export.js` 用 `typeof x === 'object'` 区分 `[[t,d]…]` 与 `[{t,d,accent}…]`,但 `typeof [] === 'object'`,数组形态 steps/levels/lane/nodes 的标题与描述被读成 `undefined` 后落空(第 8 章 steps 仅 4/7 关键串)。改为 `isRec()`(非数组对象)判定,双引擎同步。
44
- - **PPTX 模型往返误报(挡交付)**:`validate_pptx.validate_model_roundtrip` 关键串比对语料原先只取幻灯片形状文本,把原生图表 `chart.labels`(落在 chart part)和 notes-only 字段(`lead` / `image.hint` 等)误判为 `MODEL_ROUNDTRIP_CONTENT_MISSING`;v9 将 `roundtripMin` 提到 0.80 后 9 个随包示例全部 FAIL。现语料改为 **形状文本 ∪ 演讲者备注 ∪ 关联 chart part 文本**(`_roundtrip_corpus` + `slide_chart_text`),`slide_notes` 真正参与内容比对;探针跳过 `hint`/`src`/`alt` 等元数据键。
45
- - 示例矩阵顶层金字塔描述过长触发 `CONTAINER_OVERFLOW`:顶层槽位收窄后改为「自动执行」;9 示例 `validate_pptx --strict --model` 全 0/0。
46
-
47
- ### Changed
48
- - 随包示例按 v9.0 模板重建(内嵌 MODEL_SCHEMA 8.3 → 9.0);4 张 `theme-overview*.png` 主题参考图刷新。
49
- - 版本:技能 `9.0.0` → **`9.0.1`**(`package.json` npm 语义化);monorepo `1.1.0` → **`1.1.1`**。版本单源仍为 `layout-constants.json` `version: 9.0`。
50
-
51
- ### Verified
52
- - 全链路回归通过:HTML strict + B 通道精导 strict 0/0 + A 通道 strict 0/0 + 双区组合页探针 + 深色主题探针 + `negative_tests` + 任务路由遍历 + python-pptx 双裁判。
53
- - 审计全绿:`audit_styles` / `audit_docs` / `audit_skill` / `audit_css`;`package_skill.py --check` 通过。
54
-
55
- ## 1.1.0 — 2026-09-23(安装口径 + 隐私门禁)
56
-
57
- ### Changed
58
- - **安装口径改为 GitHub 优先**:根 README / 技能 README / `bin/topskills.js` / `docs/PUBLISHING.md` 统一以 `npx github:topmindspace/topskills ...` 为默认;npm 包名降为「已 publish 后的可选通道」。补充「找不到这个包」排错说明。
59
- - `package.json` description 与新增 `npm run privacy` 脚本对齐上述口径。
60
-
61
- ### Fixed
62
- - **隐私扫描器自身泄漏**:`ci_privacy_scan.py` 不再硬编码本机用户名;改为通用 home 用户名段检测 + 可选本地词表 `scripts/.privacy-deny.local`(gitignore)。
63
- - **扫描器自扫失明**:旧版词表写在 raw string 里导致字面量扫不到自己;新版附合成样本自检,并拒绝在扫描器源码中出现用户名形态 token。
64
- - **CI 日志二次泄漏**:扫描命中项一律脱敏输出(`xx***y(len=n)`),不回显密钥/路径原文。
65
- - 删除本地临时脚本 `scripts/_find_dup.py`(`scripts/_*` 约定为用后即删)。
66
-
67
- ### Added
68
- - 隐私扫描扩展:GitHub/npm token、AWS key、Bearer、密钥赋值形态;`git ls-files` 禁止跟踪路径门禁(临时脚本 / `.env` / 密钥 / 缓存 / 智能体本地状态)。
69
- - `docs/PUBLISHING.md` 增加安装口径表、隐私扫描器自身约束、打包矩阵中的 `.privacy-deny.local` 行。
70
-
71
- ## 9.0.0 — 2026-09-23(v9 质量整改)
72
-
73
- ### Added
74
- - `references/reform-plan.md`:整体整改方案(根因 / 设定纠偏 / 复杂度收敛 / 门禁重建 / 图文演讲 V1–V4 / **布局语法**)。
75
- - **`references/layout-grammar.md`**:布局语法——12 列网格、预设骨架 **P1–P12**、元素级排版(图标/列表/卡/指标/图表/图文/结构图)、组合槽位、对齐与填充率。
76
- - `layout-constants.layoutSystem`:骨架/元素/填充率/多重心/对齐/`pageToPreset`/`defaultCharts` 单源。
77
- - v9 硬门禁:`HTML_TAG_IN_TEXT` / `TITLE_ONLY_PAGE` / `UNDERFILL_PAGE` / `CHART_SKEW_INVALID` / `CHART_OVERSIZE`。
78
- - **`LAYOUT_*` 门禁**:`NO_SKELETON` / `MULTI_FOCUS` / `ALIGN_DRIFT` / `SPACING_OFF_TOKEN` / `ICON_SIZE` / `LABEL_COLLIDE` / `FILL`。
79
- - scaffold:`PAGE_TO_PRESET` + `data-skel`/`data-page-type`/`layoutPreset`;图/exhibit 页强制 P8 主从;默认图表 8 核心轮换。
80
- - **`render_from_model.py`**:模型驱动生成 HTML(只填 REPORT_MODEL,`--inplace` 回填正文;`[n]` 自动转 cite)。
81
- - 结构图正交箭头:`engine.css` `.lane__arr`/`.arch__conn`/`.flow-*`;PPTX lane/diagram 线段+三角箭头。
82
- - `layoutSlots` 并入 `layout-constants`(`lib_layout_regions` 优先读 LC);cards 双端兼容 `[[k,v]]`/`str`/`{t,d}`。
83
- - `cross_verify` 逐页文本改为 **≥80% 覆盖**(与 roundtripMin 同源)。
84
- - playbook §〇 排版总序 + §三-b 图文演讲 V1–V4;content-rules §二-b 模型字段禁 HTML 标签。
85
- - 负向测试 N15–N17(标签泄漏 / 极偏 donut / 模型夹带标签)。
86
-
87
- ### Fixed
88
- - SKILL.md 超重与 references 内容重复(audit_skill);CSS 未引用类清零(`flow-*` 接入 scaffold)。
89
- - render_from_model:agenda 对齐、Exhibit 顺序编号、donut/matrix/threecol/halftable/comparison 版式类映射。
90
- - cards 双端 points 形态兼容;页高估算按栅格折行 + 8% 容差。
91
- - 临时脚本与死代码清理;tech-design/README 单写路径对齐。
92
-
93
- ### Docs
94
- - 根 README / PUBLISHING 中文化;技能 `description` 重写(445 字,做什么+何时用+何时不用)。
95
- - README 历史版本长文移除,统一看本 CHANGELOG;版本表述统一 v9.0。
96
-
97
- ### Changed
98
- - 过空页、留白失衡(任一轴)、大图、文本溢出、内容保真(50%→80%)纳入 strict。
99
- - 废除「presentation 每页 1 张大图」;图表面积随信息复杂度。
100
- - scaffold `cards` 契约改为 `{title, points[]}`(与双引擎一致,修复空卡)。
101
- - `extract_model` 自动剥离模型字段中的 HTML 标签。
102
- - 承载口径扩展(ul/arch/lane/…);页高估算改重承载 + 8% 静态容差。
103
-
104
- ## 1.0.0 — 2026-09-23
105
-
106
- ### Added
107
- - `@topmindspace/topskills` monorepo with `npx` installer (`topskills list|install`).
108
- - GitHub Actions CI (audit + package gate + privacy scan) and release workflow.
109
- - MIT license and release-ready root documentation.
110
-
111
- ### Changed
112
- - Skill renamed **`topreport` / TopReport → `top-slides-expert` / TopSlides Expert**.
113
- - Environment variables renamed: `TOPREPORT_*` → `TOP_SLIDES_*`.
114
- - Injection markers renamed: `__TOPREPORT_*__` → `__TOPSLIDES_*__`.
115
- - JS API renamed: `TopReportPptx` → `TopSlidesPptx`.
116
- - Skill lives at `skills/top-slides-expert/` so more skills can join this repo.
117
-
118
- ### Removed / deprecated
119
- - Legacy `topreport`, `TopReport`, `TOPREPORT_*`, `MIGA_*` identifiers (no silent aliases).
120
- - Private host path probes and IDE/agent local state from the publishable tree.
121
- - Internal optimization planning notes (`OPTIMIZATION-PLAN.md`) from the release tree.
122
- - Build artifacts (`dist/`, `node_modules/`, caches) from version control.
123
-
124
- ### Migration
125
- | Old | New |
126
- |-----|-----|
127
- | skill id `topreport` | `top-slides-expert` |
128
- | brand `TopReport` | `TopSlides Expert` |
129
- | `TOPREPORT_NODE_EXE` | `TOP_SLIDES_NODE_EXE` |
130
- | `TOPREPORT_NODE_PATH` | `TOP_SLIDES_NODE_PATH` |
131
- | `TOPREPORT_BROWSER_CHANNEL` | `TOP_SLIDES_BROWSER_CHANNEL` |
132
- | `__TOPREPORT_*__` markers | `__TOPSLIDES_*__` |
133
- | `TopReportPptx` | `TopSlidesPptx` |
134
- | `MIGA_*` env | removed — use `TOP_SLIDES_*` |
1
+ # Changelog
2
+
3
+ 所有 monorepo 变更记录见本文件。
4
+
5
+ ## 2.0.2 — 2026-09-24(发布流水线校验)
6
+
7
+ ### Changed
8
+ - 校验 **tag `v*` → GitHub Release + 自动 npm publish**(Secret `NPM_TOKEN`)链路。
9
+
10
+ ## 2.0.1 — 2026-09-24(文档 + 发布链路)
11
+
12
+ ### Changed
13
+ - 文档全面对齐「双通道分发」:npm [`@topmindspace/tms-skills`](https://www.npmjs.com/package/@topmindspace/tms-skills) 已公开发布(`2.0.0` 起),GitHub 直装仍可用。
14
+ - 明确 **GitHub ≠ npm 自动同步**:push 不更新 npm;**tag `v*` → `release.yml` 自动 npm publish**。
15
+ - `release.yml` 启用 npm 发布步骤(Secret `NPM_TOKEN`);`docs/PUBLISHING.md` 补版本策略、打包矩阵 npm 列、排错表。
16
+
17
+ ## 2.0.0 — 2026-09-24(技能 9.1.0 · 仓库/技能更名 + 层级扁平化)
18
+
19
+ ### Published
20
+ - 首次发布公共 npm:[`@topmindspace/tms-skills@2.0.0`](https://www.npmjs.com/package/@topmindspace/tms-skills)
21
+ - 安装:`npx @topmindspace/tms-skills install top-ppt-html`
22
+
23
+ ### Changed
24
+ - **仓库更名**:GitHub `topmindspace/topskills` → **`topmindspace/tms-skills`**(旧 URL 301);本地根目录、`git remote`、npm 包名 `@topmindspace/tms-skills`、CLI `tms-skills` / `bin/tms-skills.js` 全部对齐。
25
+ - **技能更名**:`top-slides-expert` / TopSlides Expert → **`top-ppt-html` / TopPPT HTML**(目录、frontmatter `name`、分发包、文档一致)。
26
+ - **注入标记**:`__TOPSLIDES_*__` → `__TOPPPT_*__`;**环境变量**:`TOP_SLIDES_*` → `TOP_PPT_*`;**JS API**:`TopSlidesPptx` → `TopPptHtml`。
27
+ - **层级扁平化**:移除冗余的 `skills/` 中间层,技能目录直接放在仓库根(`top-ppt-html/`);安装器改为扫描根目录下含 `SKILL.md` 的技能目录。
28
+ - 版本:技能 `9.0.1` → **`9.1.0`**(`layout-constants.json` `version: 9.1`);monorepo `1.1.1` → **`2.0.0`**(包名/CLI/结构破坏性变更)。
29
+
30
+ ### Migration
31
+ | Old | New |
32
+ |-----|-----|
33
+ | repo `topmindspace/topskills` | `topmindspace/tms-skills` |
34
+ | npm `@topmindspace/topskills` | `@topmindspace/tms-skills` |
35
+ | CLI `topskills` / `bin/topskills.js` | `tms-skills` / `bin/tms-skills.js` |
36
+ | skill id / dir `top-slides-expert` | `top-ppt-html` |
37
+ | brand `TopSlides Expert` | `TopPPT HTML` |
38
+ | `skills/<id>/` | `<id>/`(仓库根) |
39
+ | `__TOPSLIDES_*__` markers | `__TOPPPT_*__` |
40
+ | `TOP_SLIDES_*` env | `TOP_PPT_*` |
41
+ | `TopSlidesPptx` | `TopPptHtml` |
42
+
43
+ 无静默别名;旧标识见 `docs/PUBLISHING.md` 废弃清单,仅 CHANGELOG / 迁移说明可提及。
44
+
45
+ ## 1.1.1 — 2026-09-23(技能 9.0.1 · PPTX 往返与双形态修复)
46
+
47
+ ### Fixed
48
+ - **PPTX 双形态载荷静默丢字**:`build_pptx.js` / `pptx-export.js` 用 `typeof x === 'object'` 区分 `[[t,d]…]` 与 `[{t,d,accent}…]`,但 `typeof [] === 'object'`,数组形态 steps/levels/lane/nodes 的标题与描述被读成 `undefined` 后落空(第 8 章 steps 仅 4/7 关键串)。改为 `isRec()`(非数组对象)判定,双引擎同步。
49
+ - **PPTX 模型往返误报(挡交付)**:`validate_pptx.validate_model_roundtrip` 关键串比对语料原先只取幻灯片形状文本,把原生图表 `chart.labels`(落在 chart part)和 notes-only 字段(`lead` / `image.hint` 等)误判为 `MODEL_ROUNDTRIP_CONTENT_MISSING`;v9 将 `roundtripMin` 提到 0.80 后 9 个随包示例全部 FAIL。现语料改为 **形状文本 ∪ 演讲者备注 ∪ 关联 chart part 文本**(`_roundtrip_corpus` + `slide_chart_text`),`slide_notes` 真正参与内容比对;探针跳过 `hint`/`src`/`alt` 等元数据键。
50
+ - 示例矩阵顶层金字塔描述过长触发 `CONTAINER_OVERFLOW`:顶层槽位收窄后改为「自动执行」;9 示例 `validate_pptx --strict --model` 全 0/0。
51
+
52
+ ### Changed
53
+ - 随包示例按 v9.0 模板重建(内嵌 MODEL_SCHEMA 8.3 → 9.0);4 张 `theme-overview*.png` 主题参考图刷新。
54
+ - 版本:技能 `9.0.0` → **`9.0.1`**(`package.json` npm 语义化);monorepo `1.1.0` → **`1.1.1`**。版本单源仍为 `layout-constants.json` `version: 9.0`。
55
+
56
+ ### Verified
57
+ - 全链路回归通过:HTML strict + B 通道精导 strict 0/0 + A 通道 strict 0/0 + 双区组合页探针 + 深色主题探针 + `negative_tests` + 任务路由遍历 + python-pptx 双裁判。
58
+ - 审计全绿:`audit_styles` / `audit_docs` / `audit_skill` / `audit_css`;`package_skill.py --check` 通过。
59
+
60
+ ## 1.1.0 — 2026-09-23(安装口径 + 隐私门禁)
61
+
62
+ ### Changed
63
+ - **安装口径改为 GitHub 优先**:根 README / 技能 README / `bin/topskills.js` / `docs/PUBLISHING.md` 统一以 `npx github:topmindspace/topskills ...` 为默认;npm 包名降为「已 publish 后的可选通道」。补充「找不到这个包」排错说明。
64
+ - `package.json` description 与新增 `npm run privacy` 脚本对齐上述口径。
65
+
66
+ ### Fixed
67
+ - **隐私扫描器自身泄漏**:`ci_privacy_scan.py` 不再硬编码本机用户名;改为通用 home 用户名段检测 + 可选本地词表 `scripts/.privacy-deny.local`(gitignore)。
68
+ - **扫描器自扫失明**:旧版词表写在 raw string 里导致字面量扫不到自己;新版附合成样本自检,并拒绝在扫描器源码中出现用户名形态 token。
69
+ - **CI 日志二次泄漏**:扫描命中项一律脱敏输出(`xx***y(len=n)`),不回显密钥/路径原文。
70
+ - 删除本地临时脚本 `scripts/_find_dup.py`(`scripts/_*` 约定为用后即删)。
71
+
72
+ ### Added
73
+ - 隐私扫描扩展:GitHub/npm token、AWS key、Bearer、密钥赋值形态;`git ls-files` 禁止跟踪路径门禁(临时脚本 / `.env` / 密钥 / 缓存 / 智能体本地状态)。
74
+ - `docs/PUBLISHING.md` 增加安装口径表、隐私扫描器自身约束、打包矩阵中的 `.privacy-deny.local` 行。
75
+
76
+ ## 9.0.0 — 2026-09-23(v9 质量整改)
77
+
78
+ ### Added
79
+ - `references/reform-plan.md`:整体整改方案(根因 / 设定纠偏 / 复杂度收敛 / 门禁重建 / 图文演讲 V1–V4 / **布局语法**)。
80
+ - **`references/layout-grammar.md`**:布局语法——12 列网格、预设骨架 **P1–P12**、元素级排版(图标/列表/卡/指标/图表/图文/结构图)、组合槽位、对齐与填充率。
81
+ - `layout-constants.layoutSystem`:骨架/元素/填充率/多重心/对齐/`pageToPreset`/`defaultCharts` 单源。
82
+ - v9 硬门禁:`HTML_TAG_IN_TEXT` / `TITLE_ONLY_PAGE` / `UNDERFILL_PAGE` / `CHART_SKEW_INVALID` / `CHART_OVERSIZE`。
83
+ - **`LAYOUT_*` 门禁**:`NO_SKELETON` / `MULTI_FOCUS` / `ALIGN_DRIFT` / `SPACING_OFF_TOKEN` / `ICON_SIZE` / `LABEL_COLLIDE` / `FILL`。
84
+ - scaffold:`PAGE_TO_PRESET` + `data-skel`/`data-page-type`/`layoutPreset`;图/exhibit 页强制 P8 主从;默认图表 8 核心轮换。
85
+ - **`render_from_model.py`**:模型驱动生成 HTML(只填 REPORT_MODEL,`--inplace` 回填正文;`[n]` 自动转 cite)。
86
+ - 结构图正交箭头:`engine.css` `.lane__arr`/`.arch__conn`/`.flow-*`;PPTX lane/diagram 线段+三角箭头。
87
+ - `layoutSlots` 并入 `layout-constants`(`lib_layout_regions` 优先读 LC);cards 双端兼容 `[[k,v]]`/`str`/`{t,d}`。
88
+ - `cross_verify` 逐页文本改为 **≥80% 覆盖**(与 roundtripMin 同源)。
89
+ - playbook §〇 排版总序 + §三-b 图文演讲 V1–V4;content-rules §二-b 模型字段禁 HTML 标签。
90
+ - 负向测试 N15–N17(标签泄漏 / 极偏 donut / 模型夹带标签)。
91
+
92
+ ### Fixed
93
+ - SKILL.md 超重与 references 内容重复(audit_skill);CSS 未引用类清零(`flow-*` 接入 scaffold)。
94
+ - render_from_model:agenda 对齐、Exhibit 顺序编号、donut/matrix/threecol/halftable/comparison 版式类映射。
95
+ - cards 双端 points 形态兼容;页高估算按栅格折行 + 8% 容差。
96
+ - 临时脚本与死代码清理;tech-design/README 单写路径对齐。
97
+
98
+ ### Docs
99
+ - 根 README / PUBLISHING 中文化;技能 `description` 重写(445 字,做什么+何时用+何时不用)。
100
+ - README 历史版本长文移除,统一看本 CHANGELOG;版本表述统一 v9.0。
101
+
102
+ ### Changed
103
+ - 过空页、留白失衡(任一轴)、大图、文本溢出、内容保真(50%→80%)纳入 strict。
104
+ - 废除「presentation 每页 1 张大图」;图表面积随信息复杂度。
105
+ - scaffold `cards` 契约改为 `{title, points[]}`(与双引擎一致,修复空卡)。
106
+ - `extract_model` 自动剥离模型字段中的 HTML 标签。
107
+ - 承载口径扩展(ul/arch/lane/…);页高估算改重承载 + 8% 静态容差。
108
+
109
+ ## 1.0.0 — 2026-09-23
110
+
111
+ ### Added
112
+ - `@topmindspace/topskills` monorepo with `npx` installer (`topskills list|install`).
113
+ - GitHub Actions CI (audit + package gate + privacy scan) and release workflow.
114
+ - MIT license and release-ready root documentation.
115
+
116
+ ### Changed
117
+ - Skill renamed **`topreport` / TopReport → `top-slides-expert` / TopSlides Expert**.
118
+ - Environment variables renamed: `TOPREPORT_*` → `TOP_SLIDES_*`.
119
+ - Injection markers renamed: `__TOPREPORT_*__` → `__TOPSLIDES_*__`.
120
+ - JS API renamed: `TopReportPptx` → `TopSlidesPptx`.
121
+ - Skill lives at `skills/top-slides-expert/` so more skills can join this repo.
122
+
123
+ ### Removed / deprecated
124
+ - Legacy `topreport`, `TopReport`, `TOPREPORT_*`, `MIGA_*` identifiers (no silent aliases).
125
+ - Private host path probes and IDE/agent local state from the publishable tree.
126
+ - Internal optimization planning notes (`OPTIMIZATION-PLAN.md`) from the release tree.
127
+ - Build artifacts (`dist/`, `node_modules/`, caches) from version control.
128
+
129
+ ### Migration
130
+ | Old | New |
131
+ |-----|-----|
132
+ | skill id `topreport` | `top-slides-expert` |
133
+ | brand `TopReport` | `TopSlides Expert` |
134
+ | `TOPREPORT_NODE_EXE` | `TOP_SLIDES_NODE_EXE` |
135
+ | `TOPREPORT_NODE_PATH` | `TOP_SLIDES_NODE_PATH` |
136
+ | `TOPREPORT_BROWSER_CHANNEL` | `TOP_SLIDES_BROWSER_CHANNEL` |
137
+ | `__TOPREPORT_*__` markers | `__TOPSLIDES_*__` |
138
+ | `TopReportPptx` | `TopSlidesPptx` |
139
+ | `MIGA_*` env | removed — use `TOP_SLIDES_*` |
package/bin/tms-skills.js CHANGED
@@ -1,160 +1,160 @@
1
- #!/usr/bin/env node
2
- /**
3
- * tms-skills — TopMindspace agent skills installer
4
- *
5
- * Usage (GitHub is the primary install source — npm publish is optional):
6
- * npx github:topmindspace/tms-skills list
7
- * npx github:topmindspace/tms-skills install top-ppt-html
8
- * npx github:topmindspace/tms-skills install top-ppt-html --to ./skills-out
9
- * npx @topmindspace/tms-skills install top-ppt-html # only after npm publish
10
- */
11
- 'use strict';
12
-
13
- const fs = require('fs');
14
- const path = require('path');
15
-
16
- const ROOT = path.resolve(__dirname, '..');
17
- // Skills live at repo root (one directory per skill with SKILL.md).
18
- const INFRA_DIRS = new Set(['bin', 'docs', 'scripts', 'node_modules', 'dist', 'release-assets']);
19
-
20
- function die(msg, code = 1) {
21
- console.error(msg);
22
- process.exit(code);
23
- }
24
-
25
- function skillDir(skillId) {
26
- return path.join(ROOT, skillId);
27
- }
28
-
29
- function listSkillIds() {
30
- return fs
31
- .readdirSync(ROOT, { withFileTypes: true })
32
- .filter((d) => d.isDirectory() && !INFRA_DIRS.has(d.name) && !d.name.startsWith('.'))
33
- .filter((d) => fs.existsSync(path.join(ROOT, d.name, 'SKILL.md')))
34
- .map((d) => d.name)
35
- .sort();
36
- }
37
-
38
- function readSkillMeta(skillId) {
39
- const skillPath = skillDir(skillId);
40
- const skillMd = path.join(skillPath, 'SKILL.md');
41
- if (!fs.existsSync(skillMd)) return { id: skillId, description: '' };
42
- const text = fs.readFileSync(skillMd, 'utf8');
43
- const m = text.match(/^---\r?\n([\s\S]*?)\r?\n---/);
44
- if (!m) return { id: skillId, description: '' };
45
- const desc = (m[1].match(/^description:\s*"(.*)"\s*$/m) || m[1].match(/^description:\s*(.+)\s*$/m) || [])[1] || '';
46
- return { id: skillId, description: String(desc).slice(0, 120) };
47
- }
48
-
49
- function resolveDefaultTarget() {
50
- const candidates = [
51
- path.join(process.cwd(), '.agents', 'skills'),
52
- path.join(process.cwd(), '.claude', 'skills'),
53
- path.join(process.cwd(), '.mimocode', 'skills'),
54
- path.join(process.env.HOME || process.env.USERPROFILE || '', '.claude', 'skills'),
55
- path.join(process.env.HOME || process.env.USERPROFILE || '', '.agents', 'skills'),
56
- ];
57
- for (const dir of candidates) {
58
- if (dir && fs.existsSync(path.dirname(dir))) {
59
- return dir;
60
- }
61
- }
62
- return path.join(process.cwd(), '.agents', 'skills');
63
- }
64
-
65
- function copyDir(src, dest) {
66
- fs.mkdirSync(dest, { recursive: true });
67
- for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
68
- const s = path.join(src, entry.name);
69
- const d = path.join(dest, entry.name);
70
- if (entry.isDirectory()) {
71
- if (entry.name === 'node_modules' || entry.name === 'dist' || entry.name === '__pycache__') continue;
72
- copyDir(s, d);
73
- } else if (entry.isFile()) {
74
- if (entry.name.endsWith('.pyc')) continue;
75
- fs.copyFileSync(s, d);
76
- }
77
- }
78
- }
79
-
80
- function install(skillId, targetRoot) {
81
- const src = skillDir(skillId);
82
- if (!fs.existsSync(path.join(src, 'SKILL.md'))) {
83
- die(`Skill not found: ${skillId}\nAvailable: ${listSkillIds().join(', ') || '(none)'}`);
84
- }
85
- const dest = path.join(targetRoot, skillId);
86
- fs.mkdirSync(targetRoot, { recursive: true });
87
- if (fs.existsSync(dest)) {
88
- fs.rmSync(dest, { recursive: true, force: true });
89
- }
90
- copyDir(src, dest);
91
- console.log(`Installed ${skillId}`);
92
- console.log(` from ${src}`);
93
- console.log(` to ${dest}`);
94
- console.log('');
95
- console.log('Optional (PPTX export only):');
96
- console.log(` cd "${dest}" && npm install`);
97
- }
98
-
99
- function usage() {
100
- console.log(`tms-skills — install TopMindspace agent skills
101
-
102
- Usage:
103
- tms-skills list
104
- tms-skills install <skill-id> [--to <dir>]
105
- tms-skills help
106
-
107
- Examples:
108
- npx github:topmindspace/tms-skills list
109
- npx github:topmindspace/tms-skills install top-ppt-html
110
- npx github:topmindspace/tms-skills install top-ppt-html --to ./.agents/skills
111
-
112
- # Optional npm package (only after @topmindspace/tms-skills is published):
113
- npx @topmindspace/tms-skills install top-ppt-html
114
- `);
115
- }
116
-
117
- function main(argv) {
118
- const args = argv.slice(2);
119
- const cmd = args[0];
120
-
121
- if (!cmd || cmd === 'help' || cmd === '--help' || cmd === '-h') {
122
- usage();
123
- return;
124
- }
125
-
126
- if (cmd === 'list' || cmd === 'ls') {
127
- const ids = listSkillIds();
128
- if (!ids.length) {
129
- console.log('No skills found in package.');
130
- return;
131
- }
132
- for (const id of ids) {
133
- const meta = readSkillMeta(id);
134
- console.log(`${id}`);
135
- if (meta.description) console.log(` ${meta.description}…`);
136
- }
137
- return;
138
- }
139
-
140
- if (cmd === 'install') {
141
- const skillId = args[1];
142
- if (!skillId || skillId.startsWith('-')) {
143
- die('Missing skill id.\n\n' + usage());
144
- }
145
- let to = null;
146
- for (let i = 2; i < args.length; i++) {
147
- if (args[i] === '--to' || args[i] === '-t') {
148
- to = args[++i];
149
- if (!to) die('Option --to requires a directory path.');
150
- }
151
- }
152
- const targetRoot = to ? path.resolve(to) : resolveDefaultTarget();
153
- install(skillId, targetRoot);
154
- return;
155
- }
156
-
157
- die(`Unknown command: ${cmd}\n\n` + usage());
158
- }
159
-
160
- main(process.argv);
1
+ #!/usr/bin/env node
2
+ /**
3
+ * tms-skills — TopMindspace agent skills installer
4
+ *
5
+ * Usage (GitHub is the primary install source — npm publish is optional):
6
+ * npx github:topmindspace/tms-skills list
7
+ * npx github:topmindspace/tms-skills install top-ppt-html
8
+ * npx github:topmindspace/tms-skills install top-ppt-html --to ./skills-out
9
+ * npx @topmindspace/tms-skills install top-ppt-html # only after npm publish
10
+ */
11
+ 'use strict';
12
+
13
+ const fs = require('fs');
14
+ const path = require('path');
15
+
16
+ const ROOT = path.resolve(__dirname, '..');
17
+ // Skills live at repo root (one directory per skill with SKILL.md).
18
+ const INFRA_DIRS = new Set(['bin', 'docs', 'scripts', 'node_modules', 'dist', 'release-assets']);
19
+
20
+ function die(msg, code = 1) {
21
+ console.error(msg);
22
+ process.exit(code);
23
+ }
24
+
25
+ function skillDir(skillId) {
26
+ return path.join(ROOT, skillId);
27
+ }
28
+
29
+ function listSkillIds() {
30
+ return fs
31
+ .readdirSync(ROOT, { withFileTypes: true })
32
+ .filter((d) => d.isDirectory() && !INFRA_DIRS.has(d.name) && !d.name.startsWith('.'))
33
+ .filter((d) => fs.existsSync(path.join(ROOT, d.name, 'SKILL.md')))
34
+ .map((d) => d.name)
35
+ .sort();
36
+ }
37
+
38
+ function readSkillMeta(skillId) {
39
+ const skillPath = skillDir(skillId);
40
+ const skillMd = path.join(skillPath, 'SKILL.md');
41
+ if (!fs.existsSync(skillMd)) return { id: skillId, description: '' };
42
+ const text = fs.readFileSync(skillMd, 'utf8');
43
+ const m = text.match(/^---\r?\n([\s\S]*?)\r?\n---/);
44
+ if (!m) return { id: skillId, description: '' };
45
+ const desc = (m[1].match(/^description:\s*"(.*)"\s*$/m) || m[1].match(/^description:\s*(.+)\s*$/m) || [])[1] || '';
46
+ return { id: skillId, description: String(desc).slice(0, 120) };
47
+ }
48
+
49
+ function resolveDefaultTarget() {
50
+ const candidates = [
51
+ path.join(process.cwd(), '.agents', 'skills'),
52
+ path.join(process.cwd(), '.claude', 'skills'),
53
+ path.join(process.cwd(), '.mimocode', 'skills'),
54
+ path.join(process.env.HOME || process.env.USERPROFILE || '', '.claude', 'skills'),
55
+ path.join(process.env.HOME || process.env.USERPROFILE || '', '.agents', 'skills'),
56
+ ];
57
+ for (const dir of candidates) {
58
+ if (dir && fs.existsSync(path.dirname(dir))) {
59
+ return dir;
60
+ }
61
+ }
62
+ return path.join(process.cwd(), '.agents', 'skills');
63
+ }
64
+
65
+ function copyDir(src, dest) {
66
+ fs.mkdirSync(dest, { recursive: true });
67
+ for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
68
+ const s = path.join(src, entry.name);
69
+ const d = path.join(dest, entry.name);
70
+ if (entry.isDirectory()) {
71
+ if (entry.name === 'node_modules' || entry.name === 'dist' || entry.name === '__pycache__') continue;
72
+ copyDir(s, d);
73
+ } else if (entry.isFile()) {
74
+ if (entry.name.endsWith('.pyc')) continue;
75
+ fs.copyFileSync(s, d);
76
+ }
77
+ }
78
+ }
79
+
80
+ function install(skillId, targetRoot) {
81
+ const src = skillDir(skillId);
82
+ if (!fs.existsSync(path.join(src, 'SKILL.md'))) {
83
+ die(`Skill not found: ${skillId}\nAvailable: ${listSkillIds().join(', ') || '(none)'}`);
84
+ }
85
+ const dest = path.join(targetRoot, skillId);
86
+ fs.mkdirSync(targetRoot, { recursive: true });
87
+ if (fs.existsSync(dest)) {
88
+ fs.rmSync(dest, { recursive: true, force: true });
89
+ }
90
+ copyDir(src, dest);
91
+ console.log(`Installed ${skillId}`);
92
+ console.log(` from ${src}`);
93
+ console.log(` to ${dest}`);
94
+ console.log('');
95
+ console.log('Optional (PPTX export only):');
96
+ console.log(` cd "${dest}" && npm install`);
97
+ }
98
+
99
+ function usage() {
100
+ console.log(`tms-skills — install TopMindspace agent skills
101
+
102
+ Usage:
103
+ tms-skills list
104
+ tms-skills install <skill-id> [--to <dir>]
105
+ tms-skills help
106
+
107
+ Examples:
108
+ npx github:topmindspace/tms-skills list
109
+ npx github:topmindspace/tms-skills install top-ppt-html
110
+ npx github:topmindspace/tms-skills install top-ppt-html --to ./.agents/skills
111
+
112
+ # Optional npm package (only after @topmindspace/tms-skills is published):
113
+ npx @topmindspace/tms-skills install top-ppt-html
114
+ `);
115
+ }
116
+
117
+ function main(argv) {
118
+ const args = argv.slice(2);
119
+ const cmd = args[0];
120
+
121
+ if (!cmd || cmd === 'help' || cmd === '--help' || cmd === '-h') {
122
+ usage();
123
+ return;
124
+ }
125
+
126
+ if (cmd === 'list' || cmd === 'ls') {
127
+ const ids = listSkillIds();
128
+ if (!ids.length) {
129
+ console.log('No skills found in package.');
130
+ return;
131
+ }
132
+ for (const id of ids) {
133
+ const meta = readSkillMeta(id);
134
+ console.log(`${id}`);
135
+ if (meta.description) console.log(` ${meta.description}…`);
136
+ }
137
+ return;
138
+ }
139
+
140
+ if (cmd === 'install') {
141
+ const skillId = args[1];
142
+ if (!skillId || skillId.startsWith('-')) {
143
+ die('Missing skill id.\n\n' + usage());
144
+ }
145
+ let to = null;
146
+ for (let i = 2; i < args.length; i++) {
147
+ if (args[i] === '--to' || args[i] === '-t') {
148
+ to = args[++i];
149
+ if (!to) die('Option --to requires a directory path.');
150
+ }
151
+ }
152
+ const targetRoot = to ? path.resolve(to) : resolveDefaultTarget();
153
+ install(skillId, targetRoot);
154
+ return;
155
+ }
156
+
157
+ die(`Unknown command: ${cmd}\n\n` + usage());
158
+ }
159
+
160
+ main(process.argv);