skill-forge-hub 1.0.4 → 1.0.5

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 (92) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +82 -150
  3. package/annual-report/SKILL.md +23 -3
  4. package/annual-report/resources/data-collection.md +20 -4
  5. package/annual-report/resources/disk-and-html.md +3 -3
  6. package/annual-report/resources/reference.html +31 -10
  7. package/annual-report/resources/usage-guide.md +8 -0
  8. package/annual-report/user-config.md +5 -5
  9. package/article-to-html/SKILL.md +26 -7
  10. package/article-to-html/design-system.md +9 -3
  11. package/article-to-html/resources/reference.html +631 -0
  12. package/article-to-html/resources/usage-guide.md +9 -1
  13. package/article-to-html/user-config.md +6 -3
  14. package/cli.js +2 -2
  15. package/daily-report/SKILL.md +23 -3
  16. package/daily-report/resources/content-rules.md +1 -1
  17. package/daily-report/resources/data-collection.md +24 -4
  18. package/daily-report/resources/disk-and-html.md +2 -2
  19. package/daily-report/resources/reference.html +24 -3
  20. package/daily-report/resources/usage-guide.md +8 -0
  21. package/daily-report/user-config.md +5 -5
  22. package/deck-stage/SKILL.md +15 -4
  23. package/deck-stage/resources/cover-template.html +3 -3
  24. package/deck-stage/resources/data-schema.md +11 -1
  25. package/deck-stage/resources/pptx-builder.js +1 -1
  26. package/deck-stage/resources/usage-guide.md +9 -2
  27. package/docs/architecture.md +89 -0
  28. package/docs/images/article-to-html.png +0 -0
  29. package/docs/images/daily-report.png +0 -0
  30. package/docs/images/deck-stage.png +0 -0
  31. package/docs/images/magic-deck.png +0 -0
  32. package/docs/images/meeting-minutes.png +0 -0
  33. package/docs/images/prompt-pouch.png +0 -0
  34. package/docs/install.md +71 -0
  35. package/magic-deck/SKILL.md +23 -8
  36. package/magic-deck/resources/content-guide.md +5 -4
  37. package/magic-deck/resources/deck-spec.md +18 -11
  38. package/magic-deck/resources/reference.html +110 -32
  39. package/magic-deck/resources/usage-guide.md +10 -2
  40. package/magic-deck/user-config.md +4 -4
  41. package/meeting-minutes/SKILL.md +51 -0
  42. package/meeting-minutes/resources/content-rules.md +57 -0
  43. package/meeting-minutes/resources/disk-and-html.md +26 -0
  44. package/meeting-minutes/resources/meeting-type-dictionary.md +24 -0
  45. package/meeting-minutes/resources/reference.html +436 -0
  46. package/meeting-minutes/resources/usage-guide.md +63 -0
  47. package/meeting-minutes/user-config.md +56 -0
  48. package/meta-forge/SKILL.md +6 -6
  49. package/meta-forge/resources/forge-rules.md +55 -10
  50. package/meta-forge/resources/usage-guide.md +7 -3
  51. package/meta-forge/user-config.md +1 -1
  52. package/monthly-report/SKILL.md +62 -0
  53. package/monthly-report/resources/content-rules.md +40 -0
  54. package/monthly-report/resources/data-collection.md +44 -0
  55. package/monthly-report/resources/date-parsing.md +18 -0
  56. package/monthly-report/resources/disk-and-html.md +29 -0
  57. package/monthly-report/resources/industry-dictionary.md +21 -0
  58. package/monthly-report/resources/reference.html +531 -0
  59. package/monthly-report/resources/usage-guide.md +75 -0
  60. package/monthly-report/user-config.md +53 -0
  61. package/package.json +9 -2
  62. package/prompt-pouch/SKILL.md +17 -2
  63. package/prompt-pouch/resources/data-format.md +1 -1
  64. package/prompt-pouch/resources/reference.html +56 -24
  65. package/prompt-pouch/resources/usage-guide.md +10 -3
  66. package/quarterly-report/SKILL.md +63 -0
  67. package/quarterly-report/resources/content-rules.md +42 -0
  68. package/quarterly-report/resources/data-collection.md +46 -0
  69. package/quarterly-report/resources/date-parsing.md +19 -0
  70. package/quarterly-report/resources/disk-and-html.md +22 -0
  71. package/quarterly-report/resources/industry-dictionary.md +21 -0
  72. package/quarterly-report/resources/reference.html +509 -0
  73. package/quarterly-report/resources/usage-guide.md +76 -0
  74. package/quarterly-report/user-config.md +53 -0
  75. package/spec-doc2spec/SKILL.md +21 -22
  76. package/spec-doc2spec/resources/checklist.md +7 -0
  77. package/spec-doc2spec/resources/images.md +14 -5
  78. package/spec-doc2spec/resources/structure.md +19 -10
  79. package/spec-doc2spec/resources/usage-guide.md +10 -8
  80. package/spec-doc2spec/user-config.md +2 -2
  81. package/spec-spec2doc/SKILL.md +4 -4
  82. package/spec-spec2doc/resources/checklist.md +6 -0
  83. package/spec-spec2doc/resources/pdf-path.md +1 -0
  84. package/spec-spec2doc/resources/usage-guide.md +2 -2
  85. package/template/SKILL.md +1 -1
  86. package/weekly-report/SKILL.md +23 -3
  87. package/weekly-report/resources/content-rules.md +1 -1
  88. package/weekly-report/resources/data-collection.md +24 -4
  89. package/weekly-report/resources/disk-and-html.md +2 -2
  90. package/weekly-report/resources/reference.html +24 -3
  91. package/weekly-report/resources/usage-guide.md +8 -0
  92. package/weekly-report/user-config.md +5 -5
