skill-forge-hub 0.3.0 → 0.4.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.
- package/README.md +7 -6
- package/annual-report/SKILL.md +7 -7
- package/annual-report/resources/content-rules.md +11 -9
- package/annual-report/resources/data-collection.md +3 -3
- package/annual-report/resources/date-parsing.md +1 -1
- package/annual-report/resources/disk-and-html.md +5 -5
- package/annual-report/resources/industry-dictionary.md +3 -1
- package/annual-report/resources/reference.html +11 -11
- package/annual-report/resources/usage-guide.md +56 -15
- package/annual-report/user-config.md +1 -1
- package/cli.js +1 -0
- package/daily-report/SKILL.md +6 -5
- package/daily-report/resources/content-rules.md +27 -23
- package/daily-report/resources/data-collection.md +5 -5
- package/daily-report/resources/date-parsing.md +1 -1
- package/daily-report/resources/disk-and-html.md +1 -1
- package/daily-report/resources/industry-dictionary.md +3 -1
- package/daily-report/resources/reference.html +18 -14
- package/daily-report/resources/usage-guide.md +4 -4
- package/daily-report/user-config.md +1 -1
- package/magic-deck/SKILL.md +3 -3
- package/magic-deck/resources/deck-spec.md +36 -25
- package/magic-deck/resources/reference.html +319 -56
- package/magic-deck/user-config.md +2 -2
- package/meta-forge/resources/usage-guide.md +1 -1
- package/package.json +1 -1
- package/weekly-report/SKILL.md +6 -5
- package/weekly-report/resources/content-rules.md +38 -27
- package/weekly-report/resources/data-collection.md +5 -5
- package/weekly-report/resources/date-parsing.md +1 -1
- package/weekly-report/resources/disk-and-html.md +2 -2
- package/weekly-report/resources/industry-dictionary.md +5 -3
- package/weekly-report/resources/reference.html +49 -16
- package/weekly-report/resources/usage-guide.md +6 -6
- package/weekly-report/user-config.md +2 -2
|
@@ -112,33 +112,63 @@ button,select,input{ font-family:inherit; }
|
|
|
112
112
|
.endpage{ justify-content:center; align-items:center; text-align:center; }
|
|
113
113
|
.endpage .s-title{ font-size:56px; }
|
|
114
114
|
.endpage p{ margin-top:20px; font-size:16px; color:var(--muted); }
|
|
115
|
-
/* ══════════ 5.
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
115
|
+
/* ══════════ 5. 五模板运行时骨架(data-template 驱动;模板管版式、主题管配色) ══════════ */
|
|
116
|
+
/* 应用模板 = slide 挂 data-template + 结构包装器重组语义节点;标题自动映射到模板固定位置 */
|
|
117
|
+
/* T1 classic 经典商务:默认骨架,无前缀规则 */
|
|
118
|
+
/* T2 minimal 极简留白:去色条居中大标题、无边框卡片、窄栏要点 */
|
|
119
|
+
[data-template="minimal"] .s-head::before{ display:none; }
|
|
120
|
+
[data-template="minimal"] .s-head{ margin-bottom:28px; }
|
|
121
|
+
[data-template="minimal"] .s-head h2{ width:100%; font-size:44px; font-weight:900; text-align:center;
|
|
122
|
+
background:var(--title-grad); -webkit-background-clip:text; background-clip:text; color:transparent; }
|
|
123
|
+
[data-template="minimal"] .s-head .tag{ display:none; }
|
|
124
|
+
[data-template="minimal"] .s-title{ font-size:44px; text-align:center; }
|
|
125
|
+
[data-template="minimal"] .points{ margin:0 auto; max-width:640px; list-style:none; }
|
|
126
|
+
[data-template="minimal"] .points li{ padding:12px 0; border-bottom:1px solid var(--border);
|
|
119
127
|
font-size:20px; line-height:1.9; color:var(--text); }
|
|
120
|
-
|
|
121
|
-
|
|
128
|
+
[data-template="minimal"] .card{ background:transparent; border:none; padding:10px 0; box-shadow:none; }
|
|
129
|
+
[data-template="minimal"] .card:hover{ transform:none; box-shadow:none; }
|
|
130
|
+
[data-template="minimal"] .card h4{ font-size:20px; }
|
|
131
|
+
[data-template="minimal"] .bignum{ background:transparent; border:none; }
|
|
132
|
+
[data-template="minimal"] .bignum b{ font-size:88px; }
|
|
133
|
+
[data-template="minimal"] .cover .logo{ display:none; }
|
|
134
|
+
[data-template="minimal"] .cover{ align-items:center; text-align:center; }
|
|
135
|
+
[data-template="minimal"] .cover .sub{ border-top:1px solid var(--border); padding-top:22px; margin-top:30px; }
|
|
136
|
+
[data-template="minimal"] .toc-item{ background:transparent; border:none; border-bottom:1px solid var(--border); border-radius:0; }
|
|
137
|
+
/* T3 magazine 杂志画册:超大标题跨版 + 左文右图分栏(包装器生成)+ 横向大数字带 */
|
|
138
|
+
[data-template="magazine"] .s-title{ font-size:96px; line-height:1.05; }
|
|
139
|
+
[data-template="magazine"] .s-head h2{ font-size:56px; }
|
|
140
|
+
[data-template="magazine"] .card{ border-radius:18px; padding:28px 30px; }
|
|
141
|
+
[data-template="magazine"] .card h4{ font-size:22px; }
|
|
142
|
+
[data-template="magazine"] .card p{ font-size:15px; }
|
|
143
|
+
[data-template="magazine"] .bignum{ background:transparent; border:none; }
|
|
144
|
+
[data-template="magazine"] .bignum b{ font-size:88px; }
|
|
145
|
+
[data-template="magazine"] .cover .s-title{ font-size:96px; }
|
|
122
146
|
.m-split{ display:grid; grid-template-columns:46% 54%; gap:56px; align-items:center; }
|
|
123
147
|
.m-split h3{ font-size:36px; font-weight:800; color:var(--text); margin-bottom:18px; }
|
|
124
148
|
.m-split p{ font-size:16px; color:var(--muted); line-height:1.9; }
|
|
125
|
-
.m-figure{ height:380px; border-radius:18px; display:flex; align-items:flex-end;
|
|
149
|
+
.m-figure{ height:380px; border-radius:18px; display:flex; flex-wrap:wrap; align-items:flex-end;
|
|
150
|
+
align-content:flex-end; gap:10px; padding:20px;
|
|
126
151
|
background:linear-gradient(135deg,var(--accent),var(--accent2)); opacity:.85; }
|
|
127
|
-
.m-strip{ display:flex; justify-content:space-between; }
|
|
152
|
+
.m-strip{ display:flex; justify-content:space-between; margin-top:40px; }
|
|
128
153
|
.m-strip>div{ flex:1; text-align:center; border-left:1px solid var(--border); }
|
|
129
154
|
.m-strip>div:first-child{ border-left:0; }
|
|
130
155
|
.m-strip b{ display:block; font-size:64px; font-weight:900; background:var(--title-grad);
|
|
131
156
|
-webkit-background-clip:text; background-clip:text; color:transparent; }
|
|
132
157
|
.m-strip span{ font-size:14px; color:var(--muted); }
|
|
133
|
-
|
|
158
|
+
/* T4 keynote 黑金发布:每页单点大字(包装器生成)+ 环形进度 + 余量小字 */
|
|
159
|
+
[data-template="keynote"] .s-title{ font-size:112px; text-align:center; }
|
|
160
|
+
[data-template="keynote"] .cover{ align-items:center; text-align:center; }
|
|
161
|
+
[data-template="keynote"] .endpage .s-title{ font-size:96px; }
|
|
134
162
|
.k-big{ font-size:64px; font-weight:900; text-align:center; color:var(--text); margin:auto; }
|
|
135
163
|
.k-sub{ font-size:22px; color:var(--muted); text-align:center; margin-top:18px; }
|
|
136
164
|
.k-bar{ width:320px; height:4px; border-radius:2px; margin:40px auto 0;
|
|
137
165
|
background:linear-gradient(90deg,var(--accent),var(--accent2)); }
|
|
138
|
-
.k-ring{ width:120px; height:120px; border-radius:50%; margin:
|
|
166
|
+
.k-ring{ width:120px; height:120px; border-radius:50%; margin:14px auto 0;
|
|
139
167
|
background:conic-gradient(var(--accent) 0 72%, var(--border) 72% 100%);
|
|
140
168
|
display:flex; align-items:center; justify-content:center; }
|
|
141
169
|
.k-ring b{ font-size:34px; color:var(--text); }
|
|
170
|
+
.k-note{ margin:30px auto 0; max-width:560px; text-align:center; font-size:13px; color:var(--muted); line-height:1.9; }
|
|
171
|
+
/* T5 timeline 时间线叙事(结构由包装器生成:卡片标题→节点标题自动映射) */
|
|
142
172
|
.tl{ position:relative; padding-left:32px; }
|
|
143
173
|
.tl::before{ content:''; position:absolute; left:6px; top:8px; bottom:8px; width:3px; background:var(--accent); }
|
|
144
174
|
.tl-item{ position:relative; padding:18px 0 18px 24px; }
|
|
@@ -207,6 +237,27 @@ body:hover .nav{ opacity:1; }
|
|
|
207
237
|
.cp-foot{ display:flex; justify-content:flex-end; gap:10px; margin-top:14px; }
|
|
208
238
|
.cp-foot .tbtn{ border:1px solid var(--border); background:var(--tag-bg); cursor:pointer; }
|
|
209
239
|
.cp-foot .tbtn.primary{ background:var(--accent); color:var(--bg); border-color:transparent; }
|
|
240
|
+
/* ═══ 模板应用面板 ═══ */
|
|
241
|
+
.tpl-panel{ width:520px; max-height:78vh; display:flex; flex-direction:column; padding:24px 26px;
|
|
242
|
+
border-radius:16px; background:var(--panel-solid); border:1px solid var(--border); color:var(--text); }
|
|
243
|
+
.tpl-panel h3{ font-size:18px; margin:0; }
|
|
244
|
+
.tpl-head-note{ font-size:12px; color:var(--muted); }
|
|
245
|
+
.tpl-cards{ display:grid; grid-template-columns:repeat(2,1fr); gap:10px; margin:14px 0 12px; }
|
|
246
|
+
.tpl-card{ display:flex; align-items:center; gap:12px; padding:12px 14px; border-radius:12px;
|
|
247
|
+
background:var(--panel); border:1px solid var(--border); cursor:pointer; transition:all .15s ease; text-align:left; }
|
|
248
|
+
.tpl-card:hover{ border-color:var(--accent); }
|
|
249
|
+
.tpl-card.on{ border-color:var(--accent); box-shadow:0 0 0 2px var(--tag-bg), 0 0 16px var(--glow); }
|
|
250
|
+
.tpl-card .ic{ width:34px; height:34px; border-radius:9px; flex:0 0 auto; display:flex; align-items:center;
|
|
251
|
+
justify-content:center; font-size:16px; color:#fff; background:linear-gradient(135deg,var(--accent),var(--accent2)); }
|
|
252
|
+
.tpl-card .nm{ display:block; font-size:14px; font-weight:700; }
|
|
253
|
+
.tpl-card .ds{ display:block; font-size:11px; color:var(--muted); margin-top:2px; line-height:1.5; }
|
|
254
|
+
.tpl-scope{ display:flex; gap:8px; margin:2px 0 12px; flex-wrap:wrap; }
|
|
255
|
+
.tpl-scope label{ display:inline-flex; align-items:center; gap:6px; font-size:13px; cursor:pointer; padding:6px 12px;
|
|
256
|
+
border-radius:999px; border:1px solid var(--border); color:var(--muted); }
|
|
257
|
+
.tpl-scope label input{ margin:0; accent-color:var(--accent); }
|
|
258
|
+
.tpl-scope label.sel{ color:var(--accent); border-color:var(--accent); background:var(--tag-bg); }
|
|
259
|
+
#tplList{ display:none; }
|
|
260
|
+
#tplList.show{ display:block; }
|
|
210
261
|
/* ══════════ 7. 全屏放映纯净模式(PPT 放映规范:黑底 + 幻灯充满画面) ══════════ */
|
|
211
262
|
:root:fullscreen{ background:#000; } /* 放映黑底:与 PPT 软件放映一致,比例不匹配处补黑边,不带主题氛围边框 */
|
|
212
263
|
:root:fullscreen .bg-glow,
|
|
@@ -225,6 +276,9 @@ body:hover .nav{ opacity:1; }
|
|
|
225
276
|
<div class="fill" id="progFill" style="height:100%;width:0;background:linear-gradient(90deg,var(--accent),var(--accent2));transition:width .3s ease;"></div>
|
|
226
277
|
</div>
|
|
227
278
|
<div class="toolbar">
|
|
279
|
+
<div class="group">
|
|
280
|
+
<button class="tbtn" id="btnTemplate" title="五套版式模板:可应用到全部页面 / 仅本页 / 勾选页面,标题自动映射">🎨 模板</button>
|
|
281
|
+
</div>
|
|
228
282
|
<div class="group" title="主题:点色点整份换肤,点「仅本页」后只改当前页">
|
|
229
283
|
<button class="tbtn theme" data-theme="tech" title="tech 深蓝科技"></button>
|
|
230
284
|
<button class="tbtn theme" data-theme="biz" title="biz 浅色商务"></button>
|
|
@@ -289,65 +343,51 @@ body:hover .nav{ opacity:1; }
|
|
|
289
343
|
</section>
|
|
290
344
|
|
|
291
345
|
<!-- 页 4 minimal 极简留白 -->
|
|
292
|
-
<section class="slide" data-title="极简留白">
|
|
293
|
-
<div class="
|
|
294
|
-
|
|
295
|
-
<
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
</ul>
|
|
300
|
-
</div>
|
|
346
|
+
<section class="slide" data-title="极简留白" data-template="minimal">
|
|
347
|
+
<div class="s-title" style="margin-bottom:28px;">少即是多</div>
|
|
348
|
+
<ul class="points">
|
|
349
|
+
<li>没有卡片描边,只有文字与留白</li>
|
|
350
|
+
<li>信息密度低,观点反而更突出</li>
|
|
351
|
+
<li>适合观点陈述与开场引导</li>
|
|
352
|
+
</ul>
|
|
301
353
|
</section>
|
|
302
354
|
|
|
303
|
-
<!-- 页 5 magazine
|
|
304
|
-
<section class="slide" data-title="杂志画册">
|
|
305
|
-
<div class="
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
<p>左文右图 46/54 分栏,图位用主题渐变色块占位,杂志感扑面而来。数据页另有横向大数字带 m-strip 呈现关键指标。</p>
|
|
310
|
-
</div>
|
|
311
|
-
<div class="m-figure"><span class="chip">封面图位 · 渐变占位</span></div>
|
|
312
|
-
</div>
|
|
355
|
+
<!-- 页 5 magazine 杂志画册(分栏结构由包装器生成) -->
|
|
356
|
+
<section class="slide" data-title="杂志画册" data-template="magazine">
|
|
357
|
+
<div class="s-head"><h2>图与文的黄金分栏</h2><span class="tag">MAGAZINE</span></div>
|
|
358
|
+
<div class="grid2">
|
|
359
|
+
<div class="card"><h4>左文右图分栏<span class="en">Split</span></h4><p>46/54 分栏,图位用主题渐变色块占位,杂志感扑面而来。</p></div>
|
|
360
|
+
<div class="card"><h4>横向大数字带<span class="en">Strip</span></h4><p>数据页的 bignum 自动转成横向大数字带呈现关键指标。</p></div>
|
|
313
361
|
</div>
|
|
314
362
|
</section>
|
|
315
363
|
|
|
316
|
-
<!-- 页 6 keynote
|
|
317
|
-
<section class="slide" data-title="黑金发布">
|
|
318
|
-
<div class="
|
|
319
|
-
|
|
320
|
-
<div class="
|
|
321
|
-
<div class="
|
|
322
|
-
<div class="k-ring"><b>72%</b></div>
|
|
364
|
+
<!-- 页 6 keynote 黑金发布(单点大字结构由包装器生成) -->
|
|
365
|
+
<section class="slide" data-title="黑金发布" data-template="keynote">
|
|
366
|
+
<div class="s-head"><h2>一个观点,讲透</h2><span class="tag">KEYNOTE</span></div>
|
|
367
|
+
<div class="grid2">
|
|
368
|
+
<div class="card"><h4>每页一个核心信息<span class="en">Focus</span></h4><p>配合环形进度展示达成率。</p></div>
|
|
369
|
+
<div class="bignum"><b>72%</b><span>达成率</span></div>
|
|
323
370
|
</div>
|
|
324
371
|
</section>
|
|
325
372
|
|
|
326
|
-
<!-- 页 7 timeline
|
|
327
|
-
<section class="slide" data-title="时间线叙事">
|
|
373
|
+
<!-- 页 7 timeline 时间线叙事(时间线结构由包装器生成:卡片标题→节点标题) -->
|
|
374
|
+
<section class="slide" data-title="时间线叙事" data-template="timeline">
|
|
328
375
|
<div class="s-head"><h2>里程碑</h2><span class="tag">TIMELINE</span></div>
|
|
329
|
-
<div class="
|
|
330
|
-
<div class="
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
<div class="tl-item"><div class="tl-time">2026 Q3</div><h4>单页换肤</h4><p>整份或单页自由切换主题。</p></div>
|
|
334
|
-
</div>
|
|
376
|
+
<div class="grid3">
|
|
377
|
+
<div class="card"><h4>立项与架构<span class="en">2026 Q1</span></h4><p>完成技术选型与四主题变量体系。</p></div>
|
|
378
|
+
<div class="card"><h4>模板库建设<span class="en">2026 Q2</span></h4><p>五套版式骨架与主题正交组合。</p></div>
|
|
379
|
+
<div class="card"><h4>单页换肤<span class="en">2026 Q3</span></h4><p>整份或单页自由切换主题。</p></div>
|
|
335
380
|
</div>
|
|
336
381
|
</section>
|
|
337
382
|
|
|
338
|
-
<!-- 页 8 数据页(
|
|
383
|
+
<!-- 页 8 数据页(magazine 下 bignum 自动转横向大数字带) -->
|
|
339
384
|
<section class="slide" data-title="数据一览">
|
|
340
385
|
<div class="s-head"><h2>数据一览</h2><span class="tag">DATA</span></div>
|
|
341
386
|
<div class="grid4">
|
|
342
|
-
<div class="bignum"><b>
|
|
387
|
+
<div class="bignum"><b>99.9%</b><span>可用性</span></div>
|
|
343
388
|
<div class="bignum"><b>5</b><span>版式模板</span></div>
|
|
344
389
|
<div class="bignum"><b>4</b><span>配色主题</span></div>
|
|
345
|
-
<div class="bignum"><b>
|
|
346
|
-
</div>
|
|
347
|
-
<div class="m-strip" style="margin-top:40px;">
|
|
348
|
-
<div><b>99.9%</b><span>可用性</span></div>
|
|
349
|
-
<div><b>1</b><span>文件交付</span></div>
|
|
350
|
-
<div><b>0</b><span>外部依赖</span></div>
|
|
390
|
+
<div class="bignum"><b>0</b><span>外部依赖</span></div>
|
|
351
391
|
</div>
|
|
352
392
|
</section>
|
|
353
393
|
|
|
@@ -372,7 +412,27 @@ body:hover .nav{ opacity:1; }
|
|
|
372
412
|
<tr><td><kbd>Home</kbd> / <kbd>End</kbd></td><td>首页 / 末页</td></tr>
|
|
373
413
|
<tr><td><kbd>Esc</kbd></td><td>关弹层 / 退全屏</td></tr>
|
|
374
414
|
</table>
|
|
375
|
-
<div class="help-note">工具栏色点=整份换主题;点「⭮
|
|
415
|
+
<div class="help-note">工具栏色点=整份换主题;点「⭮ 仅本页」后色点只改当前页,再点恢复整份。「🎨 模板」=五套版式模板应用到全部页/仅本页/勾选页,标题自动映射,切回经典商务即恢复原排版。截图与复制只含主体内容,绝不包含工具栏/页码/箭头等操作元素;「▦ 选页复制 / 选页截图」可勾选任意页批量执行,截图逐张下载 PNG。</div>
|
|
416
|
+
</div>
|
|
417
|
+
</div>
|
|
418
|
+
<div class="help-mask" id="tplMask">
|
|
419
|
+
<div class="tpl-panel">
|
|
420
|
+
<div class="cp-head">
|
|
421
|
+
<h3>应用模板</h3>
|
|
422
|
+
<span class="tpl-head-note">模板只改版式,内容与配色不动</span>
|
|
423
|
+
</div>
|
|
424
|
+
<div class="tpl-cards" id="tplCards"></div>
|
|
425
|
+
<div class="tpl-scope">
|
|
426
|
+
<label class="sel"><input type="radio" name="tplScope" value="all" checked>全部页面</label>
|
|
427
|
+
<label><input type="radio" name="tplScope" value="current">仅本页</label>
|
|
428
|
+
<label><input type="radio" name="tplScope" value="selected">选择页面</label>
|
|
429
|
+
</div>
|
|
430
|
+
<div class="cp-list" id="tplList"></div>
|
|
431
|
+
<div class="cp-foot">
|
|
432
|
+
<button class="tbtn" id="tplCancel">取消</button>
|
|
433
|
+
<button class="tbtn primary" id="tplDo">应用模板</button>
|
|
434
|
+
</div>
|
|
435
|
+
<div class="help-note">标题自动映射到模板固定位置:timeline 取卡片标题做节点、keynote 取页标题做大观点、magazine 左文右图分栏,切回「经典商务」即恢复原始排版,内容一条不丢。模板与主题正交——换模板后配色保持不变。</div>
|
|
376
436
|
</div>
|
|
377
437
|
</div>
|
|
378
438
|
<div class="help-mask" id="copyMask">
|
|
@@ -458,6 +518,203 @@ btnScope.addEventListener('click', function(){
|
|
|
458
518
|
btnScope.textContent = btnScope.classList.contains('on') ? '⭮ 本页模式' : '⭮ 仅本页';
|
|
459
519
|
});
|
|
460
520
|
|
|
521
|
+
|
|
522
|
+
/* ── 模板应用(全部/本页/选页;标题自动映射到模板固定位置,内容不丢) ── */
|
|
523
|
+
var TPLS = [
|
|
524
|
+
{ id:'classic', name:'经典商务', ic:'▦', ds:'左色条标题 + 卡片栅格,稳重大方' },
|
|
525
|
+
{ id:'minimal', name:'极简留白', ic:'▫', ds:'居中大标题 + 无边框要点,安静克制' },
|
|
526
|
+
{ id:'magazine', name:'杂志画册', ic:'▤', ds:'超大标题跨版 + 左文右图 + 大数字带' },
|
|
527
|
+
{ id:'keynote', name:'黑金发布', ic:'◉', ds:'每页一个核心观点,大字居中 + 环形进度' },
|
|
528
|
+
{ id:'timeline', name:'时间线叙事', ic:'☰', ds:'竖线时间轴 + 节点卡片,适合历程回顾' }
|
|
529
|
+
];
|
|
530
|
+
function tplOf(s){ return s.getAttribute('data-template') || 'classic'; }
|
|
531
|
+
function ensureOrigin(s){ if (!s._origin) s._origin = s.innerHTML; }
|
|
532
|
+
function isSpecialPage(s){
|
|
533
|
+
return s.classList.contains('cover') || s.classList.contains('endpage') || !!s.querySelector('.toc');
|
|
534
|
+
}
|
|
535
|
+
function wrapTimeline(s){
|
|
536
|
+
var cards = s.querySelectorAll('.card, .points li');
|
|
537
|
+
if (!cards.length) return;
|
|
538
|
+
var tl = document.createElement('div'); tl.className = 'tl';
|
|
539
|
+
Array.prototype.forEach.call(cards, function(card){
|
|
540
|
+
var it = document.createElement('div'); it.className = 'tl-item';
|
|
541
|
+
var en = card.querySelector('.en');
|
|
542
|
+
var tm = document.createElement('div'); tm.className = 'tl-time';
|
|
543
|
+
tm.textContent = en ? en.textContent.trim() : '·';
|
|
544
|
+
it.appendChild(tm);
|
|
545
|
+
var h4 = card.querySelector('h4');
|
|
546
|
+
var t4 = document.createElement('h4');
|
|
547
|
+
t4.textContent = h4 ? h4.textContent.replace(en ? en.textContent : '', '').trim() : card.textContent.trim();
|
|
548
|
+
it.appendChild(t4);
|
|
549
|
+
var p = card.querySelector('p');
|
|
550
|
+
if (p){ var np = document.createElement('p'); np.textContent = p.textContent; it.appendChild(np); }
|
|
551
|
+
tl.appendChild(it);
|
|
552
|
+
});
|
|
553
|
+
var host = cards[0].parentNode;
|
|
554
|
+
host.parentNode.insertBefore(tl, host);
|
|
555
|
+
host.parentNode.removeChild(host);
|
|
556
|
+
}
|
|
557
|
+
function wrapKeynote(s){
|
|
558
|
+
var head = s.querySelector('.s-head h2, .s-title');
|
|
559
|
+
var sub = s.querySelector('.card p');
|
|
560
|
+
var num = s.querySelector('.bignum b');
|
|
561
|
+
if (!head && !num) return;
|
|
562
|
+
var kw = document.createElement('div');
|
|
563
|
+
kw.style.cssText = 'flex:1;display:flex;flex-direction:column;justify-content:center;';
|
|
564
|
+
if (head){
|
|
565
|
+
var kb = document.createElement('div'); kb.className = 'k-big';
|
|
566
|
+
kb.textContent = head.textContent; kw.appendChild(kb);
|
|
567
|
+
}
|
|
568
|
+
if (sub){
|
|
569
|
+
var ks = document.createElement('div'); ks.className = 'k-sub';
|
|
570
|
+
ks.textContent = sub.textContent; kw.appendChild(ks);
|
|
571
|
+
}
|
|
572
|
+
var bar = document.createElement('div'); bar.className = 'k-bar'; kw.appendChild(bar);
|
|
573
|
+
if (num){
|
|
574
|
+
var ring = document.createElement('div'); ring.className = 'k-ring';
|
|
575
|
+
var rb = document.createElement('b'); rb.textContent = num.textContent; ring.appendChild(rb);
|
|
576
|
+
kw.appendChild(ring);
|
|
577
|
+
}
|
|
578
|
+
var rest = [];
|
|
579
|
+
Array.prototype.forEach.call(s.querySelectorAll('.card h4'), function(h4){
|
|
580
|
+
rest.push(h4.childNodes[0] ? h4.childNodes[0].textContent.trim() : h4.textContent);
|
|
581
|
+
});
|
|
582
|
+
if (rest.length){
|
|
583
|
+
var kn = document.createElement('div'); kn.className = 'k-note';
|
|
584
|
+
kn.textContent = rest.join(' · '); kw.appendChild(kn);
|
|
585
|
+
}
|
|
586
|
+
while (s.firstChild) s.removeChild(s.firstChild);
|
|
587
|
+
s.appendChild(kw);
|
|
588
|
+
}
|
|
589
|
+
function wrapMagazine(s){
|
|
590
|
+
var head = s.querySelector('.s-head h2');
|
|
591
|
+
var p = s.querySelector('.card p');
|
|
592
|
+
var nums = s.querySelectorAll('.bignum');
|
|
593
|
+
if (!head && !p && !nums.length) return;
|
|
594
|
+
var mw = document.createElement('div');
|
|
595
|
+
mw.style.cssText = 'flex:1;display:flex;flex-direction:column;justify-content:center;';
|
|
596
|
+
var split = document.createElement('div'); split.className = 'm-split';
|
|
597
|
+
var left = document.createElement('div');
|
|
598
|
+
if (head){ var h3 = document.createElement('h3'); h3.textContent = head.textContent; left.appendChild(h3); }
|
|
599
|
+
if (p){ var np = document.createElement('p'); np.textContent = p.textContent; left.appendChild(np); }
|
|
600
|
+
split.appendChild(left);
|
|
601
|
+
var fig = document.createElement('div'); fig.className = 'm-figure';
|
|
602
|
+
Array.prototype.forEach.call(s.querySelectorAll('.card h4'), function(h4){
|
|
603
|
+
var chip = document.createElement('span'); chip.className = 'chip';
|
|
604
|
+
chip.textContent = h4.childNodes[0] ? h4.childNodes[0].textContent.trim() : h4.textContent;
|
|
605
|
+
fig.appendChild(chip);
|
|
606
|
+
});
|
|
607
|
+
if (!fig.children.length){
|
|
608
|
+
var chip = document.createElement('span'); chip.className = 'chip';
|
|
609
|
+
chip.textContent = '主题渐变图位'; fig.appendChild(chip);
|
|
610
|
+
}
|
|
611
|
+
split.appendChild(fig);
|
|
612
|
+
mw.appendChild(split);
|
|
613
|
+
if (nums.length >= 2){
|
|
614
|
+
var strip = document.createElement('div'); strip.className = 'm-strip';
|
|
615
|
+
Array.prototype.forEach.call(nums, function(n){
|
|
616
|
+
var d = document.createElement('div');
|
|
617
|
+
var b = document.createElement('b'); b.textContent = n.querySelector('b').textContent;
|
|
618
|
+
var sp = document.createElement('span'); sp.textContent = n.querySelector('span').textContent;
|
|
619
|
+
d.appendChild(b); d.appendChild(sp); strip.appendChild(d);
|
|
620
|
+
});
|
|
621
|
+
mw.appendChild(strip);
|
|
622
|
+
}
|
|
623
|
+
while (s.firstChild) s.removeChild(s.firstChild);
|
|
624
|
+
s.appendChild(mw);
|
|
625
|
+
}
|
|
626
|
+
function applyTpl(s, tpl){
|
|
627
|
+
ensureOrigin(s);
|
|
628
|
+
s.innerHTML = s._origin;
|
|
629
|
+
if (tpl === 'classic'){ s.removeAttribute('data-template'); return; }
|
|
630
|
+
s.setAttribute('data-template', tpl);
|
|
631
|
+
if (tpl === 'timeline') wrapTimeline(s);
|
|
632
|
+
else if (tpl === 'keynote' && !isSpecialPage(s)) wrapKeynote(s);
|
|
633
|
+
else if (tpl === 'magazine' && !isSpecialPage(s)) wrapMagazine(s);
|
|
634
|
+
}
|
|
635
|
+
function applyScope(tpl, scope, selected){
|
|
636
|
+
var n = 0;
|
|
637
|
+
slides.forEach(function(s, i){
|
|
638
|
+
if (scope === 'current' && i !== cur) return;
|
|
639
|
+
if (scope === 'selected' && selected.indexOf(i) < 0) return;
|
|
640
|
+
applyTpl(s, tpl); n++;
|
|
641
|
+
});
|
|
642
|
+
return n;
|
|
643
|
+
}
|
|
644
|
+
var tplMask = document.getElementById('tplMask');
|
|
645
|
+
var tplCards = document.getElementById('tplCards');
|
|
646
|
+
var tplList = document.getElementById('tplList');
|
|
647
|
+
var tplDo = document.getElementById('tplDo');
|
|
648
|
+
var btnTemplate = document.getElementById('btnTemplate');
|
|
649
|
+
var selTpl = 'classic';
|
|
650
|
+
function closeTplPanel(){ tplMask.classList.remove('open'); }
|
|
651
|
+
function updateTplListVis(){
|
|
652
|
+
var sc = tplMask.querySelector('input[name="tplScope"]:checked');
|
|
653
|
+
tplList.classList.toggle('show', !!(sc && sc.value === 'selected'));
|
|
654
|
+
}
|
|
655
|
+
function updateTplBtn(){
|
|
656
|
+
var sc = tplMask.querySelector('input[name="tplScope"]:checked');
|
|
657
|
+
var n = N;
|
|
658
|
+
if (sc && sc.value === 'selected') n = tplMask.querySelectorAll('.tpl-check:checked').length;
|
|
659
|
+
if (sc && sc.value === 'current') n = 1;
|
|
660
|
+
tplDo.textContent = n ? '应用模板(' + n + ' 页)' : '应用模板';
|
|
661
|
+
}
|
|
662
|
+
function openTplPanel(){
|
|
663
|
+
selTpl = tplOf(slides[cur]);
|
|
664
|
+
var html = '';
|
|
665
|
+
TPLS.forEach(function(tp){
|
|
666
|
+
html += '<div class="tpl-card' + (tp.id === selTpl ? ' on' : '') + '" data-tpl="' + tp.id + '">'
|
|
667
|
+
+ '<span class="ic">' + tp.ic + '</span>'
|
|
668
|
+
+ '<span><span class="nm">' + tp.name + '</span><span class="ds">' + tp.ds + '</span></span></div>';
|
|
669
|
+
});
|
|
670
|
+
tplCards.innerHTML = html;
|
|
671
|
+
var pageHtml = '';
|
|
672
|
+
for (var i = 0; i < N; i++) {
|
|
673
|
+
pageHtml += '<label class="cp-item"><input type="checkbox" class="tpl-check" value="' + i + '" checked>'
|
|
674
|
+
+ '<span class="cp-no">第 ' + (i + 1) + ' 页</span>'
|
|
675
|
+
+ '<span class="cp-preview">' + escapeHtml(pagePreview(i)) + '</span></label>';
|
|
676
|
+
}
|
|
677
|
+
tplList.innerHTML = pageHtml;
|
|
678
|
+
tplMask.querySelector('input[name="tplScope"][value="all"]').checked = true;
|
|
679
|
+
updateTplListVis();
|
|
680
|
+
updateTplBtn();
|
|
681
|
+
closeCopyPanel(); closeShotPanel();
|
|
682
|
+
tplMask.classList.add('open');
|
|
683
|
+
}
|
|
684
|
+
function doApplyTpl(){
|
|
685
|
+
var sc = tplMask.querySelector('input[name="tplScope"]:checked');
|
|
686
|
+
if (!sc) return;
|
|
687
|
+
var selected = [];
|
|
688
|
+
if (sc.value === 'selected'){
|
|
689
|
+
Array.prototype.forEach.call(tplMask.querySelectorAll('.tpl-check:checked'), function(box){ selected.push(parseInt(box.value, 10)); });
|
|
690
|
+
if (!selected.length) return;
|
|
691
|
+
}
|
|
692
|
+
var n = applyScope(selTpl, sc.value, selected);
|
|
693
|
+
closeTplPanel();
|
|
694
|
+
btnTemplate.textContent = '✓ 已应用 ' + n + ' 页';
|
|
695
|
+
setTimeout(function(){ btnTemplate.textContent = '🎨 模板'; }, 1500);
|
|
696
|
+
}
|
|
697
|
+
btnTemplate.addEventListener('click', openTplPanel);
|
|
698
|
+
document.getElementById('tplCancel').addEventListener('click', closeTplPanel);
|
|
699
|
+
tplDo.addEventListener('click', doApplyTpl);
|
|
700
|
+
tplCards.addEventListener('click', function(e){
|
|
701
|
+
var c = e.target.closest('.tpl-card');
|
|
702
|
+
if (!c) return;
|
|
703
|
+
selTpl = c.getAttribute('data-tpl');
|
|
704
|
+
Array.prototype.forEach.call(tplCards.children, function(x){ x.classList.remove('on'); });
|
|
705
|
+
c.classList.add('on');
|
|
706
|
+
});
|
|
707
|
+
tplMask.addEventListener('change', function(e){
|
|
708
|
+
if (e.target.name === 'tplScope'){
|
|
709
|
+
Array.prototype.forEach.call(tplMask.querySelectorAll('.tpl-scope label'), function(l){
|
|
710
|
+
l.classList.toggle('sel', l.querySelector('input') === e.target);
|
|
711
|
+
});
|
|
712
|
+
updateTplListVis(); updateTplBtn();
|
|
713
|
+
}
|
|
714
|
+
if (e.target.classList.contains('tpl-check')) updateTplBtn();
|
|
715
|
+
});
|
|
716
|
+
tplMask.addEventListener('click', function(e){ if (e.target === tplMask) closeTplPanel(); });
|
|
717
|
+
|
|
461
718
|
/* ── 翻页 / 键盘 ── */
|
|
462
719
|
document.getElementById('btnPrev').addEventListener('click', prev);
|
|
463
720
|
document.getElementById('btnNext').addEventListener('click', next);
|
|
@@ -475,7 +732,7 @@ document.addEventListener('keydown', function(e){
|
|
|
475
732
|
case 'c': case 'C': copyPage(); break;
|
|
476
733
|
case 'f': case 'F': toggleFull(); break;
|
|
477
734
|
case '?': helpMask.classList.add('open'); break;
|
|
478
|
-
case 'Escape': helpMask.classList.remove('open'); copyMask.classList.remove('open'); shotMask.classList.remove('open'); if (document.fullscreenElement) document.exitFullscreen(); break;
|
|
735
|
+
case 'Escape': helpMask.classList.remove('open'); copyMask.classList.remove('open'); shotMask.classList.remove('open'); tplMask.classList.remove('open'); if (document.fullscreenElement) document.exitFullscreen(); break;
|
|
479
736
|
default:
|
|
480
737
|
if (/^[1-9]$/.test(e.key) && parseInt(e.key, 10) <= N) go(parseInt(e.key, 10) - 1);
|
|
481
738
|
}
|
|
@@ -537,7 +794,7 @@ function openCopyPanel(){
|
|
|
537
794
|
cpList.innerHTML = html;
|
|
538
795
|
cpAll.checked = true;
|
|
539
796
|
updateCpBtn();
|
|
540
|
-
closeShotPanel();
|
|
797
|
+
closeShotPanel(); closeTplPanel();
|
|
541
798
|
copyMask.classList.add('open');
|
|
542
799
|
}
|
|
543
800
|
function updateCpBtn(){
|
|
@@ -635,7 +892,7 @@ function openShotPanel(){
|
|
|
635
892
|
spList.innerHTML = html;
|
|
636
893
|
spAll.checked = true;
|
|
637
894
|
updateSpBtn();
|
|
638
|
-
closeCopyPanel();
|
|
895
|
+
closeCopyPanel(); closeTplPanel();
|
|
639
896
|
shotMask.classList.add('open');
|
|
640
897
|
}
|
|
641
898
|
function updateSpBtn(){
|
|
@@ -693,8 +950,14 @@ function fit(){
|
|
|
693
950
|
window.addEventListener('resize', fit);
|
|
694
951
|
|
|
695
952
|
/* ── 初始化:?theme / ?shot / #/N ── */
|
|
953
|
+
slides.forEach(function(s){
|
|
954
|
+
var tp = s.getAttribute('data-template');
|
|
955
|
+
if (tp && tp !== 'classic') applyTpl(s, tp);
|
|
956
|
+
});
|
|
696
957
|
var themeParam = new URLSearchParams(location.search).get('theme');
|
|
697
958
|
if (['tech','biz','mono','warm'].indexOf(themeParam) > -1) setGlobalTheme(themeParam);
|
|
959
|
+
var tplParam = new URLSearchParams(location.search).get('tpl');
|
|
960
|
+
if (tplParam && TPLS.some(function(t){ return t.id === tplParam; })) applyScope(tplParam, 'all', []);
|
|
698
961
|
var sm = location.hash.match(/^#\/(\d+)$/);
|
|
699
962
|
var shotParam = new URLSearchParams(location.search).get('shot');
|
|
700
963
|
var jumped = false;
|
|
@@ -16,7 +16,7 @@ DIR: ~/Desktop # 幻灯片 HTML 落盘目录
|
|
|
16
16
|
FILENAME: auto # 文件名(不含扩展名):auto = 按本次内容主题+用途自动总结中文名(如「智能探针系统-产品介绍」,便于日后按名找回继续改);也可口头指定文件名(永远优先);或写死固定名如 slides(重名自动加日期后缀,不覆盖)
|
|
17
17
|
OPEN_HTML: true # 生成后自动打开浏览器放映
|
|
18
18
|
THEME: tech # 默认主题:tech 深蓝科技 / biz 浅色商务 / mono 极简黑白 / warm 温暖渐变(放映时工具栏可整份切换或「仅本页」单页换肤)
|
|
19
|
-
TEMPLATE: classic # 默认模板(版式骨架,与主题正交可自由组合):classic 经典商务 / minimal 极简留白 / magazine 杂志画册 / keynote 黑金发布 / timeline
|
|
19
|
+
TEMPLATE: classic # 默认模板(版式骨架,与主题正交可自由组合):classic 经典商务 / minimal 极简留白 / magazine 杂志画册 / keynote 黑金发布 / timeline 时间线叙事。生成时定默认版式,放映时可随时经工具栏「🎨 模板」面板切换(全部页/仅本页/勾选页,标题自动映射)
|
|
20
20
|
WIDTH: 1280 # 舞台宽度(16:9 基准,改宽高请同步改 deck-spec 同值)
|
|
21
21
|
HEIGHT: 720 # 舞台高度
|
|
22
22
|
SEC: 5 # 自动播放默认间隔(秒,可选 3/5/8/10)
|
|
@@ -32,6 +32,6 @@ SIGNATURE: GENERATED BY SKILLFORGE # 封面/结束页署名
|
|
|
32
32
|
|
|
33
33
|
## 📝 模板与主题(像真 PPT 一样可选)
|
|
34
34
|
|
|
35
|
-
-
|
|
35
|
+
- **内置模板五套**(版式骨架):classic 经典商务(默认)/ minimal 极简留白 / magazine 杂志画册 / keynote 黑金发布 / timeline 时间线叙事。改上方 `TEMPLATE` 即换生成默认,或生成时口头点名(如「用杂志风模板」)当次生效;放映时随时经工具栏「🎨 模板」面板切换(全部页面/仅本页/选择页面),标题自动映射到模板固定位置,切回经典商务即恢复原排版
|
|
36
36
|
- **内置主题四套**(配色,放映时随时换):tech / biz / mono / warm。工具栏色点点击=整份切换;点「⭮ 仅本页」后再点色点=只给当前页换肤,再点一次恢复整份模式
|
|
37
37
|
- **自定义模板片段**(可选):在 `resources/templates/` 下放 `my-*.html`(仅 body 内容片段,不含 html/head/script),生成时用户点名模板名即可套用;未点名用内置五套模板
|
|
@@ -18,7 +18,7 @@ meta-forge 是「造 skill 的 skill」:把一段重复劳作,按 SkillForge
|
|
|
18
18
|
直接说需求即可,例如:
|
|
19
19
|
|
|
20
20
|
- 「做一个会议纪要技能」→ 澄清需求后生成技能包
|
|
21
|
-
-
|
|
21
|
+
- 「把日报生成流程做成技能,含 HTML 报告」→ 生成并植入 reference 双轨机制
|
|
22
22
|
- 「做一个 XX 技能,不用登记进仓库」→ 只生成技能包
|
|
23
23
|
|
|
24
24
|
只问用法(如「元锻炉怎么用」)时,本指南原样输出,不创建任何文件。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skill-forge-hub",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "SkillForge (技能锻造坊) — a curated collection of AI craft skills. Install once, then pick skills interactively: daily/weekly reports, article-to-HTML, SpecCore document converters.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"skill-forge": "cli.js"
|
package/weekly-report/SKILL.md
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: weekly-report
|
|
3
|
-
description:
|
|
3
|
+
description: 生成工作周报(默认本周结论+本周任务进度/下周计划/风险阻塞点结构,中文顿号序号,1D=8H),适配各行业(内置 12 行业职业词典,可指定角色身份)。数据来源灵活:直接口述、给一段文字、发文件(Word/PDF/Excel/PPT 等)或图片,都能整理成周报。支持自定义模板(可永久或临时指定)、周结束日可配置(默认周五,可改周日等)。支持自然语言定位周(本周/上周/10月第2周/10月20号所在周等)。当用户请求写周报、本周周报、上周周报、生成周报、/weekly-report,或询问周报用法(周报怎么用/周报使用说明/周报有哪些使用方式)时使用。
|
|
4
4
|
allowed-tools: Bash, Read, Write
|
|
5
5
|
disable-model-invocation: false
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# 周报生成
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
多源数据生成四段式周报(本周结论三句 + 本周任务进度/下周计划/风险阻塞点 + 本周概览卡)——数据来源灵活:一段文字、文件里的描述、图片或口头补充皆可成稿;对话输出 md 正文 + 落盘 md/txt/html/content-png 并自动打开 html。
|
|
11
11
|
|
|
12
12
|
## 生成流程
|
|
13
13
|
|
|
14
14
|
0. **读用户配置**(DISK/FORMATS/DIR/OPEN_HTML/TEMPLATE/ROLE/CONFIRM/CONFIG_VERSION、自定义模板)→ 先 Read 同目录 `user-config.md`
|
|
15
15
|
1. **解析周**(自然语言 → 目标周:周一起点、WEEK_END 结束日)→ 读 `resources/date-parsing.md`
|
|
16
|
-
2.
|
|
16
|
+
2. **收集数据**(多源:会话口述 / 文字 / 文件 / 图片 / 代码提交记录,合并去重;同取上周数据供概览环比)→ 读 `resources/data-collection.md`
|
|
17
17
|
3. **内容归类与润色**(聚合来源 / 补充任务 / 纯文字模式 / 输出格式 / 写作风格)→ 读 `resources/content-rules.md`
|
|
18
18
|
4. **行业词条**(话术含职业词时按词典取词)→ 读 `resources/industry-dictionary.md`
|
|
19
19
|
5. **落盘与截图**(md/txt/html/content-png + 自动打开 html)→ 读 `resources/disk-and-html.md`
|
|
20
|
-
6. **使用咨询**(用户只问「周报怎么用」等用法、未要求生成)→ 读 `resources/usage-guide.md
|
|
20
|
+
6. **使用咨询**(用户只问「周报怎么用」等用法、未要求生成)→ 读 `resources/usage-guide.md`,将其内容原样输出(首行标题改为「周报生成器使用指南」),不收集数据、不生成报告、不落盘、不开浏览器
|
|
21
21
|
|
|
22
22
|
## ⚙️ 配置与自定义模板
|
|
23
23
|
|
|
@@ -41,6 +41,7 @@ disable-model-invocation: false
|
|
|
41
41
|
## 规则速览
|
|
42
42
|
|
|
43
43
|
- 任务进度 5-15 点、每点 30-60 字;序号用中文顿号(1、2、3)
|
|
44
|
-
-
|
|
44
|
+
- 本周结论三句先行(最重要的结果/值得处理的变化/下周优先的动作,与 TL;DR 呼应不重复);四段兜底写「暂无」;计划点带进度百分比与预估用时+完成标准(口述有时必写);风险阻塞点四环(问题+影响+建议+责任与时间,第四环口述有时必写)
|
|
45
45
|
- 用时单位 X.XD(天,1D=8H),估算值注明「约」;落盘子目录名 = 当周最后一天(WEEK_END)日期
|
|
46
|
+
- 数字凡有对比基准必带;业务结果指标优先于提交统计;流水无主语、结论判断归因处允许「我」;落笔前五问自检(结论/基准/闭环/可验证/归属)
|
|
46
47
|
- 完整规则(聚合来源 / 纯文字模式 / 写作风格约束 / 使用提示)见 `resources/content-rules.md`
|