skill-forge-hub 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +77 -22
  3. package/annual-report/SKILL.md +10 -3
  4. package/annual-report/resources/disk-and-html.md +7 -7
  5. package/annual-report/resources/reference.html +135 -41
  6. package/annual-report/user-config.md +3 -2
  7. package/article-to-html/SKILL.md +23 -0
  8. package/article-to-html/design-system.md +86 -21
  9. package/article-to-html/user-config.md +18 -0
  10. package/cli.js +71 -23
  11. package/daily-report/SKILL.md +10 -3
  12. package/daily-report/resources/disk-and-html.md +2 -2
  13. package/daily-report/resources/reference.html +163 -65
  14. package/daily-report/user-config.md +3 -2
  15. package/deck-stage/SKILL.md +80 -0
  16. package/deck-stage/package-lock.json +172 -0
  17. package/deck-stage/package.json +15 -0
  18. package/deck-stage/resources/cover-template.html +139 -0
  19. package/deck-stage/resources/data-schema.md +111 -0
  20. package/deck-stage/resources/pptx-builder.js +394 -0
  21. package/deck-stage/resources/usage-guide.md +20 -0
  22. package/deck-stage/user-config.md +26 -0
  23. package/magic-deck/SKILL.md +27 -13
  24. package/magic-deck/resources/content-guide.md +58 -0
  25. package/magic-deck/resources/deck-spec.md +380 -30
  26. package/magic-deck/resources/reference.html +1803 -82
  27. package/magic-deck/resources/usage-guide.md +42 -0
  28. package/magic-deck/user-config.md +10 -7
  29. package/meta-forge/SKILL.md +2 -0
  30. package/meta-forge/resources/forge-rules.md +1 -0
  31. package/package.json +16 -4
  32. package/prompt-pouch/SKILL.md +81 -0
  33. package/prompt-pouch/resources/data-format.md +67 -0
  34. package/prompt-pouch/resources/reference.html +2038 -0
  35. package/prompt-pouch/resources/usage-guide.md +32 -0
  36. package/prompt-pouch/user-config.md +22 -0
  37. package/template/SKILL.md +1 -0
  38. package/weekly-report/SKILL.md +10 -3
  39. package/weekly-report/resources/disk-and-html.md +2 -2
  40. package/weekly-report/resources/reference.html +184 -95
  41. package/weekly-report/user-config.md +3 -2
