skill-forge-hub 1.3.8 → 1.3.9

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/CHANGELOG.en.md CHANGED
@@ -4,6 +4,14 @@
4
4
 
5
5
  Version history of the SkillForge npm package `skill-forge-hub` (command name `skill-forge`).
6
6
 
7
+ ## 1.3.9 (2026-11-13)
8
+
9
+ **Theme-switch fade across twelve templates: 0.45s color transition instead of a hard flip**
10
+
11
+ - Skin mechanism upgrade: clicking the theme dock / theme panel briefly adds a transient .theming class to <html> (auto-removed after 650ms), during which background/text/border/shadow/SVG fill-stroke colors transition smoothly at 0.45s — the switch now dissolves like ink; outside that window the class is absent, so existing element animations and hover effects stay untouched
12
+ - Three guards: restoring a remembered theme on page load triggers no animation (no first-paint flicker); rapid consecutive theme clicks are debounced via timer reset; prefers-reduced-motion users get an instant switch (accessibility)
13
+ - All template stamps bumped: daily/weekly/monthly/quarterly @2→3, annual/meeting-minutes @3→4, prompt-pouch @15→16, article-to-html @2→3, commit-heatmap/team-report-collector @1→2, one-pager @10→11, magic-deck @2→3 (say "upgrade my old pages" to remelt existing artifacts)
14
+
7
15
  ## 1.3.8 (2026-11-13)
8
16
 
9
17
  **Data-collection config consolidation across seven report skills (five-suite v4 / meeting-minutes v3)**
package/CHANGELOG.md CHANGED
@@ -4,6 +4,14 @@
4
4
 
5
5
  SkillForge(技能锻造坊)npm 包 `skill-forge-hub`(命令名 `skill-forge`)版本变更记录。
6
6
 
7
+ ## 1.3.9(2026-11-13)
8
+
9
+ **十二模板主题切换渐变:换肤不再生硬闪切,全页颜色 0.45s 平滑过渡**
10
+
11
+ - 换肤机制升级:点击换肤坞/主题面板的瞬间给 <html> 挂瞬态 .theming 类(650ms 后自动摘除),期间全页背景/文字/边框/阴影/SVG 填充描边六项颜色属性以 0.45s 匀速渐变,切换如墨晕开;平时类不存在,各元素既有动画与 hover 零影响
12
+ - 细节三保障:页面加载恢复记忆主题不触发动画(首屏不闪);快速连点换肤计时器防抖互不打架;系统「减弱动态效果」偏好自动跳过渐变(无障碍惯例)
13
+ - 版本戳全量 +1:日报/周报/月报/季报 @2→3、年报/会议纪要 @3→4、锦囊 @15→16、文章页 @2→3、热力图/收集台 @1→2、一页纸 @10→11、演示稿 @2→3(旧产物说「升级旧页面」即可回炉换新)
14
+
7
15
  ## 1.3.8(2026-11-13)
8
16
 
9
17
  **报告七技能数据收集配置归位:配置落 user-config,机制文档收敛(五件套 v4 / 会议纪要 v3)**
@@ -53,7 +53,7 @@ disable-model-invocation: false
53
53
 
54
54
  ## 产物升级(回炉)
55
55
 
56
- 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="annual-report@3">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧产物/回炉旧页面/旧年报换新样式」时:扫落盘目录下本技能命名的 html,读版本戳筛出旧版(无版本戳或缺少 `<meta name="annual-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单) → 列清单(文件/旧版本/手改状态——旧 html 正文与同目录 md 正文对比,不一致视为可能手改过)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文内容原样保留;深升级(DOM 结构变化)从同目录 md 底稿按当前 reference.html 重建,先备份旧版 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知「技能模板已升级至 vN,检测到 X 份旧版年报(vN-1 或无版本戳的历史产物),说『把我旧年报都升级成新样式』即可一键升级」,不让用户背触发语。
56
+ 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="annual-report@4">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧产物/回炉旧页面/旧年报换新样式」时:扫落盘目录下本技能命名的 html,读版本戳筛出旧版(无版本戳或缺少 `<meta name="annual-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单) → 列清单(文件/旧版本/手改状态——旧 html 正文与同目录 md 正文对比,不一致视为可能手改过)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文内容原样保留;深升级(DOM 结构变化)从同目录 md 底稿按当前 reference.html 重建,先备份旧版 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知「技能模板已升级至 vN,检测到 X 份旧版年报(vN-1 或无版本戳的历史产物),说『把我旧年报都升级成新样式』即可一键升级」,不让用户背触发语。
57
57
 
58
58
  ## 🔧 报修处理流程(用户报页面问题时)
59
59
 
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <meta name="sf-template" content="annual-report@3">
6
+ <meta name="sf-template" content="annual-report@4">
7
7
  <meta name="annual-id" content="REF-ANNUAL-0000">
8
8
  <title>2026 研发年度总结</title>
9
9
  <style>
@@ -252,6 +252,10 @@ html.js .rv.in{ opacity:1; translate:0 0; }
252
252
  .header-card{ padding:26px 18px 20px; }
253
253
  .header-card h1{ font-size:26px; }
254
254
  }
255
+ /* 主题切换渐变:切换瞬间给 html 挂 .theming 类(650ms 后自动摘除),期间全页颜色属性平滑过渡;平时类不存在,不影响任何元素 */
256
+ html.theming, html.theming *, html.theming *::before, html.theming *::after{ transition: background-color .45s ease, color .45s ease, border-color .45s ease, box-shadow .45s ease, fill .45s ease, stroke .45s ease !important; }
257
+ @media (prefers-reduced-motion: reduce){ html.theming, html.theming *{ transition: none !important; } }
258
+
255
259
  </style>
256
260
  </head>
257
261
  <body>
@@ -513,7 +517,7 @@ var SF_NS = 'annual:' + SF_ID;
513
517
  var saved = null; try{ saved = localStorage.getItem(SF_NS + '-theme') || localStorage.getItem('sf:' + location.pathname + '-theme'); }catch(e){}
514
518
  if (saved && THEMES.indexOf(saved) !== -1 && saved !== cur){ apply(saved); }
