skill-forge-hub 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +52 -0
- package/README.md +83 -27
- package/annual-report/SKILL.md +17 -10
- package/annual-report/resources/content-rules.md +11 -9
- package/annual-report/resources/data-collection.md +3 -3
- package/annual-report/resources/date-parsing.md +1 -1
- package/annual-report/resources/disk-and-html.md +10 -10
- package/annual-report/resources/industry-dictionary.md +3 -1
- package/annual-report/resources/reference.html +146 -52
- package/annual-report/resources/usage-guide.md +56 -15
- package/annual-report/user-config.md +3 -2
- package/article-to-html/SKILL.md +23 -0
- package/article-to-html/design-system.md +86 -21
- package/article-to-html/user-config.md +18 -0
- package/cli.js +72 -23
- package/daily-report/SKILL.md +16 -8
- package/daily-report/resources/content-rules.md +27 -23
- package/daily-report/resources/data-collection.md +5 -5
- package/daily-report/resources/date-parsing.md +1 -1
- package/daily-report/resources/disk-and-html.md +2 -2
- package/daily-report/resources/industry-dictionary.md +3 -1
- package/daily-report/resources/reference.html +175 -73
- package/daily-report/resources/usage-guide.md +4 -4
- package/daily-report/user-config.md +3 -2
- package/deck-stage/SKILL.md +80 -0
- package/deck-stage/package-lock.json +172 -0
- package/deck-stage/package.json +15 -0
- package/deck-stage/resources/cover-template.html +139 -0
- package/deck-stage/resources/data-schema.md +111 -0
- package/deck-stage/resources/pptx-builder.js +394 -0
- package/deck-stage/resources/usage-guide.md +20 -0
- package/deck-stage/user-config.md +26 -0
- package/magic-deck/SKILL.md +20 -11
- package/magic-deck/resources/deck-spec.md +412 -51
- package/magic-deck/resources/reference.html +2096 -112
- package/magic-deck/resources/usage-guide.md +42 -0
- package/magic-deck/user-config.md +10 -7
- package/meta-forge/SKILL.md +2 -0
- package/meta-forge/resources/forge-rules.md +1 -0
- package/meta-forge/resources/usage-guide.md +1 -1
- package/package.json +16 -4
- package/prompt-pouch/SKILL.md +77 -0
- package/prompt-pouch/resources/data-format.md +67 -0
- package/prompt-pouch/resources/reference.html +2038 -0
- package/prompt-pouch/resources/usage-guide.md +32 -0
- package/prompt-pouch/user-config.md +22 -0
- package/weekly-report/SKILL.md +16 -8
- package/weekly-report/resources/content-rules.md +38 -27
- package/weekly-report/resources/data-collection.md +5 -5
- package/weekly-report/resources/date-parsing.md +1 -1
- package/weekly-report/resources/disk-and-html.md +2 -2
- package/weekly-report/resources/industry-dictionary.md +5 -3
- package/weekly-report/resources/reference.html +226 -104
- package/weekly-report/resources/usage-guide.md +6 -6
- package/weekly-report/user-config.md +4 -3
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
| 风格 | 适用气质 | 关键参数 |
|
|
10
10
|
|:---|:---|:---|
|
|
11
|
-
| **A. 暗色封面长文风**(默认款) | 科技文、产品文、深度技术长文 | 深色渐变 hero + 浅灰 `--bg:#f6f8fb` 正文 + 彩色圆角组件(第 2-5
|
|
11
|
+
| **A. 暗色封面长文风**(默认款) | 科技文、产品文、深度技术长文 | 深色渐变 hero + 浅灰 `--bg:#f6f8fb` 正文 + 彩色圆角组件(第 2-5 节全套)。主题色四款命名主题(第 1 节 `[data-theme]` 块):tech 科技蓝 `#2563eb`(默认)/ gold 暖棕金 `#b45309` / forest 墨绿 `#0f766e` / plum 梅紫 `#7c3aed`;生成时按 THEME 配置定默认(写入 `<html data-theme>`),页面右下角换肤坞随点随换 |
|
|
12
12
|
| **B. 文艺排版风** | 散文、人物稿、随笔、书评 | 字体仍为思源黑体(**不改宋体**);背景米白 `#faf7f1`;封面极简:居中大标题 + 细线 + 作者名,无深色块;行距 1.9、字号 17px、栏宽 680px;`p:first-of-type::first-letter{font-size:3em;float:left}` 首字下沉;引用用居中大字号灰字,分割用 `1px solid #e8e0d0` 细线;禁彩色卡片与重阴影——文艺感全靠排版营造 |
|
|
13
13
|
| **C. 极简白** | 干货教程、方法论、SOP | `--bg:#ffffff`;封面白底大黑标题 + 蓝字点缀;组件只用白卡细边框 `1px solid var(--line)`,单色点缀 `#2563eb`,不用多彩色系统;行距 1.8 |
|
|
14
14
|
| **D. 终端极客风** | 硬核技术文、命令行主题 | 全页暗色 `--bg:#0d1117`,正文 `#c9d1d9`,强调绿 `#7ee787`/蓝 `#58a6ff`;封面命令行提示符风格(`$` 前缀标题 + ASCII 装饰);组件边框 `#30363d`、圆角 ≤8、阴影弱化;代码块为主导视觉;`--mono` 仍为思源黑体(禁等宽商业字体) |
|
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
选择原则:科技/产品长文默认 A;文艺散文 B;教程干货 C;硬核技术 D;科普清单 E;报道评论 F。拿不准时用 AskUserQuestion 让用户挑(每款附一句话气质描述)。
|
|
19
19
|
|
|
20
|
+
主题换肤坞只随 A 款出现:A 款生成时按 THEME 配置写 `<html data-theme>`,页面右下角四色点随时切换;B/C/D/E/F 五款本色锁定(D 深色极客、C 纯白等定式),不配坞。
|
|
21
|
+
|
|
20
22
|
## 1. 字体与设计变量(必用)
|
|
21
23
|
|
|
22
24
|
```css
|
|
@@ -26,7 +28,7 @@
|
|
|
26
28
|
@font-face { font-family:'Roboto'; font-style:normal; font-weight:900; font-display:swap; src:url('assets/fonts/roboto-latin-900-normal.woff2') format('woff2'); }
|
|
27
29
|
|
|
28
30
|
:root{
|
|
29
|
-
--blue:#2563eb; --blue-bg:#ebf0ff; --blue-line:#a1bdfa;
|
|
31
|
+
--blue:#2563eb; --blue-bg:#ebf0ff; --blue-line:#a1bdfa; /* 多彩组件固定蓝(layers/fnode/ask/mode 等),不随主题变 */
|
|
30
32
|
--red:#e24b4a; --red-bg:#fcebeb; --red-line:#f09595; --red-dark:#a32d2d;
|
|
31
33
|
--green:#16a34a; --green-bg:#ecfdf5; --green-line:#86efac; --green-dark:#15803d;
|
|
32
34
|
--purple:#7c3aed; --purple-bg:#f5f0ff; --purple-line:#c4b5fd; --purple-dark:#6d28d9;
|
|
@@ -34,12 +36,50 @@
|
|
|
34
36
|
--orange:#ea580c; --orange-bg:#fff7ed; --orange-line:#fdba74;
|
|
35
37
|
--ink:#1f2937; --ink-2:#4b5563; --ink-3:#6b7280; --ink-4:#9ca3af;
|
|
36
38
|
--bg:#f6f8fb; --card:#ffffff; --line:#e5e7eb;
|
|
39
|
+
/* ── 主题色令牌(tech 默认值;gold/forest/plum 见下方 [data-theme] 块;A 款强调色一律引用 --accent 家族,禁止硬编码)── */
|
|
40
|
+
--accent:#2563eb; --accent-bg:#ebf0ff; --accent-line:#a1bdfa; --accent-ink:#1e4ad6;
|
|
41
|
+
--hero-base:linear-gradient(160deg,#0b1220 0%,#0e1a33 45%,#131c3a 100%);
|
|
42
|
+
--hero-glow:radial-gradient(1200px 600px at 15% -10%,rgba(96,165,250,.35),transparent 55%),radial-gradient(1000px 500px at 110% 30%,rgba(167,139,250,.30),transparent 55%),radial-gradient(900px 700px at 50% 120%,rgba(45,212,191,.22),transparent 60%);
|
|
43
|
+
--title-grad:linear-gradient(90deg,#7dd3fc,#a5b4fc,#c4b5fd);
|
|
44
|
+
--kicker-color:#93c5fd; --kicker-bg:rgba(59,130,246,.14); --kicker-line:rgba(96,165,250,.35);
|
|
37
45
|
--shadow-sm:0 1px 3px rgba(17,24,39,.06),0 1px 2px rgba(17,24,39,.04);
|
|
38
46
|
--shadow-md:0 4px 12px rgba(17,24,39,.08),0 2px 4px rgba(17,24,39,.04);
|
|
39
47
|
--shadow-lg:0 12px 32px rgba(17,24,39,.12),0 4px 8px rgba(17,24,39,.06);
|
|
40
48
|
--sans:'Roboto','Source Han Sans SC';
|
|
41
49
|
--mono:'Source Han Sans SC';
|
|
42
50
|
}
|
|
51
|
+
/* ── 三款独立主题:html[data-theme] 运行时切换(A 款专用)── */
|
|
52
|
+
[data-theme="gold"]{
|
|
53
|
+
--accent:#b45309; --accent-bg:#fdf4e7; --accent-line:#f0d5b5; --accent-ink:#92400e;
|
|
54
|
+
--hero-base:linear-gradient(160deg,#171009 0%,#241708 45%,#2e1f0d 100%);
|
|
55
|
+
--hero-glow:radial-gradient(1200px 600px at 15% -10%,rgba(251,191,36,.30),transparent 55%),radial-gradient(1000px 500px at 110% 30%,rgba(251,146,60,.26),transparent 55%),radial-gradient(900px 700px at 50% 120%,rgba(45,212,191,.16),transparent 60%);
|
|
56
|
+
--title-grad:linear-gradient(90deg,#fcd34d,#fdba74,#fca5a5);
|
|
57
|
+
--kicker-color:#fde68a; --kicker-bg:rgba(251,191,36,.12); --kicker-line:rgba(251,191,36,.35);
|
|
58
|
+
}
|
|
59
|
+
[data-theme="forest"]{
|
|
60
|
+
--accent:#0f766e; --accent-bg:#e6f4f2; --accent-line:#a7e8dd; --accent-ink:#115e59;
|
|
61
|
+
--hero-base:linear-gradient(160deg,#071512 0%,#0a1f1a 45%,#0d2a22 100%);
|
|
62
|
+
--hero-glow:radial-gradient(1200px 600px at 15% -10%,rgba(52,211,153,.30),transparent 55%),radial-gradient(1000px 500px at 110% 30%,rgba(45,212,191,.28),transparent 55%),radial-gradient(900px 700px at 50% 120%,rgba(96,165,250,.16),transparent 60%);
|
|
63
|
+
--title-grad:linear-gradient(90deg,#6ee7b7,#5eead4,#93c5fd);
|
|
64
|
+
--kicker-color:#a7f3d0; --kicker-bg:rgba(52,211,153,.12); --kicker-line:rgba(52,211,153,.35);
|
|
65
|
+
}
|
|
66
|
+
[data-theme="plum"]{
|
|
67
|
+
--accent:#7c3aed; --accent-bg:#f5f0ff; --accent-line:#d5c7fd; --accent-ink:#6d28d9;
|
|
68
|
+
--hero-base:linear-gradient(160deg,#120b20 0%,#1a1133 45%,#221540 100%);
|
|
69
|
+
--hero-glow:radial-gradient(1200px 600px at 15% -10%,rgba(167,139,250,.34),transparent 55%),radial-gradient(1000px 500px at 110% 30%,rgba(196,181,253,.28),transparent 55%),radial-gradient(900px 700px at 50% 120%,rgba(45,212,191,.16),transparent 60%);
|
|
70
|
+
--title-grad:linear-gradient(90deg,#c4b5fd,#a5b4fc,#7dd3fc);
|
|
71
|
+
--kicker-color:#ddd6fe; --kicker-bg:rgba(167,139,250,.14); --kicker-line:rgba(167,139,250,.35);
|
|
72
|
+
}
|
|
73
|
+
/* ── 主题换肤坞(A 款页面专用):右下角四色点随点随换,记忆上次选择;打印与 ?shot 截图模式隐藏 ── */
|
|
74
|
+
.theme-dock{position:fixed;right:18px;bottom:18px;z-index:1001;display:flex;gap:8px;padding:8px 10px;border-radius:999px;background:rgba(255,255,255,.92);border:1px solid var(--line);box-shadow:0 4px 18px rgba(17,24,39,.15)}
|
|
75
|
+
.theme-dock .th-dot{width:22px;height:22px;border-radius:50%;cursor:pointer;border:2px solid transparent;padding:0;transition:transform .15s ease,border-color .15s ease}
|
|
76
|
+
.theme-dock .th-dot:hover{transform:scale(1.18)}
|
|
77
|
+
.theme-dock .th-dot.on{border-color:var(--ink)}
|
|
78
|
+
.theme-dock .th-dot[data-theme="tech"]{background:#2563eb}
|
|
79
|
+
.theme-dock .th-dot[data-theme="gold"]{background:#b45309}
|
|
80
|
+
.theme-dock .th-dot[data-theme="forest"]{background:#0f766e}
|
|
81
|
+
.theme-dock .th-dot[data-theme="plum"]{background:#7c3aed}
|
|
82
|
+
@media print{.theme-dock{display:none}}
|
|
43
83
|
*{margin:0;padding:0;box-sizing:border-box}
|
|
44
84
|
body{font-family:var(--sans);background:var(--bg);color:var(--ink);line-height:1.75;font-size:16px}
|
|
45
85
|
.wrap{max-width:880px;margin:0 auto;padding:0 28px}
|
|
@@ -49,31 +89,29 @@ p{margin:0 0 1.1em}
|
|
|
49
89
|
```
|
|
50
90
|
|
|
51
91
|
> 字体纯化原则(绝对纯粹):`--sans` 仅 `'Roboto','Source Han Sans SC'`;`--mono` 仅 `'Source Han Sans SC'`。任何别名(Noto Sans SC、思源黑体)与兜底(苹方/雅黑/系统字体/sans-serif)一律禁止——未装思源黑体时宁可缺字,不可静默回退,截图抽检即能发现。SVG 内 font-family 同样仅两字体。
|
|
92
|
+
> 主题色纯化原则(A 款):组件强调色一律 `var(--accent)` / `var(--accent-bg)` / `var(--accent-line)` / `var(--accent-ink)`,封面一律 `var(--hero-glow)` / `var(--hero-base)` / `var(--title-grad)` / `var(--kicker-*)`——换肤坞才能随点随换;多彩组件(layers/fnode/ask/mode 等)保留固定色系,不随主题变。
|
|
52
93
|
> 纯白背景版:把 `--bg:#f6f8fb` 改为 `--bg:#ffffff`(深色 hero/ending/term 组件不受影响)。
|
|
53
94
|
|
|
54
95
|
## 2. 封面 hero(深色渐变 + 流程节点)
|
|
55
96
|
|
|
56
97
|
```css
|
|
57
98
|
.hero{position:relative;overflow:hidden;color:#fff;padding:96px 0 88px;text-align:center;
|
|
58
|
-
background:
|
|
59
|
-
radial-gradient(1000px 500px at 110% 30%,rgba(167,139,250,.30),transparent 55%),
|
|
60
|
-
radial-gradient(900px 700px at 50% 120%,rgba(45,212,191,.22),transparent 60%),
|
|
61
|
-
linear-gradient(160deg,#0b1220 0%,#0e1a33 45%,#131c3a 100%)}
|
|
99
|
+
background:var(--hero-glow),var(--hero-base)}
|
|
62
100
|
.hero::before{content:"";position:absolute;inset:0;background-image:
|
|
63
101
|
linear-gradient(rgba(148,163,184,.05) 1px,transparent 1px),
|
|
64
102
|
linear-gradient(90deg,rgba(148,163,184,.05) 1px,transparent 1px);
|
|
65
103
|
background-size:44px 44px;pointer-events:none}
|
|
66
104
|
.hero .inner{position:relative;z-index:2}
|
|
67
|
-
.hero .kicker{display:inline-flex;align-items:center;gap:8px;font-size:13px;letter-spacing:.14em;color
|
|
68
|
-
background:
|
|
105
|
+
.hero .kicker{display:inline-flex;align-items:center;gap:8px;font-size:13px;letter-spacing:.14em;color:var(--kicker-color);
|
|
106
|
+
background:var(--kicker-bg);border:1px solid var(--kicker-line);padding:7px 18px;border-radius:999px;margin-bottom:30px}
|
|
69
107
|
.hero h1{font-size:44px;font-weight:900;margin-bottom:18px}
|
|
70
|
-
.hero h1 .grad{background:
|
|
108
|
+
.hero h1 .grad{background:var(--title-grad);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
|
|
71
109
|
.hero .sub{font-size:19px;color:#cbd5e1;margin-bottom:12px}
|
|
72
110
|
.hero .flow{display:flex;align-items:center;justify-content:center;gap:14px;margin-top:44px;flex-wrap:wrap}
|
|
73
111
|
.hero .flow .node{display:flex;align-items:center;gap:8px;background:rgba(30,41,59,.7);border:1px solid rgba(148,163,184,.3);
|
|
74
112
|
padding:9px 18px;border-radius:12px;font-size:14px;color:#e2e8f0}
|
|
75
113
|
.hero .flow .node .n{width:22px;height:22px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;
|
|
76
|
-
font-size:12px;font-weight:700;color:#fff;background:
|
|
114
|
+
font-size:12px;font-weight:700;color:#fff;background:var(--title-grad)}
|
|
77
115
|
.hero .flow .arrow{color:#64748b;font-size:18px}
|
|
78
116
|
.hero .tagline{margin-top:34px;font-size:15px;color:#94a3b8;letter-spacing:.08em}
|
|
79
117
|
```
|
|
@@ -82,12 +120,12 @@ p{margin:0 0 1.1em}
|
|
|
82
120
|
|
|
83
121
|
```css
|
|
84
122
|
.sec-head{display:flex;align-items:baseline;gap:14px;margin:0 0 26px;padding-bottom:14px;border-bottom:1px solid var(--line)}
|
|
85
|
-
.sec-head .no{font-weight:900;font-size:30px;color:var(--
|
|
123
|
+
.sec-head .no{font-weight:900;font-size:30px;color:var(--accent);letter-spacing:-.02em;min-width:52px}
|
|
86
124
|
.sec-head h2{font-size:26px}
|
|
87
125
|
.sec-head .en{font-size:12px;letter-spacing:.12em;color:var(--ink-4);text-transform:uppercase;margin-left:auto}
|
|
88
126
|
.lead{font-size:17px;color:var(--ink-2);margin-bottom:28px}
|
|
89
127
|
.h3{font-size:19px;margin:34px 0 14px;display:flex;align-items:center;gap:10px}
|
|
90
|
-
.h3::before{content:"";width:4px;height:18px;border-radius:2px;background:var(--
|
|
128
|
+
.h3::before{content:"";width:4px;height:18px;border-radius:2px;background:var(--accent)}
|
|
91
129
|
.card{background:var(--card);border-radius:16px;box-shadow:var(--shadow-sm);border:1px solid var(--line)}
|
|
92
130
|
.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:18px}
|
|
93
131
|
.grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
|
|
@@ -217,7 +255,7 @@ td.hl{font-weight:700;color:var(--ink)}
|
|
|
217
255
|
.rule{background:var(--card);border:1px solid var(--line);border-radius:16px;padding:24px 22px;position:relative;box-shadow:var(--shadow-sm);transition:transform .2s}
|
|
218
256
|
.rule:hover{transform:translateY(-3px);box-shadow:var(--shadow-md)}
|
|
219
257
|
.rule .num{position:absolute;top:16px;right:18px;font-size:34px;font-weight:900;color:var(--line)}
|
|
220
|
-
.rule .en{font-size:16px;font-weight:900;color:var(--
|
|
258
|
+
.rule .en{font-size:16px;font-weight:900;color:var(--accent);margin-bottom:8px}
|
|
221
259
|
.rule p{font-size:13.5px;color:var(--ink-2);margin:0;line-height:1.7}
|
|
222
260
|
```
|
|
223
261
|
|
|
@@ -274,7 +312,7 @@ td.hl{font-weight:700;color:var(--ink)}
|
|
|
274
312
|
```css
|
|
275
313
|
.ttypes{display:grid;grid-template-columns:repeat(5,1fr);gap:12px}
|
|
276
314
|
.tt{background:#fff;border:1px solid var(--line);border-radius:12px;padding:14px 12px;box-shadow:var(--shadow-sm)}
|
|
277
|
-
.tt .ttn{font-family:var(--mono);font-weight:700;font-size:13px;color:var(--
|
|
315
|
+
.tt .ttn{font-family:var(--mono);font-weight:700;font-size:13px;color:var(--accent);margin-bottom:5px}
|
|
278
316
|
.tt .tcount{font-size:10.5px;color:var(--ink-4);float:right;font-family:var(--sans)}
|
|
279
317
|
.tt p{font-size:12px;color:var(--ink-3);margin:0;line-height:1.6}
|
|
280
318
|
|
|
@@ -307,7 +345,7 @@ td.hl{font-weight:700;color:var(--ink)}
|
|
|
307
345
|
.chat .chat-title{font-weight:700;font-size:16px;margin-bottom:18px}
|
|
308
346
|
.msg{max-width:86%;border-radius:13px;padding:10px 15px;font-size:13.5px;margin-bottom:12px;line-height:1.65}
|
|
309
347
|
.msg .who{font-size:11.5px;font-weight:700;opacity:.65;margin-bottom:2px}
|
|
310
|
-
.msg.u{background:var(--
|
|
348
|
+
.msg.u{background:var(--accent-bg);border:1px solid var(--accent-line);margin-left:auto;border-bottom-right-radius:3px;color:var(--accent-ink)}
|
|
311
349
|
.msg.a{background:#f8fafc;border:1px solid var(--line);border-bottom-left-radius:3px;color:var(--ink-2)}
|
|
312
350
|
|
|
313
351
|
.oss{display:grid;grid-template-columns:1fr 1fr;gap:16px}
|
|
@@ -318,14 +356,14 @@ td.hl{font-weight:700;color:var(--ink)}
|
|
|
318
356
|
|
|
319
357
|
.ending{background:linear-gradient(160deg,#0f172a,#111c36);border-radius:20px;color:#e2e8f0;padding:46px 40px;text-align:center;box-shadow:var(--shadow-lg);position:relative;overflow:hidden}
|
|
320
358
|
.ending .e-t{position:relative;font-size:26px;font-weight:900;margin-bottom:14px}
|
|
321
|
-
.ending .e-t .grad{background:
|
|
359
|
+
.ending .e-t .grad{background:var(--title-grad);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
|
|
322
360
|
.ending p{position:relative;color:#94a3b8;font-size:14.5px;max-width:620px;margin:0 auto 22px}
|
|
323
|
-
.ending .nospec{position:relative;display:inline-block;font-size:21px;font-weight:900;letter-spacing:.08em;color:#fff;background:linear-gradient(90deg
|
|
361
|
+
.ending .nospec{position:relative;display:inline-block;font-size:21px;font-weight:900;letter-spacing:.08em;color:#fff;background:linear-gradient(90deg,var(--accent),var(--accent-ink));padding:12px 34px;border-radius:12px;box-shadow:0 8px 26px rgba(37,99,235,.5)}
|
|
324
362
|
|
|
325
363
|
.author{display:flex;gap:20px;align-items:flex-start;background:#fff;border:1px solid var(--line);border-radius:16px;padding:24px 28px;box-shadow:var(--shadow-sm);margin-bottom:60px}
|
|
326
|
-
.author .avatar{width:56px;height:56px;border-radius:14px;flex:none;display:flex;align-items:center;justify-content:center;font-size:24px;font-weight:900;color:#fff;background:
|
|
364
|
+
.author .avatar{width:56px;height:56px;border-radius:14px;flex:none;display:flex;align-items:center;justify-content:center;font-size:24px;font-weight:900;color:#fff;background:var(--title-grad)}
|
|
327
365
|
.author .nm{font-weight:700;font-size:16.5px;margin-bottom:6px}
|
|
328
|
-
.author .nm .role{display:inline-block;font-size:11.5px;font-weight:500;color:var(--
|
|
366
|
+
.author .nm .role{display:inline-block;font-size:11.5px;font-weight:500;color:var(--accent-ink);background:var(--accent-bg);border:1px solid var(--accent-line);padding:2px 10px;border-radius:999px;margin-left:10px;vertical-align:2px}
|
|
329
367
|
.author p{font-size:13.5px;color:var(--ink-2);margin:0;line-height:1.7}
|
|
330
368
|
|
|
331
369
|
.foot{text-align:center;padding:34px 0 44px;color:var(--ink-4);font-size:12.5px}
|
|
@@ -335,12 +373,12 @@ td.hl{font-weight:700;color:var(--ink)}
|
|
|
335
373
|
|
|
336
374
|
```html
|
|
337
375
|
<!DOCTYPE html>
|
|
338
|
-
<html lang="zh-CN">
|
|
376
|
+
<html lang="zh-CN" data-theme="tech">
|
|
339
377
|
<head>
|
|
340
378
|
<meta charset="UTF-8">
|
|
341
379
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
342
380
|
<title>文章标题</title>
|
|
343
|
-
<style>/*
|
|
381
|
+
<style>/* 按需复制上面的变量与组件样式(A 款含四主题 data-theme 块与换肤坞 CSS) */</style>
|
|
344
382
|
</head>
|
|
345
383
|
<body>
|
|
346
384
|
<div class="hero">…封面…</div>
|
|
@@ -353,6 +391,33 @@ td.hl{font-weight:700;color:var(--ink)}
|
|
|
353
391
|
…更多章节…
|
|
354
392
|
<div class="foot">…页脚…</div>
|
|
355
393
|
</div>
|
|
394
|
+
<!-- 主题换肤坞(A 款页面专用;data-theme 初始值 = THEME 配置) -->
|
|
395
|
+
<div class="theme-dock" id="themeDock">
|
|
396
|
+
<button class="th-dot" type="button" data-theme="tech" title="科技蓝"></button>
|
|
397
|
+
<button class="th-dot" type="button" data-theme="gold" title="暖棕金"></button>
|
|
398
|
+
<button class="th-dot" type="button" data-theme="forest" title="墨绿"></button>
|
|
399
|
+
<button class="th-dot" type="button" data-theme="plum" title="梅紫"></button>
|
|
400
|
+
</div>
|
|
401
|
+
<script>
|
|
402
|
+
/* 主题换肤:html[data-theme] 切换 + 记忆上次选择(localStorage,失败静默);?shot 截图模式隐藏坞 */
|
|
403
|
+
(function(){
|
|
404
|
+
var THEMES=['tech','gold','forest','plum'];
|
|
405
|
+
var dock=document.getElementById('themeDock');
|
|
406
|
+
if(!dock) return;
|
|
407
|
+
if(location.search.indexOf('shot=')!==-1){ dock.style.display='none'; }
|
|
408
|
+
function apply(t){
|
|
409
|
+
document.documentElement.setAttribute('data-theme',t);
|
|
410
|
+
dock.querySelectorAll('.th-dot').forEach(function(d){ d.classList.toggle('on',d.getAttribute('data-theme')===t); });
|
|
411
|
+
try{ localStorage.setItem('sf-article-theme',t); }catch(e){}
|
|
412
|
+
}
|
|
413
|
+
var cur=document.documentElement.getAttribute('data-theme');
|
|
414
|
+
var saved=null;
|
|
415
|
+
try{ saved=localStorage.getItem('sf-article-theme'); }catch(e){}
|
|
416
|
+
if(saved && THEMES.indexOf(saved)!==-1 && saved!==cur){ apply(saved); }
|
|
417
|
+
else{ dock.querySelectorAll('.th-dot').forEach(function(d){ d.classList.toggle('on',d.getAttribute('data-theme')===(cur||'tech')); }); }
|
|
418
|
+
dock.querySelectorAll('.th-dot').forEach(function(d){ d.addEventListener('click',function(){ apply(d.getAttribute('data-theme')); }); });
|
|
419
|
+
})();
|
|
420
|
+
</script>
|
|
356
421
|
</body>
|
|
357
422
|
</html>
|
|
358
423
|
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# 用户配置(升级技能时本文件不会被覆盖)
|
|
2
|
+
|
|
3
|
+
> 你的个人配置全放在这里。skill-forge 升级技能时官方只更新 SKILL.md、design-system.md 与 resources/scripts,
|
|
4
|
+
> 本文件始终保留你的版本——页面主题色默认值放心改。
|
|
5
|
+
> 官方升级若带来新配置点,会另存 `user-config.md.upstream` 对照文件到同目录,
|
|
6
|
+
> 你按需查看并手动合并新配置点到本文件。
|
|
7
|
+
|
|
8
|
+
## ⚙️ 默认配置(用户可手动修改;临时口头要求永远优先)
|
|
9
|
+
|
|
10
|
+
```yaml
|
|
11
|
+
CONFIG_VERSION: 1 # 配置结构版本:skill 升级时若配置结构变化会递增;AI 每次执行前对比 SKILL.md「配置版本机制」节声明的当前版本,不一致时按 SKILL.md 的迁移规则处理(先备份本文件为带时间戳 .bak,再迁移,最后对话告知用户)
|
|
12
|
+
THEME: tech # A 款(暗色封面长文风)页面主题色:tech 科技蓝(默认)/ gold 暖棕金 / forest 墨绿 / plum 梅紫;生成时写入 <html data-theme="THEME值"> 定默认,页面右下角换肤坞可随时切换(浏览器本地记忆,?shot 截图模式自动隐藏,打印隐藏);其余五款风格(B 文艺/C 极简白/D 终端极客/E 卡片流/F 报纸)本色锁定不参与换肤
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
> 临时口头要求(仅对当次生效,不修改上方配置):说「主题色用暖棕金/金色」→ 当次 data-theme="gold";说「这次用墨绿主题」→ 当次 data-theme="forest";说「以后默认用梅紫主题」→ 永久把 THEME 改为 plum。
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
> 更多用法见 SKILL.md 的「Workflow」与 design-system.md 设计系统参考。
|
package/cli.js
CHANGED
|
@@ -23,7 +23,8 @@ const CATEGORIES = [
|
|
|
23
23
|
{ name: "报表汇演", en: "Reports", skills: ["daily-report", "weekly-report", "annual-report"] },
|
|
24
24
|
{ name: "文档装裱", en: "Documents", skills: ["article-to-html"] },
|
|
25
25
|
{ name: "工程提效", en: "Engineering", skills: ["spec-doc2spec", "spec-spec2doc"] },
|
|
26
|
-
{ name: "演示汇演", en: "Slides", skills: ["magic-deck"] },
|
|
26
|
+
{ name: "演示汇演", en: "Slides", skills: ["magic-deck", "deck-stage"] },
|
|
27
|
+
{ name: "沟通协作", en: "Communication", skills: ["prompt-pouch"] },
|
|
27
28
|
{ name: "技能自造", en: "Meta", skills: ["meta-forge"] },
|
|
28
29
|
];
|
|
29
30
|
|
|
@@ -202,33 +203,36 @@ function detectTargetDirs() {
|
|
|
202
203
|
return found;
|
|
203
204
|
}
|
|
204
205
|
|
|
205
|
-
async function selectSkillsInteractive(skills) {
|
|
206
|
+
async function selectSkillsInteractive(skills, target) {
|
|
206
207
|
const numbered = [];
|
|
207
208
|
const mapped = new Set(CATEGORIES.reduce((acc, c) => acc.concat(c.skills), []));
|
|
208
|
-
|
|
209
|
+
const isInstalled = (s) => fs.existsSync(path.join(target, s.dir, "SKILL.md"));
|
|
210
|
+
let installedCount = 0;
|
|
211
|
+
let text = "\n可选技能(a=全部安装;编号挑选,逗号分隔,如 1,3;q=退出):\n\n";
|
|
212
|
+
const render = (s) => {
|
|
213
|
+
numbered.push(s);
|
|
214
|
+
const installed = isInstalled(s);
|
|
215
|
+
if (installed) installedCount++;
|
|
216
|
+
text += ` [${numbered.length}] ${s.name.padEnd(16)} ${(installed ? "★已装" : "").padEnd(8)}${shortDesc(s.description)}\n`;
|
|
217
|
+
};
|
|
209
218
|
for (const cat of CATEGORIES) {
|
|
210
219
|
const list = cat.skills.map((n) => skills.find((s) => s.name === n)).filter(Boolean);
|
|
211
220
|
if (list.length === 0) continue;
|
|
212
221
|
text += `【${cat.name} ${cat.en}】\n`;
|
|
213
|
-
for (const s of list)
|
|
214
|
-
numbered.push(s);
|
|
215
|
-
text += ` [${numbered.length}] ${s.name.padEnd(16)} ${shortDesc(s.description)}\n`;
|
|
216
|
-
}
|
|
222
|
+
for (const s of list) render(s);
|
|
217
223
|
text += "\n";
|
|
218
224
|
}
|
|
219
225
|
const rest = skills.filter((s) => !mapped.has(s.name));
|
|
220
226
|
if (rest.length > 0) {
|
|
221
227
|
text += "【未分类】\n";
|
|
222
|
-
for (const s of rest)
|
|
223
|
-
numbered.push(s);
|
|
224
|
-
text += ` [${numbered.length}] ${s.name.padEnd(16)} ${shortDesc(s.description)}\n`;
|
|
225
|
-
}
|
|
228
|
+
for (const s of rest) render(s);
|
|
226
229
|
text += "\n";
|
|
227
230
|
}
|
|
231
|
+
text += `共 ${skills.length} 件技能,目标目录已装 ${installedCount} 件(★ 标注,重选已装=升级)\n`;
|
|
228
232
|
console.log(text);
|
|
229
233
|
const ans = await ask("你的选择:");
|
|
230
234
|
if (/^q$/i.test(ans)) return [];
|
|
231
|
-
if (/^a$/i.test(ans)) return
|
|
235
|
+
if (/^a$/i.test(ans)) return numbered; // 全选返回清单展示顺序,与编号一致
|
|
232
236
|
const chosen = [];
|
|
233
237
|
for (const part of ans.split(/[,,\s]+/)) {
|
|
234
238
|
if (!part) continue;
|
|
@@ -294,9 +298,19 @@ async function upgradeSkill(src, dest, argv, existed) {
|
|
|
294
298
|
}
|
|
295
299
|
}
|
|
296
300
|
|
|
297
|
-
if (mode === "official")
|
|
301
|
+
if (mode === "official") {
|
|
302
|
+
fs.unlinkSync(localCfg); // 备份已做,移除后 copyDir 正常覆盖
|
|
303
|
+
try { fs.unlinkSync(localCfg + ".upstream"); } catch (e) {} // 旧对照已无意义,清理
|
|
304
|
+
}
|
|
298
305
|
copyDir(src, dest, loadPreserveSet(src), hits, upstreams);
|
|
299
306
|
|
|
307
|
+
// 依赖提示:技能自带 package.json(如 deck-stage 依赖 PptxGenJS)且目标无 node_modules 时
|
|
308
|
+
// (本地仓库直装会连带复制 node_modules 离线可用;npm 全局装出的包不含 node_modules)
|
|
309
|
+
let depNote = "";
|
|
310
|
+
if (fs.existsSync(path.join(dest, "package.json")) && !fs.existsSync(path.join(dest, "node_modules"))) {
|
|
311
|
+
depNote = `(缺依赖:cd ${dest} && npm install)`;
|
|
312
|
+
}
|
|
313
|
+
|
|
300
314
|
let note = existed ? "已更新" : "已安装";
|
|
301
315
|
if (mode === "official") {
|
|
302
316
|
note += `(已用官方配置覆盖,你的旧配置备份在 ${path.basename(bakFile)})`;
|
|
@@ -314,6 +328,7 @@ async function upgradeSkill(src, dest, argv, existed) {
|
|
|
314
328
|
note += `;官方配置有更新,已另存对照文件:${names}(可手动合并新配置点)`;
|
|
315
329
|
}
|
|
316
330
|
}
|
|
331
|
+
if (depNote) note += depNote;
|
|
317
332
|
return note;
|
|
318
333
|
}
|
|
319
334
|
|
|
@@ -338,7 +353,7 @@ async function cmdInit(argv) {
|
|
|
338
353
|
process.exit(1);
|
|
339
354
|
}
|
|
340
355
|
} else if (process.stdin.isTTY) {
|
|
341
|
-
chosen = await selectSkillsInteractive(skills);
|
|
356
|
+
chosen = await selectSkillsInteractive(skills, target);
|
|
342
357
|
if (chosen.length === 0) {
|
|
343
358
|
console.log("未选择任何技能,退出。");
|
|
344
359
|
return;
|
|
@@ -348,15 +363,35 @@ async function cmdInit(argv) {
|
|
|
348
363
|
process.exit(1);
|
|
349
364
|
}
|
|
350
365
|
|
|
351
|
-
// 3.
|
|
366
|
+
// 3. 确认(已装技能分组提示:默认升级保留本地配置,可 s 跳过已装只装新)
|
|
367
|
+
const already = chosen.filter((s) => fs.existsSync(path.join(target, s.dir, "SKILL.md")));
|
|
352
368
|
if (!argv.yes) {
|
|
353
369
|
console.log(`\n将安装 ${chosen.length} 件技能到:${target}`);
|
|
354
|
-
chosen.forEach((s) => console.log(`
|
|
370
|
+
chosen.filter((s) => !already.includes(s)).forEach((s) => console.log(` + ${s.name}`));
|
|
371
|
+
if (already.length > 0) {
|
|
372
|
+
already.forEach((s) => console.log(` ↻ ${s.name}(已装,将升级到官方最新)`));
|
|
373
|
+
console.log(" 升级保留你的 user-config.md 等本地文件;配置结构变化时自动备份后询问。");
|
|
374
|
+
}
|
|
355
375
|
if (process.stdin.isTTY) {
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
376
|
+
if (already.length > 0) {
|
|
377
|
+
const ans = await ask("确认安装?(y=全部 / s=跳过已装只装新 / N=取消):");
|
|
378
|
+
if (/^s$/i.test(ans)) {
|
|
379
|
+
chosen = chosen.filter((s) => !already.includes(s));
|
|
380
|
+
if (chosen.length === 0) {
|
|
381
|
+
console.log("已装技能全部跳过,没有新技能可装。");
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
console.log(`已跳过 ${already.length} 件已装技能,仅安装 ${chosen.length} 件新技能。`);
|
|
385
|
+
} else if (!/^y/i.test(ans)) {
|
|
386
|
+
console.log("已取消。");
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
} else {
|
|
390
|
+
const ans = await ask("确认安装?(y/N):");
|
|
391
|
+
if (!/^y/i.test(ans)) {
|
|
392
|
+
console.log("已取消。");
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
360
395
|
}
|
|
361
396
|
}
|
|
362
397
|
}
|
|
@@ -391,6 +426,20 @@ async function cmdUpdate(argv) {
|
|
|
391
426
|
}
|
|
392
427
|
if (argv.skills) {
|
|
393
428
|
const wanted = argv.skills.split(",").map((x) => x.trim());
|
|
429
|
+
const unknown = wanted.filter((n) => !skills.some((s) => s.name === n));
|
|
430
|
+
const notInstalled = wanted.filter(
|
|
431
|
+
(n) =>
|
|
432
|
+
skills.some((s) => s.name === n) && !installed.some((s) => s.name === n)
|
|
433
|
+
);
|
|
434
|
+
if (unknown.length) {
|
|
435
|
+
console.log(
|
|
436
|
+
`错误:仓库中不存在这些技能:${unknown.join(", ")}。可用技能:${skills.map((s) => s.name).join(", ")}`
|
|
437
|
+
);
|
|
438
|
+
process.exit(1);
|
|
439
|
+
}
|
|
440
|
+
if (notInstalled.length) {
|
|
441
|
+
console.log(`提示:以下技能尚未安装到目标目录,本次跳过:${notInstalled.join(", ")}`);
|
|
442
|
+
}
|
|
394
443
|
installed = installed.filter((s) => wanted.includes(s.name));
|
|
395
444
|
if (installed.length === 0) {
|
|
396
445
|
console.log(`错误:目标目录没有已安装的指定技能。可用 --skills 仅限已装技能,请先 init。`);
|
|
@@ -432,11 +481,11 @@ function printHelp() {
|
|
|
432
481
|
|
|
433
482
|
用法:
|
|
434
483
|
skill-forge ls 列出全部技能(分类 + 名称 + 说明)
|
|
435
|
-
skill-forge init
|
|
484
|
+
skill-forge init 列清单交互挑选:a=全部安装 / 编号挑选(已装标 ★,确认时可跳过已装)
|
|
436
485
|
skill-forge update 升级已安装技能(配置版本感知,默认全部已装技能)
|
|
437
|
-
skill-forge update --skills a,b
|
|
486
|
+
skill-forge update --skills a,b 只升级指定技能(未安装的提示跳过)
|
|
438
487
|
skill-forge init --target <目录> 指定技能目录(默认自动探测常见助手目录)
|
|
439
|
-
skill-forge init --skills a,b
|
|
488
|
+
skill-forge init --skills a,b 跳过选择,直接安装/升级指定技能(适合脚本与单件补装)
|
|
440
489
|
skill-forge init --yes 跳过确认,直接安装
|
|
441
490
|
skill-forge --version 显示版本
|
|
442
491
|
|
package/daily-report/SKILL.md
CHANGED
|
@@ -1,31 +1,33 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: daily-report
|
|
3
|
-
description: 生成工作日报(默认任务进度/明日计划/风险阻塞点三段结构,中文顿号序号),适配各行业(内置 12
|
|
3
|
+
description: 生成工作日报(默认任务进度/明日计划/风险阻塞点三段结构,中文顿号序号),适配各行业(内置 12 行业职业词典,可指定角色身份)。数据来源灵活:直接口述、给一段文字、发文件(Word/PDF/Excel/PPT 等)或图片,都能整理成日报。支持自定义模板(可永久或临时指定)。支持自然语言指定日期(今天/昨天/上周三/10月20号等)。当用户请求写日报、今日日报、昨天的日报、生成日报、/daily-report,或询问日报用法(日报怎么用/日报使用说明/日报有哪些使用方式)时使用。
|
|
4
4
|
allowed-tools: Bash, Read, Write
|
|
5
5
|
disable-model-invocation: false
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# 日报生成
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
多源数据生成三段式日报(今日任务进度/明日计划/风险阻塞点)——数据来源灵活:一段文字、文件里的描述、图片或口头补充皆可成稿;对话输出 md 正文 + 落盘 md/txt/html/content-png 并自动打开 html。
|
|
11
11
|
|
|
12
12
|
## 生成流程
|
|
13
13
|
|
|
14
|
-
0. **读用户配置**(DISK/FORMATS/DIR/OPEN_HTML/TEMPLATE/ROLE/CONFIRM/CONFIG_VERSION、自定义模板)→ 先 Read 同目录 `user-config.md`
|
|
14
|
+
0. **读用户配置**(DISK/FORMATS/DIR/OPEN_HTML/THEME/TEMPLATE/ROLE/CONFIRM/CONFIG_VERSION、自定义模板)→ 先 Read 同目录 `user-config.md`
|
|
15
15
|
1. **解析日期**(自然语言 → 目标日期 YYYY-MM-DD)→ 读 `resources/date-parsing.md`
|
|
16
|
-
2.
|
|
16
|
+
2. **收集数据**(多源:会话口述 / 文字 / 文件 / 图片 / 代码提交记录,合并去重)→ 读 `resources/data-collection.md`
|
|
17
17
|
3. **内容归类与润色**(聚合来源 / 补充任务 / 纯文字模式 / 输出格式 / 写作风格)→ 读 `resources/content-rules.md`
|
|
18
18
|
4. **行业词条**(话术含职业词时按词典取词)→ 读 `resources/industry-dictionary.md`
|
|
19
19
|
5. **落盘与截图**(md/txt/html/content-png + 自动打开 html)→ 读 `resources/disk-and-html.md`
|
|
20
|
-
6. **使用咨询**(用户只问「日报怎么用」等用法、未要求生成)→ 读 `resources/usage-guide.md
|
|
20
|
+
6. **使用咨询**(用户只问「日报怎么用」等用法、未要求生成)→ 读 `resources/usage-guide.md`,将其内容原样输出(首行标题改为「日报生成器使用指南」),不收集数据、不生成报告、不落盘、不开浏览器
|
|
21
21
|
|
|
22
22
|
## ⚙️ 配置与自定义模板
|
|
23
23
|
|
|
24
|
-
**执行本 skill 前必须先 Read 同目录 `user-config.md`**:默认配置(DISK/FORMATS/DIR/OPEN_HTML/TEMPLATE/ROLE/CONFIRM/CONFIG_VERSION)与自定义模板都在该文件中,以它为准。升级技能时 user-config.md 不会被覆盖,你的修改永久保留;官方更新配置时另存 `user-config.md.upstream` 对照文件,可按需手动合并新配置点。
|
|
24
|
+
**执行本 skill 前必须先 Read 同目录 `user-config.md`**:默认配置(DISK/FORMATS/DIR/OPEN_HTML/THEME/TEMPLATE/ROLE/CONFIRM/CONFIG_VERSION)与自定义模板都在该文件中,以它为准。升级技能时 user-config.md 不会被覆盖,你的修改永久保留;官方更新配置时另存 `user-config.md.upstream` 对照文件,可按需手动合并新配置点。
|
|
25
|
+
|
|
26
|
+
- **THEME**:html 页面主题,tech 深蓝科技(默认)/ biz 浅色商务 / mono 极简黑白 / warm 温暖渐变;生成时写 `<html data-theme="THEME值">` 定默认,页面右下角换肤坞随点随换(localStorage 记忆、?shot 截图模式与打印隐藏)
|
|
25
27
|
|
|
26
28
|
## 配置版本机制(升级保护)
|
|
27
29
|
|
|
28
|
-
本 skill 当前配置版本为 `
|
|
30
|
+
本 skill 当前配置版本为 `2`(对应 user-config.md 中的 `CONFIG_VERSION`)。执行时若发现 user-config.md 的 CONFIG_VERSION 与本节声明的当前版本不一致:
|
|
29
31
|
|
|
30
32
|
1. 先将旧 user-config.md 备份为 `user-config.md.bak-<时间戳>`(同目录,绝不删除旧值)
|
|
31
33
|
2. 按本节「配置升级规则」迁移字段:新增字段补默认值、改名字段按映射改写、删除字段的值保留在备份中并在对话提示用户手动确认
|
|
@@ -34,6 +36,10 @@ disable-model-invocation: false
|
|
|
34
36
|
|
|
35
37
|
升级本 skill 时,配置结构如有变化必须同步更新本节的当前版本号与迁移说明;禁止在未声明版本变更的情况下静默修改配置语义。
|
|
36
38
|
|
|
39
|
+
**无法迁移项处理**(值域失效 / 语义漂移 / 数据不兼容):三情形——①旧值不在新值域(如旧模板/主题名已移除)②同名键含义变化(单位/枚举变更)③数据文件 schema 不兼容。三绝不:绝不静默(无法迁移项停下问,不猜值)、绝不丢失(旧值永远在 .bak-时间戳)、一次说清(升级报告三段式:⚠️ 版本与备份路径 → ✅ 已自动迁移清单 → 🟡 无法迁移项逐条附原因+影响+建议替代);随后 AskUserQuestion 三选项(A 用建议值 / B 用户给新值 / C 保持旧配置——不更新 CONFIG_VERSION,每次执行再提醒);报告必附回滚一句话;数据文件迁移前先复制 .bak-时间戳,能映射则映射、不能则写兼容层或留备份提示手动整理
|
|
40
|
+
|
|
41
|
+
当前版本变更记录:v1→v2 新增 THEME 字段(默认 tech;发现旧配置时按迁移规则补默认值)。
|
|
42
|
+
|
|
37
43
|
## 文档同步自检纪律(维护者必读)
|
|
38
44
|
|
|
39
45
|
修改本 skill 任一文件(SKILL.md / user-config.md / resources/*)后,必须 grep 全文核对相关关键词在各文件间一致(如章节名/字段名/效果参数改名时新旧词全仓核对,旧词零残留才算完成)。修改 HTML 效果必须同步更新 `resources/reference.html` 与 `disk-and-html.md` 对应描述,三者以 reference.html 为真相源;改完后互相 grep 关键参数确认对齐。
|
|
@@ -41,6 +47,8 @@ disable-model-invocation: false
|
|
|
41
47
|
## 规则速览
|
|
42
48
|
|
|
43
49
|
- 任务进度 3-6 点、每点 20-40 字;序号用中文顿号(1、2、3)
|
|
44
|
-
-
|
|
50
|
+
- 三段兜底写「暂无」;计划点带进度百分比与预估用时+完成标准(口述有时必写);风险阻塞点四环(问题+影响+建议+责任与时间,第四环口述有时必写)
|
|
45
51
|
- 用时单位 XH(小时),估算值注明「约」
|
|
52
|
+
- 数字凡有对比基准必带;业务结果指标优先于提交统计;流水无主语、结论判断归因处允许「我」;落笔前五问自检(结论/基准/闭环/可验证/归属)
|
|
53
|
+
- 页面主题四选一(tech 深蓝科技默认 / biz 浅色商务 / mono 极简黑白 / warm 温暖渐变):THEME 配置定默认,右下角换肤坞随点随换
|
|
46
54
|
- 完整规则(聚合来源 / 纯文字模式 / 写作风格约束 / 使用提示)见 `resources/content-rules.md`
|
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
## 输出内容与数据来源
|
|
4
4
|
- 三段结构:今日任务进度(3-6 点)/ 明日计划 / 风险阻塞点
|
|
5
|
-
- 任务点格式:1
|
|
6
|
-
-
|
|
5
|
+
- 任务点格式:1、任务描述(量化数据)- 进度XX% - 用时XH
|
|
6
|
+
- 量化数据优先级:用户口述的业务结果指标(响应时间/错误率/成功率/转化率等)优先写入;提交统计(文件数/行数/提交次数)仅在无业务指标时兜底;两者都有时业务指标在前、提交统计后置或省略
|
|
7
|
+
- 数字凡有对比基准必带(环比/同比/目标完成度至少其一,如「+18%」「达目标 90%」);无基准来源时不作要求
|
|
8
|
+
- 任务来源(默认):各仓库当日 提交记录自动聚合 + 本次会话中用户已提及/口述的工作内容 + 用户口头补充,全部合并去重;仅当用户明确说"只整理这段文字/只按这段"时才忽略提交记录与会话上下文、只用指定文字(见「纯文字整理模式」)
|
|
7
9
|
- 「明日计划」取材双通道:①用户口述/文字补充的计划(优先并入);②一次生成连续多天日报时(本次批量生成中后面日期的日报,或 reports 目录中已存在的后续日报),从后一天日报的「今日任务进度」中抽取任务作为当天「明日计划」(抽取数量灵活、不设死上限:后续完成任务多且连续性强时可多抽至 4-5 条,少则抽 1-2 条,与后续日报内容形成呼应即可),描述改写为计划语气(完成态改进行态:如「完成 XX 重构」→「推进 XX 重构」「继续 XX 开发」,去掉量化数据/进度/用时);批量多天时优先保证跨天连续性:抽取时尽量让当天「明日计划」与后一天「今日任务进度」形成「计划→完成」的同主题承接链(如 11.05 计划「推进底部导航重构」→ 11.06 完成「完成底部导航重构」,同一条工作线前后呼应,跨天任务尽量串成连续的工作链);批量中最后一天无后续日报时,该段按口述或「暂无」处理
|
|
8
|
-
- 量化数据取自 git --stat
|
|
10
|
+
- 量化数据取自 git --stat(文件数、增删行数);用时为合理估算(提交记录不记录耗时,估算值注明"约",可口头修正)
|
|
9
11
|
- 数据收集范围(按当前系统自动选择,另一系统的仓库自动跳过):macOS = NearCast / nearcast-server / nearcast-go / nearcast-admin / SmartCanteenConsumerMachineApp / TrustPay 共 6 个仓库;Windows = srf-app / srf-manage / srf-operation / srf-service / srf-web-user / srf-web-operation / srf-web-wx / srf-web-h5-teacher / srf-web-uop / Spec-Core-Smart-Canteen 共 10 个仓库;无当日提交的仓库不写入
|
|
10
12
|
- HTML 版为参考图式深蓝面板卡片美化样式(实心深蓝卡片 + 细密水平条纹 + 上下边缘高光线 + 左缘节色条,保留 ask 同款发光动效):顶部「一键复制」按钮(复制纯文本版)+ TL;DR 摘要行、「今日任务进度」标题右侧带目标日期徽章 + 任务进度节内当日节奏条(上午/下午/晚上时段条,hover 显示时段提交明细)+ 节奏条下量化指标行(提交次数/涉及文件数/代码行数)+ 进度条终点圆点与流星扫描填充 + 液态玻璃卡片(@supports 兜底)+ CRT 扫描光带 + 全页 3D 微倾斜(±0.75°)、页脚署名 GENERATED BY SPECCORE TEAM(日期动态跟随目标日期),并随 FORMATS 默认落一张内容区截图 content-png(卡片整体 + 四周留白 + 日期徽章)
|
|
11
13
|
|
|
@@ -13,19 +15,19 @@
|
|
|
13
15
|
|
|
14
16
|
用户调用时可能口头追加任务(如"再补充一下:上午改了角标接口,下午跟测试联调了"),按以下规则处理:
|
|
15
17
|
|
|
16
|
-
- **触发**:话术含"补充/加上/还有/另外/以及/对了"等追加词,或直接口述任务内容(说"
|
|
18
|
+
- **触发**:话术含"补充/加上/还有/另外/以及/对了"等追加词,或直接口述任务内容(说"整理成日报/只整理这段文字/只按这段/不要别的来源"时走「纯文字整理模式」,不是追加)
|
|
17
19
|
- **分段**:补充内容带分段词时按段并入——"明日计划/计划:xxx"→ 明日计划段;"风险/阻塞:xxx"→ 风险阻塞点段(说"风险暂无/无风险"→ 风险段写「暂无」);不带分段词默认并入"今日任务进度"
|
|
18
20
|
- **拆条**:按语义主题拆分,一个主题一条;拆分信号:时间词(上午/下午/晚上)、追加连接词、分号顿号列举、数字列举(1、2、3)
|
|
19
|
-
- **润色**:口语整理为规范任务描述(动词开头、说清对象与结果);用户未给量化数据时,优先从
|
|
20
|
-
- **去重**:与
|
|
21
|
-
- **格式**:与
|
|
21
|
+
- **润色**:口语整理为规范任务描述(动词开头、说清对象与结果);用户未给量化数据时,优先从 提交记录补文件数/行数,无记录则省略量化、只写进度与用时(估算值注明"约")
|
|
22
|
+
- **去重**:与 提交记录聚合任务合并时,同一件事只保留一条
|
|
23
|
+
- **格式**:与 提交记录聚合条目同格式,接在"今日任务进度"下继续编号
|
|
22
24
|
|
|
23
|
-
## 纯文字整理模式(用户贴一段文字,无
|
|
25
|
+
## 纯文字整理模式(用户贴一段文字,无 提交记录)
|
|
24
26
|
|
|
25
|
-
用户调用时直接贴一段文字并说"整理成日报/根据这段生成日报"(可能不是开发岗位,没有任何
|
|
27
|
+
用户调用时直接贴一段文字并说"整理成日报/根据这段生成日报"(可能不是开发岗位,没有任何 提交记录),按以下规则处理:
|
|
26
28
|
|
|
27
|
-
- **触发**:话术含"整理/根据这段/以下内容/帮我梳理"等 + 附了一段多句文字/图片/文件,或明说"
|
|
28
|
-
- **数据来源**:用户文字/图片/文件为主源,**跳过
|
|
29
|
+
- **触发**:话术含"整理/根据这段/以下内容/帮我梳理"等 + 附了一段多句文字/图片/文件,或明说"只整理这段文字/只按这段/不要别的来源/不要别的来源"(与"写日报 + 补充一下"的区别:文字/图片/文件是唯一主源、跳过提交记录与会话上下文,不是追加)
|
|
30
|
+
- **数据来源**:用户文字/图片/文件为主源,**跳过 提交记录收集**(不跑聚合命令)且忽略本次会话其它工作内容;图片用 Read 视觉理解提取图中文字信息,md/txt 直接读文本,docx/pdf 优先尝试 pandoc 转文本(无 pandoc 则请用户粘贴文字);用户是开发且内容提到代码相关工作时,可仍收集提交记录用于补量化数据
|
|
29
31
|
- **三段归类**(用户文字没按段写明时用信号词归类):
|
|
30
32
|
- 含"明天/明日/接下来/计划/准备/打算/将要/待办" → 明日计划
|
|
31
33
|
- 含"风险/阻塞/问题/卡住/困难/待定/依赖/遗留" → 风险阻塞点
|
|
@@ -33,9 +35,9 @@
|
|
|
33
35
|
- 用户已明确分段("今日完成:A;明日计划:B;风险:C")→ 按用户分段,不猜
|
|
34
36
|
- **拆条**:按语义主题拆分,一个主题一条;拆分信号:时间词(上午/下午/晚上)、连接词(还有/另外/以及)、分号顿号列举、数字列举(1、2、3)、换行/段落边界
|
|
35
37
|
- **润色**:口语整理为规范任务描述(动词开头、说清对象与结果),每点 20-40 字
|
|
36
|
-
- **量化数据**:无
|
|
38
|
+
- **量化数据**:无 提交记录 → 不写文件数/行数/提交次数;格式退化为「1、任务描述 - 进度XX% - 用时XH」
|
|
37
39
|
- **进度与用时**:文字没给进度时,完成任务默认 100%、计划默认 0%;用时/预估用时仅在用户文字给出时才写,没给就省略(不瞎编估算值)
|
|
38
|
-
-
|
|
40
|
+
- **风险阻塞点**:素材没给影响/建议时只列描述;素材含影响/建议/责任时间时按四环结构写全
|
|
39
41
|
- **日期/落盘/HTML**:与常规流程一致(默认今天、md/txt/html 三文件 + 内容区截图落盘、html 自动打开)
|
|
40
42
|
|
|
41
43
|
## 输出格式
|
|
@@ -49,33 +51,35 @@
|
|
|
49
51
|
1、任务描述(量化数据:文件数/行数/提交次数)- 进度XX% - 用时XH
|
|
50
52
|
|
|
51
53
|
## 明日计划
|
|
52
|
-
1、任务描述 - 进度XX% - 预估用时XH
|
|
54
|
+
1、任务描述 - 完成标准:XX(时间点)- 进度XX% - 预估用时XH
|
|
53
55
|
|
|
54
56
|
## 风险阻塞点
|
|
55
|
-
-
|
|
57
|
+
- 问题描述;影响:xxx;建议:xxx;责任与时间:xxx(谁/何时,口述有时必写)
|
|
56
58
|
```
|
|
57
59
|
|
|
58
60
|
## 规则
|
|
59
61
|
|
|
60
62
|
- 任务进度 3-6 点,每点 20-40 字;序号用中文顿号(1、2、)
|
|
61
63
|
- 聚合后任务数超上限(6 点)时,同类小任务合并压缩到上限内;用户说「精简点/太长了」→ 条目数取下限、每点压缩到 20 字左右;说「详细点」→ 条目数取上限、每点写足 40 字
|
|
62
|
-
- 三段兜底:任务进度默认 100%;任务进度/明日计划/风险阻塞点无任何内容时该段写「暂无」(默认聚合时明日计划无
|
|
63
|
-
-
|
|
64
|
-
-
|
|
64
|
+
- 三段兜底:任务进度默认 100%;任务进度/明日计划/风险阻塞点无任何内容时该段写「暂无」(默认聚合时明日计划无 提交来源,用户没给计划就写「暂无」)
|
|
65
|
+
- 计划每点带进度百分比与预估用时;用户口述/文字给出完成标准时(如「周五前出唤醒效率对比」),必写「完成标准:XX(时间点)」,未给出则省略
|
|
66
|
+
- 风险阻塞点四环结构:问题+影响+建议+责任与时间,不写进度用时;第四环「责任与时间(谁/何时)」取自用户口述,未提供时省略
|
|
65
67
|
- 用时单位:XH(小时),估算值注明"约"
|
|
66
|
-
- 文字风格约束:①明日计划用计划态陈述句,动词取「推进/启动/开展/跟进/梳理/筹备/验证/排查/联调」等计划态词,禁用完成态词(完成/搞定/已实现/做完),可带「计划/预计/拟」字样(不必每条都有),句式「动词+对象+目标范围」(如「推进底部导航重构,完成主流程交互调整」),禁祈使句(「去做 xx」)与口语(「把 xx
|
|
68
|
+
- 文字风格约束:①明日计划用计划态陈述句,动词取「推进/启动/开展/跟进/梳理/筹备/验证/排查/联调」等计划态词,禁用完成态词(完成/搞定/已实现/做完),可带「计划/预计/拟」字样(不必每条都有),句式「动词+对象+目标范围」(如「推进底部导航重构,完成主流程交互调整」),禁祈使句(「去做 xx」)与口语(「把 xx 弄一下/搞搞」);②完成任务用动词开头的完成态陈述句(完成/修复/优化/重构/开发/实现/接入/升级/排查/联调/上线),说清对象与结果(如「完成底部导航重构」);③风险阻塞点四环结构:问题+影响+建议+责任与时间(问题客观陈述、影响说明后果、建议给出可执行对策、责任与时间来自口述缺省省略),不写抱怨与情绪话;④任务流水与清单条目保持无主语(动词开头);结论、判断、归因处允许第一人称「我」(「我主导了 XX 联调」「我判断风险可控」「我推动 XX 落地」),团队协作成果用「我们」;不用口语语气词(啦/啊/吧/哈/哦/呢)、不用 emoji、不用口语形容词(差不多/还行/基本上/搞不定/一堆);用户口述/补充的口语内容一律先润色为规范书面语再写入(「上午改了角标接口」→「完成角标接口改造」),量化数据(文件数/行数/进度/用时)格式不变
|
|
69
|
+
- 技术动作翻译:用户口述技术动作且带结果数据时,翻译为业务结果表述(「重写 SQL 加索引」→「查询响应 3.2s→0.4s」);仅含动作无结果时保留动作描述,并在对话中提示可补充结果指标
|
|
70
|
+
- 落笔前五问自检:①第一句是不是结论?②数字有没有对比基准?③卡点有没有责任动作和时间?④计划能不能被验证?⑤个人贡献与团队成果的归属是否清晰?任一不过,改写后再输出
|
|
67
71
|
- 报告标题下输出生成时间,精确到时分秒(YYYY-MM-DD HH:MM:SS)
|
|
68
72
|
- 生成报告时,对话中先输出简要「使用提示」(几条速览 + 完整说明引用)再输出报告正文,固定条目:
|
|
69
73
|
- 默认生成今天;「昨天的日报 / 上周三的日报 / 10月20号的日报」指定日期
|
|
70
74
|
- 「补充一下:xxx」追加任务(「明日计划:/风险:」分段词自动归段);贴文字/发图片/给文件「整理成日报」默认直接生成,说「先看看效果」→ 确认后再落盘
|
|
71
|
-
-
|
|
75
|
+
- 默认多源聚合:提交记录(有仓库时)+ 本次会话已提的工作内容,没有提交记录则以口述/文字为准;说「只整理这段文字」→ 仅用该文字
|
|
72
76
|
- 「写到桌面 / 不落盘 / 只要 md / 只要截图 / 这次不截图 / 别开浏览器 / 保留之前的」临时控制落盘;「这次按 xxx 模板来」临时换模板
|
|
73
77
|
- 生成完成后在对话中告知本次落盘的文件完整路径清单(目录 + 各文件名,Windows 用反斜杠)
|
|
74
78
|
- 默认配置长期生效:改 skill 文件顶部「默认配置」节(DISK/FORMATS/DIR/OPEN_HTML/TEMPLATE/CONFIRM)
|
|
75
79
|
- 📖 完整使用说明:问「日报怎么用」
|
|
76
|
-
-
|
|
77
|
-
- 目录名 = 目标日期(解析出的报告日期),不是生成时刻:整理"昨天的日报"
|
|
78
|
-
- 纯文字整理模式:用户贴一段文字/发图片/给文件说"整理成日报/只按这段"时跳过
|
|
80
|
+
- 默认聚合来源:提交记录(有仓库时)+ 本次会话中用户已提及/口述的工作内容全部合并去重(没有提交记录 或非代码工作以口述/文字为主);仅当用户明确说"只整理这段文字/只按这段"时,才只用指定文字、忽略其它来源
|
|
81
|
+
- 目录名 = 目标日期(解析出的报告日期),不是生成时刻:整理"昨天的日报"时目录用昨天日期、提交记录收集范围也是昨天;标题中的 YYYYMMDD 同为该目标日期
|
|
82
|
+
- 纯文字整理模式:用户贴一段文字/发图片/给文件说"整理成日报/只按这段"时跳过 提交记录收集与会话上下文,内容为主源(图片 Read 视觉提取、md/txt 直接读、docx/pdf 优先 pandoc 转文本);按信号词自动三段归类(用户已分段则按用户分段);无量化数据不写文件数/行数,进度默认完成 100%/计划 0%,用时用户没给就省略;CONFIRM: never 默认直接生成落盘不确认,CONFIRM: text/always 或用户说"先看看效果"时先出整理效果、用户说"可以/确认/落盘"后再落盘,说"改一下 xxx"按意见修改后重新确认,说"不用确认/直接落盘"跳过确认(CONFIRM 配置控制,临时口头要求优先)
|
|
79
83
|
- 模板优先级:用户临时口头指定的模板 > 顶部 TEMPLATE 配置(custom 用「📝 自定义模板」节结构,default 用内置三段式);自定义模板只改段名/段数/条目格式,其余规范(中文顿号序号、生成时间、落盘、HTML 样式)不变
|
|
80
84
|
- 日期优先按自然语言解析(如"昨天的日报"、"上周三的日报");显式参数 `/daily-report [YYYYMMDD] [md|txt|html]` 等价于自然语言,日期缺省为今天
|
|
81
85
|
- 跨系统兼容:执行时先检测当前系统(macOS/Windows),所有路径、命令、浏览器均按系统分支取值(DIR auto→DIR_MAC/DIR_WIN、仓库表对应路径列、Chrome/Edge 路径、open/Start-Process、桌面/回退目录);禁止假设单一系统
|