@@ -0,0 +1,172 @@
1
+ {
2
+ "name": "deck-stage",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "deck-stage",
9
+ "version": "1.0.0",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "pptxgenjs": "^4.0.1"
13
+ }
14
+ },
15
+ "node_modules/@types/node": {
16
+ "version": "22.20.5",
17
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.5.tgz",
18
+ "integrity": "sha512-U2+DNr+wSjpsTS/wZGYHq7GcwfuSmKiKvoPvK22zwTlRhU91yOniN4qRR5KhIjvif7ysw/dz/hKmfDH0Ris4aA==",
19
+ "license": "MIT",
20
+ "dependencies": {
21
+ "undici-types": "~6.21.0"
22
+ }
23
+ },
24
+ "node_modules/core-util-is": {
25
+ "version": "1.0.3",
26
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
27
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
28
+ "license": "MIT"
29
+ },
30
+ "node_modules/https": {
31
+ "version": "1.0.0",
32
+ "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz",
33
+ "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==",
34
+ "license": "ISC"
35
+ },
36
+ "node_modules/image-size": {
37
+ "version": "1.2.1",
38
+ "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz",
39
+ "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==",
40
+ "license": "MIT",
41
+ "dependencies": {
42
+ "queue": "6.0.2"
43
+ },
44
+ "bin": {
45
+ "image-size": "bin/image-size.js"
46
+ },
47
+ "engines": {
48
+ "node": ">=16.x"
49
+ }
50
+ },
51
+ "node_modules/immediate": {
52
+ "version": "3.0.6",
53
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
54
+ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
55
+ "license": "MIT"
56
+ },
57
+ "node_modules/inherits": {
58
+ "version": "2.0.4",
59
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
60
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
61
+ "license": "ISC"
62
+ },
63
+ "node_modules/isarray": {
64
+ "version": "1.0.0",
65
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
66
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
67
+ "license": "MIT"
68
+ },
69
+ "node_modules/jszip": {
70
+ "version": "3.10.2",
71
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.2.tgz",
72
+ "integrity": "sha512-3l+rb15IOWtUhU0H5MFqES/T6Kh7abYwjosBey/vD6hDt8zoEffkSC5Ws5SGtgVw3gBx2NEbhTeSW1+kWkpyTQ==",
73
+ "license": "(MIT OR GPL-3.0-or-later)",
74
+ "dependencies": {
75
+ "lie": "~3.3.0",
76
+ "pako": "~1.0.2",
77
+ "readable-stream": "~2.3.6",
78
+ "setimmediate": "^1.0.5"
79
+ }
80
+ },
81
+ "node_modules/lie": {
82
+ "version": "3.3.0",
83
+ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
84
+ "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
85
+ "license": "MIT",
86
+ "dependencies": {
87
+ "immediate": "~3.0.5"
88
+ }
89
+ },
90
+ "node_modules/pako": {
91
+ "version": "1.0.11",
92
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
93
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
94
+ "license": "(MIT AND Zlib)"
95
+ },
96
+ "node_modules/pptxgenjs": {
97
+ "version": "4.0.1",
98
+ "resolved": "https://registry.npmjs.org/pptxgenjs/-/pptxgenjs-4.0.1.tgz",
99
+ "integrity": "sha512-TeJISr8wouAuXw4C1F/mC33xbZs/FuEG6nH9FG1Zj+nuPcGMP5YRHl6X+j3HSUnS1f3at6k75ZZXPMZlA5Lj9A==",
100
+ "license": "MIT",
101
+ "dependencies": {
102
+ "@types/node": "^22.8.1",
103
+ "https": "^1.0.0",
104
+ "image-size": "^1.2.1",
105
+ "jszip": "^3.10.1"
106
+ }
107
+ },
108
+ "node_modules/process-nextick-args": {
109
+ "version": "2.0.1",
110
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
111
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
112
+ "license": "MIT"
113
+ },
114
+ "node_modules/queue": {
115
+ "version": "6.0.2",
116
+ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
117
+ "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
118
+ "license": "MIT",
119
+ "dependencies": {
120
+ "inherits": "~2.0.3"
121
+ }
122
+ },
123
+ "node_modules/readable-stream": {
124
+ "version": "2.3.8",
125
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
126
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
127
+ "license": "MIT",
128
+ "dependencies": {
129
+ "core-util-is": "~1.0.0",
130
+ "inherits": "~2.0.3",
131
+ "isarray": "~1.0.0",
132
+ "process-nextick-args": "~2.0.0",
133
+ "safe-buffer": "~5.1.1",
134
+ "string_decoder": "~1.1.1",
135
+ "util-deprecate": "~1.0.1"
136
+ }
137
+ },
138
+ "node_modules/safe-buffer": {
139
+ "version": "5.1.2",
140
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
141
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
142
+ "license": "MIT"
143
+ },
144
+ "node_modules/setimmediate": {
145
+ "version": "1.0.5",
146
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
147
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
148
+ "license": "MIT"
149
+ },
150
+ "node_modules/string_decoder": {
151
+ "version": "1.1.1",
152
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
153
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
154
+ "license": "MIT",
155
+ "dependencies": {
156
+ "safe-buffer": "~5.1.0"
157
+ }
158
+ },
159
+ "node_modules/undici-types": {
160
+ "version": "6.21.0",
161
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
162
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
163
+ "license": "MIT"
164
+ },
165
+ "node_modules/util-deprecate": {
166
+ "version": "1.0.2",
167
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
168
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
169
+ "license": "MIT"
170
+ }
171
+ }
172
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "deck-stage",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "scripts": {
6
+ "test": "echo \"Error: no test specified\" && exit 1"
7
+ },
8
+ "keywords": [],
9
+ "author": "",
10
+ "license": "ISC",
11
+ "description": "",
12
+ "dependencies": {
13
+ "pptxgenjs": "^4.0.1"
14
+ }
15
+ }
@@ -0,0 +1,139 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN" data-theme="tech">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>PPT 封面底版</title>
7
+ <style>
8
+ /* ⛔ 封面/亮点页截图模板(静态版式,无动画,保截图零风险)
9
+ 视觉与报告深蓝面板体系同源;AI 执行时替换 <script> 内 COVER 数据后经 Chrome headless 截图。
10
+ 四主题经 html[data-theme] 切换;截图窗口 1280x720(16:9)。 */
11
+ :root{
12
+ --bg:#0a1929; --panel:#0b1e37; --panel-line:#0f3350; --text:#e6f1ff; --muted:#8892b0;
13
+ --accent:#38bdf8; --accent2:#0ea5e9; --border:#1e3a5f; --glow:rgba(14,165,233,.25);
14
+ --title-mid:#ffffff;
15
+ }
16
+ html[data-theme="biz"]{ --bg:#ffffff; --panel:#f8fafc; --panel-line:#e2e8f0; --text:#0f172a; --muted:#64748b; --accent:#2563eb; --accent2:#1d4ed8; --border:#e2e8f0; --glow:rgba(37,99,235,.14); --title-mid:#1e40af; }
17
+ html[data-theme="mono"]{ --bg:#ffffff; --panel:#ffffff; --panel-line:#d4d4d4; --text:#111111; --muted:#666666; --accent:#000000; --accent2:#333333; --border:#cccccc; --glow:rgba(0,0,0,.08); --title-mid:#555555; }
18
+ html[data-theme="warm"]{ --bg:#1c0f0f; --panel:#2a1717; --panel-line:#4a2f1f; --text:#fff1e6; --muted:#c4a98f; --accent:#fdba74; --accent2:#f97316; --border:#4a2f1f; --glow:rgba(249,115,22,.22); --title-mid:#ffffff; }
19
+ *{ margin:0; padding:0; box-sizing:border-box; }
20
+ body{
21
+ width:1280px; height:720px; overflow:hidden; position:relative;
22
+ background:var(--bg); color:var(--text);
23
+ font-family:"PingFang SC","Microsoft YaHei","Source Han Sans SC",sans-serif;
24
+ }
25
+ /* 三层科技底纹(静态) */
26
+ .bg-grid{ position:absolute; inset:0;
27
+ background-image:linear-gradient(rgba(0,240,255,.03) 1px,transparent 1px),
28
+ linear-gradient(90deg,rgba(0,240,255,.03) 1px,transparent 1px);
29
+ background-size:60px 60px; }
30
+ .bg-stars{ position:absolute; inset:0;
31
+ background-image:radial-gradient(1px 1px at 12% 18%,rgba(255,255,255,.9),transparent),
32
+ radial-gradient(1.2px 1.2px at 88% 12%,rgba(0,240,255,.7),transparent),
33
+ radial-gradient(1px 1px at 72% 82%,rgba(167,139,250,.8),transparent),
34
+ radial-gradient(1.5px 1.5px at 8% 78%,rgba(94,234,212,.7),transparent),
35
+ radial-gradient(1px 1px at 42% 32%,rgba(253,186,116,.7),transparent),
36
+ radial-gradient(1.2px 1.2px at 62% 66%,rgba(244,114,182,.6),transparent),
37
+ radial-gradient(1px 1px at 32% 92%,rgba(0,240,255,.6),transparent),
38
+ radial-gradient(1px 1px at 94% 44%,rgba(255,255,255,.8),transparent); }
39
+ .bg-noise{ position:absolute; inset:0; opacity:.04;
40
+ background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='120' height='120' filter='url(%23n)'/%3E%3C/svg%3E"); }
41
+ /* 顶部光斑(静态) */
42
+ .card-glow{ position:absolute; top:0; left:50%; transform:translateX(-50%) scale(1.6); width:70%; height:55%;
43
+ background:radial-gradient(ellipse at 50% 10%,var(--glow),transparent 70%); pointer-events:none; }
44
+ /* 主体 */
45
+ .wrap{ position:relative; z-index:2; height:100%; display:flex; flex-direction:column; padding:56px 72px 40px; }
46
+ .badge{ align-self:flex-start; font-size:13px; letter-spacing:.22em; color:var(--muted);
47
+ border:1px solid var(--border); border-radius:999px; padding:7px 18px; }
48
+ .center{ flex:1; display:flex; flex-direction:column; justify-content:center; }
49
+ .title{ font-size:58px; font-weight:800; line-height:1.25; letter-spacing:.02em;
50
+ background:linear-gradient(120deg,var(--accent) 0%,var(--title-mid) 55%,var(--accent2) 100%);
51
+ -webkit-background-clip:text; background-clip:text; color:transparent;
52
+ filter:drop-shadow(0 0 18px var(--glow)) drop-shadow(0 0 6px var(--glow)); }
53
+ .subtitle{ margin-top:22px; font-size:20px; color:var(--muted); letter-spacing:.06em; }
54
+ .rule{ margin-top:30px; width:210px; height:3px; border-radius:2px;
55
+ background:linear-gradient(90deg,var(--accent),transparent); }
56
+ /* 数据卡横排 */
57
+ .stats{ display:flex; gap:22px; margin-top:46px; }
58
+ .stat{ flex:1; background:var(--panel); border:1px solid var(--panel-line); border-radius:8px;
59
+ padding:18px 22px; position:relative; overflow:hidden; }
60
+ .stat::before{ content:""; position:absolute; left:0; top:14px; bottom:14px; width:5px; border-radius:0 3px 3px 0;
61
+ background:linear-gradient(180deg,var(--accent),var(--accent2)); box-shadow:0 0 10px var(--glow); }
62
+ .stat .v{ font-size:34px; font-weight:800;
63
+ background:linear-gradient(120deg,var(--accent),var(--accent2));
64
+ -webkit-background-clip:text; background-clip:text; color:transparent; }
65
+ .stat .l{ margin-top:6px; font-size:13px; color:var(--muted); }
66
+ .stat .d{ margin-top:6px; font-size:11.5px; font-weight:700; }
67
+ .stat .d.up{ color:#34d399; } .stat .d.down{ color:#fb7185; }
68
+ /* 底栏 */
69
+ .foot{ display:flex; justify-content:space-between; align-items:center; margin-top:38px;
70
+ font-size:13px; color:var(--muted); }
71
+ .foot .info span{ margin-right:26px; }
72
+ .foot .brand{ letter-spacing:.18em; font-size:11px; }
73
+ /* 结尾版式 */
74
+ body.mode-closing .center{ align-items:center; text-align:center; }
75
+ body.mode-closing .badge{ align-self:center; }
76
+ body.mode-closing .rule{ margin-left:auto; margin-right:auto;
77
+ background:linear-gradient(90deg,transparent,var(--accent),transparent); }
78
+ body.mode-closing .foot{ justify-content:center; }
79
+ body.mode-closing .stats{ display:none; }
80
+ /* 浅色主题适配:标题渐变不发虚、网格星点换深色、白卡靠投影分层 */
81
+ html[data-theme="biz"] .title, html[data-theme="mono"] .title{ filter:none; }
82
+ html[data-theme="biz"] .bg-grid, html[data-theme="mono"] .bg-grid{
83
+ background-image:linear-gradient(rgba(15,23,42,.05) 1px,transparent 1px),
84
+ linear-gradient(90deg,rgba(15,23,42,.05) 1px,transparent 1px); }
85
+ html[data-theme="biz"] .bg-stars, html[data-theme="mono"] .bg-stars{ opacity:.3; filter:grayscale(1) invert(1); }
86
+ html[data-theme="biz"] .stat, html[data-theme="mono"] .stat{ box-shadow:0 2px 10px rgba(0,0,0,.06); }
87
+ </style>
88
+ </head>
89
+ <body class="mode-cover">
90
+ <div class="bg-noise"></div>
91
+ <div class="bg-grid"></div>
92
+ <div class="bg-stars"></div>
93
+ <div class="card-glow"></div>
94
+ <div class="wrap">
95
+ <div class="badge" id="badge">GENERATED BY SPECCORE TEAM</div>
96
+ <div class="center">
97
+ <div class="title" id="title">2026 研发年度总结</div>
98
+ <div class="subtitle" id="subtitle">资深研发工程师 · 全栈方向</div>
99
+ <div class="rule"></div>
100
+ <div class="stats" id="stats"></div>
101
+ </div>
102
+ <div class="foot">
103
+ <div class="info"><span id="info">2026-01-01 ~ 2026-12-31 · 生成于 2026-11-11</span></div>
104
+ <div class="brand">GENERATED BY SPECCORE TEAM</div>
105
+ </div>
106
+ </div>
107
+ <script>
108
+ /* ── COVER 数据(AI 执行时替换此对象内容) ─────────────────────── */
109
+ var COVER = {
110
+ mode: "cover", // cover 封面 / closing 结尾
111
+ badge: "GENERATED BY SPECCORE TEAM",
112
+ title: "2026 研发年度总结",
113
+ subtitle: "资深研发工程师 · 全栈方向",
114
+ info: "2026-01-01 ~ 2026-12-31 · 生成于 2026-11-11",
115
+ stats: [ // 3-4 张数据卡;closing 模式忽略
116
+ { value: "486", label: "全年提交", delta: "较去年 +18%", up: true },
117
+ { value: "12.6万", label: "增删代码行", delta: "核心模块重构", up: true },
118
+ { value: "9", label: "版本里程碑", delta: "4 次大版本", up: true }
119
+ ]
120
+ };
121
+ (function apply(){
122
+ document.body.className = COVER.mode === "closing" ? "mode-closing" : "mode-cover";
123
+ document.getElementById("badge").textContent = COVER.badge || "";
124
+ document.getElementById("title").textContent = COVER.title || "";
125
+ document.getElementById("subtitle").textContent = COVER.subtitle || "";
126
+ document.getElementById("info").textContent = COVER.info || "";
127
+ var box = document.getElementById("stats");
128
+ box.innerHTML = "";
129
+ (COVER.stats || []).slice(0, 4).forEach(function(s){
130
+ var d = document.createElement("div");
131
+ d.className = "stat";
132
+ d.innerHTML = '<div class="v">' + s.value + '</div><div class="l">' + s.label + '</div>' +
133
+ (s.delta ? '<div class="d ' + (s.up === false ? "down" : "up") + '">' + s.delta + "</div>" : "");
134
+ box.appendChild(d);
135
+ });
136
+ })();
137
+ </script>
138
+ </body>
139
+ </html>
@@ -0,0 +1,111 @@
1
+ # data.json Schema 与转换规则
2
+
3
+ `pptx-builder.js` 的输入是结构化 `data.json`。AI 执行时从报告(md/HTML/口述大纲)或散装素材提炼本结构后调用生成器。
4
+
5
+ ## 一、完整 Schema
6
+
7
+ ```json
8
+ {
9
+ "meta": {
10
+ "title": "2026 研发年度总结", // pptx 文档标题
11
+ "subtitle": "资深研发工程师 · 全栈方向", // 封面副标题(可选)
12
+ "footer": "GENERATED BY SPECCORE TEAM · 2026" // 每页页脚(可选,缺省 GENERATED BY SPECCORE TEAM)
13
+ },
14
+ "theme": "tech", // tech(默认)/ biz / mono / warm,与报告四主题同源
15
+ "pages": [
16
+ { "type": "cover-image", "image": "/abs/path/cover.png",
17
+ "notes": "开场白:各位好,今天汇报本年度研发工作,先看总体数字……" },
18
+ { "type": "overview", "title": "年度概览", "color": "blue", "tlDr": "一句话结论",
19
+ "stats": [ { "value": "486", "label": "全年提交", "delta": "较去年 +18%", "deltaUp": true } ] },
20
+ { "type": "timeline", "title": "核心成果与里程碑", "color": "green",
21
+ "items": [ { "q": "Q1", "desc": "描述", "metric": "量化小字" } ] },
22
+ { "type": "bullets", "title": "经验与成长", "color": "purple",
23
+ "image": "/abs/path/photo.png", // 可选:右侧配图(contain 等比内嵌,仅第一页带图)
24
+ "items": [ { "t": "条目标题", "d": "条目描述" } ] },
25
+ { "type": "chart", "title": "月度提交分布", "color": "orange",
26
+ "values": [12, 45, 67], "labels": ["1月", "2月", "3月"] },
27
+ { "type": "chart-pie", "title": "技术栈占比", "color": "green",
28
+ "items": [ { "label": "前端", "value": 45 }, { "label": "后端", "value": 38 } ],
29
+ "percent": true, "donut": false }, // percent=true 显示百分比;donut=true 空心环
30
+ { "type": "chart-line", "title": "提交趋势", "color": "blue",
31
+ "labels": ["1月", "2月", "3月"], "smooth": true,
32
+ "series": [ { "name": "提交数", "values": [32, 41, 38] }, { "name": "评审数", "values": [20, 30, 26] } ] },
33
+ { "type": "closing-image", "image": "/abs/path/closing.png",
34
+ "notes": "收尾:以上是本年度汇报,感谢聆听,欢迎指正。" }
35
+ ]
36
+ }
37
+ ```
38
+
39
+ ## 二、页类型与版式说明
40
+
41
+ | 类型 | 版式 | 分页规则 |
42
+ |:---|:---|:---|
43
+ | `cover-image` | 整页铺图(封面截图,无任何装饰元素) | 固定 1 页 |
44
+ | `overview` | 节色竖线 + 标题 + TL;DR 一行 + 数据卡 3-6 张横排(大数字/标签/同比,左侧小色条) | 数据卡超 6 张自动截断 |
45
+ | `timeline` | 节色竖线 + 时间线 + 季度节点圆 + 条目(描述 + 量化小字) | 每页 8 条自动续页,q 字段带入 |
46
+ | `bullets` | 序号圆球徽章 + 标题 + 描述(可选右侧配图) | 每页 6 条自动续页 |
47
+ | `chart` | 自绘圆角柱 + 柱顶数值 + 底部标签(基线细线) | 固定 1 页,柱数不限(自动算宽) |
48
+ | `chart-pie` | 原生饼图(PPT 内可直接编辑数据),图例右侧 | 固定 1 页 |
49
+ | `chart-line` | 原生折线(PPT 内可直接编辑数据),多系列可选 | 固定 1 页 |
50
+ | `closing-image` | 整页铺图(结尾截图) | 固定 1 页 |
51
+
52
+ **color 取值**(五段节色,与年报同款):`blue` 概览 / `green` 成果 / `purple` 成长 / `rose` 反思 / `orange` 展望。
53
+
54
+ **数值纪律(沿用三件套量化转型规范)**:业务结果指标优先(响应时间/转化率/成功率),git 统计兜底;数字凡有对比基准必带(同比/环比);deltaUp=false 时同比红色。
55
+
56
+ ## 三、演讲备注(notes)
57
+
58
+ - 每页可带 `notes` 字段(字符串),写入该页演讲者备注:开场白/数据解读/过渡句,不写正文照读
59
+ - 自动续页页型(timeline/bullets)用 `notesList` 数组按分页逐页写(第 0 项写第一页,以此类推);`notes` 字符串只写在该类型第一页
60
+ - 话术按 user-config.md 的 AUDIENCE 画像调整语气与深度
61
+
62
+ ## 四、报告 → data.json 段落映射
63
+
64
+ ### 年报(五段式)
65
+
66
+ | 报告段落 | 页类型 | color |
67
+ |:---|:---|:---|
68
+ | 年度概览(TL;DR + 数据卡) | `cover-image`(数据卡上封面)+ `overview`(TL;DR + 数据卡) | blue |
69
+ | 核心成果与里程碑(Q1-Q4 时间线) | `timeline`(q=Q1..Q4,desc=成果描述,metric=量化小字) | green |
70
+ | 经验与成长 | `bullets`(t=条目标题,d=描述) | purple |
71
+ | 不足与反思 | `bullets` | rose |
72
+ | 新年展望与规划 | `bullets`(t=目标,d=量化指标与行动节点) | orange |
73
+ | 月度提交柱图 | `chart`(values=12 个月提交数,labels=1月..12月) | orange |
74
+ | 技术栈占比/构成类数据 | `chart-pie`(items=构成项) | green |
75
+ | 多期趋势对比(提交/工时双线等) | `chart-line`(series=多系列) | blue |
76
+ | — | `closing-image`(谢谢观看 + 署名) | — |
77
+
78
+ ### 周报
79
+
80
+ | 报告段落 | 页类型 | color |
81
+ |:---|:---|:---|
82
+ | 本周结论(三句卡) | `overview`(TL;DR=最重要结果,stats=结论三句或量化指标) | blue |
83
+ | 本周任务进度 | `timeline`(q=周一..周五 或任务名,desc=任务+完成标准) | green |
84
+ | 风险阻塞(四环) | `bullets`(t=问题,d=影响+建议+责任与时间) | rose |
85
+ | 下周计划 | `bullets`(t=任务,d=完成标准) | orange |
86
+ | 提交节奏柱图 | `chart`(values=每日提交数,labels=周一..周五) | orange |
87
+ | 一周提交趋势 | `chart-line`(values=每日提交数,labels=周一..周五,smooth=true) | blue |
88
+
89
+ ### 日报
90
+
91
+ | 报告段落 | 页类型 | color |
92
+ |:---|:---|:---|
93
+ | TL;DR | `overview`(tlDr + stats=量化指标 2-3 张) | blue |
94
+ | 今日任务进度 | `bullets`(t=任务,d=进度与数据) | green |
95
+ | 明日计划 | `bullets`(t=任务,d=完成标准) | orange |
96
+ | 风险阻塞 | `bullets`(t=问题,d=影响+建议) | rose |
97
+
98
+ ### 通用规则
99
+
100
+ - 素材入口四通道:指定目录(扫 md/txt/docx)/ 指定文件 / 贴文字 / 口述主题;无现成报告时按上述结构先提炼要点,写作规范沿用专业汇报 A/B/C 档(结论先行、量化优先、计划可验证)
101
+ - 报告含截图/图表素材 → 按需复用(报告 HTML 头部截图可作封面;bullets 页配图用 page.image)
102
+ - 无封面素材时一律用 `cover-template.html` 生成:AI 替换模板内 `COVER` 对象(mode/title/subtitle/info/stats)→ 临时 HTML → Chrome headless 截图 1280x720 → cover.png;`mode: closing` 生成结尾页
103
+ - `image` 一律用绝对路径(builder 按路径嵌入)
104
+
105
+ ## 五、执行命令
106
+
107
+ ```bash
108
+ cd <skill目录> && node resources/pptx-builder.js --data <data.json绝对路径> --out <输出pptx绝对路径>
109
+ ```
110
+
111
+ 输出 `PPTX_OK <绝对路径>` 即成功。生成后校验:文件存在 + 大小 > 20KB + `unzip -l` 含 `ppt/slides/slide*.xml` 且页数 = data.json pages 数(自动续页后以实际页数为准)。