515
519
  else{ dock.querySelectorAll('.th-dot').forEach(function(d){ d.classList.toggle('on', d.getAttribute('data-theme') === (cur || 'tech')); }); }
516
- dock.querySelectorAll('.th-dot').forEach(function(d){ d.addEventListener('click', function(){ apply(d.getAttribute('data-theme')); }); });
520
+ dock.querySelectorAll('.th-dot').forEach(function(d){ d.addEventListener('click', function(){ var r = document.documentElement; r.classList.add('theming'); clearTimeout(r.__sfThT); r.__sfThT = setTimeout(function(){ r.classList.remove('theming'); }, 650); apply(d.getAttribute('data-theme')); }); });
517
521
  })();
518
522
 
519
523
  /* 滚动入场:初始视口外的卡片滚到视口才上浮渐显(首屏卡维持加载错峰动画);无 JS 时 html.js 不生效全显 */
@@ -32,7 +32,7 @@ Turn any Word/Markdown/plain-text article into a standalone styled HTML page and
32
32
 
33
33
  ## 产物升级(回炉)
34
34
 
35
- 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="article-to-html@2">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧产物/回炉旧页面/旧文章页换新样式」时:扫落盘目录下本技能生成的 html,读版本戳筛出旧版(无版本戳或缺少 `<meta name="article-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单)→ 列清单(文件/旧版本/手改状态——html 与同目录 md 底稿正文对比,不一致视为可能手改过;无 md 底稿时标记「无法比对」)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文内容原样保留;深升级(DOM 结构变化)从 md 底稿按当前 reference.html 重建(无 md 底稿则提取旧 html 正文重建),先备份旧版 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物(vN-1 或无版本戳的历史产物)主动告知「技能模板已升级至 vN,检测到 X 份旧版文章页,说『把我旧文章页都升级成新样式』即可一键升级」,不让用户背触发语。
35
+ 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="article-to-html@3">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧产物/回炉旧页面/旧文章页换新样式」时:扫落盘目录下本技能生成的 html,读版本戳筛出旧版(无版本戳或缺少 `<meta name="article-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单)→ 列清单(文件/旧版本/手改状态——html 与同目录 md 底稿正文对比,不一致视为可能手改过;无 md 底稿时标记「无法比对」)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文内容原样保留;深升级(DOM 结构变化)从 md 底稿按当前 reference.html 重建(无 md 底稿则提取旧 html 正文重建),先备份旧版 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物(vN-1 或无版本戳的历史产物)主动告知「技能模板已升级至 vN,检测到 X 份旧版文章页,说『把我旧文章页都升级成新样式』即可一键升级」,不让用户背触发语。
36
36
 
37
37
  ## Prerequisites(新用户准备)
38
38
 
@@ -13,7 +13,7 @@
13
13
  <head>
14
14
  <meta charset="UTF-8">
15
15
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
16
- <meta name="sf-template" content="article-to-html@2">
16
+ <meta name="sf-template" content="article-to-html@3">
17
17
  <meta name="article-id" content="REF-ARTICLE-0000">
18
18
  <title>设计系统组件示范 · article-to-html</title>
19
19
  <style>
@@ -309,6 +309,10 @@ td.hl{font-weight:700;color:var(--ink)}
309
309
  .author p{font-size:13.5px;color:var(--ink-2);margin:0;line-height:1.7}
310
310
 
311
311
  .foot{text-align:center;padding:34px 0 44px;color:var(--ink-4);font-size:12.5px}
312
+ /* 主题切换渐变:切换瞬间给 html 挂 .theming 类(650ms 后自动摘除),期间全页颜色属性平滑过渡;平时类不存在,不影响任何元素 */
313
+ html.theming, html.theming *, html.theming *::before, html.theming *::after{ transition: background-color .45s ease, color .45s ease, border-color .45s ease, box-shadow .45s ease, fill .45s ease, stroke .45s ease !important; }
314
+ @media (prefers-reduced-motion: reduce){ html.theming, html.theming *{ transition: none !important; } }
315
+
312
316
  </style>
313
317
  </head>
314
318
  <body>
@@ -624,7 +628,7 @@ var SF_NS = 'article:' + SF_ID;
624
628
  try{ saved=localStorage.getItem(SF_NS + '-theme') || localStorage.getItem('sf:' + location.pathname + '-theme'); }catch(e){}
625
629
  if(saved && THEMES.indexOf(saved)!==-1 && saved!==cur){ apply(saved); }
626
630
  else{ dock.querySelectorAll('.th-dot').forEach(function(d){ d.classList.toggle('on',d.getAttribute('data-theme')===(cur||'tech')); }); }
627
- dock.querySelectorAll('.th-dot').forEach(function(d){ d.addEventListener('click',function(){ apply(d.getAttribute('data-theme')); }); });
631
+ dock.querySelectorAll('.th-dot').forEach(function(d){ d.addEventListener('click',function(){ var r=document.documentElement; r.classList.add('theming'); clearTimeout(r.__sfThT); r.__sfThT=setTimeout(function(){ r.classList.remove('theming'); },650); apply(d.getAttribute('data-theme')); }); });
628
632
  })();
629
633
  </script>
630
634
  </body>
@@ -51,7 +51,7 @@ disable-model-invocation: false
51
51
 
52
52
  ## 产物升级(回炉)
53
53
 