@@ -0,0 +1,24 @@
1
+ # 会议类型词典
2
+
3
+ 五段式骨架对所有会议通用,只有「要素侧重 / 议题侧重 / 行动项模板」随会议类型切换。用户话术中声明会议类型即按词典取侧(如「整理昨天项目评审会的纪要」→ 项目评审词条);未提类型按 ROLE 画像推断,推断不出用通用模板。
4
+
5
+ | 类型 | 信息头侧重 | 议题侧重 | 行动项模板 |
6
+ |---|---|---|---|
7
+ | 周例会 | 主持人 + 参会人 + 上周回顾 | 各人上周进度/本周计划/风险阻塞 | 「XX 跟进 YY 修复,负责人:张三,截止 2026-11-14」 |
8
+ | 项目评审 | 评审人 + 被评审人 + 里程碑节点 | 方案取舍/风险识别/评审结论(通过/有条件通过/不通过)| 「XX 按评审意见修订方案,负责人:张三,截止 …」 |
9
+ | 需求评审 | 产品 + 研发 + 测试三方 | 需求范围确认/边界与例外/优先级 | 「XX 需求补充验收标准,负责人:张三,截止 …」 |
10
+ | 技术方案评审 | 方案主讲人 + 评审组 | 架构选型/技术债/性能与安全 | 「XX 方案补充压测数据,负责人:张三,截止 …」 |
11
+ | 复盘会 | 复盘对象(项目/事故/活动)| 目标回顾/结果对比/根因分析/改进措施 | 「XX 输出复盘文档并同步全组,负责人:张三,截止 …」 |
12
+ | 客户会议 | 客户方 + 我方参会人 | 客户诉求/交付承诺/合同与回款 | 「XX 客户诉求 48 小时内书面回复,负责人:张三,截止 …」 |
13
+ | 跨部门协调会 | 各部门代表 | 职责边界/接口约定/时间对齐 | 「XX 部门确认接口字段,负责人:张三,截止 …」 |
14
+ | OKR 对齐会 | 各团队负责人 | 目标对齐/关键结果/依赖排期 | 「XX 团队输出 OKR 拆解表,负责人:张三,截止 …」 |
15
+ | 全员会 | 主讲人 + 发布事项 | 公司动态/政策宣贯/表彰 | 「XX 同步宣讲材料到全员群,负责人:张三,截止 …」 |
16
+ | 设计评审 | 设计师 + 产品 + 研发 | 视觉规范/交互流程/走查问题 | 「XX 按意见修改设计稿 V2,负责人:张三,截止 …」 |
17
+ | 合同谈判 | 双方谈判人 | 条款分歧/让步底线/签约时间 | 「XX 修订合同第 N 条并发对方确认,负责人:张三,截止 …」 |
18
+ | 面试复盘 | 面试官 + HR | 候选人评价/录用建议/薪资范围 | 「XX 推进背调与 Offer 流程,负责人:张三,截止 …」 |
19
+
20
+ - 通用模板(类型不明):要素侧重 = 主题/日期/参会人;议题侧重 = 议程顺序;行动项模板 = 「XX 事项,负责人:张三,截止 YYYY-MM-DD」
21
+ - 触发:话术含类型词(周例会/例会/评审/复盘/客户会/协调会/对齐会/全员会/谈判/面试等)→ 信息头侧重、议题侧重、行动项话术全部按该词典词条生成
22
+ - 临时指定:说「按项目评审会的格式记」→ 当次按该词条生成,不改配置
23
+ - 兜底:词典外的会议类型(读书会/培训会/家长会等)→ 骨架 + 用户素材现场生成侧重,本次生效;说「记住这类会」→ 固化为新词条
24
+ - 会议类型只换要素侧重与行动项模板,五段骨架/HTML 样式/落盘规范全部不变;优先级:临时指定 > 话术类型词 > ROLE 画像推断 > 通用模板
@@ -0,0 +1,436 @@
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">
6
+ <meta name="sf-template" content="meeting-minutes@3">
7
+ <meta name="minutes-id" content="REF-MINUTES-0000">
8
+ <title>示例项目 周例会纪要</title>
9
+ <style>
10
+
11
+ /* ═══ 五主题令牌:12 核心契约 + 会议纪要扩展;html[data-theme] 运行时切换,THEME 生成时定默认 ═══ */
12
+ :root, [data-theme="tech"]{
13
+ --bg:#0a1929; --bg2:#071525; --panel:rgba(11,30,55,.9); --panel-solid:#0b1e37;
14
+ --text:#bae6fd; --muted:#5b7fa5; --accent:#0ea5e9; --accent2:#14b8a6;
15
+ --border:rgba(14,165,233,.18); --glow:rgba(14,165,233,.35); --glow-soft:rgba(14,165,233,.15);
16
+ --title-grad:linear-gradient(90deg,#7dd3fc,#0ea5e9 45%,#818cf8);
17
+ --tag-bg:rgba(14,165,233,.12);
18
+ --card-shadow:0 1px 0 rgba(255,255,255,.05) inset,0 12px 32px rgba(1,6,16,.5),0 0 24px rgba(14,165,233,.15);
19
+ --scan:rgba(0,240,255,.2); --scan-dim:rgba(0,240,255,.05);
20
+ --heat:rgba(14,165,233,.55);
21
+ --green:#14b8a6; --orange:#f97316; --rose:#f43f5e;
22
+ }
23
+ [data-theme="biz"]{
24
+ --bg:#e8ecf5; --bg2:#dde3ef; --panel:rgba(255,255,255,.97); --panel-solid:#ffffff;
25
+ --text:#1e293b; --muted:#64748b; --accent:#2563eb; --accent2:#0891b2;
26
+ --border:rgba(37,99,235,.14); --glow:rgba(37,99,235,.18); --glow-soft:rgba(37,99,235,.12);
27
+ --title-grad:linear-gradient(90deg,#1e40af,#2563eb 55%,#0891b2);
28
+ --tag-bg:rgba(37,99,235,.08);
29
+ --card-shadow:0 1px 2px rgba(15,23,42,.05),0 10px 28px rgba(15,23,42,.12);
30
+ --scan:rgba(37,99,235,.14); --scan-dim:rgba(37,99,235,.04);
31
+ --heat:rgba(37,99,235,.55);
32
+ --green:#0d9488; --orange:#ea580c; --rose:#e11d48;
33
+ }
34
+ [data-theme="mono"]{
35
+ --bg:#1e1f22; --bg2:#2b2d30; --panel:rgba(43,45,48,.95); --panel-solid:#2b2d30;
36
+ --card-shadow:0 1px 0 rgba(255,255,255,.06) inset, 0 12px 32px rgba(0,0,0,.5), 0 0 24px rgba(53,116,240,.16);
37
+ --text:#dfe1e5; --muted:#9aa0a6; --accent:#3574f0; --accent2:#5e9aff;
38
+ --border:rgba(53,116,240,.26); --glow:rgba(53,116,240,.3); --glow-soft:rgba(53,116,240,.13);
39
+ --title-grad:linear-gradient(90deg,#dfe1e5,#5e9aff 50%,#3574f0);
40
+ --tag-bg:rgba(53,116,240,.13);
41
+ --scan:rgba(223,225,229,.18); --scan-dim:rgba(223,225,229,.07);
42
+ --heat:rgba(53,116,240,.55);
43
+ --green:#4da36b; --orange:#d09645; --rose:#d85f73;
44
+ }
45
+ [data-theme="light"]{
46
+ --bg:#ffffff; --bg2:#f2f2f2; --panel:rgba(255,255,255,.98); --panel-solid:#ffffff;
47
+ --card-shadow:0 1px 2px rgba(30,31,34,.06), 0 10px 28px rgba(30,31,34,.12);
48
+ --text:#1e1f22; --muted:#6e7781; --accent:#2675bf; --accent2:#4a9be0;
49
+ --border:rgba(38,117,191,.18); --glow:rgba(38,117,191,.2); --glow-soft:rgba(38,117,191,.1);
50
+ --title-grad:linear-gradient(90deg,#1e5f9f,#2675bf 55%,#4a9be0);
51
+ --tag-bg:rgba(38,117,191,.08);
52
+ --scan:rgba(38,117,191,.12); --scan-dim:rgba(38,117,191,.04);
53
+ --heat:rgba(38,117,191,.55);
54
+ --green:#2f8a5b; --orange:#d97706; --rose:#d6336c;
55
+ }
56
+ [data-theme="warm"]{
57
+ --bg:#f7ebd9; --bg2:#efe0c8; --panel:rgba(255,250,243,.97); --panel-solid:#fffaf3;
58
+ --text:#43301f; --muted:#8a7565; --accent:#d97706; --accent2:#ea580c;
59
+ --border:rgba(217,119,6,.18); --glow:rgba(217,119,6,.22); --glow-soft:rgba(217,119,6,.14);
60
+ --title-grad:linear-gradient(90deg,#b45309,#d97706 50%,#ea580c);
61
+ --tag-bg:rgba(217,119,6,.1);
62
+ --card-shadow:0 1px 2px rgba(120,72,24,.07),0 10px 28px rgba(120,72,24,.13);
63
+ --scan:rgba(217,119,6,.16); --scan-dim:rgba(217,119,6,.04);
64
+ --heat:rgba(217,119,6,.55);
65
+ --green:#0d9488; --orange:#c2410c; --rose:#be123c;
66
+ }
67
+ [data-theme="biz"] .stars, [data-theme="light"] .stars, [data-theme="warm"] .stars{ opacity:.28; }
68
+ [data-theme="mono"] .stars{ background:radial-gradient(1px 1px at 12% 22%,rgba(223,225,229,.32),transparent),radial-gradient(1px 1px at 28% 68%,rgba(223,225,229,.28),transparent),radial-gradient(1.5px 1.5px at 45% 15%,rgba(223,225,229,.24),transparent),radial-gradient(1px 1px at 62% 78%,rgba(223,225,229,.26),transparent),radial-gradient(1px 1px at 78% 32%,rgba(223,225,229,.3),transparent),radial-gradient(1.5px 1.5px at 88% 58%,rgba(223,225,229,.28),transparent),radial-gradient(1px 1px at 8% 85%,rgba(223,225,229,.26),transparent),radial-gradient(1px 1px at 55% 45%,rgba(223,225,229,.24),transparent)}
69
+
70
+ *{margin:0;padding:0;box-sizing:border-box}
71
+ html,body{background:var(--bg)}
72
+ body{
73
+ font-family:ui-monospace,'SF Mono',SFMono-Regular,Menlo,Consolas,'PingFang SC','Microsoft YaHei',monospace;
74
+ color:var(--text);-webkit-font-smoothing:antialiased;overflow-x:hidden;
75
+ }
76
+ .grid-pattern{position:fixed;inset:0;z-index:0;pointer-events:none;
77
+ background:linear-gradient(var(--scan-dim) 1px,transparent 1px),linear-gradient(90deg,var(--scan-dim) 1px,transparent 1px);
78
+ background-size:60px 60px}
79
+ .stars{position:fixed;inset:0;z-index:0;pointer-events:none;
80
+ background:radial-gradient(1px 1px at 12% 22%,rgba(255,255,255,.4),transparent),radial-gradient(1px 1px at 28% 68%,rgba(0,240,255,.5),transparent),radial-gradient(1.5px 1.5px at 45% 15%,rgba(168,85,247,.4),transparent),radial-gradient(1px 1px at 62% 78%,rgba(0,255,136,.4),transparent),radial-gradient(1px 1px at 78% 32%,rgba(255,255,255,.35),transparent),radial-gradient(1.5px 1.5px at 88% 58%,rgba(0,240,255,.45),transparent),radial-gradient(1px 1px at 8% 85%,rgba(255,255,255,.3),transparent),radial-gradient(1px 1px at 55% 45%,rgba(0,240,255,.35),transparent)}
81
+ .scanlines{position:fixed;inset:0;z-index:999;pointer-events:none;
82
+ background:repeating-linear-gradient(0deg,transparent,transparent 2px,var(--scan-dim) 2px,var(--scan-dim) 4px)}
83
+ .scanband{position:fixed;left:0;right:0;height:150px;z-index:998;pointer-events:none;
84
+ background:linear-gradient(180deg,transparent,var(--scan-dim) 50%,transparent);
85
+ animation:scanMove 11s linear infinite}
86
+ @keyframes scanMove{from{top:-22%}to{top:112%}}
87
+ .wrap{width:clamp(640px, 60%, 1200px); margin:0 auto; position:relative; z-index:1; padding:40px 0}
88
+ .header-card{position:relative;overflow:hidden;background:var(--panel-solid);border:1px solid var(--border);border-radius:6px;
89
+ padding:34px 28px 26px;text-align:center;margin-bottom:18px;
90
+ box-shadow:var(--card-shadow);
91
+ background-image:repeating-linear-gradient(180deg, rgba(255,255,255,.012) 0 1px, transparent 1px 8px)}
92
+ .header-card h1{font-size:26px;letter-spacing:2px;margin-bottom:8px;
93
+ background:var(--title-grad);-webkit-background-clip:text;background-clip:text;color:transparent;
94
+ animation:titleGlow 3s ease-in-out infinite}
95
+ @keyframes titleGlow{0%,100%{text-shadow:0 0 8px var(--glow),0 0 22px var(--glow-soft)}50%{text-shadow:0 0 14px var(--glow),0 0 34px var(--glow-soft)}}
96
+ .header-sub{font-size:12px;color:var(--muted);letter-spacing:1px;margin-bottom:12px}
97
+ .header-badge{display:inline-block;font-size:11px;color:var(--accent);border:1px solid var(--glow);border-radius:999px;padding:4px 14px}
98
+ .card-glow{position:absolute;inset:-40% -20% auto;height:70%;pointer-events:none;
99
+ background:radial-gradient(ellipse at 50% 10%,var(--glow),transparent 70%);
100
+ animation:cardGlow 3s ease-in-out infinite;transform-origin:top center;opacity:.5}
101
+ @keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}
102
+ .scanline-el{position:absolute;pointer-events:none}
103
+ .scan-x{top:0;left:0;height:1px;width:100%;background:linear-gradient(90deg,transparent,var(--accent),transparent);animation:scanX 3s linear infinite}
104
+ .scan-y{top:0;right:0;width:1px;height:100%;background:linear-gradient(180deg,transparent,var(--accent),transparent);animation:scanY 3s linear infinite}
105
+ .scan-x-rev{bottom:0;left:0;height:1px;width:100%;background:linear-gradient(90deg,transparent,var(--accent),transparent);animation:scanXRev 3s linear infinite}
106
+ .scan-y-rev{top:0;left:0;width:1px;height:100%;background:linear-gradient(180deg,transparent,var(--accent),transparent);animation:scanYRev 3s linear infinite}
107
+ @keyframes scanX{from{transform:translateX(-100%)}to{transform:translateX(100%)}}
108
+ @keyframes scanY{from{transform:translateY(-100%)}to{transform:translateY(100%)}}
109
+ @keyframes scanXRev{from{transform:translateX(100%)}to{transform:translateX(-100%)}}
110
+ @keyframes scanYRev{from{transform:translateY(100%)}to{transform:translateY(-100%)}}
111
+ .section{position:relative;overflow:hidden;background:var(--panel-solid);border:1px solid var(--border);border-radius:6px;
112
+ padding:22px 24px 22px 32px;margin-bottom:18px;
113
+ box-shadow:var(--card-shadow);
114
+ background-image:repeating-linear-gradient(180deg, rgba(255,255,255,.012) 0 1px, transparent 1px 8px);
115
+ transition:transform .18s ease,box-shadow .18s ease}
116
+ .section:hover{transform:translateY(-2px);box-shadow:var(--card-shadow),inset 0 0 22px var(--glow-soft)}
117
+ .sec-bar{position:absolute;left:0;top:0;bottom:0;width:8px}
118
+ .sec-if .sec-bar{background:linear-gradient(180deg,var(--accent2),var(--accent));box-shadow:0 0 12px var(--glow)}
119
+ .sec-su .sec-bar{background:linear-gradient(180deg,#5eead4,#14b8a6);box-shadow:0 0 12px rgba(20,184,166,.3)}
120
+ .sec-tp .sec-bar{background:linear-gradient(180deg,#c4b5fd,#818cf8);box-shadow:0 0 12px rgba(129,140,248,.3)}
121
+ .sec-ac .sec-bar{background:linear-gradient(180deg,#fda4af,#e11d48);box-shadow:0 0 12px rgba(244,63,94,.3)}
122
+ .sec-nx .sec-bar{background:linear-gradient(180deg,#fdba74,#f97316);box-shadow:0 0 12px rgba(249,115,22,.3)}
123
+ .sec-head{display:flex;align-items:center;gap:10px;margin-bottom:16px}
124
+ .sec-head svg{flex:0 0 auto}
125
+ .sec-head h2{font-size:18px;letter-spacing:1px;animation:secGlow 3s ease-in-out infinite}
126
+ .sec-if .sec-head h2{color:var(--accent)}.sec-su .sec-head h2{color:#5eead4}
127
+ .sec-tp .sec-head h2{color:#c4b5fd}.sec-ac .sec-head h2{color:#fda4af}.sec-nx .sec-head h2{color:#fdba74}
128
+ @keyframes secGlow{0%,100%{text-shadow:0 0 6px var(--glow)}50%{text-shadow:0 0 14px var(--glow)}}
129
+ .tldr-line{font-size:15px;line-height:1.75;margin-bottom:16px}
130
+ .tldr-line b{color:var(--accent);font-weight:700}
131
+ .info-grid{display:grid;grid-template-columns:86px 1fr;gap:8px 14px;align-items:baseline}
132
+ .info-k{font-size:11px;color:var(--muted);letter-spacing:2px}
133
+ .info-v{font-size:13px;line-height:1.7}
134
+ .ppl-chips{display:flex;flex-wrap:wrap;gap:6px}
135
+ .ppl-chip{font-size:12px;color:var(--text);background:var(--tag-bg);border:1px solid var(--border);border-radius:999px;padding:2px 12px}
136
+ .decision-row{display:flex;align-items:flex-start;gap:10px;padding:7px 0}
137
+ .decision-row::before{content:'';flex:0 0 auto;width:6px;height:6px;border-radius:50%;background:rgba(94,234,212,.85);box-shadow:0 0 6px rgba(94,234,212,.5);margin-top:8px}
138
+ .decision-txt{font-size:14.5px;line-height:1.65}
139
+ .topic-card{background:var(--tag-bg);border:1px solid var(--border);border-radius:6px;
140
+ padding:14px 16px;margin-bottom:12px;transition:transform .18s ease,box-shadow .18s ease}
141
+ .topic-card:hover{transform:translateY(-2px);box-shadow:0 8px 20px rgba(0,0,0,.3)}
142
+ .topic-name{font-size:15px;font-weight:700;color:var(--accent);margin-bottom:8px}
143
+ .topic-concl{display:flex;align-items:flex-start;gap:8px;font-size:13px;line-height:1.65;margin-bottom:8px}
144
+ .topic-concl .ck{flex:0 0 auto;font-size:11px;font-weight:700;border-radius:4px;padding:1px 8px;margin-top:2px}
145
+ .ck.done{color:var(--accent2);background:rgba(20,184,166,.12);border:1px solid rgba(20,184,166,.3)}
146
+ .ck.open{color:var(--orange);background:rgba(249,115,22,.12);border:1px solid rgba(249,115,22,.3)}
147
+ .topic-pts{margin:0;padding-left:0;list-style:none}
148
+ .topic-pts li{font-size:12.5px;color:var(--muted);line-height:1.7;padding:2px 0 2px 14px;position:relative}
149
+ .topic-pts li::before{content:'';position:absolute;left:0;top:10px;width:4px;height:4px;border-radius:50%;background:var(--accent)}
150
+ .act-table{width:100%;border-collapse:collapse}
151
+ .act-table th{font-size:11px;color:var(--muted);letter-spacing:1px;text-align:left;padding:6px 10px;border-bottom:1px solid var(--border);font-weight:400}
152
+ .act-table td{font-size:13.5px;padding:10px;border-bottom:1px dashed var(--border);vertical-align:top;line-height:1.6}
153
+ .act-table tr:last-child td{border-bottom:none}
154
+ .owner{display:inline-block;font-size:12px;color:var(--text);background:var(--tag-bg);border:1px solid var(--border);border-radius:999px;padding:1px 12px}
155
+ .owner.tbd{color:var(--orange);background:rgba(249,115,22,.1);border:1px solid rgba(249,115,22,.3)}
156
+ .ddl{font-size:12.5px;color:var(--muted);white-space:nowrap}
157
+ .st{display:inline-block;font-size:11px;font-weight:700;border-radius:999px;padding:2px 12px;white-space:nowrap}
158
+ .st.done{color:var(--green);background:rgba(20,184,166,.12);border:1px solid rgba(20,184,166,.3)}
159
+ .st.doing{color:var(--accent);background:rgba(14,165,233,.12);border:1px solid rgba(14,165,233,.3)}
160
+ .st.todo{color:var(--muted);background:rgba(91,127,165,.1);border:1px solid var(--border)}
161
+ .next-line{display:flex;align-items:baseline;gap:14px;padding:6px 0}
162
+ .next-k{flex:0 0 auto;font-size:11px;color:var(--muted);letter-spacing:2px}
163
+ .next-v{font-size:14px;line-height:1.7}
164
+ .copy-wrap{display:flex;justify-content:center;margin:18px 0 0}
165
+ .copy-btn{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:700;color:#fff;letter-spacing:2px;
166
+ background:linear-gradient(135deg,var(--accent),var(--accent2));border:none;border-radius:999px;padding:12px 38px;cursor:pointer;
167
+ box-shadow:0 0 30px var(--glow);transition:transform .18s ease,box-shadow .18s ease;
168
+ font-family:inherit}
169
+ .copy-btn:hover{transform:translateY(-2px);box-shadow:0 0 45px var(--glow)}
170
+ .copy-btn:active{transform:translateY(1px) scale(.98)}
171
+ footer{text-align:center;font-size:10px;color:var(--muted);letter-spacing:1px;padding:8px 0 4px}
172
+ .header-card{animation:fadeDown .6s ease-out backwards}
173
+ .sec-if{animation:riseIn .5s ease-out .13s backwards}
174
+ .sec-su{animation:riseIn .5s ease-out .26s backwards}
175
+ .sec-tp{animation:riseIn .5s ease-out .4s backwards}
176
+ .sec-ac{animation:riseIn .5s ease-out .54s backwards}
177
+ .sec-nx{animation:riseIn .5s ease-out .68s backwards}
178
+ .copy-wrap{animation:popIn .4s ease-out .9s backwards}
179
+ @keyframes fadeDown{from{opacity:0;transform:translateY(-14px)}to{opacity:1;transform:none}}
180
+ @keyframes riseIn{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}
181
+ @keyframes popIn{from{opacity:0;transform:scale(.85)}to{opacity:1;transform:none}}
182
+ .section:hover{transform:perspective(900px) translateY(-2px) rotateY(calc(var(--mx,0)*2.5deg)) rotateX(calc(var(--my,0)*-2.5deg))}
183
+ .theme-dock{
184
+ position:fixed; right:18px; bottom:18px; z-index:1001;
185
+ display:flex; gap:8px; padding:8px 10px; border-radius:999px;
186
+ background:var(--panel-solid); border:1px solid var(--border);
187
+ box-shadow:0 4px 18px rgba(0,0,0,.3);
188
+ }
189
+ .theme-dock .th-dot{
190
+ width:22px; height:22px; border-radius:50%; cursor:pointer;
191
+ border:2px solid transparent; padding:0;
192
+ transition:transform .15s ease, border-color .15s ease;
193
+ }
194
+ .theme-dock .th-dot:hover{ transform:scale(1.18); }
195
+ .theme-dock .th-dot.on{ border-color:var(--text); }
196
+ .theme-dock .th-dot[data-theme="tech"]{ background:#0ea5e9; }
197
+ .theme-dock .th-dot[data-theme="biz"]{ background:#2563eb; }
198
+ .theme-dock .th-dot[data-theme="mono"]{ background:#1e1f22; }
199
+ .theme-dock .th-dot[data-theme="light"]{ background:#ffffff; }
200
+ .theme-dock .th-dot[data-theme="warm"]{ background:#d97706; }
201
+ @media print{ .theme-dock{ display:none; } .rv{ opacity:1 !important; translate:none !important; } }
202
+ html.js .rv{ opacity:0; translate:0 16px; transition:opacity .5s ease-out, translate .5s ease-out; }
203
+ html.js .rv.in{ opacity:1; translate:0 0; }
204
+ @media (max-width:680px){
205
+ body{ padding:24px 12px 32px; }
206
+ .wrap{ width:100%; max-width:none; }
207
+ .header-card{ padding:26px 18px 20px; }
208
+ .header-card h1{ font-size:26px; }
209
+ .section{ padding:20px 14px 20px 22px; }
210
+ .act-table th:nth-child(2), .act-table td:nth-child(2){ display:none; }
211
+ }
212
+ </style>
213
+ </head>
214
+ <body>
215
+ <div class="grid-pattern"></div>
216
+ <div class="stars"></div>
217
+ <div class="scanlines"></div>
218
+ <div class="scanband"></div>
219
+ <div class="wrap">
220
+
221
+ <div class="header-card">
222
+ <div class="scanline-el scan-x"></div><div class="scanline-el scan-y"></div>
223
+ <div class="scanline-el scan-x-rev"></div><div class="scanline-el scan-y-rev"></div>
224
+ <div class="card-glow"></div>
225
+ <h1>示例项目 周例会纪要</h1>
226
+ <div class="header-sub">2026-11-11 周三 · 14:00 ~ 14:45 · 线上会议</div>
227
+ <div class="header-badge">周例会</div>
228
+ <div class="copy-wrap">
229
+ <button class="copy-btn" id="copyBtn">
230
+ <svg id="copyIcon" viewBox="0 0 16 16" width="15" height="15" fill="none" stroke="#fff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="5.5" y="5.5" width="8.5" height="8.5" rx="1.5"/><path d="M10.5 5.5V4a1.5 1.5 0 0 0-1.5-1.5H4A1.5 1.5 0 0 0 2.5 4v5A1.5 1.5 0 0 0 4 10.5h1.5"/></svg>
231
+ <span id="copyText">一键复制</span>
232
+ </button>
233
+ </div>
234
+ </div>
235
+
236
+ <section class="section sec-if rv">
237
+ <div class="sec-bar"></div>
238
+ <div class="sec-head">
239
+ <svg viewBox="0 0 24 24" width="22" height="22" fill="none" stroke="#7dd3fc" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 3"/></svg>
240
+ <h2>会议信息</h2>
241
+ </div>
242
+ <div class="info-grid">
243
+ <span class="info-k">主题</span><span class="info-v">示例项目 双周发布节奏与季报技能进展</span>
244
+ <span class="info-k">日期</span><span class="info-v">2026-11-11 周三</span>
245
+ <span class="info-k">时间</span><span class="info-v">14:00 ~ 14:45</span>
246
+ <span class="info-k">地点</span><span class="info-v">线上会议</span>
247
+ <span class="info-k">主持人</span><span class="info-v">张工</span>
248
+ <span class="info-k">参会人</span><span class="info-v"><div class="ppl-chips"><span class="ppl-chip">李工</span><span class="ppl-chip">王工</span><span class="ppl-chip">赵工</span><span class="ppl-chip">刘工</span></div></span>
249
+ </div>
250
+ </section>
251
+
252
+ <section class="section sec-su rv">
253
+ <div class="sec-bar"></div>
254
+ <div class="sec-head">
255
+ <svg viewBox="0 0 24 24" width="22" height="22" fill="none" stroke="#5eead4" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12l4 4L20 6"/></svg>
256
+ <h2>会议结论</h2>
257
+ </div>
258
+ <div class="tldr-line">TL;DR:<b>双周聚合发布节奏正式确认</b>——单批 ≤6 版本、双周一档,11-25 前完成验证前置改造;季报技能本周收尾,汇报链升级为五选一分流。</div>
259
+ <div class="decision-row"><div class="decision-txt">1、发布节奏定档:单批 ≤6 版本、双周一档,版本总量季度 ≤20 个</div></div>
260
+ <div class="decision-row"><div class="decision-txt">2、验证前置改造 11-25 完成,回归时长压到 2 小时内</div></div>
261
+ <div class="decision-row"><div class="decision-txt">3、季报技能本周上线,「写总结」分流升级五选一(日报/周报/月报/季报/年报)</div></div>
262
+ <div class="decision-row"><div class="decision-txt">4、会议纪要技能同步孵化,作为汇报链源头(行动项可被日报/周报/月报/季报引用)</div></div>
263
+ </section>
264
+
265
+ <section class="section sec-tp rv">
266
+ <div class="sec-bar"></div>
267
+ <div class="sec-head">
268
+ <svg viewBox="0 0 24 24" width="22" height="22" fill="none" stroke="#c4b5fd" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 1 1-9-9"/><path d="M12 7v5l3 2"/><path d="M12 7c0-1.5 1-2.5 2.5-2.5"/></svg>
269
+ <h2>议题讨论</h2>
270
+ </div>
271
+ <div class="topic-card">
272
+ <div class="topic-name">议题一:双周发布节奏确认</div>
273
+ <div class="topic-concl"><span class="ck done">已决</span><span>按双周批次发布,单批 ≤6 版本,验证前置到开发期,回归控制在 2 小时内。</span></div>
274
+ <ul class="topic-pts">
275
+ <li>10 月 18 个版本、11 月 12 个,节奏波动大,回归耗时拖慢交付</li>
276
+ <li>大版本集中在月中发布,验证压力峰值明显</li>
277
+ <li>双周固定批次后月度版本数波动可控制在 ±30% 内</li>
278
+ </ul>
279
+ </div>
280
+ <div class="topic-card">
281
+ <div class="topic-name">议题二:季报技能与分流升级</div>
282
+ <div class="topic-concl"><span class="ck done">已决</span><span>季报技能按四段式 + 环比/同比双基准 + Q1-Q4 走势图实现,本周完成并升级分流为五选一。</span></div>
283
+ <ul class="topic-pts">
284
+ <li>季报成果段按 M1/M2/M3 月时间线,全季报按 Q1-Q4 季度时间线</li>
285
+ <li>概览数据卡必须带「较上季度」「较去年同期」双基准小字</li>
286
+ <li>日报/周报/年报的分流句需同步升级,月报已是五选一</li>
287
+ </ul>
288
+ </div>
289
+ <div class="topic-card">
290
+ <div class="topic-name">议题三:会议纪要技能孵化</div>
291
+ <div class="topic-concl"><span class="ck open">进行中</span><span>纪要五段式结构已定,行动项带负责人与截止时间,定位为汇报链源头。</span></div>
292
+ <ul class="topic-pts">
293
+ <li>行动项三要素:事项 + 负责人 + 截止时间,缺失标「待定」</li>
294
+ <li>日报/周报/月报/季报的 DATA_SOURCES 已支持会议纪要文件作为素材</li>
295
+ <li>下周例会前完成 HTML 五段卡版式与收编</li>
296
+ </ul>
297
+ </div>
298
+ </section>
299
+
300
+ <section class="section sec-ac rv">
301
+ <div class="sec-bar"></div>
302
+ <div class="sec-head">
303
+ <svg viewBox="0 0 24 24" width="22" height="22" fill="none" stroke="#fda4af" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg>
304
+ <h2>决议与行动项</h2>
305
+ </div>
306
+ <table class="act-table">
307
+ <tr><th>事项</th><th>负责人</th><th>截止时间</th><th>状态</th></tr>
308
+ <tr><td>1、发布节奏固化:单批 ≤6 版本、双周一档写入发布规范</td><td><span class="owner">李工</span></td><td class="ddl">2026-11-14</td><td><span class="st done">已完成</span></td></tr>
309
+ <tr><td>2、验证前置改造:回归用例前置到开发期,目标 ≤2 小时</td><td><span class="owner">王工</span></td><td class="ddl">2026-11-25</td><td><span class="st doing">进行中</span></td></tr>
310
+ <tr><td>3、季报技能收尾:盘落 + 分流五选一升级 + 收编 README/cli.js</td><td><span class="owner">赵工</span></td><td class="ddl">2026-11-13</td><td><span class="st doing">进行中</span></td></tr>
311
+ <tr><td>4、会议纪要技能上线:五段式 + 行动项表格版式 + 汇报链联动</td><td><span class="owner">赵工</span></td><td class="ddl">2026-11-15</td><td><span class="st todo">待办</span></td></tr>
312
+ <tr><td>5、多仓数据画像:数据收集层多仓合并去重方案评审</td><td><span class="owner">刘工</span></td><td class="ddl">2026-11-20</td><td><span class="st todo">待办</span></td></tr>
313
+ </table>
314
+ </section>
315
+
316
+ <section class="section sec-nx rv">
317
+ <div class="sec-bar"></div>
318
+ <div class="sec-head">
319
+ <svg viewBox="0 0 24 24" width="22" height="22" fill="none" stroke="#fdba74" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="17" rx="2"/><path d="M8 2v4M16 2v4M3 10h18"/></svg>
320
+ <h2>下次会议</h2>
321
+ </div>
322
+ <div class="next-line"><span class="next-k">时间</span><span class="next-v">2026-11-18 周三 14:00</span></div>
323
+ <div class="next-line"><span class="next-k">主题</span><span class="next-v">季报/会议纪要技能上线复盘 + 验证前置改造进展</span></div>
324
+ <div class="next-line"><span class="next-k">地点</span><span class="next-v">线上会议</span></div>
325
+ </section>
326
+
327
+ <footer>GENERATED BY AI TEAM · 2026-11-11</footer>
328
+ </div>
329
+
330
+ <div class="theme-dock" id="themeDock">
331
+ <button class="th-dot" type="button" data-theme="tech" title="深蓝科技"></button>
332
+ <button class="th-dot" type="button" data-theme="biz" title="浅色商务"></button>
333
+ <button class="th-dot" type="button" data-theme="mono" title="IDEA 黑亮"></button>
334
+ <button class="th-dot" type="button" data-theme="light" title="IDEA 白亮"></button>
335
+ <button class="th-dot" type="button" data-theme="warm" title="温暖渐变"></button>
336
+ </div>
337
+
338
+ <script>
339
+ // 复制源 = txt 纯文本全文
340
+ var TXT = "示例项目 周例会纪要\n\n生成时间:2026-11-12 19:10:38\n\n会议信息\n主题:示例项目 双周发布节奏与季报技能进展\n日期:2026-11-11 周三\n时间:14:00 ~ 14:45\n地点:线上会议\n主持人:张工\n参会人:李工、王工、赵工、刘工\n\n会议结论\nTL;DR:双周聚合发布节奏正式确认——单批 ≤6 版本、双周一档,11-25 前完成验证前置改造;季报技能本周收尾,汇报链升级为五选一分流。\n1、发布节奏定档:单批 ≤6 版本、双周一档,版本总量季度 ≤20 个\n2、验证前置改造 11-25 完成,回归时长压到 2 小时内\n3、季报技能本周上线,「写总结」分流升级五选一(日报/周报/月报/季报/年报)\n4、会议纪要技能同步孵化,作为汇报链源头(行动项可被日报/周报/月报/季报引用)\n\n议题讨论\n议题一:双周发布节奏确认\n结论:按双周批次发布,单批 ≤6 版本,验证前置到开发期,回归控制在 2 小时内。\n- 10 月 18 个版本、11 月 12 个,节奏波动大,回归耗时拖慢交付\n- 大版本集中在月中发布,验证压力峰值明显\n- 双周固定批次后月度版本数波动可控制在 ±30% 内\n议题二:季报技能与分流升级\n结论:季报技能按四段式 + 环比/同比双基准 + Q1-Q4 走势图实现,本周完成并升级分流为五选一。\n- 季报成果段按 M1/M2/M3 月时间线,全季报按 Q1-Q4 季度时间线\n- 概览数据卡必须带「较上季度」「较去年同期」双基准小字\n- 日报/周报/年报的分流句需同步升级,月报已是五选一\n议题三:会议纪要技能孵化\n结论:纪要五段式结构已定,行动项带负责人与截止时间,定位为汇报链源头。\n- 行动项三要素:事项 + 负责人 + 截止时间,缺失标「待定」\n- 日报/周报/月报/季报的 DATA_SOURCES 已支持会议纪要文件作为素材\n- 下周例会前完成 HTML 五段卡版式与收编\n\n决议与行动项\n1、发布节奏固化:单批 ≤6 版本、双周一档写入发布规范(负责人:李工,截止 2026-11-14,已完成)\n2、验证前置改造:回归用例前置到开发期,目标 ≤2 小时(负责人:王工,截止 2026-11-25,进行中)\n3、季报技能收尾:盘落 + 分流五选一升级 + 收编 README/cli.js(负责人:赵工,截止 2026-11-13,进行中)\n4、会议纪要技能上线:五段式 + 行动项表格版式 + 汇报链联动(负责人:赵工,截止 2026-11-15,待办)\n5、多仓数据画像:数据收集层多仓合并去重方案评审(负责人:刘工,截止 2026-11-20,待办)\n\n下次会议\n时间:2026-11-18 周三 14:00\n主题:季报/会议纪要技能上线复盘 + 验证前置改造进展\n地点:线上会议";
341
+
342
+ // 一键复制
343
+ var btn = document.getElementById('copyBtn');
344
+ var icon = document.getElementById('copyIcon');
345
+ var txt = document.getElementById('copyText');
346
+ btn.addEventListener('click', function(){
347
+ function done(){ icon.innerHTML = '<path d="M2.5 8.5l3.5 3.5 7-7.5"/>'; txt.textContent = '已复制'; setTimeout(function(){ icon.innerHTML = '<rect x="5.5" y="5.5" width="8.5" height="8.5" rx="1.5"/><path d="M10.5 5.5V4a1.5 1.5 0 0 0-1.5-1.5H4A1.5 1.5 0 0 0 2.5 4v5A1.5 1.5 0 0 0 4 10.5h1.5"/>'; txt.textContent = '一键复制'; }, 1600); }
348
+ if (navigator.clipboard && navigator.clipboard.writeText) {
349
+ navigator.clipboard.writeText(TXT).then(done, function(){ fallback(); });
350
+ } else { fallback(); }
351
+ function fallback(){
352
+ var ta = document.createElement('textarea');
353
+ ta.value = TXT;
354
+ ta.style.cssText = 'position:fixed;left:-9999px;top:0';
355
+ document.body.appendChild(ta);
356
+ ta.select();
357
+ try { document.execCommand('copy'); done(); } catch(e){}
358
+ document.body.removeChild(ta);
359
+ }
360
+ });
361
+
362
+ // 换肤坞
363
+
364
+ /* 稳定身份命名空间:localStorage 键按页内嵌唯一 ID(meta minutes-id)命名——Chrome/Safari 下 file:// 与 localhost 共享同源存储,固定键名会导致多份产物互相串台;ID 与文件路径解耦,改名/移动目录记忆不丢 */
365
+ var SF_ID = ((document.querySelector('meta[name="minutes-id"]') || {}).content || 'REF-MINUTES-0000').trim();
366
+ /* ID 格式自愈(格式定死执行层):meta 非法或缺失(占位残留/手写变体/误沿用旧值)时按路径键自愈为 crypto.randomUUID() 标准 v4,同路径跨打开稳定;合法 UUID 原样使用(复制文件副本=同一身份共享数据,是特性) */
367
+ if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(SF_ID)) {
368
+ var __sfHealKey = 'sf-heal:' + location.pathname;
369
+ try { SF_ID = localStorage.getItem(__sfHealKey) || SF_ID; } catch (e) {}
370
+ if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(SF_ID)) {
371
+ try { SF_ID = crypto.randomUUID(); } catch (e) {
372
+ SF_ID = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c){ var r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8); return v.toString(16); });
373
+ }
374
+ try { localStorage.setItem(__sfHealKey, SF_ID); } catch (e) {}
375
+ }
376
+ var __sfMeta = document.querySelector('meta[name="minutes-id"]');
377
+ if (__sfMeta) __sfMeta.setAttribute('content', SF_ID);
378
+ console.warn('[meeting-minutes] meta minutes-id 非法或缺失,已自愈为标准 v4 ID(' + SF_ID + '),建议重新生成页面固化');
379
+ }
380
+
381
+ var SF_NS = 'minutes:' + SF_ID;
382
+
383
+ (function(){
384
+ var dock = document.getElementById('themeDock');
385
+ if (!dock) return;
386
+ var saved = null;
387
+ try { saved = localStorage.getItem(SF_NS + '-theme') || localStorage.getItem('sf:' + location.pathname + '-theme'); } catch(e){}
388
+ if (saved) document.documentElement.setAttribute('data-theme', saved);
389
+ var dots = dock.querySelectorAll('.th-dot');
390
+ function mark(){ dots.forEach(function(d){ d.classList.toggle('on', d.getAttribute('data-theme') === document.documentElement.getAttribute('data-theme')); }); }
391
+ mark();
392
+ dots.forEach(function(d){
393
+ d.addEventListener('click', function(){
394
+ var t = d.getAttribute('data-theme');
395
+ document.documentElement.setAttribute('data-theme', t);
396
+ try { localStorage.setItem(SF_NS + '-theme', t); } catch(e){}
397
+ mark();
398
+ });
399
+ });
400
+ })();
401
+
402
+ // 截图模式 + 滚动入场 + 3D 微倾斜
403
+ (function(){
404
+ document.documentElement.classList.add('js');
405
+ var shot = /[?&]shot=content/.test(location.search);
406
+ if (shot){
407
+ var hc = document.querySelector('.header-card'), ft = document.querySelector('footer'), dock = document.getElementById('themeDock');
408
+ if (hc) hc.style.display = 'none';
409
+ if (ft) ft.style.display = 'none';
410
+ if (dock) dock.style.display = 'none';
411
+ var cw = document.querySelector('.copy-wrap');
412
+ if (cw) cw.style.display = 'none';
413
+ document.body.style.padding = '40px';
414
+ }
415
+ var rvs = document.querySelectorAll('.rv');
416
+ if (!('IntersectionObserver' in window)){ rvs.forEach(function(el){ el.classList.add('in'); }); return; }
417
+ var io2 = new IntersectionObserver(function(entries){
418
+ entries.forEach(function(en){ if (en.isIntersecting){ en.target.classList.add('in'); io2.unobserve(en.target); } });
419
+ }, { threshold: 0.12 });
420
+ rvs.forEach(function(el){ io2.observe(el); });
421
+ if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches){ rvs.forEach(function(el){ el.classList.add('in'); }); }
422
+ setTimeout(function(){
423
+ document.querySelectorAll('.rv:not(.in)').forEach(function(el){ el.classList.add('in'); });
424
+ }, 2000);
425
+ var secs = document.querySelectorAll('.section');
426
+ secs.forEach(function(s){
427
+ s.addEventListener('mousemove', function(e){
428
+ var r = s.getBoundingClientRect();
429
+ s.style.setProperty('--mx', ((e.clientX - r.left) / r.width - .5).toFixed(3));
430
+ s.style.setProperty('--my', ((e.clientY - r.top) / r.height - .5).toFixed(3));
431
+ });
432
+ });
433
+ })();
434
+ </script>
435
+ </body>
436
+ </html>
@@ -0,0 +1,63 @@
1
+ # 会议纪要使用指南
2
+
3
+ ## 能干什么
4
+
5
+ 把一场会整理成五段式会议纪要:会议信息(主题/日期/地点/主持人/参会人)/ 会议结论(一句话 TL;DR + 核心决策)/ 议题讨论(议题名 + 结论 + 讨论要点)/ 决议与行动项(事项 + 负责人 + 截止时间)/ 下次会议。适配各行业各类型会议:内置 12 类会议类型词典(周例会/评审会/复盘会/客户会议等),报会议类型自动换要素侧重与行动项话术。行动项带负责人与截止时间,是汇报链的源头——日报/周报/月报/季报生成时可直接引用会议行动项。
6
+
7
+ ## 基本用法
8
+ - 直接说「写会议纪要 / 记一下会议 / 整理会议记录」→ 默认按当前会话口述与提供的材料生成
9
+ - 指定会议(多种说法均可):
10
+ - 「今天的会 / 刚才的会」→ 当天会议(日期按当前系统日期)
11
+ - 「昨天的会 / 上周三的周例会」→ 按口述日期换算
12
+ - 「整理 2026-11-11 的会议纪要」→ 明确指定日期(若当天有多场会,按主题区分文件名)
13
+ - 同一场会议重复生成默认直接覆盖;说「保留之前的 / 另存 / 不覆盖」→ 文件名追加时间戳另存不覆盖
14
+ - 说「打开 / 查看 11-11 的会议纪要」→ 该纪要文件已存在时直接打开不重新生成;不存在则按正常流程生成
15
+
16
+ ## 口头补充素材
17
+ - 说「补充一下:会上还定了月底上线,小明负责联调」→ 自动拆成行动项(事项 + 负责人 + 截止时间)并入行动项段
18
+ - 拆分信号:负责人词(XX 负责/XX 跟进/交给 XX)、时间词(这周/月底/周五前/11-20)、连接词(还有/另外/以及)
19
+ - 补充内容带分段词时按段并入:「议题:预算审批」→ 议题讨论段;「决策:走方案 B」→ 会议结论段;不带分段词按语义归段
20
+ - 与已记录内容自动去重,同一行动项只保留一条
21
+
22
+ ## 贴文字 / 发图片 / 给文件整理
23
+ - 直接贴一段文字说「整理成会议纪要 / 把这段聊天记录整理成纪要」→ 以文字为主源生成;说「只整理这段文字 / 只按这段」同样跳过其它来源与会话上下文
24
+ - 发图片(白板照片/聊天截图/议程照片等 jpg/png/webp)或给文件(md/txt/docx/pdf 等)说「整理成会议纪要」→ 先用 Read 读取:图片按视觉理解提取文字信息,md/txt 直接读文本,docx/pdf 优先尝试 pandoc 转文本(无 pandoc 则请用户粘贴文字);会议录音/视频不能直接解析,请提供转写文本或口述要点
25
+ - 图片模糊/内容读不清时:先把已提取的部分展示给用户确认或补充,不瞎编没读到的内容
26
+ - 素材不足的段写「暂无」并提示用户可补充素材
27
+ - 默认直接生成落盘(CONFIRM: never,无需确认);把顶部 CONFIRM 改为 text/always,或临时说「先看看效果/先出效果」→ 先在对话输出整理好的纪要正文,用户说「可以/确认/落盘」→ 再落盘文件与内容区截图并开 html;说「改一下 xxx」→ 按意见修改后重新出效果再确认
28
+ - 说「不用确认/直接落盘」→ 当次跳过确认直接落盘(临时要求优先于配置)
29
+ - 说「不落盘/别写文件」时跳过确认,直接对话输出
30
+
31
+ ## 自定义模板(适配各类会议)
32
+ - 内置模板为五段式(会议信息/会议结论/议题讨论/决议与行动项/下次会议),适合通用会议;特殊会议可自定义模板
33
+ - 临时换模板:说「这次按 xxx 来」→ 口头描述结构(如「按三段:会议结论/行动项/下次会议」),当次按该结构生成,不改配置
34
+ - 永久换模板:把顶部配置 TEMPLATE 改为 custom,并按 user-config.md 的「📝 自定义模板」节说明修改段结构,之后默认按新模板生成
35
+ - 说「以后都用这个模板」→ 自动把当前口述的结构写入「📝 自定义模板」节并把 TEMPLATE 改为 custom
36
+ - 模板优先于纯文字模式的信号词归类:指定了段名后,文字按段名归类填充
37
+
38
+ ## 角色定制(我的职业画像)
39
+ - 默认按顶部「默认配置」ROLE 推断会议类型与术语(当前:全栈开发工程师(企业内技术开发));说「我的职业是 XX / 我的主要工作是 XX / 以后默认用 XX 角色」→ 永久修改 ROLE
40
+ - 说「以 XX 的身份记」→ 当次按该角色视角生成(内置 12 类会议词条:周例会/项目评审/需求评审/技术方案评审/复盘会/客户会议/跨部门协调会/OKR 对齐会/全员会/设计评审/合同谈判/面试复盘可直接用),不改配置
41
+ - 词典外会议类型走兜底:按骨架 + 你提供的素材现场生成侧重;说「记住这类会」→ 固化为新词条
42
+
43
+ ## 控制落盘(临时要求,仅对当次生效)
44
+ - 默认:对话输出 Markdown + md/txt/html 三文件 + 内容区截图 content-png 落盘到 DIR(auto 按系统选:macOS=~/reports、Windows=%USERPROFILE%\reports,模板默认值,路径以 user-config.md 顶部「默认配置」为准)/meetings/{系列名}/(SERIES_GROUP=auto:提取到稳定系列名建系列目录,未提取到回退 meetings/YYYY-MM/ 月份平铺)+ html 自动打开(DIR 目录/盘符不存在时自动改用用户主目录下 reports:macOS=~/reports、Windows=%USERPROFILE%\reports)
45
+ - 说「写到桌面」→ 本次落盘到桌面(macOS=~/Desktop、Windows=%USERPROFILE%\Desktop);说「存到 ~/report / D:\report」→ 本次用指定目录(仍按 SERIES_GROUP 规则建系列/月份子目录);说「这个系列叫 XX」→ 当次用新系列名建目录;说「以后这个系列叫 XX」→ 永久记住该系列名;说「把我旧纪要按系列整理」→ 一次性把 meetings/ 下旧纪要按系列名归置到系列目录
46
+ - 说「不落盘/别写文件」→ 本次只在对话输出,不写文件、不开浏览器
47
+ - 说「只要 md」「只出 html」「只要内容区截图」→ 本次只落指定格式文件;说「这次不截图」→ 本次跳过截图(content-png = 五张分节卡片整体一张图,四周约 40px 留白,不含头部标题、复制按钮、页脚)
48
+ - 说「只要截图/重新截个图」(如「给 11-11 会议纪要截个图」)→ 本次不重新生成内容,只对现有 html 执行内容区截图(覆盖 content-png,需 html 已存在,找不到则提示先生成)
49
+ - 说「别开浏览器」→ 本次落盘后不自动打开 html
50
+ - 说「保留之前的」→ 同一会议重复生成时不覆盖,文件名追加时间戳另存
51
+
52
+ ## 配置开关(改 user-config.md 顶部「默认配置」节,长期生效)
53
+ | 配置项 | 作用 | 可选值 / 示例 |
54
+ |---|---|---|
55
+ | DISK | 是否落盘写文件 | true(落盘,默认)/ false(默认只在对话输出) |
56
+ | FORMATS | 落盘哪些格式(数组) | [md, txt, html, content-png](默认,含内容区截图)/ [md, html] / [md, txt, html](不截图);content-png = 五张分节卡片整体截图(四周约 40px 留白),不含头部标题/复制按钮/页脚 |
57
+ | DIR | 落盘根目录 | auto(按当前系统自动选 DIR_MAC / DIR_WIN,默认);DIR_MAC = macOS 根目录(模板默认 ~/reports,可改);DIR_WIN = Windows 根目录(模板默认 %USERPROFILE%\reports,可改) |
58
+ | OPEN_HTML | 落盘后是否自动打开 html | true(自动打开,默认)/ false(不打开) |
59
+ | TEMPLATE | 纪要模板 | default(内置五段式,默认)/ custom(按「📝 自定义模板」节的结构生成) |
60
+ | ROLE | 默认职业角色画像 | 全栈开发工程师(企业内技术开发)等;职业名 + 括号内工作内容 |
61
+ | CONFIRM | 落盘前先出效果确认 | never(直接生成不确认,默认)/ text(纯文字整理模式确认)/ always(所有生成都确认) |
62
+ - 优先级:临时口头要求(不落盘/写到桌面/只要 md/只要内容区截图/这次不截图/别开浏览器/临时换模板等)永远优先于默认配置,仅对当次生效、不改配置
63
+ - DIR(按系统解析)指向的目录/盘符不存在时,自动回退到用户主目录下 reports(macOS=~/reports、Windows=%USERPROFILE%\reports)
@@ -0,0 +1,56 @@
1
+ # 用户配置(升级技能时本文件不会被覆盖)
2
+
3
+ > 你的个人配置全放在这里。skill-forge 升级技能时官方只更新 SKILL.md 与 resources/,
4
+ > 本文件始终保留你的版本——落盘目录、格式、角色画像、自定义模板放心改。
5
+ > 官方升级若带来新配置点,会另存 `user-config.md.upstream` 对照文件到同目录,
6
+ > 你按需查看并手动合并新配置点到本文件。
7
+
8
+
9
+ ## ⚙️ 默认配置(用户可手动修改;临时口头要求永远优先)
10
+
11
+ ```yaml
12
+ DISK: true # 是否落盘写文件;false = 默认只在对话输出,不写文件不开浏览器
13
+ CONFIG_VERSION: 2 # 配置结构版本:skill 升级时若配置结构变化会递增;AI 每次执行前对比 SKILL.md「配置版本机制」节声明的当前版本,不一致时按 SKILL.md 的迁移规则处理(先备份本文件为带时间戳 .bak,再迁移,最后对话告知用户)
14
+ FORMATS: [md, txt, html, content-png] # 落盘哪些格式(数组,可删减/增,如 [md, html] / [md, txt, html](不截图);content-png = 内容区截图(五张分节卡片整体,不含头部标题/复制按钮/页脚),删除该项即不截图;不影响对话中的 md 正文输出)
15
+ SERIES_GROUP: auto # 纪要系列分组:auto = 提取到稳定系列名(如「产品周例会」)时建系列目录 meetings/{系列名}/,未提取到则回退月份平铺 meetings/YYYY-MM/;series = 一律建系列目录(提取不到就用会议主题做目录名);off = 纯月份平铺(旧行为)。系列名落盘确认时报给用户,可改口(说「这个系列叫 XX」→ 当次改目录名;说「以后这个系列叫 XX」→ 永久记住该系列名)
16
+ DIR: auto # 落盘根目录:auto = 按当前系统自动选 DIR_MAC / DIR_WIN(也可直接写死某个绝对路径)
17
+ DIR_MAC: ~/reports # macOS 落盘根目录(按 SERIES_GROUP 规则建子目录:auto/series 建 meetings/{系列名}/、off 或未提取到系列名建 meetings/YYYY-MM/;目录不存在时回退用户主目录下 reports)
18
+ DIR_WIN: %USERPROFILE%\reports # Windows 落盘根目录(按 SERIES_GROUP 规则建子目录:auto/series 建 meetings/{系列名}/、off 或未提取到系列名建 meetings/YYYY-MM/;目录/盘符不存在时回退用户主目录下 reports)
19
+ OPEN_HTML: true # 落盘后是否自动用浏览器打开 html(FORMATS 不含 html 时忽略)
20
+ THEME: tech # html 页面主题:tech 深蓝科技(默认)/ biz 浅色商务 / mono IDEA 黑亮 / light IDEA 白亮 / warm 温暖渐变;生成时写 <html data-theme="THEME值"> 定默认,页面右下角换肤坞五色点随点随换(浏览器本地记忆(键按页内嵌唯一 ID 隔离、多份产物互不串台、改名/移动目录记忆不丢;生成时头部写 `<meta name="minutes-id" content="<UUID>">`,每次新 UUID),?shot 截图模式自动隐藏,打印隐藏)
21
+ TEMPLATE: default # 纪要模板:default = 内置五段式(会议信息/会议结论/议题讨论/决议与行动项/下次会议);custom = 使用下方「📝 自定义模板」节;口头临时指定模板仅当次生效
22
+ ROLE: 全栈开发工程师(企业内技术开发) # 用户默认职业角色与主要工作内容(两者并存:职业名 + 括号内工作内容,会议类型推断/术语/行动项模板全部按此画像走);用户随口描述职业时(如「我搞装修的,天天跑工地」)→ AI 提炼为规范表述(装修项目经理(负责工地现场管理、施工进度与质量巡检))更新此处;说「以 XX 的身份写」→ 当次临时换角色不改配置;说「以后默认用 XX 角色 / 我的职业是 XX / 我的主要工作是 XX」→ 永久更新此处
23
+ CONFIRM: never # 落盘前确认:never = 直接生成落盘不确认(默认);text = 纯文字整理模式先出效果确认后再落盘;always = 任何方式生成都先确认;临时说「先看看效果」当次先确认、说「不用确认」当次跳过
24
+ DATA_SOURCES: [] # 数据源清单(升级不覆盖;AI 每次生成前 Read 本文件按此清单收集;空清单 = 只按会话/文字内容生成)。每项:name 唯一名称 + type 类型 + 路径。三种类型示例(把下方 # 注释示例改成你的真实数据源后填入上方数组;未知 type(拼写错误)忽略该项并在生成时一句话提示,不中断):
25
+ # - name: 会议速记目录 # 名称:唯一 key(重名视为同一数据源;口述「只整理 xxx」按 name 匹配)
26
+ # type: file # file = 普通文件/目录(文件 Read 全文、目录逐个 Read 文本文件,二进制跳过;路径无效静默跳过)
27
+ # mac: ~/Documents/meetings # macOS 路径(绝对路径或 ~ 开头)
28
+ # win: D:\Documents\meetings # Windows 路径;「-」= 该系统不存在,自动跳过
29
+ # - name: 会议录音转写
30
+ # type: file
31
+ # mac: ~/Documents/meeting-transcript.txt
32
+ # win: -
33
+ # - name: 项目周报
34
+ # type: file
35
+ # mac: ~/reports/2026-11/weekly-report-2026-11-06.md
36
+ # win: -
37
+ ```
38
+
39
+ > 临时口头要求(仅对当次生效,不修改上方配置):说「不落盘/别写文件」→ 当次 DISK=false;说「写到桌面/存到 ~/report(macOS)或 D:\report(Windows)」→ 当次改用该 DIR;说「只要 md / 只出 html / 只要内容区截图」→ 当次只落指定格式;说「这次不截图」→ 当次不生成内容区截图;说「只要截图/重新截个图」→ 当次只对现有 html 执行内容区截图(不重新收集材料、不重写 md/txt/html 内容文件);说「别开浏览器」→ 当次 OPEN_HTML=false;说「这次按 xxx 模板来」→ 当次临时换模板(不改配置);说「以后都用这个模板」→ 自动写入下方「📝 自定义模板」节并把 TEMPLATE 改为 custom(永久生效);说「先看看效果/先出效果再落盘」→ 当次先出效果确认后再落盘;说「不用确认/直接落盘」→ 当次跳过确认直接落盘。说「页面用浅色商务主题/浅色主题」→ 当次 THEME=biz;说「以后默认用暖色主题」→ 永久改 THEME=warm。
40
+
41
+ ## 📝 自定义模板(TEMPLATE: custom 时启用,用户可手改,适配各类会议)
42
+
43
+ 把顶部 TEMPLATE 改为 custom 后,按下面结构生成纪要(段名、段数、条目格式均可改):
44
+
45
+ ```text
46
+ 段一:会议信息(主题 - 日期 - 地点 - 主持人 - 参会人)
47
+ 段二:会议结论(TL;DR + 核心决策)
48
+ 段三:议题讨论(议题名 - 结论 - 讨论要点)
49
+ 段四:决议与行动项(事项 - 负责人 - 截止时间)
50
+ 段五:下次会议(主题 - 时间)
51
+ ```
52
+
53
+ > 只写段结构与条目格式即可;未写明的细节(中文顿号序号、生成时间行、落盘行为、HTML 样式)沿用默认规范。
54
+
55
+ ---
56
+ > 更多用法见 SKILL.md 的「生成流程」与 resources/ 分册。