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.
- package/CHANGELOG.md +18 -0
- package/README.md +82 -150
- package/annual-report/SKILL.md +23 -3
- package/annual-report/resources/data-collection.md +20 -4
- package/annual-report/resources/disk-and-html.md +3 -3
- package/annual-report/resources/reference.html +31 -10
- package/annual-report/resources/usage-guide.md +8 -0
- package/annual-report/user-config.md +5 -5
- package/article-to-html/SKILL.md +26 -7
- package/article-to-html/design-system.md +9 -3
- package/article-to-html/resources/reference.html +631 -0
- package/article-to-html/resources/usage-guide.md +9 -1
- package/article-to-html/user-config.md +6 -3
- package/cli.js +2 -2
- package/daily-report/SKILL.md +23 -3
- package/daily-report/resources/content-rules.md +1 -1
- package/daily-report/resources/data-collection.md +24 -4
- package/daily-report/resources/disk-and-html.md +2 -2
- package/daily-report/resources/reference.html +24 -3
- package/daily-report/resources/usage-guide.md +8 -0
- package/daily-report/user-config.md +5 -5
- package/deck-stage/SKILL.md +15 -4
- package/deck-stage/resources/cover-template.html +3 -3
- package/deck-stage/resources/data-schema.md +11 -1
- package/deck-stage/resources/pptx-builder.js +1 -1
- package/deck-stage/resources/usage-guide.md +9 -2
- package/docs/architecture.md +89 -0
- package/docs/images/article-to-html.png +0 -0
- package/docs/images/daily-report.png +0 -0
- package/docs/images/deck-stage.png +0 -0
- package/docs/images/magic-deck.png +0 -0
- package/docs/images/meeting-minutes.png +0 -0
- package/docs/images/prompt-pouch.png +0 -0
- package/docs/install.md +71 -0
- package/magic-deck/SKILL.md +23 -8
- package/magic-deck/resources/content-guide.md +5 -4
- package/magic-deck/resources/deck-spec.md +18 -11
- package/magic-deck/resources/reference.html +110 -32
- package/magic-deck/resources/usage-guide.md +10 -2
- package/magic-deck/user-config.md +4 -4
- package/meeting-minutes/SKILL.md +51 -0
- package/meeting-minutes/resources/content-rules.md +57 -0
- package/meeting-minutes/resources/disk-and-html.md +26 -0
- package/meeting-minutes/resources/meeting-type-dictionary.md +24 -0
- package/meeting-minutes/resources/reference.html +436 -0
- package/meeting-minutes/resources/usage-guide.md +63 -0
- package/meeting-minutes/user-config.md +56 -0
- package/meta-forge/SKILL.md +6 -6
- package/meta-forge/resources/forge-rules.md +55 -10
- package/meta-forge/resources/usage-guide.md +7 -3
- package/meta-forge/user-config.md +1 -1
- package/monthly-report/SKILL.md +62 -0
- package/monthly-report/resources/content-rules.md +40 -0
- package/monthly-report/resources/data-collection.md +44 -0
- package/monthly-report/resources/date-parsing.md +18 -0
- package/monthly-report/resources/disk-and-html.md +29 -0
- package/monthly-report/resources/industry-dictionary.md +21 -0
- package/monthly-report/resources/reference.html +531 -0
- package/monthly-report/resources/usage-guide.md +75 -0
- package/monthly-report/user-config.md +53 -0
- package/package.json +9 -2
- package/prompt-pouch/SKILL.md +17 -2
- package/prompt-pouch/resources/data-format.md +1 -1
- package/prompt-pouch/resources/reference.html +56 -24
- package/prompt-pouch/resources/usage-guide.md +10 -3
- package/quarterly-report/SKILL.md +63 -0
- package/quarterly-report/resources/content-rules.md +42 -0
- package/quarterly-report/resources/data-collection.md +46 -0
- package/quarterly-report/resources/date-parsing.md +19 -0
- package/quarterly-report/resources/disk-and-html.md +22 -0
- package/quarterly-report/resources/industry-dictionary.md +21 -0
- package/quarterly-report/resources/reference.html +509 -0
- package/quarterly-report/resources/usage-guide.md +76 -0
- package/quarterly-report/user-config.md +53 -0
- package/spec-doc2spec/SKILL.md +21 -22
- package/spec-doc2spec/resources/checklist.md +7 -0
- package/spec-doc2spec/resources/images.md +14 -5
- package/spec-doc2spec/resources/structure.md +19 -10
- package/spec-doc2spec/resources/usage-guide.md +10 -8
- package/spec-doc2spec/user-config.md +2 -2
- package/spec-spec2doc/SKILL.md +4 -4
- package/spec-spec2doc/resources/checklist.md +6 -0
- package/spec-spec2doc/resources/pdf-path.md +1 -0
- package/spec-spec2doc/resources/usage-guide.md +2 -2
- package/template/SKILL.md +1 -1
- package/weekly-report/SKILL.md +23 -3
- package/weekly-report/resources/content-rules.md +1 -1
- package/weekly-report/resources/data-collection.md +24 -4
- package/weekly-report/resources/disk-and-html.md +2 -2
- package/weekly-report/resources/reference.html +24 -3
- package/weekly-report/resources/usage-guide.md +8 -0
- package/weekly-report/user-config.md +5 -5
|
@@ -0,0 +1,531 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<meta name="sf-template" content="monthly-report@2">
|
|
7
|
+
<meta name="monthly-id" content="REF-MONTHLY-0000">
|
|
8
|
+
<title>2026-11 研发月度总结</title>
|
|
9
|
+
<style>
|
|
10
|
+
|
|
11
|
+
/* ═══ 五主题令牌:12 核心契约(与 magic-deck 一致)+ 报告扩展(发光/氛围/热力/语义色);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"]{ /* IDEA 黑亮:JetBrains New UI Dark 官方(编辑区 #1e1f22 + 面板 #2b2d30 + 描边 #3c3f41) */
|
|
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"]{ /* IDEA 白亮:IntelliJ Light 官方(白编辑区 + 浅灰面板 #f2f2f2 + IDEA 蓝 #2675bf) */
|
|
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
|
+
/* 浅色主题下星点氛围自然退隐 */
|
|
68
|
+
[data-theme="biz"] .stars, [data-theme="light"] .stars, [data-theme="warm"] .stars{ opacity:.28; }
|
|
69
|
+
/* mono 黑亮下星点换装:去彩改中性灰白(条纹留存不泛蓝) */
|
|
70
|
+
[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)}
|
|
71
|
+
|
|
72
|
+
*{margin:0;padding:0;box-sizing:border-box}
|
|
73
|
+
html,body{background:var(--bg)}
|
|
74
|
+
body{
|
|
75
|
+
font-family:ui-monospace,'SF Mono',SFMono-Regular,Menlo,Consolas,'PingFang SC','Microsoft YaHei',monospace;
|
|
76
|
+
color:var(--text);-webkit-font-smoothing:antialiased;overflow-x:hidden;
|
|
77
|
+
}
|
|
78
|
+
/* 三层科技底纹 */
|
|
79
|
+
.grid-pattern{position:fixed;inset:0;z-index:0;pointer-events:none;
|
|
80
|
+
background:linear-gradient(var(--scan-dim) 1px,transparent 1px),linear-gradient(90deg,var(--scan-dim) 1px,transparent 1px);
|
|
81
|
+
background-size:60px 60px}
|
|
82
|
+
.stars{position:fixed;inset:0;z-index:0;pointer-events:none;
|
|
83
|
+
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)}
|
|
84
|
+
.scanlines{position:fixed;inset:0;z-index:999;pointer-events:none;
|
|
85
|
+
background:repeating-linear-gradient(0deg,transparent,transparent 2px,var(--scan-dim) 2px,var(--scan-dim) 4px)}
|
|
86
|
+
.scanband{position:fixed;left:0;right:0;height:150px;z-index:998;pointer-events:none;
|
|
87
|
+
background:linear-gradient(180deg,transparent,var(--scan-dim) 50%,transparent);
|
|
88
|
+
animation:scanMove 11s linear infinite}
|
|
89
|
+
@keyframes scanMove{from{top:-22%}to{top:112%}}
|
|
90
|
+
.wrap{width:clamp(640px, 60%, 1200px); margin:0 auto; position:relative; z-index:1; padding:40px 0}
|
|
91
|
+
/* 头部卡片 */
|
|
92
|
+
.header-card{position:relative;overflow:hidden;background:var(--panel-solid);border:1px solid var(--border);border-radius:6px;
|
|
93
|
+
padding:34px 28px 26px;text-align:center;margin-bottom:18px;
|
|
94
|
+
box-shadow:var(--card-shadow);
|
|
95
|
+
background-image:repeating-linear-gradient(180deg, rgba(255,255,255,.012) 0 1px, transparent 1px 8px)}
|
|
96
|
+
.header-card h1{font-size:26px;letter-spacing:2px;margin-bottom:8px;
|
|
97
|
+
background:var(--title-grad);-webkit-background-clip:text;background-clip:text;color:transparent;
|
|
98
|
+
animation:titleGlow 3s ease-in-out infinite}
|
|
99
|
+
@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)}}
|
|
100
|
+
.header-sub{font-size:12px;color:var(--muted);letter-spacing:1px;margin-bottom:12px}
|
|
101
|
+
.header-badge{display:inline-block;font-size:11px;color:var(--accent);border:1px solid var(--glow);border-radius:999px;padding:4px 14px}
|
|
102
|
+
.card-glow{position:absolute;inset:-40% -20% auto;height:70%;pointer-events:none;
|
|
103
|
+
background:radial-gradient(ellipse at 50% 10%,var(--glow),transparent 70%);
|
|
104
|
+
animation:cardGlow 3s ease-in-out infinite;transform-origin:top center;opacity:.5}
|
|
105
|
+
@keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}
|
|
106
|
+
/* 四边浮光线 */
|
|
107
|
+
.scanline-el{position:absolute;pointer-events:none}
|
|
108
|
+
.scan-x{top:0;left:0;height:1px;width:100%;background:linear-gradient(90deg,transparent,var(--accent),transparent);animation:scanX 3s linear infinite}
|
|
109
|
+
.scan-y{top:0;right:0;width:1px;height:100%;background:linear-gradient(180deg,transparent,var(--accent),transparent);animation:scanY 3s linear infinite}
|
|
110
|
+
.scan-x-rev{bottom:0;left:0;height:1px;width:100%;background:linear-gradient(90deg,transparent,var(--accent),transparent);animation:scanXRev 3s linear infinite}
|
|
111
|
+
.scan-y-rev{top:0;left:0;width:1px;height:100%;background:linear-gradient(180deg,transparent,var(--accent),transparent);animation:scanYRev 3s linear infinite}
|
|
112
|
+
@keyframes scanX{from{transform:translateX(-100%)}to{transform:translateX(100%)}}
|
|
113
|
+
@keyframes scanY{from{transform:translateY(-100%)}to{transform:translateY(100%)}}
|
|
114
|
+
@keyframes scanXRev{from{transform:translateX(100%)}to{transform:translateX(-100%)}}
|
|
115
|
+
@keyframes scanYRev{from{transform:translateY(100%)}to{transform:translateY(-100%)}}
|
|
116
|
+
/* 分节卡片 */
|
|
117
|
+
.section{position:relative;overflow:hidden;background:var(--panel-solid);border:1px solid var(--border);border-radius:6px;
|
|
118
|
+
padding:22px 24px 22px 32px;margin-bottom:18px;
|
|
119
|
+
box-shadow:var(--card-shadow);
|
|
120
|
+
background-image:repeating-linear-gradient(180deg, rgba(255,255,255,.012) 0 1px, transparent 1px 8px);
|
|
121
|
+
transition:transform .18s ease,box-shadow .18s ease}
|
|
122
|
+
.section:hover{transform:translateY(-2px);box-shadow:var(--card-shadow),inset 0 0 22px var(--glow-soft)}
|
|
123
|
+
.sec-bar{position:absolute;left:0;top:0;bottom:0;width:8px}
|
|
124
|
+
.sec-ov .sec-bar{background:linear-gradient(180deg,var(--accent2),var(--accent));box-shadow:0 0 12px var(--glow)}
|
|
125
|
+
.sec-ms .sec-bar{background:linear-gradient(180deg,#5eead4,#14b8a6);box-shadow:0 0 12px rgba(20,184,166,.3)}
|
|
126
|
+
.sec-pi .sec-bar{background:linear-gradient(180deg,#fda4af,#e11d48);box-shadow:0 0 12px rgba(244,63,94,.3)}
|
|
127
|
+
.sec-nm .sec-bar{background:linear-gradient(180deg,#fdba74,#f97316);box-shadow:0 0 12px rgba(249,115,22,.3)}
|
|
128
|
+
.sec-head{display:flex;align-items:center;gap:10px;margin-bottom:16px}
|
|
129
|
+
.sec-head svg{flex:0 0 auto}
|
|
130
|
+
.sec-head h2{font-size:18px;letter-spacing:1px;animation:secGlow 3s ease-in-out infinite}
|
|
131
|
+
.sec-ov .sec-head h2{color:var(--accent)}.sec-ms .sec-head h2{color:#5eead4}
|
|
132
|
+
.sec-pi .sec-head h2{color:#fda4af}.sec-nm .sec-head h2{color:#fdba74}
|
|
133
|
+
@keyframes secGlow{0%,100%{text-shadow:0 0 6px var(--glow)}50%{text-shadow:0 0 14px var(--glow)}}
|
|
134
|
+
/* 概览:TL;DR + 数据卡 */
|
|
135
|
+
.tldr-line{font-size:15px;line-height:1.75;margin-bottom:18px}
|
|
136
|
+
.tldr-line b{color:var(--accent);font-weight:700}
|
|
137
|
+
.stat-row{display:flex;gap:12px;flex-wrap:wrap}
|
|
138
|
+
.stat-card{flex:1 1 160px;position:relative;background:var(--tag-bg);border:1px solid var(--border);
|
|
139
|
+
border-radius:6px;padding:16px 14px;min-width:140px;overflow:hidden;
|
|
140
|
+
transition:transform .18s ease,box-shadow .18s ease}
|
|
141
|
+
.stat-card:hover{transform:translateY(-2px);box-shadow:0 8px 20px rgba(0,0,0,.35)}
|
|
142
|
+
.stat-card::before{content:'';position:absolute;left:0;top:0;bottom:0;width:4px;background:linear-gradient(180deg,var(--accent2),var(--accent))}
|
|
143
|
+
.stat-num{font-size:28px;font-weight:900;letter-spacing:1px;
|
|
144
|
+
background:var(--title-grad);-webkit-background-clip:text;background-clip:text;color:transparent}
|
|
145
|
+
.stat-label{font-size:12px;color:var(--muted);margin-top:6px}
|
|
146
|
+
.stat-cmp{font-size:11.5px;margin-top:4px}
|
|
147
|
+
.stat-cmp.up{color:var(--green)}
|
|
148
|
+
.stat-cmp.down{color:var(--rose)}
|
|
149
|
+
/* 周时间线 */
|
|
150
|
+
.timeline{position:relative;padding-left:26px}
|
|
151
|
+
.timeline::before{content:'';position:absolute;left:7px;top:6px;bottom:6px;width:2px;background:linear-gradient(180deg,var(--glow),var(--glow-soft))}
|
|
152
|
+
.tl-group{position:relative;margin-bottom:18px}
|
|
153
|
+
.tl-node{position:absolute;left:-26px;top:0;width:16px;height:16px;border-radius:50%;
|
|
154
|
+
display:flex;align-items:center;justify-content:center;font-size:8px;font-weight:900;color:#fff}
|
|
155
|
+
.tl-node.w1,.tl-node.w2,.tl-node.w3{background:radial-gradient(circle at 30% 28%,#64748b,#475569 60%,#334155);box-shadow:0 0 8px rgba(100,116,139,.3)}
|
|
156
|
+
.tl-node.w4{background:radial-gradient(circle at 30% 28%,#7dd3fc,#0ea5e9 55%,#0369a1);box-shadow:0 0 10px rgba(14,165,233,.5);animation:nodePulse 2.4s ease-in-out infinite}
|
|
157
|
+
@keyframes nodePulse{0%,100%{box-shadow:0 0 8px rgba(14,165,233,.4)}50%{box-shadow:0 0 18px rgba(14,165,233,.8)}}
|
|
158
|
+
.tl-q{font-size:12px;font-weight:700;color:var(--accent);letter-spacing:1px;margin-bottom:8px}
|
|
159
|
+
.tl-item{position:relative;padding:10px 0 10px 16px;border-top:1px dashed var(--border)}
|
|
160
|
+
.tl-item::before{content:'';position:absolute;left:0;top:19px;width:5px;height:5px;border-radius:50%;background:rgba(94,234,212,.8);box-shadow:0 0 6px rgba(94,234,212,.5)}
|
|
161
|
+
.tl-desc{font-size:15px;line-height:1.65}
|
|
162
|
+
.tl-meta{font-size:12px;color:var(--muted);margin-top:4px}
|
|
163
|
+
.tl-badge{display:inline-block;font-size:11px;color:var(--muted);border:1px solid var(--border);border-radius:999px;padding:1px 10px;margin-left:6px}
|
|
164
|
+
.tl-empty{font-size:13px;color:var(--muted);padding:6px 0 10px 16px}
|
|
165
|
+
/* 柱图 */
|
|
166
|
+
.cb-wrap{margin-top:18px;padding-top:14px;border-top:1px dashed var(--border)}
|
|
167
|
+
.cb-title{font-size:12px;color:var(--muted);margin-bottom:12px;letter-spacing:1px}
|
|
168
|
+
.ech{width:100%;height:170px}
|
|
169
|
+
.ech-off{display:flex;align-items:center;justify-content:center}
|
|
170
|
+
.ech-off::after{content:attr(data-off);font-size:11px;color:var(--muted);text-align:center;line-height:1.6;padding:0 10px}
|
|
171
|
+
/* 序号徽章 3D 球 */
|
|
172
|
+
.idx{flex:0 0 auto;width:28px;height:28px;border-radius:50%;position:relative;
|
|
173
|
+
display:flex;align-items:center;justify-content:center;color:#fff;
|
|
174
|
+
font-size:12px;font-weight:900;margin-top:2px;transition:transform .2s ease,font-size .2s ease}
|
|
175
|
+
.idx.pi{background:radial-gradient(circle at 30% 28%,#fdaab4,#f43f5e 55%,#be123c);
|
|
176
|
+
box-shadow:0 2px 4px rgba(0,0,0,.25),0 0 8px rgba(244,63,94,.4),inset -3px -4px 6px rgba(0,0,0,.3),inset 1px 2px 3px rgba(255,255,255,.25)}
|
|
177
|
+
.idx::before{content:'';position:absolute;top:5px;left:7px;width:8px;height:6px;border-radius:50%;
|
|
178
|
+
background:radial-gradient(circle,rgba(255,255,255,.7),rgba(255,255,255,0));transform:rotate(-28deg);pointer-events:none}
|
|
179
|
+
.idx b{display:inline-block;transition:transform .2s ease}
|
|
180
|
+
/* 条目 */
|
|
181
|
+
.entry{flex:1;min-width:0}
|
|
182
|
+
.entry-head{display:flex;align-items:flex-start;gap:12px}
|
|
183
|
+
.desc{font-size:15px;line-height:1.65}
|
|
184
|
+
.meta{display:block;font-size:12px;color:var(--muted);margin-top:4px}
|
|
185
|
+
.meta b{color:var(--accent);font-weight:700}
|
|
186
|
+
ol{list-style:none}
|
|
187
|
+
li{display:flex;align-items:flex-start;gap:12px;padding:10px;border-radius:4px;transition:background .18s}
|
|
188
|
+
li:hover{background:var(--tag-bg)}
|
|
189
|
+
li:hover .idx{transform:scale(1.18) rotate(-4deg);font-size:14px}
|
|
190
|
+
li:hover .idx b{transform:rotate(-6deg)}
|
|
191
|
+
/* 展望目标卡 */
|
|
192
|
+
.goal{background:rgba(249,115,22,.04);border:1px solid rgba(249,115,22,.18);border-radius:6px;
|
|
193
|
+
padding:14px 16px;margin-bottom:12px;transition:transform .18s ease,box-shadow .18s ease}
|
|
194
|
+
.goal:hover{transform:translateY(-2px);box-shadow:0 8px 20px rgba(0,0,0,.3)}
|
|
195
|
+
.goal-desc{font-size:15px;line-height:1.65;margin-bottom:8px}
|
|
196
|
+
.goal-desc b{color:#fdba74;font-weight:700}
|
|
197
|
+
.goal-q{display:flex;flex-wrap:wrap;gap:6px}
|
|
198
|
+
.q-chip{font-size:11px;color:var(--muted);border:1px solid var(--border);background:var(--tag-bg);
|
|
199
|
+
border-radius:999px;padding:2px 10px}
|
|
200
|
+
/* 复制按钮 */
|
|
201
|
+
.copy-wrap{display:flex;justify-content:center;margin:18px 0 0}
|
|
202
|
+
.copy-btn{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:700;color:#fff;letter-spacing:2px;
|
|
203
|
+
background:linear-gradient(135deg,var(--accent),var(--accent2));border:none;border-radius:999px;padding:12px 38px;cursor:pointer;
|
|
204
|
+
box-shadow:0 0 30px var(--glow);transition:transform .18s ease,box-shadow .18s ease;
|
|
205
|
+
font-family:inherit}
|
|
206
|
+
.copy-btn:hover{transform:translateY(-2px);box-shadow:0 0 45px var(--glow)}
|
|
207
|
+
.copy-btn:active{transform:translateY(1px) scale(.98)}
|
|
208
|
+
/* 页脚 */
|
|
209
|
+
footer{text-align:center;font-size:10px;color:var(--muted);letter-spacing:1px;padding:8px 0 4px}
|
|
210
|
+
/* 入场动画 */
|
|
211
|
+
.header-card{animation:fadeDown .6s ease-out backwards}
|
|
212
|
+
.sec-ov{animation:riseIn .5s ease-out .13s backwards}
|
|
213
|
+
.sec-ms{animation:riseIn .5s ease-out .26s backwards}
|
|
214
|
+
.sec-pi{animation:riseIn .5s ease-out .4s backwards}
|
|
215
|
+
.sec-nm{animation:riseIn .5s ease-out .54s backwards}
|
|
216
|
+
.copy-wrap{animation:popIn .4s ease-out .8s backwards}
|
|
217
|
+
@keyframes fadeDown{from{opacity:0;transform:translateY(-14px)}to{opacity:1;transform:none}}
|
|
218
|
+
@keyframes riseIn{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}
|
|
219
|
+
@keyframes popIn{from{opacity:0;transform:scale(.85)}to{opacity:1;transform:none}}
|
|
220
|
+
/* 卡片 3D 微倾斜(仅 hover 卡片) */
|
|
221
|
+
.section:hover{transform:perspective(900px) translateY(-2px) rotateY(calc(var(--mx,0)*2.5deg)) rotateX(calc(var(--my,0)*-2.5deg))}
|
|
222
|
+
|
|
223
|
+
/* 主题换肤坞:右下角五色点随点随换,记忆上次选择;打印与截图模式隐藏 */
|
|
224
|
+
.theme-dock{
|
|
225
|
+
position:fixed; right:18px; bottom:18px; z-index:1001;
|
|
226
|
+
display:flex; gap:8px; padding:8px 10px; border-radius:999px;
|
|
227
|
+
background:var(--panel-solid); border:1px solid var(--border);
|
|
228
|
+
box-shadow:0 4px 18px rgba(0,0,0,.3);
|
|
229
|
+
}
|
|
230
|
+
.theme-dock .th-dot{
|
|
231
|
+
width:22px; height:22px; border-radius:50%; cursor:pointer;
|
|
232
|
+
border:2px solid transparent; padding:0;
|
|
233
|
+
transition:transform .15s ease, border-color .15s ease;
|
|
234
|
+
}
|
|
235
|
+
.theme-dock .th-dot:hover{ transform:scale(1.18); }
|
|
236
|
+
.theme-dock .th-dot.on{ border-color:var(--text); }
|
|
237
|
+
.theme-dock .th-dot[data-theme="tech"]{ background:#0ea5e9; }
|
|
238
|
+
.theme-dock .th-dot[data-theme="biz"]{ background:#2563eb; }
|
|
239
|
+
.theme-dock .th-dot[data-theme="mono"]{ background:#1e1f22; }
|
|
240
|
+
.theme-dock .th-dot[data-theme="light"]{ background:#ffffff; }
|
|
241
|
+
.theme-dock .th-dot[data-theme="warm"]{ background:#d97706; }
|
|
242
|
+
@media print{ .theme-dock{ display:none; } .rv{ opacity:1 !important; translate:none !important; } }
|
|
243
|
+
/* 滚动入场:html.js 门控(无 JS/打印全显);初始视口外的卡片滚到视口才上浮渐显;translate 独立属性不碰 transform,hover 3D 偏转零冲突 */
|
|
244
|
+
html.js .rv{ opacity:0; translate:0 16px; transition:opacity .5s ease-out, translate .5s ease-out; }
|
|
245
|
+
html.js .rv.in{ opacity:1; translate:0 0; }
|
|
246
|
+
/* 窄屏收敛:<680px 视口下 clamp 的 640px 下限会横向溢出,wrap 改流式满宽、边距收窄、标题字号统一 26px */
|
|
247
|
+
@media (max-width:680px){
|
|
248
|
+
body{ padding:24px 12px 32px; }
|
|
249
|
+
.wrap{ width:100%; max-width:none; }
|
|
250
|
+
.header-card{ padding:26px 18px 20px; }
|
|
251
|
+
.header-card h1{ font-size:26px; }
|
|
252
|
+
}
|
|
253
|
+
</style>
|
|
254
|
+
</head>
|
|
255
|
+
<body>
|
|
256
|
+
<div class="grid-pattern"></div>
|
|
257
|
+
<div class="stars"></div>
|
|
258
|
+
<div class="scanband"></div>
|
|
259
|
+
<div class="scanlines"></div>
|
|
260
|
+
<div class="wrap">
|
|
261
|
+
<header class="header-card" id="headerCard">
|
|
262
|
+
<span class="scanline-el scan-x"></span>
|
|
263
|
+
<span class="scanline-el scan-y"></span>
|
|
264
|
+
<span class="scanline-el scan-x-rev"></span>
|
|
265
|
+
<span class="scanline-el scan-y-rev"></span>
|
|
266
|
+
<div class="card-glow"></div>
|
|
267
|
+
<h1>2026-11 研发月度总结</h1>
|
|
268
|
+
<div class="header-sub">全栈开发工程师 · 2026-11-01 ~ 2026-11-12(截至 11-12)</div>
|
|
269
|
+
<span class="header-badge">生成时间 2026-11-12 19:10:38</span>
|
|
270
|
+
<div class="copy-wrap">
|
|
271
|
+
<button class="copy-btn" id="copyBtn" type="button">
|
|
272
|
+
<svg id="copyIcon" viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.4">
|
|
273
|
+
<rect x="5.5" y="5.5" width="8.5" height="8.5" rx="1.5"/>
|
|
274
|
+
<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"/>
|
|
275
|
+
</svg>
|
|
276
|
+
<span id="copyText">一键复制</span>
|
|
277
|
+
</button>
|
|
278
|
+
</div>
|
|
279
|
+
</header>
|
|
280
|
+
|
|
281
|
+
<section class="section sec-ov">
|
|
282
|
+
<div class="sec-bar"></div>
|
|
283
|
+
<div class="card-glow"></div>
|
|
284
|
+
<div class="sec-head">
|
|
285
|
+
<svg viewBox="0 0 24 24" width="22" height="22" fill="none" stroke="#38bdf8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 15l4-5M8 15l4-5"/><circle cx="12" cy="14" r="8"/><path d="M12 14l4-5"/></svg>
|
|
286
|
+
<h2>月度概览</h2>
|
|
287
|
+
</div>
|
|
288
|
+
<div class="tldr-line"><b>TL;DR:</b>发布节奏收敛的一个月:双周聚合发布落地,月度版本数从上月 38 个收敛到 12 个,质量门禁覆盖全部命令族,示例项目 进入稳定迭代期。</div>
|
|
289
|
+
<div class="stat-row">
|
|
290
|
+
<div class="stat-card"><div class="stat-num">168</div><div class="stat-label">本月提交数(11-01 ~ 11-12)</div><div class="stat-cmp up">较上月:+12%</div></div>
|
|
291
|
+
<div class="stat-card"><div class="stat-num">12</div><div class="stat-label">版本发布(v8.3.400 → v8.3.412)</div><div class="stat-cmp down">较上月:-68%</div></div>
|
|
292
|
+
<div class="stat-card"><div class="stat-num">+3.2万</div><div class="stat-label">净增代码行(+4.1万 / -0.9万)</div><div class="stat-cmp up">较上月:+8%</div></div>
|
|
293
|
+
<div class="stat-card"><div class="stat-num">96%</div><div class="stat-label">质量门禁通过率(本月全量)</div><div class="stat-cmp up">较上月:+11%</div></div>
|
|
294
|
+
</div>
|
|
295
|
+
</section>
|
|
296
|
+
|
|
297
|
+
<section class="section sec-ms">
|
|
298
|
+
<div class="sec-bar"></div>
|
|
299
|
+
<div class="card-glow"></div>
|
|
300
|
+
<div class="sec-head">
|
|
301
|
+
<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="M6 4h12v3a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V4z"/><path d="M12 11v4M9 17h6v3H9z"/></svg>
|
|
302
|
+
<h2>本月关键成果</h2>
|
|
303
|
+
</div>
|
|
304
|
+
<div class="timeline">
|
|
305
|
+
<div class="tl-group">
|
|
306
|
+
<span class="tl-node w1">W1</span>
|
|
307
|
+
<div class="tl-q">第 1 周(11-01 ~ 11-07)</div>
|
|
308
|
+
<div class="tl-item"><div class="tl-desc">1、双周聚合发布机制上线:v8.3.400~403 起按双周批次发布,单批 ≤10 版本</div><div class="tl-meta">36 次提交 · +0.8 万行<span class="tl-badge">W1</span></div></div>
|
|
309
|
+
</div>
|
|
310
|
+
<div class="tl-group">
|
|
311
|
+
<span class="tl-node w2">W2</span>
|
|
312
|
+
<div class="tl-q">第 2 周(11-08 ~ 11-14,截至当前)</div>
|
|
313
|
+
<div class="tl-item"><div class="tl-desc">2、质量门禁补全:execute 用例核对闸覆盖全部命令族,error 拦截率 100%</div><div class="tl-meta">52 次提交 · +1.1 万行<span class="tl-badge">W2</span></div></div>
|
|
314
|
+
<div class="tl-item"><div class="tl-desc">3、v8.3.412 累积发布:反推域隔离、文档生成器升格、澄清链修复</div><div class="tl-meta">12 个版本<span class="tl-badge">W2</span></div></div>
|
|
315
|
+
</div>
|
|
316
|
+
|
|
317
|
+
<div class="tl-group">
|
|
318
|
+
<span class="tl-node w3">W3</span>
|
|
319
|
+
<div class="tl-q">第 3 周(11-15 ~ 11-21)</div>
|
|
320
|
+
<div class="tl-empty">尚未开始(示例占位)</div>
|
|
321
|
+
</div>
|
|
322
|
+
<div class="tl-group">
|
|
323
|
+
<span class="tl-node w4">W4</span>
|
|
324
|
+
<div class="tl-q">第 4 周(11-22 ~ 11-30)</div>
|
|
325
|
+
<div class="tl-empty">尚未开始(示例占位)</div>
|
|
326
|
+
</div>
|
|
327
|
+
</div>
|
|
328
|
+
<div class="cb-wrap">
|
|
329
|
+
<div class="cb-title">本月提交日历热力图(次/天)</div>
|
|
330
|
+
<div class="ech" id="heatChart" data-off="图表需联网加载 echarts,离线环境不显示"></div>
|
|
331
|
+
</div>
|
|
332
|
+
</section>
|
|
333
|
+
|
|
334
|
+
<section class="section sec-pi">
|
|
335
|
+
<div class="sec-bar"></div>
|
|
336
|
+
<div class="card-glow"></div>
|
|
337
|
+
<div class="sec-head">
|
|
338
|
+
<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="M12 9v4M12 17h.01"/><path d="M10.3 3.9L1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z"/></svg>
|
|
339
|
+
<h2>问题与改进</h2>
|
|
340
|
+
</div>
|
|
341
|
+
<ol>
|
|
342
|
+
<li><span class="idx pi"><b>1</b></span><div class="entry"><div class="desc">聚合发布批次粒度仍需校准:11 月首两批各含 8~10 版本,回归验证耗时偏长。</div><div class="meta">影响:验证节奏拖慢双周目标,12 日仅完成 2 批。</div><div class="meta" style="color:var(--accent)"><b style="color:var(--accent)">改进:</b>12 月起固定单批 ≤6 版本,验证前置到开发期。</div></div></li>
|
|
343
|
+
<li><span class="idx pi"><b>2</b></span><div class="entry"><div class="desc">热力图数据源单一:日历热力图仅覆盖主仓库,辅助仓库提交未纳入。</div><div class="meta">影响:月度工作量画像不完整,环比口径偏窄。</div><div class="meta" style="color:var(--accent)"><b style="color:var(--accent)">改进:</b>数据收集层支持多仓合并去重,11 月底前上线。</div></div></li>
|
|
344
|
+
</ol>
|
|
345
|
+
</section>
|
|
346
|
+
|
|
347
|
+
<section class="section sec-nm">
|
|
348
|
+
<div class="sec-bar"></div>
|
|
349
|
+
<div class="card-glow"></div>
|
|
350
|
+
<div class="sec-head">
|
|
351
|
+
<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>
|
|
352
|
+
<h2>下月计划</h2>
|
|
353
|
+
</div>
|
|
354
|
+
<div class="goal"><div class="goal-desc">1、<b>发布批次固化</b>:单批 ≤6 版本、双周一档,12 月版本发布总量 ≤12 个</div><div class="goal-q"><span class="q-chip">W1 建立模板</span><span class="q-chip">W3 稳定运行</span></div></div>
|
|
355
|
+
<div class="goal"><div class="goal-desc">2、<b>多仓热力图</b>:数据收集层多仓合并去重上线,辅助仓库纳入统计</div><div class="goal-q"><span class="q-chip">W1 开发</span><span class="q-chip">W2 上线</span></div></div>
|
|
356
|
+
<div class="goal"><div class="goal-desc">3、<b>质量门禁全覆盖</b>:全部命令族门禁通过率 ≥95%</div><div class="goal-q"><span class="q-chip">W2 补齐</span><span class="q-chip">W4 验收</span></div></div>
|
|
357
|
+
</section>
|
|
358
|
+
|
|
359
|
+
<footer>GENERATED BY AI TEAM · 2026-11</footer>
|
|
360
|
+
</div>
|
|
361
|
+
|
|
362
|
+
<!-- 主题换肤坞(五色点) -->
|
|
363
|
+
<div class="theme-dock" id="themeDock">
|
|
364
|
+
<button class="th-dot" type="button" data-theme="tech" title="深蓝科技"></button>
|
|
365
|
+
<button class="th-dot" type="button" data-theme="biz" title="浅色商务"></button>
|
|
366
|
+
<button class="th-dot" type="button" data-theme="mono" title="IDEA 黑亮"></button>
|
|
367
|
+
<button class="th-dot" type="button" data-theme="light" title="IDEA 白亮"></button>
|
|
368
|
+
<button class="th-dot" type="button" data-theme="warm" title="温暖渐变"></button>
|
|
369
|
+
</div>
|
|
370
|
+
|
|
371
|
+
<script src="https://cdn.jsdelivr.net/npm/echarts@5.5.1/dist/echarts.min.js"></script>
|
|
372
|
+
<script>
|
|
373
|
+
// 复制源 = txt 纯文本全文
|
|
374
|
+
var TXT = "2026-11 研发月度总结\n\n生成时间:2026-11-12 19:10:38\n\n月度概览\nTL;DR:发布节奏收敛的一个月:双周聚合发布落地,月度版本数从上月 38 个收敛到 12 个,质量门禁覆盖全部命令族,示例项目 进入稳定迭代期。\n1、本月提交数:168 次(11-01 ~ 11-12,较上月 +12%)\n2、版本发布:12 个(v8.3.400 → v8.3.412,较上月 -68%)\n3、净增代码:+3.2 万行(+4.1 万 / -0.9 万,较上月 +8%)\n4、质量门禁通过率:96%(较上月 +11%)\n\n本月关键成果\n1、双周聚合发布机制上线:v8.3.400~403 起按双周批次发布,单批 ≤10 版本(36 次提交、+0.8 万行)- W1\n2、质量门禁补全:execute 用例核对闸覆盖全部命令族,error 拦截率 100%(52 次提交、+1.1 万行)- W2\n3、v8.3.412 累积发布:反推域隔离、文档生成器升格、澄清链修复(12 个版本)- W2\n\n问题与改进\n1、聚合发布批次粒度仍需校准:11 月首两批各含 8~10 版本,回归验证耗时偏长。\n影响:验证节奏拖慢双周目标,12 日仅完成 2 批。\n改进:12 月起固定单批 ≤6 版本,验证前置到开发期。\n2、热力图数据源单一:日历热力图仅覆盖主仓库,辅助仓库提交未纳入。\n影响:月度工作量画像不完整,环比口径偏窄。\n改进:数据收集层支持多仓合并去重,11 月底前上线。\n\n下月计划\n1、发布批次固化:单批 ≤6 版本、双周一档,12 月版本发布总量 ≤12 个(W1 建立模板、W3 稳定运行)。\n2、多仓热力图:数据收集层多仓合并去重上线,辅助仓库纳入统计(W1 开发、W2 上线)。\n3、质量门禁全覆盖:全部命令族门禁通过率 ≥95%(W2 补齐、W4 验收)。";
|
|
375
|
+
|
|
376
|
+
// 一键复制
|
|
377
|
+
var btn = document.getElementById('copyBtn');
|
|
378
|
+
var icon = document.getElementById('copyIcon');
|
|
379
|
+
var txt = document.getElementById('copyText');
|
|
380
|
+
btn.addEventListener('click', function(){
|
|
381
|
+
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); }
|
|
382
|
+
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
383
|
+
navigator.clipboard.writeText(TXT).then(done, function(){ fallback(); });
|
|
384
|
+
} else { fallback(); }
|
|
385
|
+
function fallback(){
|
|
386
|
+
var ta = document.createElement('textarea');
|
|
387
|
+
ta.value = TXT; ta.style.position = 'fixed'; ta.style.opacity = '0';
|
|
388
|
+
document.body.appendChild(ta); ta.select();
|
|
389
|
+
try { document.execCommand('copy'); done(); } catch(e){}
|
|
390
|
+
document.body.removeChild(ta);
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
// 卡片级 3D 微倾斜(仅 hover 卡片)
|
|
395
|
+
document.querySelectorAll('.section').forEach(function(card){
|
|
396
|
+
card.addEventListener('mousemove', function(e){
|
|
397
|
+
var r = card.getBoundingClientRect();
|
|
398
|
+
var mx = (e.clientX - r.left) / r.width * 2 - 1;
|
|
399
|
+
var my = (e.clientY - r.top) / r.height * 2 - 1;
|
|
400
|
+
card.style.setProperty('--mx', mx.toFixed(3));
|
|
401
|
+
card.style.setProperty('--my', my.toFixed(3));
|
|
402
|
+
});
|
|
403
|
+
card.addEventListener('mouseleave', function(){
|
|
404
|
+
card.style.setProperty('--mx', 0);
|
|
405
|
+
card.style.setProperty('--my', 0);
|
|
406
|
+
});
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
// ?shot=content:内容区截图模式
|
|
410
|
+
if (location.search.indexOf('shot=content') > -1) {
|
|
411
|
+
document.getElementById('headerCard').style.display = 'none';
|
|
412
|
+
document.querySelector('.copy-wrap').style.display = 'none';
|
|
413
|
+
document.querySelector('footer').style.display = 'none';
|
|
414
|
+
document.querySelector('.wrap').style.padding = '40px';
|
|
415
|
+
// 截图模式停入场动画,避免 backwards 0 相位整体半透明
|
|
416
|
+
document.querySelectorAll('.header-card,.section,.copy-wrap').forEach(function(el){
|
|
417
|
+
el.style.animation = 'none'; el.style.opacity = '1';
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// 月度日历热力图(echarts CDN 渲染;离线时容器降级提示;?shot 截图模式停动画——headless 虚拟时间下动画帧不推进会停在初始帧)
|
|
422
|
+
(function(){
|
|
423
|
+
var el = document.getElementById('heatChart');
|
|
424
|
+
if (!el) return;
|
|
425
|
+
if (typeof echarts === 'undefined'){ el.classList.add('ech-off'); return; }
|
|
426
|
+
var noAnim = location.search.indexOf('shot=') !== -1;
|
|
427
|
+
var chart = echarts.init(el);
|
|
428
|
+
var RANGE = '2026-11';
|
|
429
|
+
var DAYVALS = [['2026-11-03',18],['2026-11-04',26],['2026-11-05',12],['2026-11-06',21],['2026-11-07',4],['2026-11-08',15],['2026-11-09',19],['2026-11-10',23],['2026-11-11',17],['2026-11-12',13]];
|
|
430
|
+
function tokens(){
|
|
431
|
+
var s = getComputedStyle(document.documentElement);
|
|
432
|
+
return {
|
|
433
|
+
accent:s.getPropertyValue('--accent').trim(), accent2:s.getPropertyValue('--accent2').trim(),
|
|
434
|
+
muted:s.getPropertyValue('--muted').trim(), text:s.getPropertyValue('--text').trim(),
|
|
435
|
+
border:s.getPropertyValue('--border').trim(), glow:s.getPropertyValue('--glow').trim(),
|
|
436
|
+
panel:s.getPropertyValue('--panel-solid').trim(), tagBg:s.getPropertyValue('--tag-bg').trim(),
|
|
437
|
+
heat:s.getPropertyValue('--heat').trim()
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
function option(){
|
|
441
|
+
var t = tokens();
|
|
442
|
+
var maxV = 1;
|
|
443
|
+
DAYVALS.forEach(function(d){ if (d[1] > maxV) maxV = d[1]; });
|
|
444
|
+
return {
|
|
445
|
+
animation: !noAnim,
|
|
446
|
+
tooltip:{ backgroundColor:t.panel, borderColor:t.border,
|
|
447
|
+
textStyle:{ color:t.text, fontSize:11 },
|
|
448
|
+
formatter:function(p){ return p.data[0] + ' · ' + p.data[1] + ' 次提交'; } },
|
|
449
|
+
calendar:{ top:16, left:12, right:4, bottom:6, cellSize:['auto',14], range:RANGE,
|
|
450
|
+
splitLine:{ lineStyle:{ color:t.border } },
|
|
451
|
+
itemStyle:{ color:'transparent', borderWidth:2, borderColor:'transparent' },
|
|
452
|
+
dayLabel:{ fontSize:9, color:t.muted }, monthLabel:{ show:false }, yearLabel:{ show:false } },
|
|
453
|
+
visualMap:{ show:false, min:0, max:maxV, inRange:{ color:[t.tagBg, t.heat] } },
|
|
454
|
+
series:[{ type:'heatmap', coordinateSystem:'calendar', data:DAYVALS,
|
|
455
|
+
itemStyle:{ borderRadius:2, borderWidth:2, borderColor:'transparent' } }]
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
chart.setOption(option());
|
|
459
|
+
window.__sfEchartsTheme = function(){ chart.setOption(option()); };
|
|
460
|
+
window.addEventListener('resize', function(){ chart.resize(); });
|
|
461
|
+
})();
|
|
462
|
+
// 主题换肤:五套配色随点随换;记忆上次选择(localStorage,失败静默);?shot 截图模式隐藏坞
|
|
463
|
+
|
|
464
|
+
/* 稳定身份命名空间:localStorage 键按页内嵌唯一 ID(meta monthly-id)命名——Chrome/Safari 下 file:// 与 localhost 共享同源存储,固定键名会导致多份产物互相串台;ID 与文件路径解耦,改名/移动目录记忆不丢 */
|
|
465
|
+
var SF_ID = ((document.querySelector('meta[name="monthly-id"]') || {}).content || 'REF-MONTHLY-0000').trim();
|
|
466
|
+
/* ID 格式自愈(格式定死执行层):meta 非法或缺失(占位残留/手写变体/误沿用旧值)时按路径键自愈为 crypto.randomUUID() 标准 v4,同路径跨打开稳定;合法 UUID 原样使用(复制文件副本=同一身份共享数据,是特性) */
|
|
467
|
+
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)) {
|
|
468
|
+
var __sfHealKey = 'sf-heal:' + location.pathname;
|
|
469
|
+
try { SF_ID = localStorage.getItem(__sfHealKey) || SF_ID; } catch (e) {}
|
|
470
|
+
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)) {
|
|
471
|
+
try { SF_ID = crypto.randomUUID(); } catch (e) {
|
|
472
|
+
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); });
|
|
473
|
+
}
|
|
474
|
+
try { localStorage.setItem(__sfHealKey, SF_ID); } catch (e) {}
|
|
475
|
+
}
|
|
476
|
+
var __sfMeta = document.querySelector('meta[name="monthly-id"]');
|
|
477
|
+
if (__sfMeta) __sfMeta.setAttribute('content', SF_ID);
|
|
478
|
+
console.warn('[monthly-report] meta monthly-id 非法或缺失,已自愈为标准 v4 ID(' + SF_ID + '),建议重新生成页面固化');
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
var SF_NS = 'monthly:' + SF_ID;
|
|
482
|
+
(function(){
|
|
483
|
+
var THEMES = ['tech','biz','mono','light','warm'];
|
|
484
|
+
var dock = document.getElementById('themeDock');
|
|
485
|
+
if (!dock) return;
|
|
486
|
+
if (location.search.indexOf('shot=') !== -1){ dock.style.display = 'none'; }
|
|
487
|
+
function apply(t){ document.documentElement.setAttribute('data-theme', t);
|
|
488
|
+
dock.querySelectorAll('.th-dot').forEach(function(d){ d.classList.toggle('on', d.getAttribute('data-theme') === t); });
|
|
489
|
+
try{ localStorage.setItem(SF_NS + '-theme', t); }catch(e){}
|
|
490
|
+
if (window.__sfEchartsTheme) window.__sfEchartsTheme(); }
|
|
491
|
+
var cur = document.documentElement.getAttribute('data-theme');
|
|
492
|
+
var saved = null; try{ saved = localStorage.getItem(SF_NS + '-theme') || localStorage.getItem('sf:' + location.pathname + '-theme'); }catch(e){}
|
|
493
|
+
if (saved && THEMES.indexOf(saved) !== -1 && saved !== cur){ apply(saved); }
|
|
494
|
+
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')); }); });
|
|
496
|
+
})();
|
|
497
|
+
|
|
498
|
+
/* 滚动入场:初始视口外的卡片滚到视口才上浮渐显(首屏卡维持加载错峰动画);无 JS 时 html.js 不生效全显 */
|
|
499
|
+
(function(){
|
|
500
|
+
if (location.search.indexOf('shot=') !== -1) return;
|
|
501
|
+
document.documentElement.classList.add('js');
|
|
502
|
+
if (!('IntersectionObserver' in window)) return;
|
|
503
|
+
var els = Array.prototype.slice.call(document.querySelectorAll('.header-card,.overview,.section'));
|
|
504
|
+
var rvs = [];
|
|
505
|
+
els.forEach(function(el){
|
|
506
|
+
if (el.getBoundingClientRect().top < innerHeight * 0.92) return;
|
|
507
|
+
el.classList.add('rv');
|
|
508
|
+
rvs.push(el);
|
|
509
|
+
});
|
|
510
|
+
if (!rvs.length) return;
|
|
511
|
+
var io = new IntersectionObserver(function(es){
|
|
512
|
+
es.forEach(function(e){
|
|
513
|
+
if (e.isIntersecting){ e.target.classList.add('in'); io.unobserve(e.target); }
|
|
514
|
+
});
|
|
515
|
+
}, { threshold: 0.08 });
|
|
516
|
+
rvs.forEach(function(el, i){
|
|
517
|
+
el.addEventListener('transitionend', function h(ev){
|
|
518
|
+
if (ev.target !== el) return;
|
|
519
|
+
el.style.transitionDelay = '';
|
|
520
|
+
el.removeEventListener('transitionend', h);
|
|
521
|
+
});
|
|
522
|
+
el.style.transitionDelay = Math.min(i * 70, 280) + 'ms';
|
|
523
|
+
io.observe(el);
|
|
524
|
+
});
|
|
525
|
+
setTimeout(function(){
|
|
526
|
+
document.querySelectorAll('.rv:not(.in)').forEach(function(el){ el.classList.add('in'); });
|
|
527
|
+
}, 2000);
|
|
528
|
+
})();
|
|
529
|
+
</script>
|
|
530
|
+
</body>
|
|
531
|
+
</html>
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# 月度总结使用指南
|
|
2
|
+
|
|
3
|
+
## 能干什么
|
|
4
|
+
|
|
5
|
+
把一个月的工作沉淀成四段式月度总结:月度概览(一句话 TL;DR + 核心数据卡,数字带环比上月基准)/ 本月关键成果(W1-W4 周时间线)/ 问题与改进 / 下月计划。适配各行业:内置 12 行业职业词典,报职业自动换术语、指标与标题(如「2026-11 研发月度总结」「2026-11 销售月度总结」);不报职业按你的默认角色画像生成。
|
|
6
|
+
|
|
7
|
+
## 基本用法
|
|
8
|
+
- 直接说「写月报 / 生成月度总结」→ 默认生成当前自然月的总结,无需指定月份
|
|
9
|
+
- 指定月份(多种说法均可):
|
|
10
|
+
- 「2026 年 11 月的总结 / 这个月的总结」→ 当前自然月(未过完只算到「今天」,标题注明「截至 2026-11-12」)
|
|
11
|
+
- 「上个月的总结 / 10 月的总结」→ 上一自然月
|
|
12
|
+
- 「近一个月的总结 / 最近 30 天的总结」→ 滚动 30 天(今天往前推 30 天)
|
|
13
|
+
- 「2026-10 的总结」→ 明确指定的自然月
|
|
14
|
+
- 同一份月度总结重复生成默认直接覆盖;说「保留之前的 / 另存 / 不覆盖」→ 文件名追加时间戳另存不覆盖
|
|
15
|
+
- 说「打开 / 查看 2026 年 11 月月报」→ 该报告文件已存在时直接打开不重新生成;不存在则按正常流程生成
|
|
16
|
+
- 开发类用户可说「只算我的提交」→ 只聚合本人提交;默认仓库内全部提交都计入
|
|
17
|
+
- 说「只聚合 xxx 仓库 / 只写 xxx 的月报」→ 只收集指定仓库的提交,跳过其它仓库
|
|
18
|
+
|
|
19
|
+
## 口头补充素材
|
|
20
|
+
- 说「补充一下:这个月上了对账系统,月底拿下了金融客户」→ 自动按语义拆成多条,润色为规范格式并入对应周与段落
|
|
21
|
+
- 拆分信号:时间词(月初/第一周/月中/月底/W1/W2)、连接词(还有/另外/以及)、分号顿号列举、数字列举
|
|
22
|
+
- 补充内容带分段词时按段并入:「下月计划:做 XX」→ 下月计划段;「问题:复盘机制缺失」→ 问题与改进段;不带分段词按语义归段(成果 → 成果段,感悟 → 概览或问题段)
|
|
23
|
+
- 与提交记录聚合出的成果自动去重,同一件事只保留一条(量化以提交统计为准、定性以口述为准)
|
|
24
|
+
|
|
25
|
+
## 贴文字 / 发图片 / 给文件整理(没有提交记录也适用)
|
|
26
|
+
- 直接贴一段文字说「整理成月报 / 把这段文字整理成月报」→ 以文字为主源生成,不依赖提交记录(非开发岗位也可用);说「只整理这段文字 / 只按这段」同样跳过其它来源与会话上下文
|
|
27
|
+
- 发图片(截图/照片等 jpg/png/webp)或给文件(md/txt/docx/pdf 等)说「整理成月报」→ 先用 Read 读取:图片按视觉理解提取图中文字信息,md/txt 直接读文本,docx/pdf 优先尝试 pandoc 转文本(无 pandoc 则请用户粘贴文字),再按纯文字模式整理;聊天记录/周报/日报/会议纪要文件也可作为素材
|
|
28
|
+
- 图片模糊/内容读不清时:先把已提取的部分展示给用户确认或补充,不瞎编没读到的内容
|
|
29
|
+
- 素材不足的段写「暂无」并提示用户可补充素材
|
|
30
|
+
- 默认直接生成落盘(CONFIRM: never,无需确认);把顶部 CONFIRM 改为 text/always,或临时说「先看看效果/先出效果」→ 先在对话输出整理好的报告正文,用户说「可以/确认/落盘」→ 再落盘文件与内容区截图并开 html;说「改一下 xxx」→ 按意见修改后重新出效果再确认
|
|
31
|
+
- 说「不用确认/直接落盘」→ 当次跳过确认直接落盘(临时要求优先于配置)
|
|
32
|
+
- 说「不落盘/别写文件」时跳过确认,直接对话输出
|
|
33
|
+
|
|
34
|
+
## 自定义模板(适配各类岗位)
|
|
35
|
+
- 内置模板为四段式(月度概览/本月关键成果/问题与改进/下月计划),适合开发岗位;其他岗位可自定义模板
|
|
36
|
+
- 临时换模板:说「这次按 xxx 来」→ 口头描述结构(如"按三段:本月工作概述/重点成果与经验/下月计划"),当次按该结构生成,不改配置
|
|
37
|
+
- 永久换模板:把顶部配置 TEMPLATE 改为 custom,并按 SKILL.md 的「📝 自定义模板」节说明修改段结构,之后默认按新模板生成
|
|
38
|
+
- 说「以后都用这个模板」→ 自动把当前口述的结构写入「📝 自定义模板」节并把 TEMPLATE 改为 custom
|
|
39
|
+
- 模板优先于纯文字模式的信号词归类:指定了段名后,文字按段名归类填充
|
|
40
|
+
|
|
41
|
+
## 角色定制(我的职业画像)
|
|
42
|
+
- 默认按顶部「默认配置」ROLE 生成(当前:全栈开发工程师(企业内技术开发));说「我的职业是 XX / 我的主要工作是 XX / 以后默认用 XX 角色」→ 永久修改 ROLE
|
|
43
|
+
- 说「以 XX 的身份写月报」→ 当次按该角色生成(内置 12 行业词条:研发/销售/运营/产品/HR/财务/市场/客服/项目/行政/法务/设计可直接用),不改配置
|
|
44
|
+
- 标题随职业词条变化:研发 →「2026-11 研发月度总结」、销售 →「2026-11 销售月度总结」等
|
|
45
|
+
- 词典外行业走兜底:按骨架 + 你提供的素材现场生成词条;说「记住这个行业」→ 固化为新词条
|
|
46
|
+
|
|
47
|
+
## 控制落盘(临时要求,仅对当次生效)
|
|
48
|
+
- 默认:对话输出 Markdown + md/txt/html 三文件 + 内容区截图 content-png 落盘到 DIR(auto 按系统选:macOS=~/reports、Windows=%USERPROFILE%\reports,模板默认值,路径以 user-config.md 顶部「默认配置」为准)/YYYY-MM/ + html 自动打开(DIR 目录/盘符不存在时自动改用用户主目录下 reports:macOS=~/reports、Windows=%USERPROFILE%\reports)
|
|
49
|
+
- 说「写到桌面」→ 本次落盘到桌面(macOS=~/Desktop、Windows=%USERPROFILE%\Desktop);说「存到 ~/report / D:\report」→ 本次用指定目录(均自动按月份建子目录)
|
|
50
|
+
- 说「不落盘/别写文件」→ 本次只在对话输出,不写文件、不开浏览器
|
|
51
|
+
- 说「只要 md」「只出 html」「只要内容区截图」→ 本次只落指定格式文件;说「这次不截图」→ 本次跳过截图(content-png = 四张分节卡片整体一张图,四周约 40px 留白,不含头部标题、复制按钮、页脚)
|
|
52
|
+
- 说「只要截图/重新截个图」(如「给 2026-11 月报截个图」)→ 本次不重新生成内容,只对现有 html 执行内容区截图(覆盖 content-png,需 html 已存在,找不到则提示先生成)
|
|
53
|
+
- 说「别开浏览器」→ 本次落盘后不自动打开 html
|
|
54
|
+
- 说「保留之前的」→ 同月份重复生成时不覆盖,文件名追加时间戳另存
|
|
55
|
+
|
|
56
|
+
## 配置开关(改 user-config.md 顶部「默认配置」节,长期生效)
|
|
57
|
+
| 配置项 | 作用 | 可选值 / 示例 |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| DISK | 是否落盘写文件 | true(落盘,默认)/ false(默认只在对话输出) |
|
|
60
|
+
| FORMATS | 落盘哪些格式(数组) | [md, txt, html, content-png](默认,含内容区截图)/ [md, html] / [md, txt, html](不截图);content-png = 四张分节卡片整体截图(四周约 40px 留白),不含头部标题/复制按钮/页脚 |
|
|
61
|
+
| DIR | 落盘根目录 | auto(按当前系统自动选 DIR_MAC / DIR_WIN,默认);DIR_MAC = macOS 根目录(模板默认 ~/reports,可改);DIR_WIN = Windows 根目录(模板默认 %USERPROFILE%\reports,可改) |
|
|
62
|
+
| OPEN_HTML | 落盘后是否自动打开 html | true(自动打开,默认)/ false(不打开) |
|
|
63
|
+
| TEMPLATE | 报告模板 | default(内置四段式,默认)/ custom(按「📝 自定义模板」节的结构生成) |
|
|
64
|
+
| ROLE | 默认职业角色画像 | 全栈开发工程师(企业内技术开发)等;职业名 + 括号内工作内容 |
|
|
65
|
+
| CONFIRM | 落盘前先出效果确认 | never(直接生成不确认,默认)/ text(纯文字整理模式确认)/ always(所有生成都确认) |
|
|
66
|
+
- 优先级:临时口头要求(不落盘/写到桌面/只要 md/只要内容区截图/这次不截图/别开浏览器/临时换模板等)永远优先于默认配置,仅对当次生效、不改配置
|
|
67
|
+
- DIR(按系统解析)指向的目录/盘符不存在时,自动回退到用户主目录下 reports(macOS=~/reports、Windows=%USERPROFILE%\reports)
|
|
68
|
+
|
|
69
|
+
## 效果不对怎么办
|
|
70
|
+
|
|
71
|
+
- 页面效果不对(布局乱 / 样式错 / 交互异常 / 内容显示不全),直接对 AI 说「这个页面效果不对,对照参考模板修复」,把问题描述清楚(哪一节、什么现象,能截图最好)
|
|
72
|
+
- 本技能的设计标准答案就在技能目录里:`resources/reference.html`(双击可直接打开看标准效果),AI 修复时以此为唯一对照
|
|
73
|
+
- AI 的处理流程固定:先打开 reference.html 作标准 → 再读你那份问题 html 文件 → 逐处比对找出跑偏的地方 → 以 reference 为准修复 → 用浏览器自动截图对比修复前后,自证修好了再交付
|
|
74
|
+
- 效果对了但内容不对(数字/条目写错)同样说「内容有误:xxx 应该是 xxx」,AI 只改数据不动版式;参考模板本身有缺陷时(生成结果与 reference 一模一样但仍有问题)说一句「参考模板也有这个问题」,AI 会连模板一起修并同步回 reference.html
|
|
75
|
+
- 修复后想要永久按修复效果生成:说「以后都按这个效果生成」即可
|