54
- 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="commit-heatmap@1">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧热力图/回炉」时:扫落盘目录读版本戳筛旧版(无版本戳或缺少 `<meta name="heat-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单)→ 列清单(文件/旧版本)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文原样保留;深升级(DOM 结构变化)重新跑 git 收集按当前 reference.html 重建,先备份旧版 `.bak-时间戳`,重建必须沿用原页 heat-id meta 值(换 ID = 主题记忆失联)→ 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动、数据格式改动、页面改动任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知用户「说『把我旧热力图都升级成新样式』即可一键升级」。
54
+ 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="commit-heatmap@2">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧热力图/回炉」时:扫落盘目录读版本戳筛旧版(无版本戳或缺少 `<meta name="heat-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单)→ 列清单(文件/旧版本)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文原样保留;深升级(DOM 结构变化)重新跑 git 收集按当前 reference.html 重建,先备份旧版 `.bak-时间戳`,重建必须沿用原页 heat-id meta 值(换 ID = 主题记忆失联)→ 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动、数据格式改动、页面改动任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知用户「说『把我旧热力图都升级成新样式』即可一键升级」。
55
55
 
56
56
  ## 规则速览
57
57
 
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <meta name="sf-template" content="commit-heatmap@1">
6
+ <meta name="sf-template" content="commit-heatmap@2">
7
7
  <meta name="heat-id" content="REF-HEAT-0000">
8
8
  <title>提交热力图 · 示例项目</title>
9
9
  <style>
@@ -74,6 +74,10 @@ body{background:var(--bg);color:var(--text);font-family:system-ui,'Segoe UI',Rob
74
74
  .th-dot.on{border-color:var(--today-ring)}
75
75
  footer{text-align:center;color:var(--muted);font-size:10px;margin-top:26px}
76
76
  html[data-shot] .card{animation:none!important}
77
+ /* 主题切换渐变:切换瞬间给 html 挂 .theming 类(650ms 后自动摘除),期间全页颜色属性平滑过渡;平时类不存在,不影响任何元素 */
78
+ html.theming, html.theming *, html.theming *::before, html.theming *::after{ transition: background-color .45s ease, color .45s ease, border-color .45s ease, box-shadow .45s ease, fill .45s ease, stroke .45s ease !important; }
79
+ @media (prefers-reduced-motion: reduce){ html.theming, html.theming *{ transition: none !important; } }
80
+
77
81
  </style>
78
82
  </head>
79
83
  <body>
@@ -141,6 +145,7 @@ window.HEAT_STATS = {total:486, streak:12, active:"62%", topDay:"2026-11-05", to
141
145
  document.querySelectorAll('.th-dot').forEach(function(d){
142
146
  d.addEventListener('click', function(){
143
147
  var t = d.getAttribute('data-t');
148
+ var r = document.documentElement; r.classList.add('theming'); clearTimeout(r.__sfThT); r.__sfThT = setTimeout(function(){ r.classList.remove('theming'); }, 650);
144
149
  document.documentElement.setAttribute('data-theme', t);
145
150
  localStorage.setItem(THEME_KEY, t);
146
151
  document.querySelectorAll('.th-dot').forEach(function(x){ x.classList.toggle('on', x === d); });
@@ -53,7 +53,7 @@ disable-model-invocation: false
53
53
 
54
54
  ## 产物升级(回炉)
55
55
 
56
- 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="daily-report@2">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧产物/回炉旧页面/旧日报换新样式」时:扫落盘目录下本技能命名的 html,读版本戳筛出旧版(无版本戳或缺少 `<meta name="daily-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单) → 列清单(文件/旧版本/手改状态——旧 html 正文与同目录 md 正文对比,不一致视为可能手改过)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文内容原样保留;深升级(DOM 结构变化)从同目录 md 底稿按当前 reference.html 重建,先备份旧版 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知「技能模板已升级至 vN,检测到 X 份旧版日报(vN-1 或无版本戳的历史产物),说『把我旧日报都升级成新样式』即可一键升级」,不让用户背触发语。
56
+ 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="daily-report@3">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧产物/回炉旧页面/旧日报换新样式」时:扫落盘目录下本技能命名的 html,读版本戳筛出旧版(无版本戳或缺少 `<meta name="daily-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单) → 列清单(文件/旧版本/手改状态——旧 html 正文与同目录 md 正文对比,不一致视为可能手改过)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文内容原样保留;深升级(DOM 结构变化)从同目录 md 底稿按当前 reference.html 重建,先备份旧版 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知「技能模板已升级至 vN,检测到 X 份旧版日报(vN-1 或无版本戳的历史产物),说『把我旧日报都升级成新样式』即可一键升级」,不让用户背触发语。
57
57
 
58
58
  ## 🔧 报修处理流程(用户报页面问题时)
59
59
 
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <meta name="sf-template" content="daily-report@2">
6
+ <meta name="sf-template" content="daily-report@3">
7
7
  <meta name="daily-id" content="REF-DAILY-0000">
8
8
  <title>今日日报 - 20261106</title>
9
9
  <style>
@@ -406,6 +406,10 @@ html.js .rv.in{ opacity:1; translate:0 0; }
406
406
  .header-card{ padding:26px 18px 20px; }
407
407
  .header-card h1{ font-size:26px; }
408
408
  }
409
+ /* 主题切换渐变:切换瞬间给 html 挂 .theming 类(650ms 后自动摘除),期间全页颜色属性平滑过渡;平时类不存在,不影响任何元素 */
410
+ html.theming, html.theming *, html.theming *::before, html.theming *::after{ transition: background-color .45s ease, color .45s ease, border-color .45s ease, box-shadow .45s ease, fill .45s ease, stroke .45s ease !important; }
411
+ @media (prefers-reduced-motion: reduce){ html.theming, html.theming *{ transition: none !important; } }
412
+
409
413
  </style>
410
414
  </head>
411
415
  <body>
@@ -762,7 +766,7 @@ var SF_NS = 'daily:' + SF_ID;
762
766
  });
763
767
  }
764
768
  dock.querySelectorAll('.th-dot').forEach(function(d){
765
- d.addEventListener('click', function(){ apply(d.getAttribute('data-theme')); });
769
+ d.addEventListener('click', function(){ var r = document.documentElement; r.classList.add('theming'); clearTimeout(r.__sfThT); r.__sfThT = setTimeout(function(){ r.classList.remove('theming'); }, 650); apply(d.getAttribute('data-theme')); });
766
770
  });
767
771
  })();
768
772
  /* 滚动入场:初始视口外的卡片滚到视口才上浮渐显(首屏卡维持加载错峰动画);无 JS 时 html.js 不生效全显 */
@@ -76,7 +76,7 @@ disable-model-invocation: false
76
76
 
77
77
  ## 产物升级(回炉)
78
78
 
79
- 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="magic-deck@2">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧产物/回炉旧页面/旧演示稿换新样式」时:扫落盘目录下本技能生成的 html,读版本戳筛出旧版(无版本戳或缺少 `<meta name="deck-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单)→ 列清单(文件/旧版本/手改状态——deck 是单文件产物无 md 底稿,标记「无底稿,正文保留」)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文与 slide 内容原样保留;深升级(DOM 结构变化)提取旧页 slide 内容按当前 reference.html 重建,先备份旧版 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物(vN-1 或无版本戳的历史产物)主动告知「技能模板已升级至 vN,检测到 X 份旧版演示稿,说『把我旧演示稿都升级成新样式』即可一键升级」,不让用户背触发语。
79
+ 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="magic-deck@3">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧产物/回炉旧页面/旧演示稿换新样式」时:扫落盘目录下本技能生成的 html,读版本戳筛出旧版(无版本戳或缺少 `<meta name="deck-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单)→ 列清单(文件/旧版本/手改状态——deck 是单文件产物无 md 底稿,标记「无底稿,正文保留」)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文与 slide 内容原样保留;深升级(DOM 结构变化)提取旧页 slide 内容按当前 reference.html 重建,先备份旧版 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物(vN-1 或无版本戳的历史产物)主动告知「技能模板已升级至 vN,检测到 X 份旧版演示稿,说『把我旧演示稿都升级成新样式』即可一键升级」,不让用户背触发语。
80
80
 
81
81
  ## 📏 文档同步自检纪律(维护者必读)
82
82
 
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <meta name="sf-template" content="magic-deck@2">
6
+ <meta name="sf-template" content="magic-deck@3">
7
7
  <meta name="deck-id" content="REF-DECK-0000">
8
8
  <title>Reference 骨架 — magic-deck 定稿样例</title>
9
9
  <style>
@@ -784,6 +784,10 @@ body:hover .nav{ opacity:1; }
784
784
  .slide [data-anim-chart] .pt{ opacity:1 !important; }
785
785
  }
786
786
 
787
+ /* 主题切换渐变:切换瞬间给 html 挂 .theming 类(650ms 后自动摘除),期间全页颜色属性平滑过渡;平时类不存在,不影响任何元素 */
788
+ html.theming, html.theming *, html.theming *::before, html.theming *::after{ transition: background-color .45s ease, color .45s ease, border-color .45s ease, box-shadow .45s ease, fill .45s ease, stroke .45s ease !important; }
789
+ @media (prefers-reduced-motion: reduce){ html.theming, html.theming *{ transition: none !important; } }
790
+
787
791
  </style>
788
792
  </head>
789
793
  <body>
@@ -1348,6 +1352,7 @@ themeGrid.addEventListener('click', function(e){
1348
1352
  var it = e.target.closest('.th-item');
1349
1353
  if (!it) return;
1350
1354
  pushUndo();
1355
+ var r = document.documentElement; r.classList.add('theming'); clearTimeout(r.__sfThT); r.__sfThT = setTimeout(function(){ r.classList.remove('theming'); }, 650);
1351
1356
  var sc = themeMask.querySelector('input[name="thScope"]:checked');
1352
1357
  if (sc && sc.value === 'current') setSlideTheme(it.getAttribute('data-theme'));
1353
1358
  else setGlobalTheme(it.getAttribute('data-theme'));
@@ -40,7 +40,7 @@ disable-model-invocation: false
40
40
 
41
41
  ## 产物升级(回炉)
42
42
 
43
- 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="meeting-minutes@3">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧产物/回炉旧页面/旧纪要换新样式」时:扫落盘目录下本技能命名的 html,读版本戳筛出旧版(无版本戳或缺少 `<meta name="minutes-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单) → 列清单(文件/旧版本/手改状态——旧 html 正文与同目录 md 正文对比,不一致视为可能手改过)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文内容原样保留;深升级(DOM 结构变化)从同目录 md 底稿按当前 reference.html 重建,先备份旧版 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知「技能模板已升级至 vN,检测到 X 份旧版纪要(vN-1 或无版本戳的历史产物),说『把我旧纪要都升级成新样式』即可一键升级」,不让用户背触发语。
43
+ 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="meeting-minutes@4">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧产物/回炉旧页面/旧纪要换新样式」时:扫落盘目录下本技能命名的 html,读版本戳筛出旧版(无版本戳或缺少 `<meta name="minutes-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单) → 列清单(文件/旧版本/手改状态——旧 html 正文与同目录 md 正文对比,不一致视为可能手改过)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文内容原样保留;深升级(DOM 结构变化)从同目录 md 底稿按当前 reference.html 重建,先备份旧版 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知「技能模板已升级至 vN,检测到 X 份旧版纪要(vN-1 或无版本戳的历史产物),说『把我旧纪要都升级成新样式』即可一键升级」,不让用户背触发语。
44
44
 
45
45
  ## 规则速览
46
46
 
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <meta name="sf-template" content="meeting-minutes@3">
6
+ <meta name="sf-template" content="meeting-minutes@4">
7
7
  <meta name="minutes-id" content="REF-MINUTES-0000">
8
8
  <title>示例项目 周例会纪要</title>
9
9
  <style>
@@ -209,6 +209,10 @@ html.js .rv.in{ opacity:1; translate:0 0; }
209
209
  .section{ padding:20px 14px 20px 22px; }
210
210
  .act-table th:nth-child(2), .act-table td:nth-child(2){ display:none; }
211
211
  }
212
+ /* 主题切换渐变:切换瞬间给 html 挂 .theming 类(650ms 后自动摘除),期间全页颜色属性平滑过渡;平时类不存在,不影响任何元素 */
213
+ html.theming, html.theming *, html.theming *::before, html.theming *::after{ transition: background-color .45s ease, color .45s ease, border-color .45s ease, box-shadow .45s ease, fill .45s ease, stroke .45s ease !important; }
214
+ @media (prefers-reduced-motion: reduce){ html.theming, html.theming *{ transition: none !important; } }
215
+
212
216
  </style>
213
217
  </head>
214
218
  <body>
@@ -392,6 +396,7 @@ var SF_NS = 'minutes:' + SF_ID;
392
396
  dots.forEach(function(d){
393
397
  d.addEventListener('click', function(){
394
398
  var t = d.getAttribute('data-theme');
399
+ var r = document.documentElement; r.classList.add('theming'); clearTimeout(r.__sfThT); r.__sfThT = setTimeout(function(){ r.classList.remove('theming'); }, 650);
395
400
  document.documentElement.setAttribute('data-theme', t);
396
401
  try { localStorage.setItem(SF_NS + '-theme', t); } catch(e){}
397
402
  mark();
@@ -42,7 +42,7 @@ disable-model-invocation: false
42
42
 
43
43
  ## 产物升级(回炉)
44
44
 
45
- 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="monthly-report@2">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧产物/回炉旧页面/旧月报换新样式」时:扫落盘目录下本技能命名的 html,读版本戳筛出旧版(无版本戳或缺少 `<meta name="monthly-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单) → 列清单(文件/旧版本/手改状态——旧 html 正文与同目录 md 正文对比,不一致视为可能手改过)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文内容原样保留;深升级(DOM 结构变化)从同目录 md 底稿按当前 reference.html 重建,先备份旧版 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知「技能模板已升级至 vN,检测到 X 份旧版月报(vN-1 或无版本戳的历史产物),说『把我旧月报都升级成新样式』即可一键升级」,不让用户背触发语。
45
+ 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="monthly-report@3">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧产物/回炉旧页面/旧月报换新样式」时:扫落盘目录下本技能命名的 html,读版本戳筛出旧版(无版本戳或缺少 `<meta name="monthly-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单) → 列清单(文件/旧版本/手改状态——旧 html 正文与同目录 md 正文对比,不一致视为可能手改过)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文内容原样保留;深升级(DOM 结构变化)从同目录 md 底稿按当前 reference.html 重建,先备份旧版 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知「技能模板已升级至 vN,检测到 X 份旧版月报(vN-1 或无版本戳的历史产物),说『把我旧月报都升级成新样式』即可一键升级」,不让用户背触发语。
46
46
 
47
47
  ## 🔧 报修处理流程(用户报页面问题时)
48
48
 
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <meta name="sf-template" content="monthly-report@2">
6
+ <meta name="sf-template" content="monthly-report@3">
7
7
  <meta name="monthly-id" content="REF-MONTHLY-0000">
8
8
  <title>2026-11 研发月度总结</title>
9
9
  <style>
@@ -250,6 +250,10 @@ html.js .rv.in{ opacity:1; translate:0 0; }
250
250
  .header-card{ padding:26px 18px 20px; }
251
251
  .header-card h1{ font-size:26px; }
252
252
  }
253
+ /* 主题切换渐变:切换瞬间给 html 挂 .theming 类(650ms 后自动摘除),期间全页颜色属性平滑过渡;平时类不存在,不影响任何元素 */
254
+ html.theming, html.theming *, html.theming *::before, html.theming *::after{ transition: background-color .45s ease, color .45s ease, border-color .45s ease, box-shadow .45s ease, fill .45s ease, stroke .45s ease !important; }
255
+ @media (prefers-reduced-motion: reduce){ html.theming, html.theming *{ transition: none !important; } }
256
+
253
257
  </style>
254
258
  </head>
255
259
  <body>
@@ -492,7 +496,7 @@ var SF_NS = 'monthly:' + SF_ID;
492
496
  var saved = null; try{ saved = localStorage.getItem(SF_NS + '-theme') || localStorage.getItem('sf:' + location.pathname + '-theme'); }catch(e){}
493
497
  if (saved && THEMES.indexOf(saved) !== -1 && saved !== cur){ apply(saved); }
494
498
  else{ dock.querySelectorAll('.th-dot').forEach(function(d){ d.classList.toggle('on', d.getAttribute('data-theme') === (cur || 'tech')); }); }
495
- dock.querySelectorAll('.th-dot').forEach(function(d){ d.addEventListener('click', function(){ apply(d.getAttribute('data-theme')); }); });
499
+ dock.querySelectorAll('.th-dot').forEach(function(d){ d.addEventListener('click', function(){ var r = document.documentElement; r.classList.add('theming'); clearTimeout(r.__sfThT); r.__sfThT = setTimeout(function(){ r.classList.remove('theming'); }, 650); apply(d.getAttribute('data-theme')); }); });
496
500
  })();
497
501
 
498
502
  /* 滚动入场:初始视口外的卡片滚到视口才上浮渐显(首屏卡维持加载错峰动画);无 JS 时 html.js 不生效全显 */
@@ -62,7 +62,7 @@ disable-model-invocation: false
62
62
 
63
63
  ## 产物升级(回炉)
64
64
 
65
- 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="one-pager@10">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧海报/回炉」时:顺扫海报库根目录(DIR 值)下两种形态——新子目录形态 `<slug>/poster.html` 与旧平铺形态 `poster-*.html`,读版本戳筛旧版(无版本戳或缺少 `<meta name="poster-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单)→ 列清单(文件/旧版本)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文原样保留;深升级(DOM 结构变化)从同目录 md 底稿按当前 reference.html 重建,先备份旧版 `.bak-时间戳`,重建必须沿用原页 poster-id meta 值(换 ID = 模板/主题记忆失联)→ 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动、数据格式改动、页面改动任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知用户「说『把我旧海报都升级成新样式』即可一键升级」。
65
+ 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="one-pager@11">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧海报/回炉」时:顺扫海报库根目录(DIR 值)下两种形态——新子目录形态 `<slug>/poster.html` 与旧平铺形态 `poster-*.html`,读版本戳筛旧版(无版本戳或缺少 `<meta name="poster-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单)→ 列清单(文件/旧版本)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文原样保留;深升级(DOM 结构变化)从同目录 md 底稿按当前 reference.html 重建,先备份旧版 `.bak-时间戳`,重建必须沿用原页 poster-id meta 值(换 ID = 模板/主题记忆失联)→ 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动、数据格式改动、页面改动任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知用户「说『把我旧海报都升级成新样式』即可一键升级」。
66
66
 
67
67
  ## 规则速览
68
68
 
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <meta name="sf-template" content="one-pager@10">
6
+ <meta name="sf-template" content="one-pager@11">
7
7
  <meta name="poster-id" content="REF-POSTER-0000">
8
8
  <title>AI 改变工作 · 一页纸海报</title>
9
9
  <style>
@@ -697,6 +697,10 @@ html[data-shot] .dock-tpl,html[data-shot] .dock-theme{display:none!important}
697
697
  .tp-btn{font-size:11px;padding:4px 8px}
698
698
  .dock-body{max-width:calc(100vw - 36px)}
699
699
  }
700
+ /* 主题切换渐变:切换瞬间给 html 挂 .theming 类(650ms 后自动摘除),期间全页颜色属性平滑过渡;平时类不存在,不影响任何元素 */
701
+ html.theming, html.theming *, html.theming *::before, html.theming *::after{ transition: background-color .45s ease, color .45s ease, border-color .45s ease, box-shadow .45s ease, fill .45s ease, stroke .45s ease !important; }
702
+ @media (prefers-reduced-motion: reduce){ html.theming, html.theming *{ transition: none !important; } }
703
+
700
704
  </style>
701
705
  </head>
702
706
  <body>
@@ -1208,6 +1212,7 @@ html[data-shot] .dock-tpl,html[data-shot] .dock-theme{display:none!important}
1208
1212
  d.addEventListener('click', function(){
1209
1213
  var t = d.getAttribute('data-t');
1210
1214
  curT = t;
1215
+ var r = document.documentElement; r.classList.add('theming'); clearTimeout(r.__sfThT); r.__sfThT = setTimeout(function(){ r.classList.remove('theming'); }, 650);
1211
1216
  document.documentElement.setAttribute('data-theme', t);
1212
1217
  try { localStorage.setItem(THEME_KEY, t); } catch(e) {}
1213
1218
  TH_DOTS.forEach(function(x){ x.classList.toggle('on', x === d); });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skill-forge-hub",
3
- "version": "1.3.8",
3
+ "version": "1.3.9",
4
4
  "description": "SkillForge (技能锻造坊) — a curated collection of AI craft skills. Install once, then pick skills interactively: daily/weekly/monthly/quarterly/annual reports, meeting minutes, article-to-HTML, magic-deck slides, deck-stage PPTX, prompt-pouch manager, Pandoc doc converters, meta-forge.",
5
5
  "bin": {
6
6
  "skill-forge": "cli.js"
@@ -78,7 +78,7 @@ disable-model-invocation: false
78
78
 
79
79
  ## 产物升级(回炉)
80
80
 
81
- 生成/初始化页面时头部写版本戳 `<meta name="sf-template" content="prompt-pouch@15">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧锦囊/回炉旧页面/旧锦囊换新样式」时:扫 `<DIR>` 下 `prompt-pouch.html` 读版本戳筛出旧版(无版本戳或缺少 `<meta name="pouch-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单)→ 列清单(文件/旧版本/有无用户数据)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本;深升级(DOM 结构变化)从 reference.html 重建,**必须沿用原页 pouch-id meta 值**(IndexedDB 用户数据按 pouch-id 命名空间存取,换 ID = 数据失联,重建后原收藏/分组照旧读回),`<DIR>/<DATA_DIR>/prompts.json` 数据文件一概不动,先备份旧页 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成/初始化新锦囊时顺扫 `<DIR>` 读版本戳:发现旧版产物主动告知「技能模板已升级至 vN,检测到 X 份旧版锦囊,说『把我旧锦囊都升级成新样式』即可一键升级」,不让用户背触发语。
81
+ 生成/初始化页面时头部写版本戳 `<meta name="sf-template" content="prompt-pouch@16">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧锦囊/回炉旧页面/旧锦囊换新样式」时:扫 `<DIR>` 下 `prompt-pouch.html` 读版本戳筛出旧版(无版本戳或缺少 `<meta name="pouch-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单)→ 列清单(文件/旧版本/有无用户数据)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本;深升级(DOM 结构变化)从 reference.html 重建,**必须沿用原页 pouch-id meta 值**(IndexedDB 用户数据按 pouch-id 命名空间存取,换 ID = 数据失联,重建后原收藏/分组照旧读回),`<DIR>/<DATA_DIR>/prompts.json` 数据文件一概不动,先备份旧页 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成/初始化新锦囊时顺扫 `<DIR>` 读版本戳:发现旧版产物主动告知「技能模板已升级至 vN,检测到 X 份旧版锦囊,说『把我旧锦囊都升级成新样式』即可一键升级」,不让用户背触发语。
82
82
 
83
83
  ## ⚙️ 配置与自定义主题
84
84
 
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <meta name="sf-template" content="prompt-pouch@15">
6
+ <meta name="sf-template" content="prompt-pouch@16">
7
7
  <meta name="pouch-id" content="REF-POUCH-0000">
8
8
  <title>锦囊 Prompt Pouch — 提示词管理台</title>
9
9
  <style>
@@ -691,6 +691,10 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
691
691
  .theme-dock .th-dot[data-theme="light"]{ background:#ffffff; }
692
692
  .theme-dock .th-dot[data-theme="mint"]{ background:#4ade80; }
693
693
  @media print{ .theme-dock{ display:none; } }
694
+ /* 主题切换渐变:切换瞬间给 html 挂 .theming 类(650ms 后自动摘除),期间全页颜色属性平滑过渡;平时类不存在,不影响任何元素 */
695
+ html.theming, html.theming *, html.theming *::before, html.theming *::after{ transition: background-color .45s ease, color .45s ease, border-color .45s ease, box-shadow .45s ease, fill .45s ease, stroke .45s ease !important; }
696
+ @media (prefers-reduced-motion: reduce){ html.theming, html.theming *{ transition: none !important; } }
697
+
694
698
  </style>
695
699
  </head>
696
700
  <body>
@@ -2696,7 +2700,7 @@ var SF_NS = 'pouch:' + POUCH_ID;
2696
2700
  });
2697
2701
  }
2698
2702
  dock.querySelectorAll('.th-dot').forEach(function(d){
2699
- d.addEventListener('click', function(){ apply(d.getAttribute('data-theme')); });
2703
+ d.addEventListener('click', function(){ var r = document.documentElement; r.classList.add('theming'); clearTimeout(r.__sfThT); r.__sfThT = setTimeout(function(){ r.classList.remove('theming'); }, 650); apply(d.getAttribute('data-theme')); });
2700
2704
  });
2701
2705
  }
2702
2706
  if (document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', init); }
@@ -42,7 +42,7 @@ disable-model-invocation: false
42
42
 
43
43
  ## 产物升级(回炉)
44
44
 
45
- 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="quarterly-report@2">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧产物/回炉旧页面/旧季报换新样式」时:扫落盘目录下本技能命名的 html,读版本戳筛出旧版(无版本戳或缺少 `<meta name="quarterly-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单) → 列清单(文件/旧版本/手改状态——旧 html 正文与同目录 md 正文对比,不一致视为可能手改过)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文内容原样保留;深升级(DOM 结构变化)从同目录 md 底稿按当前 reference.html 重建,先备份旧版 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知「技能模板已升级至 vN,检测到 X 份旧版季报(vN-1 或无版本戳的历史产物),说『把我旧季报都升级成新样式』即可一键升级」,不让用户背触发语。
45
+ 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="quarterly-report@3">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧产物/回炉旧页面/旧季报换新样式」时:扫落盘目录下本技能命名的 html,读版本戳筛出旧版(无版本戳或缺少 `<meta name="quarterly-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单) → 列清单(文件/旧版本/手改状态——旧 html 正文与同目录 md 正文对比,不一致视为可能手改过)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文内容原样保留;深升级(DOM 结构变化)从同目录 md 底稿按当前 reference.html 重建,先备份旧版 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知「技能模板已升级至 vN,检测到 X 份旧版季报(vN-1 或无版本戳的历史产物),说『把我旧季报都升级成新样式』即可一键升级」,不让用户背触发语。
46
46
 
47
47
  ## 🔧 报修处理流程(用户报页面问题时)
48
48
 
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <meta name="sf-template" content="quarterly-report@2">
6
+ <meta name="sf-template" content="quarterly-report@3">
7
7
  <meta name="quarterly-id" content="REF-QUARTERLY-0000">
8
8
  <title>2026-Q4 研发季度总结</title>
9
9
  <style>
@@ -230,6 +230,10 @@ html.js .rv.in{ opacity:1; translate:0 0; }
230
230
  .header-card{ padding:26px 18px 20px; }
231
231
  .header-card h1{ font-size:26px; }
232
232
  }
233
+ /* 主题切换渐变:切换瞬间给 html 挂 .theming 类(650ms 后自动摘除),期间全页颜色属性平滑过渡;平时类不存在,不影响任何元素 */
234
+ html.theming, html.theming *, html.theming *::before, html.theming *::after{ transition: background-color .45s ease, color .45s ease, border-color .45s ease, box-shadow .45s ease, fill .45s ease, stroke .45s ease !important; }
235
+ @media (prefers-reduced-motion: reduce){ html.theming, html.theming *{ transition: none !important; } }
236
+
233
237
  </style>
234
238
  </head>
235
239
  <body>
@@ -470,7 +474,7 @@ var SF_NS = 'quarterly:' + SF_ID;
470
474
  var saved = null; try{ saved = localStorage.getItem(SF_NS + '-theme') || localStorage.getItem('sf:' + location.pathname + '-theme'); }catch(e){}
471
475
  if (saved && THEMES.indexOf(saved) !== -1 && saved !== cur){ apply(saved); }
472
476
  else{ dock.querySelectorAll('.th-dot').forEach(function(d){ d.classList.toggle('on', d.getAttribute('data-theme') === (cur || 'tech')); }); }
473
- dock.querySelectorAll('.th-dot').forEach(function(d){ d.addEventListener('click', function(){ apply(d.getAttribute('data-theme')); }); });
477
+ dock.querySelectorAll('.th-dot').forEach(function(d){ d.addEventListener('click', function(){ var r = document.documentElement; r.classList.add('theming'); clearTimeout(r.__sfThT); r.__sfThT = setTimeout(function(){ r.classList.remove('theming'); }, 650); apply(d.getAttribute('data-theme')); }); });
474
478
  })();
475
479
 
476
480
  /* 滚动入场:初始视口外的卡片滚到视口才上浮渐显(首屏卡维持加载错峰动画);无 JS 时 html.js 不生效全显 */
@@ -51,7 +51,7 @@ disable-model-invocation: false
51
51
 
52
52
  ## 产物升级(回炉)
53
53
 
54
- 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="team-report-collector@1">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧收集台/回炉」时:扫落盘目录读版本戳筛旧版(无版本戳或缺少 `<meta name="trc-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单)→ 列清单(文件/旧版本)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文原样保留;深升级(DOM 结构变化)从同目录 reports.json 数据按当前 reference.html 重建,先备份旧版 `.bak-时间戳`,重建必须沿用原页 trc-id meta 值(换 ID = 页面运行时收集的本地数据失联)→ 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动、数据格式改动、页面改动任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知用户「说『把我旧收集台都升级成新样式』即可一键升级」。
54
+ 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="team-report-collector@2">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧收集台/回炉」时:扫落盘目录读版本戳筛旧版(无版本戳或缺少 `<meta name="trc-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单)→ 列清单(文件/旧版本)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文原样保留;深升级(DOM 结构变化)从同目录 reports.json 数据按当前 reference.html 重建,先备份旧版 `.bak-时间戳`,重建必须沿用原页 trc-id meta 值(换 ID = 页面运行时收集的本地数据失联)→ 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动、数据格式改动、页面改动任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知用户「说『把我旧收集台都升级成新样式』即可一键升级」。
55
55
 
56
56
  ## 规则速览
57
57
 
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <meta name="sf-template" content="team-report-collector@1">
6
+ <meta name="sf-template" content="team-report-collector@2">
7
7
  <meta name="trc-id" content="REF-TRC-0000">
8
8
  <title>示例团队日报收集台</title>
9
9
  <style>
@@ -190,6 +190,10 @@ footer{text-align:center;color:var(--muted);font-size:10px;margin-top:26px}
190
190
  html[data-shot] .card{animation:none!important}
191
191
  @media (max-width:680px){body{padding:24px 12px}.wrap{width:100%}.row2{grid-template-columns:1fr}.header-card h1{font-size:18px}}
192
192
  @media print{.theme-dock,.btn{display:none}}
193
+ /* 主题切换渐变:切换瞬间给 html 挂 .theming 类(650ms 后自动摘除),期间全页颜色属性平滑过渡;平时类不存在,不影响任何元素 */
194
+ html.theming, html.theming *, html.theming *::before, html.theming *::after{ transition: background-color .45s ease, color .45s ease, border-color .45s ease, box-shadow .45s ease, fill .45s ease, stroke .45s ease !important; }
195
+ @media (prefers-reduced-motion: reduce){ html.theming, html.theming *{ transition: none !important; } }
196
+
193
197
  </style>
194
198
  </head>
195
199
  <body>
@@ -361,7 +365,7 @@ window.TRC_DATA = [
361
365
  var initial = (savedTheme && THEMES.indexOf(savedTheme) !== -1) ? savedTheme : 'tech';
362
366
  applyTheme(initial);
363
367
  dock.querySelectorAll('.th-dot').forEach(function(d){
364
- d.addEventListener('click', function(){ applyTheme(d.getAttribute('data-theme')); });
368
+ d.addEventListener('click', function(){ var r = document.documentElement; r.classList.add('theming'); clearTimeout(r.__sfThT); r.__sfThT = setTimeout(function(){ r.classList.remove('theming'); }, 650); applyTheme(d.getAttribute('data-theme')); });
365
369
  });
366
370
  document.getElementById('d-badge').textContent = '2026-11-12';
367
371
  if (location.search.indexOf('shot') !== -1) {
@@ -53,7 +53,7 @@ disable-model-invocation: false
53
53
 
54
54
  ## 产物升级(回炉)
55
55
 
56
- 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="weekly-report@2">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧产物/回炉旧页面/旧周报换新样式」时:扫落盘目录下本技能命名的 html,读版本戳筛出旧版(无版本戳或缺少 `<meta name="weekly-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单) → 列清单(文件/旧版本/手改状态——旧 html 正文与同目录 md 正文对比,不一致视为可能手改过)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文内容原样保留;深升级(DOM 结构变化)从同目录 md 底稿按当前 reference.html 重建,先备份旧版 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知「技能模板已升级至 vN,检测到 X 份旧版周报(vN-1 或无版本戳的历史产物),说『把我旧周报都升级成新样式』即可一键升级」,不让用户背触发语。
56
+ 生成 HTML 时头部写版本戳 `<meta name="sf-template" content="weekly-report@3">`(模板升级时递增 @N 并同步 reference.html 与本文档)。用户说「升级旧产物/回炉旧页面/旧周报换新样式」时:扫落盘目录下本技能命名的 html,读版本戳筛出旧版(无版本戳或缺少 `<meta name="weekly-id">` 稳定 ID 的产物视为 v0 最旧版,一并进清单) → 列清单(文件/旧版本/手改状态——旧 html 正文与同目录 md 正文对比,不一致视为可能手改过)→ AskUserQuestion 选全部或部分 → 逐份升级:浅升级(仅 CSS/JS 变化)对旧页替换 `<style>` 块与交互脚本、正文内容原样保留;深升级(DOM 结构变化)从同目录 md 底稿按当前 reference.html 重建,先备份旧版 `.bak-时间戳` → 报告三段式:✅ 已升级清单 / ⚠️ 手改保留说明 / 🟡 失败项原因。模板改动分级:业务改动(板块/段落/标题体系)、数据格式改动(字段/存储结构)、页面改动(样式/布局/交互)任一发生即模板升级,版本戳 +1 并同步 reference.html 与本文档;纯措辞润色不 bump。每次生成 HTML 时顺扫落盘目录读版本戳:发现旧版产物主动告知「技能模板已升级至 vN,检测到 X 份旧版周报(vN-1 或无版本戳的历史产物),说『把我旧周报都升级成新样式』即可一键升级」,不让用户背触发语。
57
57
 
58
58
  ## 🔧 报修处理流程(用户报页面问题时)
59
59
 
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <meta name="sf-template" content="weekly-report@2">
6
+ <meta name="sf-template" content="weekly-report@3">
7
7
  <meta name="weekly-id" content="REF-WEEKLY-0000">
8
8
  <title>本周周报 - 20261102 ~ 20261106</title>
9
9
  <style>
@@ -528,6 +528,10 @@ html.js .rv.in{ opacity:1; translate:0 0; }
528
528
  .header-card{ padding:26px 18px 20px; }
529
529
  .header-card h1{ font-size:26px; }
530
530
  }
531
+ /* 主题切换渐变:切换瞬间给 html 挂 .theming 类(650ms 后自动摘除),期间全页颜色属性平滑过渡;平时类不存在,不影响任何元素 */
532
+ html.theming, html.theming *, html.theming *::before, html.theming *::after{ transition: background-color .45s ease, color .45s ease, border-color .45s ease, box-shadow .45s ease, fill .45s ease, stroke .45s ease !important; }
533
+ @media (prefers-reduced-motion: reduce){ html.theming, html.theming *{ transition: none !important; } }
534
+
531
535
  </style>
532
536
  </head>
533
537
  <body>
@@ -1037,7 +1041,7 @@ var SF_NS = 'weekly:' + SF_ID;
1037
1041
  var saved = null; try{ saved = localStorage.getItem(SF_NS + '-theme') || localStorage.getItem('sf:' + location.pathname + '-theme'); }catch(e){}
1038
1042
  if (saved && THEMES.indexOf(saved) !== -1 && saved !== cur){ apply(saved); }
1039
1043
  else{ dock.querySelectorAll('.th-dot').forEach(function(d){ d.classList.toggle('on', d.getAttribute('data-theme') === (cur || 'tech')); }); }
1040
- dock.querySelectorAll('.th-dot').forEach(function(d){ d.addEventListener('click', function(){ apply(d.getAttribute('data-theme')); }); });
1044
+ dock.querySelectorAll('.th-dot').forEach(function(d){ d.addEventListener('click', function(){ var r = document.documentElement; r.classList.add('theming'); clearTimeout(r.__sfThT); r.__sfThT = setTimeout(function(){ r.classList.remove('theming'); }, 650); apply(d.getAttribute('data-theme')); }); });
1041
1045
  })();
1042
1046
 
1043
1047
  /* 滚动入场:初始视口外的卡片滚到视口才上浮渐显(首屏卡维持加载错峰动画);无 JS 时 html.js 不生效全显 */