skill-forge-hub 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -26,15 +26,15 @@
26
26
  | daily-report | 报表汇演 | [daily-report/](daily-report/) | 聚合各仓库 git 提交 + 会话口述生成日报(今日完成任务/明日计划/风险阻塞点),支持自然语言日期(今天/昨天/上周三/10月20号)、连续多日批量、纯文字/图片/文件整理、自定义模板、12 行业词条 |
27
27
  | weekly-report | 报表汇演 | [weekly-report/](weekly-report/) | 同上生成周报(本周完成任务/下周计划/风险阻塞点 + 本周概览卡),周结束日可配置(默认周五,可改周日等),支持自然语言周定位(本周/上周/10月第2周/节假日锚定) |
28
28
  | article-to-html | 文档装裱 | [article-to-html/](article-to-html/) | Word / Markdown / 纯文本 → 精美独立 HTML(思源黑体 + Roboto 商用免费字体,图表 HTML/CSS 重绘),逐章截图(Retina 2x);现成 HTML 可直接截图或先美化 |
29
- | spec-doc2spec | 工程提效 | [spec-doc2spec/](spec-doc2spec/) | PRD / Word 文档导入为迭代需求切片,需配合 SpecCore CLI 使用 |
30
- | spec-spec2doc | 工程提效 | [spec-spec2doc/](spec-spec2doc/) | 迭代 / Task 规格导出为 Word / PDF 文档,需配合 SpecCore CLI 使用 |
29
+ | spec-doc2spec | 工程提效 | [spec-doc2spec/](spec-doc2spec/) | Word / Markdown 需求文档转结构化需求切片;自动检测 Pandoc,未装引导跨系统安装 |
30
+ | spec-spec2doc | 工程提效 | [spec-spec2doc/](spec-spec2doc/) | Markdown 规格导出为 Word / PDF 交付文档;自动检测 Pandoc,未装引导跨系统安装 |
31
31
 
32
32
  ## 安装
33
33
 
34
34
  ### 方式一:npm 全局安装(推荐)
35
35
 
36
36
  ```bash
37
- npm i -g skill-forge-cli
37
+ npm i -g skill-forge-hub
38
38
  skill-forge ls # 列出全部技能与说明(只读)
39
39
  skill-forge init # 交互式挑选技能,自动探测并安装到 AI 助手技能目录
40
40
  ```
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: annual-report
3
+ description: 生成年度总结(默认五段式:年度概览/核心成果与里程碑/经验与成长/不足与反思/新年展望与规划),适配各行业(内置 12 行业职业词典,可指定角色身份)。数据来源灵活:各仓库 git 全年提交聚合、纯文字、图片或文件整理,无 git 也适用。支持自定义模板(可永久或临时指定)。支持自然语言指定年度(2026年/去年/近一年/最近12个月等)。当用户请求写年度总结、年终总结、年度复盘、年总结、/annual-report,或询问年度总结用法(年度总结怎么用/年度总结使用说明)时使用。
4
+ allowed-tools: Bash, Read, Write
5
+ disable-model-invocation: false
6
+ ---
7
+
8
+ # 年度总结生成
9
+
10
+ 聚合各仓库 git 全年提交 + 本次会话口述内容生成五段式年度总结(年度概览/核心成果与里程碑/经验与成长/不足与反思/新年展望与规划),对话输出 md 正文 + 落盘 md/txt/html/content-png 并自动打开 html。
11
+
12
+ ## 生成流程
13
+
14
+ 0. **读用户配置**(DISK/FORMATS/DIR/OPEN_HTML/TEMPLATE/ROLE/CONFIRM、自定义模板)→ 先 Read 同目录 `user-config.md`
15
+ 1. **解析年度**(自然语言 → 目标年度区间)→ 读 `resources/date-parsing.md`
16
+ 2. **收集数据**(git 全年提交聚合 + 会话口述 + 口头补充,合并去重)→ 读 `resources/data-collection.md`
17
+ 3. **内容归类与润色**(五段式结构 / 聚合来源 / 纯文字模式 / 输出格式 / 写作风格)→ 读 `resources/content-rules.md`
18
+ 4. **行业词条**(话术含职业词时按词典取词)→ 读 `resources/industry-dictionary.md`
19
+ 5. **落盘与截图**(md/txt/html/content-png + 自动打开 html)→ 读 `resources/disk-and-html.md`
20
+ 6. **使用咨询**(用户只问「年度总结怎么用」等用法、未要求生成)→ 读 `resources/usage-guide.md`,将其内容原样输出(首行标题改为「年度总结生成器使用指南」),不收集 git、不生成报告、不落盘、不开浏览器
21
+
22
+ ## ⚙️ 配置与自定义模板
23
+
24
+ **执行本 skill 前必须先 Read 同目录 `user-config.md`**:默认配置(DISK/FORMATS/DIR/OPEN_HTML/TEMPLATE/ROLE/CONFIRM)与自定义模板都在该文件中,以它为准。升级技能时 user-config.md 不会被覆盖,你的修改永久保留。
25
+
26
+ ## 规则速览
27
+
28
+ - 五段式骨架行业无关:年度概览(一句话 TL;DR + 3-6 项核心数据卡)/ 核心成果与里程碑(按季度 Q1-Q4 时间线 8-12 项,每项 20-40 字)/ 经验与成长(3-5 条)/ 不足与反思(2-4 条三环:问题+影响+改进)/ 新年展望与规划(3-5 项目标,各带量化指标与分季度行动节点)
29
+ - 中文顿号序号(1、2、3);段内无内容写「暂无」;量化优先,杜绝空话套话
30
+ - 行业术语/指标/里程碑主题/风险话术按 `resources/industry-dictionary.md` 职业词典取词(未提职业按 ROLE 画像)
31
+ - 完整规则(聚合来源 / 纯文字模式 / 写作风格约束 / 使用提示)见 `resources/content-rules.md`
@@ -0,0 +1,40 @@
1
+ # 内容规则(五段式)
2
+
3
+ 五段式骨架行业无关(任何职业通用),术语与指标由职业词典适配。
4
+
5
+ ## 段结构
6
+
7
+ **段一 年度概览**
8
+ - 一句话 TL;DR:全年工作的总体判断(如「交付密集的一年:全年完成 3 个版本迭代,代码库净增 4.2 万行」)
9
+ - 核心数据卡 3-6 项:年度最关键的量化指标(按职业词典),每项:数字 + 单位 + 标签
10
+ - 可带同比小字(「较去年:+18%」)
11
+
12
+ **段二 核心成果与里程碑**
13
+ - 按季度(Q1/Q2/Q3/Q4)时间线排列 8-12 项,每项:成果描述 20-40 字 + 所属季度 + 量化结果
14
+ - 里程碑事件优先(版本发布/项目上线/重大交付),日常任务不逐条列
15
+ - 未过完的季度(如写到 Q4 中途)注明「截至当前」
16
+
17
+ **段三 经验与成长**
18
+ - 3-5 条,每条一句话:沉淀的方法/技能/认知(「沉淀了 XX 方法」「掌握了 XX」)
19
+ - 强调可复用(对未来有用的才写),不写「完成了 XX」这类成果句(归段二)
20
+
21
+ **段四 不足与反思**
22
+ - 2-4 条三环结构:问题(是什么)+ 影响(导致什么)+ 改进(明年怎么改)
23
+ - 具体诚实,不写「还需努力」这类空话;无真实不足才写「暂无」
24
+
25
+ **段五 新年展望与规划**
26
+ - 年度目标 3-5 项:目标描述 + 可量化指标(「完成 XX,年底达到 XX」)
27
+ - 每项目标带分季度行动节点(Q1 起…Q2 完成…)
28
+ - 目标与段四不足的改进方向呼应
29
+
30
+ ## 写作风格
31
+
32
+ - 中文顿号序号(1、2、3),段内条目数按上述区间;不足处写「暂无」
33
+ - 量化优先:能带数字的带数字,估算值注明「约」
34
+ - 语言朴素具体,杜绝「再接再厉/砥砺前行」等套话;全年视角有判断、有取舍,不是流水账
35
+ - md/txt 正文含生成时间行(精确到时分秒,如 2026-11-06 19:10:38)
36
+
37
+ ## 聚合来源与纯文字模式
38
+
39
+ - git 聚合来源(提交统计/里程碑)与口述来源(大事/感悟)合并后按段归类;两者矛盾时量化以 git 为准
40
+ - 纯文字/图片/文件整理模式(无 git):用户提供什么用什么,按五段结构归类;素材不足的段写「暂无」并提示用户可补充素材
@@ -0,0 +1,25 @@
1
+ # 数据收集(年度)
2
+
3
+ 三种来源合并去重:git 全年聚合为主、口述与文件为辅;无 git 也适用(纯文字/图片/文件整理)。
4
+
5
+ ## 1. git 全年聚合(有仓库时)
6
+
7
+ - 遍历仓库清单(见 disk-and-html.md 的仓库清单节),对每仓执行全年统计:
8
+ - 总提交数:`git log --since={区间起} --until={区间止} --oneline | wc -l`
9
+ - 增删行数:`git log --since=... --until=... --numstat --pretty=tformat: | awk` 汇总 add/del
10
+ - **先剔除生成物路径**(.speccore/code-graph/、node_modules、dist、*.lock 等,用 grep -vE 按制表符+路径过滤),否则 graph.json 之类单文件可贡献数十万行噪音
11
+ - 月度分布:`git log --since=... --until=... --format='%ad' --date=format:'%Y-%m' | sort | uniq -c`(12 个月柱图数据)
12
+ - 里程碑:`git tag` / `git log --merges --oneline` 提取版本发布与重要合并,读 tag 信息取版本号与日期
13
+ - 仓库按系统取有效路径(macOS / Windows 双列表,空列跳过)
14
+
15
+ ## 2. 会话口述与文字材料
16
+
17
+ - 用户口述的年度大事(「年初做了 X」「Q3 上了 Y」)逐条记录
18
+ - 用户提供的总结草稿/文档(md/txt/docx)Read 提取要点;图片逐张 Read 识别内容
19
+ - 聊天记录/周报/日报文件也可作为素材
20
+
21
+ ## 3. 合并去重与口径
22
+
23
+ - 同一成果 git 数据与口述重合时合并为一条,量化以 git 统计为准、定性以口述为准
24
+ - 无法量化的条目写定性描述,不编造数字
25
+ - 年度核心指标(概览卡数据)优先取:总提交数/年度增删行数/里程碑数(研发),其它行业按职业词典量化指标
@@ -0,0 +1,18 @@
1
+ # 年度解析
2
+
3
+ 把自然语言定位到目标年度区间。年度区间决定 git 统计范围与目录/文件名。
4
+
5
+ ## 定位规则
6
+
7
+ | 用户说法 | 目标年度 | 区间 |
8
+ |:---|:---|:---|
9
+ | 2026年 / 今年 / 写个年度总结(未指定)| 当前自然年(如 2026)| 01-01 ~ 12-31(未过完则到「今天」)|
10
+ | 去年 / 2025年 | 上一自然年 | 01-01 ~ 12-31 |
11
+ | 近一年 / 最近12个月 / 近 12 个月 | 滚动 12 个月 | 今天 - 12 个月 ~ 今天 |
12
+ | 2026 财年 | 财年(可追问起止月,如 3 月~次年 2 月;不追问则按自然年处理并注明)| 按起止月 |
13
+
14
+ - 「今年」以当前系统日期为准(11 月写年度总结 → 区间 01-01 ~ 今天,标题注明「截至 2026-11」)
15
+ - 目录:`{DIR}/annual-{YYYY}/`(滚动 12 个月用起始年,如 2025-11~2026-11 → annual-2025,目录内文件名仍按目标年度)
16
+ - 文件名:`annual-report-{YYYY}.md/.txt/.html`、截图 `annual-report-{YYYY}-content.png`
17
+ - 同名目录已存在时直接复用(不重建、不清空),仅覆盖 FORMATS 清单内的同名文件;目录内其它文件一律保留不动
18
+ - 同一份年度总结重复生成默认直接覆盖;用户说「保留之前的/另存/不覆盖」时文件名追加时间戳(如 `annual-report-2026-1530.html`)
@@ -0,0 +1,28 @@
1
+ # 落盘与 HTML(年度版式)
2
+
3
+ ## 落盘
4
+
5
+ - FORMATS 默认 [md, txt, html, content-png]:md/txt/html 文件名 `annual-report-YYYY.<格式>`、截图 `annual-report-YYYY-content.png`;txt 为纯文本版;DISK: false 时全部不落盘
6
+ - 目录:`{DIR}/annual-YYYY/`(DIR 按系统取 DIR_MAC/DIR_WIN,不存在回退用户主目录下 reports);目录已存在直接复用,只覆盖本清单内同名文件;目录内存在非本 skill 命名的其它文件时对话中提示用户「该目录内已有其它文件,本次年度总结已与它们并列存放,未做任何改动」
7
+ - 对话中照常输出 md 正文(不受 FORMATS 影响);OPEN_HTML: true 且落盘了 html 时自动打开浏览器(macOS:open <html文件>;Windows PowerShell:Start-Process <html文件>)
8
+ - FORMATS 含 content-png 时生成内容区截图:只截五张分节卡片整体(年度概览/核心成果与里程碑/经验与成长/不足与反思/新年展望与规划,不含头部标题区/复制按钮/页脚,四周保留对称合适的外边距约 40px 留白);html 内置 `?shot=content` 参数(页面 JS 检测后隐藏 header-card/copy-wrap/footer、body 四周 padding 统一 40px,正常浏览不受影响);用 Chrome headless 访问带参 URL 截图(路径按系统选:macOS=`/Applications/Google Chrome.app/Contents/MacOS/Google Chrome`;Windows 按序探测 `C:\Program Files\Google\Chrome\Application\chrome.exe` → `C:\Program Files (x86)\Google\Chrome\Application\chrome.exe` → `%LOCALAPPDATA%\Google\Chrome\Application\chrome.exe`,经 node child_process 执行 `--headless --disable-gpu --no-sandbox --hide-scrollbars --user-data-dir=<临时目录> --screenshot=<png路径> --window-size=760,<估算高度> --virtual-time-budget=4000 "file:///<html路径>?shot=content"`(Windows 下 URL 写作 file:///C:/...,用 node url.pathToFileURL 生成),跑完删除临时目录;禁止用 `--headless=new`(单例模式会静默失败生成占位图);若 Chrome 不存在则换 Edge(macOS=`/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge`;Windows=`C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe` → `C:\Program Files\Microsoft\Edge\Application\msedge.exe`),都找不到时跳过截图并在对话注明);高度按内容区估算(body 上下留白~80 + 概览节(标题45+数据卡~90+45) + 里程碑节(标题45+条目数×~65+40) + 成长节/反思节/展望节(各45+条目数×~70+40) + 各卡片 margin-bottom 18 + 余量~15,底部留白仅 body 下 padding 40px、与顶部对称),截图后用 Read 校验:五张卡片整体完整在图内、无头部/按钮/页脚残留、四周留白对称合适、不截断;底部留白过大减高度、截断加高度重截
9
+
10
+ ## HTML 年度版式(深蓝面板体系,与日报/周报同源)
11
+
12
+ - 复用日报/周报深蓝面板视觉体系:背景 #0a1929 + SVG feTurbulence 微噪点(opacity .04)+ 三层科技底纹(.grid-pattern 60px 青色细网格 rgba(0,240,255,.03) + .stars 8 个 1-1.5px 星点白/青/紫/绿散落 + .scanlines 2px 周期扫描线 rgba(0,240,255,.015));禁用任何 CDN 与外部网络引用(@import、外链 CSS/JS/图片/网络字体一律禁止,页面必须公司内网离线双击可打开、零外部依赖);字体全用系统本地字体栈 ui-monospace/'SF Mono'/SFMono-Regular/Menlo/Consolas;颜色全部用 CSS 变量统一色板(--cyan #0ea5e9、--bg #0a1929、--card #0b1e37、--border rgba(14,165,233,.15)、--text #bae6fd、--muted #5b7fa5、--green #14b8a6、--orange #f97316、--purple #6366f1、--rose #f43f5e)
13
+ - 头部卡片:标题「YYYY 年度总结」+ 副标题(ROLE 画像或年度区间)+ 生成时间行;speccore ask 同款发光特效:四边 1px 青色浮光线 transparent→var(--cyan)→transparent 整条平移扫动(上 scanX 左→右、右 scanY 上→下、下 scanX-rev 右→左、左 scanY-rev 下→上,四线同周期 3s linear 单向平移,亮段完整穿越卡片后消失于两端界外,卡片 overflow:hidden 裁剪;禁止自创 background-position 滚动/常驻辉光/往返摆动/亮段半嵌常驻变体)+ 顶部光斑 cardGlow(radial-gradient ellipse at 50% 10% rgba(14,165,233,.25)→transparent 70%,opacity .5→1 + scale 1→1.6,transform-origin top center,3s 循环,头部与每张分节卡片内均放 .card-glow 层)+ 标题文字青色光晕呼吸(text-shadow 双圈 3s 循环)
14
+ - 五张分节卡片(实心深蓝底 #0b1e37 + 8px 周期细密水平条纹 + 上下边缘 1px 微亮描边 #0f3350 + 圆角 6px + overflow:hidden + 保留阴影与 inset 内发光),左侧 8px 宽节色竖线贯穿整卡(box-shadow 0 0 12px 同色 30% 光晕),内容 padding-left 24px;节色:概览亮蓝 linear-gradient(180deg,#38bdf8,#0ea5e9) / 成果青绿 linear-gradient(180deg,#5eead4,#14b8a6) / 成长紫 linear-gradient(180deg,#a5b4fc,#6366f1) / 反思玫红 linear-gradient(180deg,#fda4af,#e11d48) / 展望橙 linear-gradient(180deg,#fdba74,#f97316);节标题 18px 同色渐变 SVG 语义图标(概览=仪表盘、成果=奖杯、成长=上升箭头、反思=三角警示、展望=日历)+ 文字微光晕(h2 flex gap 10px,标题色=节色亮端,同色双圈发光字 3s 呼吸 secGlow 动画,仅节标题文字发光,SVG 图标不加)
15
+ - 概览节:一句话 TL;DR 引言行 + 核心数据卡 3-6 张横排(.stat-card flex 均分:大数字 28px 渐变字 + 12px muted 标签 + 11.5px 同比小字「较去年:+18%」,上涨 --green 绿、下跌 --rose 红;数据卡左侧小色条同概览节色)
16
+ - 里程碑节:纵向时间线(.timeline 左侧 2px 青色竖线 + 季度节点:Q1/Q2/Q3/Q4 圆形节点(节色渐变球 + 光晕,当前季度节点加呼吸动画)+ 右侧内容(成果描述 15px + 量化小字 12px 青灰 + 季度徽章 11px muted 胶囊);季度内多条共用季度节点,条目间青色虚线分隔)
17
+ - 成长节/反思节:条目沿用 3D 立体圆球序号徽章(28px 白字,径向渐变球面(受光点 circle at 30% 28%,浅亮→主色→深色)+ inset 右下内暗影 + ::before 左上椭圆高光点 + 底部投影与同色光晕;成长紫、反思玫红);反思条三环展开:问题主行 + 影响行 12px 青灰「影响:xxx」+ 改进行 12px 青色「改进:」加粗前缀
18
+ - 展望节:目标条目卡(目标描述 15px + 量化指标加粗 + 分季度行动节点小胶囊 11px(Q1 起…/Q2 完成…,muted 字 + 青色细边 rgba(14,165,233,.18) + 淡青底))
19
+ - 年度提交月度柱图(研发词条;其它词条按职业词典图表主题):.cb-col 12 根柱一月到十二月、.cb-bar width:24px 柱宽(太小显细弱)、柱高按当月提交数、position:relative 柱上带 .cb-tip hover 浮层「X月 · N 次提交」;置于里程碑节内时间线之后
20
+ - 青色渐变 40px 大胶囊「一键复制」按钮(var(--cyan)→#0284c7,30px 青色光晕,hover 45px 光晕上浮;flex 居中布局,内置 16px 内联 SVG 双矩形复制图标(白色 currentColor 描边、图标与文字 gap 8px、禁用 emoji 图标),复制成功后图标切对勾、文字变「已复制」);复制源必须用 txt 文件内容(含换行、无 #/##/> 等 Markdown 符号,严禁用 md 内容当复制源);JS 用 navigator.clipboard.writeText,失败回退隐藏 textarea + document.execCommand('copy')(兼容 file:// 打开)
21
+ - 入场动画:头部淡入下滑、五张卡片依次错峰上浮淡入(概览 0.13s/成果 0.26s/成长 0.4s/反思 0.54s/展望 0.68s)、按钮弹入;卡片入场动画 fadeDown/fadeUp/riseIn 的 fill-mode 必须用 backwards 严禁 both(both 使动画结束后最后一帧 transform:none 永久覆盖 hover 的 3D 偏转 transform,hover 偏转会完全失效)
22
+ - hover 微交互:卡片上浮 translateY(-2px) + 阴影加深 + inset 发光增强、条目淡青底 rgba(14,165,233,.06)、时间线节点放大微旋、数据卡上浮、按钮上浮/按压回缩
23
+ - 卡片级 3D 微倾斜(严禁全页级 mousemove 倾斜):每张卡片 hover 时仅该卡片随鼠标偏转(perspective(900px) + rotateY(calc(var(--mx,0)*2.5deg)) rotateX(calc(var(--my,0)*-2.5deg)) ±1.25° 极轻微,与 hover 上浮合并写同一条 transform 严禁拆两条相互覆盖);JS 对每张卡片监听 mousemove 计算卡内相对位置((clientX-rect.left)/rect.width*2-1 归一化 -1~1)只更新该卡 --mx/--my,mouseleave 归零回正,transition transform .18s 平滑;移动端无 mousemove 保持 0 不倾斜
24
+ - CRT 扫描光带(.scanband position:fixed、left:0/right:0、height:150px、linear-gradient(180deg,transparent,rgba(0,240,255,.03) 50%,transparent)、animation:scanMove 11s linear infinite(top -22%→112%)、pointer-events:none、z-index:998,置于 scanlines 之下一层)
25
+ - 禁止写 @media (prefers-reduced-motion: reduce) 禁用动画的媒体查询块(用户系统开启减少动画时该块会禁用全部动效)
26
+ - 页面 JS 需支持 `?shot=content` 参数(检测 location.search 含 shot=content 时给 header-card、copy-wrap、footer 设 display:none,body 四周 padding 统一 40px,供主体内容整体截图用、保证截图四周留白对称合适)
27
+ - 页脚 10px muted 文字(无分隔线、不加边框),署名固定 GENERATED BY SPECCORE TEAM · <年度>(动态跟随目标年度,如 GENERATED BY SPECCORE TEAM · 2026)
28
+ - 五段分节列表,条目保持中文顿号序号;md/txt 版同条目依次写,文本格式不变
@@ -0,0 +1,19 @@
1
+ # 行业适配(职业词典)
2
+
3
+ 报告骨架(五段式/TL;DR/核心数据卡/里程碑时间线/反思三环)行业无关,只有「行业变量」随职业切换。用户对话中声明职业即按词典取词(如「帮我写份销售年度总结」→ 销售词条);词典没有的行业走兜底。
4
+
5
+ | 变量 | 研发 | 销售 | 运营 | 产品 | HR | 财务 | 市场 | 客服 | 项目/PMO | 行政 | 法务 | 设计 |
6
+ |---|---|---|---|---|---|---|---|---|---|---|---|---|
7
+ | 标题 | 研发年度总结 | 销售年度总结 | 运营年度总结 | 产品年度总结 | 人事年度总结 | 财务年度总结 | 市场年度总结 | 客服年度总结 | 项目年度总结 | 行政年度总结 | 法务年度总结 | 设计年度总结 |
8
+ | 工作单元 | 提交/版本/PR | 拜访/商机/回款 | 活动/渠道/内容 | 需求/迭代/上线 | 招聘/培训/入离职 | 报表/对账/税务 | 投放/活动/线索 | 工单/会话/满意度 | 里程碑/需求变更/资源/评审 | 会务/采购/资产/证照 | 合同审核/诉讼/合规/知产 | UI稿/设计规范/走查/交付 |
9
+ | 量化指标 | 提交数·行数·版本数 | 拜访数·商机数·回款额 | 曝光·转化·GMV | 交付数·上线数 | 简历数·到面率·入职数 | 凭证数·回款·预算执行率 | 投放额·线索数·ROI | 工单量·解决率·满意度 | 里程碑达成数·任务完成数·变更数 | 会务场次·采购完成数·资产盘点数 | 合同审核数·案件进展·合规项数 | 页面稿数·规范组件数·走查问题数 |
10
+ | 里程碑 | 版本发布/架构升级 | 大客户签约/区域突破 | 爆款活动/渠道扩张 | 重大版本迭代/核心功能上线 | 组织变革/人才梯队建设 | 系统上线/审计通过 | 品牌战役/投放升级 | 服务体系搭建/满意度跃升 | 重点项目交付/流程建设 | 办公搬迁/年会/体系建设 | 重大案件胜诉/合规体系落地 | 设计系统/规范落地 |
11
+ | 风险话术 | 阻塞点/技术债 | 竞争/预算审批 | 资源/渠道效果 | 需求变更/排期 | 用人缺口 | 资金/合规 | 渠道成本 | 舆情/高峰 | 范围蔓延/资源冲突 | 供应商延期/预算超支 | 合规风险/诉讼时效 | 需求反复/排期挤压 |
12
+
13
+ - 用户角色画像:顶部「默认配置」的 ROLE 定义用户默认角色与主要工作内容(当前:全栈开发工程师(企业内技术开发));未提职业时按 ROLE 画像取词(当前等价研发词条:git 全年聚合 + 提交/版本术语 + 提交数/行数/版本数指标 + 版本发布/架构升级里程碑)
14
+ - 触发:话术含职业词(销售/运营/产品/HR/财务/市场/客服/项目/PMO/行政/法务/设计等)→ 标题、工作单元术语、量化指标、里程碑主题、风险话术全部按该词典词条生成
15
+ - 临时换角色:说「以 XX 的身份写年度总结」(如「以销售经理的身份写」)→ 当次按该角色词条生成,不改配置
16
+ - 永久换角色:说「以后默认用 XX 角色 / 我的职业是 XX / 我的主要工作是 XX」→ 更新顶部 ROLE 配置(永久生效);词典没有的角色按用户描述新增词条
17
+ - 声明+临时指标覆盖:说「这次指标看签约额和回款」→ 词条 + 临时指标(仅当次);说「以后都用这套指标」→ 固化进词典(永久)
18
+ - 兜底:词典外的行业(工地施工、医生值班等)→ 骨架 + 用户素材(文字/图片/文件)现场生成词条(工作单元/指标/里程碑从素材提取),本次生效;说「记住这个行业」→ 固化为新词条
19
+ - 行业/角色切换只换内容与指标,HTML 骨架/色板/动效/落盘规范全部不变;纯文字整理模式同样适用词典;优先级:临时角色声明 > 顶部 ROLE 配置 > 词典表
@@ -0,0 +1,26 @@
1
+ # 年度总结使用指南
2
+
3
+ ## 能干什么
4
+
5
+ 把一年的工作沉淀成五段式年度总结:年度概览(一句话 + 核心数据卡)/ 核心成果与里程碑(季度时间线)/ 经验与成长 / 不足与反思 / 新年展望与规划。适配各行业:内置 12 行业职业词典,报职业自动换术语与指标;不报职业按你的默认角色画像生成。
6
+
7
+ ## 三种使用方式
8
+
9
+ 1. **git 全年聚合**(有代码仓库):自动统计全年提交数、增删行数、月度分布、版本里程碑,结合你口述的大事生成
10
+ 2. **纯文字整理**:把年度大事、成果、感悟直接说给我或发文字
11
+ 3. **图片/文件整理**:发总结草稿、聊天记录、日报周报文件,我提取要点
12
+
13
+ 三者可混用,有 git 就用 git 数据,没有也能写。
14
+
15
+ ## 常用说法
16
+
17
+ - 「写个年度总结」/「2026 年年度总结」→ 当前年或指定年
18
+ - 「去年的年度总结」/「近一年的总结」→ 去年或滚动 12 个月
19
+ - 「以销售经理的身份写年度总结」→ 临时换职业词条
20
+ - 「以后默认用 XX 角色」→ 永久换默认角色
21
+ - 「只要 md」「别开浏览器」「写到桌面」→ 临时改落盘行为
22
+ - 「以后都用这个模板」→ 永久自定义模板
23
+
24
+ ## 输出
25
+
26
+ 对话直接出正文;默认落盘 annual-YYYY/ 目录下的 md/txt/html 三件 + 内容区截图,并自动打开 html(深蓝面板年度版式:发光头部、数据卡、季度时间线)。
@@ -0,0 +1,37 @@
1
+ # 用户配置(升级技能时本文件不会被覆盖)
2
+
3
+ > 你的个人配置全放在这里。skill-forge 升级技能时官方只更新 SKILL.md 与 resources/,
4
+ > 本文件始终保留你的版本——落盘目录、格式、角色画像、自定义模板放心改。
5
+
6
+
7
+ ## ⚙️ 默认配置(用户可手动修改;临时口头要求永远优先)
8
+
9
+ ```yaml
10
+ DISK: true # 是否落盘写文件;false = 默认只在对话输出,不写文件不开浏览器
11
+ FORMATS: [md, txt, html, content-png] # 落盘哪些格式(数组,可删减/增,如 [md, html] / [md, txt, html](不截图);content-png = 内容区截图(五张分节卡片整体,不含头部标题/复制按钮/页脚),删除该项即不截图;不影响对话中的 md 正文输出)
12
+ DIR: auto # 落盘根目录:auto = 按当前系统自动选 DIR_MAC / DIR_WIN(也可直接写死某个绝对路径)
13
+ DIR_MAC: /Users/luzhaosheng/MyWork/智慧食堂/reports # macOS 落盘根目录(自动按目标年度建子目录 annual-YYYY;目录不存在时回退用户主目录下 reports)
14
+ DIR_WIN: d:\Workspace_QCoder\reports # Windows 落盘根目录(自动按目标年度建子目录 annual-YYYY;目录/盘符不存在时回退用户主目录下 reports)
15
+ OPEN_HTML: true # 落盘后是否自动用浏览器打开 html(FORMATS 不含 html 时忽略)
16
+ TEMPLATE: default # 报告模板:default = 内置五段式(年度概览/核心成果与里程碑/经验与成长/不足与反思/新年展望与规划);custom = 使用下方「📝 自定义模板」节;口头临时指定模板仅当次生效
17
+ ROLE: 全栈开发工程师(企业内技术开发) # 用户默认职业角色与主要工作内容(两者并存:职业名 + 括号内工作内容,生成内容/术语/量化指标/里程碑/风险话术全部按此画像走);用户随口描述职业时(如「我搞装修的,天天跑工地」)→ AI 提炼为规范表述(装修项目经理(负责工地现场管理、施工进度与质量巡检))更新此处;说「以 XX 的身份写」→ 当次临时换角色不改配置;说「以后默认用 XX 角色 / 我的职业是 XX / 我的主要工作是 XX」→ 永久更新此处
18
+ CONFIRM: never # 落盘前确认:never = 直接生成落盘不确认(默认);text = 纯文字整理模式先出效果确认后再落盘;always = 任何方式生成都先确认;临时说「先看看效果」当次先确认、说「不用确认」当次跳过
19
+ ```
20
+
21
+ > 临时口头要求(仅对当次生效,不修改上方配置):说「不落盘/别写文件」→ 当次 DISK=false;说「写到桌面/存到 ~/report(macOS)或 D:\report(Windows)」→ 当次改用该 DIR;说「只要 md / 只出 html / 只要内容区截图」→ 当次只落指定格式;说「这次不截图」→ 当次不生成内容区截图;说「只要截图/重新截个图」→ 当次只对现有 html 执行内容区截图(不重新收集 git、不重写 md/txt/html 内容文件);说「别开浏览器」→ 当次 OPEN_HTML=false;说「这次按 xxx 模板来」→ 当次临时换模板(不改配置);说「以后都用这个模板」→ 自动写入下方「📝 自定义模板」节并把 TEMPLATE 改为 custom(永久生效);说「先看看效果/先出效果再落盘」→ 当次先出效果确认后再落盘;说「不用确认/直接落盘」→ 当次跳过确认直接落盘。
22
+
23
+ ## 📝 自定义模板(TEMPLATE: custom 时启用,用户可手改,适配各类岗位)
24
+
25
+ 把顶部 TEMPLATE 改为 custom 后,按下面结构生成报告(段名、段数、条目格式均可改):
26
+
27
+ ```text
28
+ 段一:年度工作概述(每条:概述 - 量化结果)
29
+ 段二:重点工作与成果(每条:成果描述 - 完成时间 - 影响)
30
+ 段三:经验与不足(每条:经验或不足 - 具体表现)
31
+ 段四:明年工作计划(每条:计划描述 - 预期目标)
32
+ ```
33
+
34
+ > 只写段结构与条目格式即可;未写明的细节(中文顿号序号、生成时间行、落盘行为、HTML 样式)沿用默认规范。
35
+
36
+ ---
37
+ > 更多用法见 SKILL.md 的「生成流程」与 resources/ 分册。
package/cli.js CHANGED
@@ -18,7 +18,7 @@ const VERSION = require(path.join(PKG_DIR, "package.json")).version;
18
18
 
19
19
  // 分类映射与 README「技能分类」表一致;新增技能时请同步
20
20
  const CATEGORIES = [
21
- { name: "报表汇演", en: "Reports", skills: ["daily-report", "weekly-report"] },
21
+ { name: "报表汇演", en: "Reports", skills: ["daily-report", "weekly-report", "annual-report"] },
22
22
  { name: "文档装裱", en: "Documents", skills: ["article-to-html"] },
23
23
  { name: "工程提效", en: "Engineering", skills: ["spec-doc2spec", "spec-spec2doc"] },
24
24
  ];
@@ -96,12 +96,28 @@ function shortDesc(desc, max = 70) {
96
96
  return first.length > max ? first.slice(0, max) + "…" : first;
97
97
  }
98
98
 
99
- function copyDir(src, dest) {
99
+ // 升级时保留的用户文件:内置名单(user-config.md)+ 技能目录 .preserve 清单(每行一个文件名,# 注释)
100
+ const BUILTIN_PRESERVE = new Set(["user-config.md"]);
101
+
102
+ function loadPreserveSet(skillDir) {
103
+ const set = new Set(BUILTIN_PRESERVE);
104
+ const pf = path.join(skillDir, ".preserve");
105
+ if (fs.existsSync(pf)) {
106
+ for (const line of fs.readFileSync(pf, "utf8").split(/\r?\n/)) {
107
+ const t = line.trim();
108
+ if (t && !t.startsWith("#")) set.add(t.toLowerCase());
109
+ }
110
+ }
111
+ return set;
112
+ }
113
+
114
+ function copyDir(src, dest, preserve, hits) {
100
115
  fs.mkdirSync(dest, { recursive: true });
101
116
  for (const entry of fs.readdirSync(src)) {
102
117
  const s = path.join(src, entry);
103
118
  const d = path.join(dest, entry);
104
- if (fs.statSync(s).isDirectory()) copyDir(s, d);
119
+ if (fs.statSync(s).isDirectory()) copyDir(s, d, preserve, hits);
120
+ else if (preserve.has(entry.toLowerCase()) && fs.existsSync(d)) hits.push(d);
105
121
  else fs.copyFileSync(s, d);
106
122
  }
107
123
  }
@@ -128,7 +144,7 @@ function cmdLs() {
128
144
  let idx = 0;
129
145
  const mapped = new Set(CATEGORIES.reduce((acc, c) => acc.concat(c.skills), []));
130
146
  for (const cat of CATEGORIES) {
131
- const list = skills.filter((s) => cat.skills.includes(s.name));
147
+ const list = cat.skills.map((n) => skills.find((s) => s.name === n)).filter(Boolean);
132
148
  if (list.length === 0) continue;
133
149
  console.log(`【${cat.name} ${cat.en}】`);
134
150
  for (const s of list) {
@@ -165,7 +181,7 @@ async function selectSkillsInteractive(skills) {
165
181
  const mapped = new Set(CATEGORIES.reduce((acc, c) => acc.concat(c.skills), []));
166
182
  let text = "\n可选技能(编号多选,逗号分隔;a=全选;q=退出):\n\n";
167
183
  for (const cat of CATEGORIES) {
168
- const list = skills.filter((s) => cat.skills.includes(s.name));
184
+ const list = cat.skills.map((n) => skills.find((s) => s.name === n)).filter(Boolean);
169
185
  if (list.length === 0) continue;
170
186
  text += `【${cat.name} ${cat.en}】\n`;
171
187
  for (const s of list) {
@@ -266,8 +282,14 @@ async function cmdInit(argv) {
266
282
  const src = path.join(PKG_DIR, s.dir);
267
283
  const dest = path.join(target, s.dir);
268
284
  const existed = fs.existsSync(dest);
269
- copyDir(src, dest);
270
- console.log(`${existed ? "已更新" : "已安装"}:${s.name} → ${dest}`);
285
+ const hits = [];
286
+ copyDir(src, dest, loadPreserveSet(src), hits);
287
+ let note = existed ? "已更新" : "已安装";
288
+ if (hits.length > 0) {
289
+ const names = hits.map((h) => path.basename(h)).join("、");
290
+ note += `(保留你的本地修改未覆盖:${names})`;
291
+ }
292
+ console.log(`${note}:${s.name} → ${dest}`);
271
293
  }
272
294
  console.log(`\n完成。共 ${chosen.length} 件技能。`);
273
295
  }
@@ -285,6 +307,8 @@ function printHelp() {
285
307
  skill-forge init --yes 跳过确认,直接安装
286
308
  skill-forge --version 显示版本
287
309
 
310
+ 升级保护:目标目录已存在的 user-config.md(及技能 .preserve 清单声明的文件)不会被覆盖,你的本地配置永久保留
311
+
288
312
  示例:
289
313
  skill-forge ls
290
314
  skill-forge init
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: daily-report
3
- description: 聚合各仓库 git 提交生成日报(默认完成任务/明日计划/风险阻塞点三段结构,中文顿号序号)。支持纯文字/图片/文件整理(无 git 也适用)、自定义模板(可永久或临时指定)。支持自然语言指定日期(今天/昨天/上周三/10月20号等)。当用户请求写日报、今日日报、昨天的日报、生成日报、/daily-report,或询问日报用法(日报怎么用/日报使用说明/日报有哪些使用方式)时使用。
3
+ description: 生成工作日报(默认完成任务/明日计划/风险阻塞点三段结构,中文顿号序号),适配各行业(内置 12 行业职业词典,可指定角色身份)。数据来源灵活:各仓库 git 提交聚合、纯文字、图片或文件整理,无 git 也适用。支持自定义模板(可永久或临时指定)。支持自然语言指定日期(今天/昨天/上周三/10月20号等)。当用户请求写日报、今日日报、昨天的日报、生成日报、/daily-report,或询问日报用法(日报怎么用/日报使用说明/日报有哪些使用方式)时使用。
4
4
  allowed-tools: Bash, Read, Write
5
5
  disable-model-invocation: false
6
6
  ---
@@ -11,6 +11,7 @@ disable-model-invocation: false
11
11
 
12
12
  ## 生成流程
13
13
 
14
+ 0. **读用户配置**(DISK/FORMATS/DIR/OPEN_HTML/TEMPLATE/ROLE/CONFIRM、自定义模板)→ 先 Read 同目录 `user-config.md`
14
15
  1. **解析日期**(自然语言 → 目标日期 YYYY-MM-DD)→ 读 `resources/date-parsing.md`
15
16
  2. **收集数据**(git 提交 + 会话口述 + 口头补充,合并去重)→ 读 `resources/data-collection.md`
16
17
  3. **内容归类与润色**(聚合来源 / 补充任务 / 纯文字模式 / 输出格式 / 写作风格)→ 读 `resources/content-rules.md`
@@ -18,33 +19,9 @@ disable-model-invocation: false
18
19
  5. **落盘与截图**(md/txt/html/content-png + 自动打开 html)→ 读 `resources/disk-and-html.md`
19
20
  6. **使用咨询**(用户只问「日报怎么用」等用法、未要求生成)→ 读 `resources/usage-guide.md`,将其内容原样输出(首行标题改为「日报生成器使用指南」),不收集 git、不生成报告、不落盘、不开浏览器
20
21
 
21
- ## ⚙️ 默认配置(用户可手动修改;临时口头要求永远优先)
22
+ ## ⚙️ 配置与自定义模板
22
23
 
23
- ```yaml
24
- DISK: true # 是否落盘写文件;false = 默认只在对话输出,不写文件不开浏览器
25
- FORMATS: [md, txt, html, content-png] # 落盘哪些格式(数组,可删减/增,如 [md, html] / [md, txt, html](不截图);content-png = 内容区截图(仅今日完成任务/明日计划/风险阻塞点三张卡片,不含头部标题/复制按钮/页脚),删除该项即不截图;不影响对话中的 md 正文输出)
26
- DIR: auto # 落盘根目录:auto = 按当前系统自动选 DIR_MAC / DIR_WIN(也可直接写死某个绝对路径)
27
- DIR_MAC: /Users/luzhaosheng/MyWork/智慧食堂/reports # macOS 落盘根目录(自动按目标日期建子目录;目录不存在时回退用户主目录下 reports)
28
- DIR_WIN: d:\Workspace_QCoder\reports # Windows 落盘根目录(自动按目标日期建子目录;目录/盘符不存在时回退用户主目录下 reports)
29
- OPEN_HTML: true # 落盘后是否自动用浏览器打开 html(FORMATS 不含 html 时忽略)
30
- TEMPLATE: default # 报告模板:default = 内置三段式(完成任务/明日计划/风险阻塞点);custom = 使用下方「📝 自定义模板」节;口头临时指定模板仅当次生效
31
- ROLE: 全栈开发工程师(企业内技术开发) # 用户默认职业角色与主要工作内容(两者并存:职业名 + 括号内工作内容,生成内容/术语/量化指标/节奏条/风险话术全部按此画像走);用户随口描述职业时(如「我搞装修的,天天跑工地」)→ AI 提炼为规范表述(装修项目经理(负责工地现场管理、施工进度与质量巡检))更新此处;说「以 XX 的身份写」→ 当次临时换角色不改配置;说「以后默认用 XX 角色 / 我的职业是 XX / 我的主要工作是 XX」→ 永久更新此处
32
- CONFIRM: never # 落盘前确认:never = 直接生成落盘不确认(默认);text = 纯文字整理模式先出效果确认后再落盘;always = 任何方式生成都先确认;临时说「先看看效果」当次先确认、说「不用确认」当次跳过
33
- ```
34
-
35
- > 临时口头要求(仅对当次生效,不修改上方配置):说「不落盘/别写文件」→ 当次 DISK=false;说「写到桌面/存到 ~/report(macOS)或 D:\report(Windows)」→ 当次改用该 DIR;说「只要 md / 只出 html / 只要内容区截图」→ 当次只落指定格式;说「这次不截图」→ 当次不生成内容区截图;说「只要截图/重新截个图」→ 当次只对现有 html 执行内容区截图(不重新收集 git、不重写 md/txt/html 内容文件);说「别开浏览器」→ 当次 OPEN_HTML=false;说「这次按 xxx 模板来」→ 当次临时换模板(不改配置);说「以后都用这个模板」→ 自动写入下方「📝 自定义模板」节并把 TEMPLATE 改为 custom(永久生效);说「先看看效果/先出效果再落盘」→ 当次先出效果确认后再落盘;说「不用确认/直接落盘」→ 当次跳过确认直接落盘。
36
-
37
- ## 📝 自定义模板(TEMPLATE: custom 时启用,用户可手改,适配各类岗位)
38
-
39
- 把顶部 TEMPLATE 改为 custom 后,按下面结构生成报告(段名、段数、条目格式均可改):
40
-
41
- ```text
42
- 段一:今日工作内容(每条:工作描述 - 完成情况)
43
- 段二:存在问题与困难(只列描述)
44
- 段三:明日工作计划(每条:计划描述 - 预计完成时间)
45
- ```
46
-
47
- > 只写段结构与条目格式即可;未写明的细节(中文顿号序号、生成时间行、落盘行为、HTML 样式)沿用默认规范。
24
+ **执行本 skill 前必须先 Read 同目录 `user-config.md`**:默认配置(DISK/FORMATS/DIR/OPEN_HTML/TEMPLATE/ROLE/CONFIRM)与自定义模板都在该文件中,以它为准。升级技能时 user-config.md 不会被覆盖,你的修改永久保留。
48
25
 
49
26
  ## 规则速览
50
27
 
@@ -5,8 +5,8 @@
5
5
  - 使用时用户临时指明位置(如"写到桌面"、"存到 ~/report(macOS)/ D:\report(Windows)",覆盖 DIR、仅当次生效):以用户指定位置为根目录,同样按日期分子目录;"桌面"映射:macOS=`~/Desktop`、Windows=`%USERPROFILE%\Desktop`;目录不存在自动创建
6
6
  - 每次生成落盘哪些文件读取顶部「默认配置」的 `FORMATS`(默认 md/txt/html/content-png 四个,md/txt/html 文件名 `daily-report-YYYYMMDD.<格式>`、截图文件名 `daily-report-YYYYMMDD-content.png`;txt 为纯文本版);`DISK: false` 时全部不落盘
7
7
  - 对话中照常输出 md 正文(不受 FORMATS 影响);`OPEN_HTML: true` 且本次落盘了 html 时,自动打开浏览器(macOS:`open <html文件>`;Windows PowerShell:`Start-Process <html文件>`)
8
- - FORMATS 含 content-png 时额外生成内容区截图 `daily-report-YYYYMMDD-content.png`:只截页面主体内容整体一张图(今日完成任务/明日计划/风险阻塞点三张卡片整体截出,不含头部标题区/复制按钮/页脚,图片四周保留对称合适的外边距约 40px 留白):html 内置 `?shot=content` 参数(页面 JS 检测后隐藏 header-card/copy-wrap/footer、body 四周 padding 统一 40px,只留三张卡片整体,正常浏览不受影响);用 Chrome headless 访问带参 URL 截图(路径按系统选:macOS=`/Applications/Google Chrome.app/Contents/MacOS/Google Chrome`;Windows 按序探测 `C:\Program Files\Google\Chrome\Application\chrome.exe` → `C:\Program Files (x86)\Google\Chrome\Application\chrome.exe` → `%LOCALAPPDATA%\Google\Chrome\Application\chrome.exe`,经 node child_process 执行 `--headless --disable-gpu --no-sandbox --hide-scrollbars --user-data-dir=<临时目录> --screenshot=<png路径> --window-size=760,<估算高度> --virtual-time-budget=4000 "file:///<html路径>?shot=content"`(Windows 下 URL 写作 file:///C:/...,用 node url.pathToFileURL 生成),跑完删除临时目录;禁止用 `--headless=new`(单例模式会静默失败生成占位图);若 Chrome 不存在则换 Edge(macOS=`/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge`;Windows=`C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe` → `C:\Program Files\Microsoft\Edge\Application\msedge.exe`),都找不到时跳过截图并在对话注明);高度按内容区估算(body 上下留白~80 + 每节卡片(45+条目数×70+40,含各卡片 margin-bottom 18) + 余量~15,底部留白仅 body 下 padding 40px、与顶部对称,余量只防截断不可多给),截图后用 Read 校验:三张卡片整体完整在图内、无头部/按钮/页脚残留、四周留白对称合适、不截断,底部留白过大则减高度、截断则加高度重截
9
- - md/txt/html 均含生成时间行,精确到时分秒(如 2026-10-22 19:10:38);HTML 采用参考图式深蓝面板风格 + ask 同款发光动效的融合样式(不换其它色系,颜色全部用 CSS 变量统一 ask 色板:--cyan #0ea5e9、--bg #0a1929、--card #0b1e37、--border rgba(14,165,233,.15)、--text #bae6fd、--muted #5b7fa5、--green #14b8a6、--orange #f97316、--purple #6366f1、--rose #f43f5e):禁用任何 CDN 与外部网络引用(@import、外链 CSS/JS/图片/网络字体一律禁止,页面必须公司内网离线双击可打开、零外部依赖),字体全用系统本地字体栈 ui-monospace/'SF Mono'/SFMono-Regular/Menlo/Consolas/'Microsoft YaHei'/monospace(macOS 走 SF Mono/Menlo、Windows 走 Consolas,中文回退 Microsoft YaHei;字母数字等宽自带科技感),正文同栈 400、标题同栈 900 渐变文字(var(--cyan) #0ea5e9→var(--purple) #6366f1,background-clip:text,发光用 ask-result 模板同款 text-shadow 双圈(titleGlow 动画 3s 呼吸:基线 20px/.4 + 60px/.15 ↔ 峰值 30px/.7 + 80px/.3,h1 留静态基线;24px 小字同参数观感与官方一致,禁止改三圈小模糊——会糊在字内边界不清));页面背景纯深蓝黑 #0a1929(参考图同款色值)、正文浅青 #bae6fd、全屏极轻微噪点纹理(body::before fixed 覆盖层,background-image 用 SVG feTurbulence data URI(<svg xmlns='http://www.w3.org/2000/svg' width='240' height='240'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/><feColorMatrix type='saturate' values='0'/></filter><rect width='100%' height='100%' filter='url(#n)'/></svg>),opacity .04,pointer-events:none,z-index 0 在卡片之下,消除大面积纯色死板感),body 纯 #0a1929 背景不加径向辉光(onboarding 同款);全屏背景叠加 speccore dashboard 同款三层科技感底纹:60px 网格底纹(.grid-pattern fixed inset 0,background-image linear-gradient(rgba(0,240,255,.03) 1px, transparent 1px) 纵横双向、background-size 60px 60px、z-index 0)+ 彩色星点层(.stars fixed inset 0,8 个 1-1.5px 星点 radial-gradient(1px 1px at <位置>, <色>, transparent) 多背景组合:白色 rgba(255,255,255,.3-.4) 与青色 rgba(0,240,255,.45-.5)、紫色 rgba(168,85,247,.4)、绿色 rgba(0,255,136,.4),位置分散 10%-90%,z-index 0)+ 全屏 2px 周期细扫描线(.scanlines fixed inset 0,repeating-linear-gradient(0deg, transparent 0 2px, rgba(0,240,255,.015) 2px 4px),z-index 999 罩最上层,pointer-events none;三层均 fixed 不随滚动,营造星野+网格+扫描的科技氛围,不破坏参考图纯深蓝黑质感);内容区宽度响应窗口自适应(.wrap width:clamp(640px, 60%, 1200px) + margin:0 auto:最小 640px、最大 1200px、中间按窗口 60% 缩放,页面左右留白对称);头部卡片参考图式实心深蓝底(var(--card) 实心 #0b1e37,略亮于背景、更偏蓝)+ 8px 周期细密水平条纹(background-image 叠加 repeating-linear-gradient(180deg, rgba(255,255,255,.012) 0 1px, transparent 1px 8px))+ 上下边缘 1px 微亮描边(border-top/border-bottom 1px solid #0f3350,参考图「边缘点亮一线」效果,与 ask 四边浮光扫描线动画共存、动画层在上)+ 圆角 6px + 外发光与 inset 内发光(0 0 20px rgba(14,165,233,.08) + inset 0 1px 24px rgba(14,165,233,.04)),overflow:hidden,标题区仅标题与青色胶囊生成时间徽章(badge 后直接收尾,不加底部细线/装饰光带,避免悬空多余线);标题与徽章下加 TL;DR 一句话摘要行(.summary-line flex 布局 max-width 540px 居中:左侧 .summary-tag「TL;DR」青色小标签 系统等宽 10px 粗体、rgba(14,165,233,.35) 细边圆角 4px、rgba(14,165,233,.07) 底、青色 text-shadow 光晕 + 右侧 .summary-text 12.5px 浅青正文 line-height 1.75 text-align left;摘要带判断给结论——整体节奏/主要风险/明日重点,不罗列条目);分节卡片同参考图式质感(实心深蓝底 #0b1e37 + 8px 周期细密水平条纹 + 上下边缘 1px 微亮描边 #0f3350 + 圆角缩小至 6px + overflow:hidden,保留阴影与 inset 内发光,去掉原全框青色细边),每张分节卡片左侧带参考图式左缘色条(8px 宽竖线贯穿整卡高度,节色渐变带同色光晕:完成 linear-gradient(180deg,#5eead4,#14b8a6) / 计划 linear-gradient(180deg,#fdba74,#f97316) / 风险 linear-gradient(180deg,#fda4af,#e11d48),box-shadow 0 0 12px 同色 30% 透明度;卡片内容 padding-left 24px 避让色条),节标题带 18px 同色渐变 SVG 语义图标+文字微光晕(h2 flex 布局 gap 10px,图标替换原竖向短条:完成=圆形对勾、计划=日历、风险=三角警示;inline SVG 内 linearGradient 同节色系渐变 完成 #5eead4→#14b8a6 / 计划 #fdba74→#f97316 / 风险 #fda4af→#e11d48 + 白色描边细节 + drop-shadow 同色光晕;标题色:完成青绿 #5eead4、计划橙 #fdba74、风险玫红 #fda4af + h2 文字同色双圈发光字 3s 呼吸 secGlow 动画(基线 14px/.45+40px/.18 ↔ 峰值 22px/.75+60px/.3,各节动画用本节主题色,与主标题同节奏;仅节标题文字发光,SVG 图标与日期徽章不加))+ 「今日完成任务」节标题右侧带目标日期小胶囊徽章 sec-date(margin-left:auto 推右、flex:0 0 auto;11px var(--muted) 字、padding 3px 10px、圆角 999px、青色细边 rgba(14,165,233,.18)、背景 rgba(14,165,233,.05),如 2026-10-22;仅完成节显示、计划/风险节不加,让截图自带具体日期)+ 条目 3D 立体圆球序号徽章(28px 白字,立体感克制的柔和球面——弱化版三段收窄色阶:受光球面渐变 radial-gradient(受光点 circle at 30% 28%,浅亮→主色→深色:完成 #7dd9cf→#14b8a6→#0d9488、计划 #fdc69a→#f97316→#ea580c、风险 #fdaab4→#f43f5e→#e11d48)+ inset 右下内暗影 -3px -4px 6px rgba(0,0,0,.3) 与左上内亮缘 1px 2px 3px rgba(255,255,255,.2) + ::before 左上椭圆高光点(position:relative 定位,top 5px/left 7px、8x6px、rotate -28deg、白色径向渐隐 rgba(255,255,255,.7)→0)+ 底部投影 0 2px 4px rgba(0,0,0,.25) 与同色光晕 0 0 8px + 数字 text-shadow 0 1px 1px rgba(0,0,0,.25) 贴球面) + 条目内部留白:li 水平 padding 10px(hover 淡青底 rgba(14,165,233,.06) 与文字间留 10px 间距)+ 序号圆形徽章 28px(数字距圆边约 8px,不贴圆边)+ 列表轻微缩进 12px(ol/ul padding 0 12px)+ 描述与进度双层错落排版(描述 15px、进度用时 12px 青灰小字 #5b7fa5、百分比加粗强调且两侧 margin 0 2px 呼吸留白、进度与用时之间用「 - 」连接(与 md/txt 版一致,不用 · )、条目间青色虚线分隔);风险节条目三环展开:desc 主行(问题)+ meta 影响行(12px 青灰小字「影响:xxx」)+ .advice 建议行(12px 青色小字,「建议:」加粗前缀,margin-top 6px);md/txt 版同条目依次写问题、影响、建议,文本格式不变+ 青色渐变 40px 大胶囊「一键复制」按钮(var(--cyan)→#0284c7,30px 青色光晕,hover 45px 光晕上浮,模板同款;flex 居中布局,内置 16px 内联 SVG 双矩形复制图标(白色 currentColor 描边、图标与文字 gap 8px、禁用 emoji 图标),复制成功后图标切换为对勾 SVG、文字短暂变「已复制」);头部 speccore ask 风格发光特效(与 ask 页面完全同款):四边 1px 青色浮光线,渐变 transparent→var(--cyan)→transparent 整条线平移扫动(亮段长、无 box-shadow 光晕,四边亮段构成顺时针环绕循环,与 ask 看板卡片完全同款(上横线 scanX 左→右、右竖线 scanY 上→下、下横线 scanX-rev 右→左、左竖线 scanY-rev 下→上,四线同周期同速度 3s linear 单向平移);实现为 1px 整线渐变元素平铺整条边(上/下横线 left:0/right:0 + height:1px + linear-gradient(90deg, transparent, var(--cyan), transparent);左/右竖线 top:0/bottom:0 + width:1px + linear-gradient(180deg, transparent, var(--cyan), transparent)),随线体 translateX/translateY 平移 ±100%(相对线长):scanX -100%→100%、scanX-rev 100%→-100%、scanY -100%→100%、scanY-rev 100%→-100%;亮段(线中央渐变段)完整穿越卡片后消失于两端界外(卡片 overflow:hidden 裁剪),带「出现→穿越→消失」节奏;禁止自创 background-position 滚动/常驻辉光/往返摆动/亮段半嵌常驻等变体)+ 顶部光斑 ask 同款 cardGlow(radial-gradient ellipse at 50% 10% rgba(14,165,233,.25)→transparent 70%,opacity .5→1 + scale 1→1.6,transform-origin top center,3s 循环;头部卡片与每张分节卡片内均放 .card-glow 光斑层,覆盖整卡顶部)+ 标题文字青色光晕呼吸(text-shadow 双圈 3s 循环);入场动画:头部淡入下滑、卡片依次错峰上浮淡入(完成 0.26s/计划 0.4s/风险 0.54s)、按钮弹入;hover 微交互:卡片上浮+阴影加深+inset 发光增强、条目淡青底、序号徽章放大微旋、按钮上浮/按压回缩;页脚 10px muted 文字(无分隔线、不加边框),署名固定 GENERATED BY SPECCORE TEAM · <目标日期>(日期动态,如 GENERATED BY SPECCORE TEAM · 20261022);三段分节列表,任务点保持中文顿号序号;当日节奏条(.day-strip 完成任务节内三时段横条:上午/下午/晚上按提交数分段高亮、.strip-item position:relative、hover 弹出 .strip-tip 浮层(bottom:calc(100% + 6px) 向上弹出避卡片 overflow:hidden 裁剪;position:absolute、translateX(-50%) scale(.85)→hover scale(1)、opacity 0→1、pointer-events:none、z-index:30、background:#0b2a4a、border:1px solid rgba(14,165,233,.4)、圆角、小字两行「时段 · N 次提交」+主题词));节奏条下量化指标行(.day-metrics flex 居中 gap:22px、10.5px muted 字、数字用 .day-metrics b 青色等宽加粗(3 次提交 / 56 个文件 / +1.8k −285 行,删行数字 .minus 用 --rose 玫红);纯文字模式无 git 数据时省略此行);进度条终点圆点 + 流星扫描填充(.pbar-fill 必须 display:block + position:relative——行内 span 忽略 width/height 会变成 0×0,填充与圆点全部不可见;.pbar-fill::before 终点圆点 7px 径向渐变圆 right:0 + transform:translate(50%,-50%) 骑在填充右缘(done 青绿 radial-gradient(circle at 35% 30%,#a7f3d0,#2dd4bf 62%,#0d9488)、plan 橙 #fdba74/#f97316/#c2410c,box-shadow 同色光晕、z-index:2;.pbar-track/.pbar-fill 均不得加 overflow:hidden——圆点右半伸出填充 3.5px 骑边渲染);流星 = JS 注入 .pbar-track 内的 .pbar-sweep(absolute 左贴轨道、width:0 起点隐藏、height:16px、transform:translateY(-50%) 垂直居中、z-index:1、pointer-events:none)+ 其右缘 .pbar-comet 光体(13×7px 小号横向椭圆青白光核(高度仅约 1.4 倍条高、宽度约 2.6 倍条高,严禁 20px 大圆球形态)background 双层 radial-gradient:右前缘青蓝冷光 radial-gradient(ellipse 60% 70% at 72% 45%,rgba(125,211,252,.85),transparent) + 青白核 radial-gradient(circle at 40% 40%,#fff,rgba(224,254,255,.95) 45%,rgba(153,246,228,.5) 75%,transparent),box-shadow 双圈柔光 0 0 5px 2px rgba(186,230,253,.75) + 0 0 12px 4px rgba(45,212,191,.3)——光晕总高控制在 2~2.5 倍条高以内,不用 drop-shadow;::after 彗尾 right:62%、78×7px 细长锥形拖尾 linear-gradient(90deg,transparent,rgba(153,246,228,.18) 26%,rgba(186,230,253,.55) 64%,rgba(255,255,255,.9)) + clip-path:polygon(0 42%,100% 0,100% 100%,0 58%) 向左收尖成 1px 尖点 + blur 1px——长度约 6 倍头宽、白→青→透明三段渐变的「细尾亮头」流星形,禁椭圆水滴块、禁矩形方块形;::before 星屑仅尾后少量细碎粒子:2px 白点 + 6 颗 box-shadow 星屑(x -40~+7 / y -5~+4 沿尾散布、rgba(255,255,255,.4~.85) 近亮远淡)+ starTwinkle .8s ease-in-out infinite alternate 明灭闪烁——禁止十几颗大星屑环绕头部成大团;opacity:0 常驻隐藏);.pbar-track.sheen-on 时 sweep transition:width 1.1s cubic-bezier(.3,.8,.4,1) 生长(comet 贴 sweep 右缘 left:100% 随宽度从左扫到右),comet 同步 animation:cometFade 1.1s(7% 淡入、86% 保持、100% 到终点消失);扫动终点按各条目标进度 data-w:sheen 内 sweep inline width 终点 = data-w(done 条 100% 扫满轨道、有进度的 plan 条如 30% 即 30% 停在进度点不越界)——sweep 宽度过渡与 fill 宽度过渡同参数天然同步,comet 与彗尾/星屑无需任何反向补偿(scaleX 压缩方案会把彗尾一同拉长数倍,禁用);填充同步生长:入场 sheen(el,'wave') 给 fill 设 transition width 1.1s 同 easing + width 0→data-w,与流星同步——流星扫到哪、填充长到哪,流星到终点消失、留下各自进度,之后填充保持不再变化;圆点 .pbar-done/.pbar-plan .pbar-fill.sheen-on::before animation:dotPulse 1.1s(90% 处 filter:brightness(2) + 白光 drop-shadow 爆亮,done/plan 通用)流星到达终点时爆亮;流星注入与入场波浪覆盖完成条 + 有进度的计划条(JS 遍历 .pbar-track:plan 且进度<=0 的条 return 跳过——0 进度的计划条不注入流星、不扫、保持静态),其余条 data-w 记录目标进度后 fill 归零;入场波浪:setTimeout 1500+i*420ms 逐条 sheen(el,'wave') 错峰(上→下必然可见);hover 重扫:li 上 mouseenter+pointerenter 双监听,sheen(el,'hover') 只 remove/add fill 与 track 的 sheen-on 类重放流星扫过(comet 再扫一遍,0 进度的 plan 条同样跳过),fill 宽度与颜色完全不重置(进度不再变化),sheen(el,src) 按来源独立节流(wave 1s / hover 300ms);重启动画 remove 类→sweep inline 归零 width:0(transition:none 无过渡)→void offsetWidth 强制回流→同步 add 类→sweep inline 目标 width=data-w(恢复 transition;双 RAF 在 headless 虚拟时间下不推进,不可用));液态玻璃(@supports((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))) 内 .header-card/.section 加 backdrop-filter:blur(16px) saturate(1.35) + background-color:rgba(11,30,55,.42),不支持的老浏览器走默认实心深蓝不白屏);CRT 扫描光带(.scanband position:fixed、left:0/right:0、height:150px、linear-gradient(180deg,transparent,rgba(0,240,255,.03) 50%,transparent)、animation:scanMove 11s linear infinite(top -22%→112%)、pointer-events:none、z-index:998,置于 scanlines 之下一层);全页 3D 微倾斜(body 添加 perspective(900px),页面容器 transform:rotateY(calc(var(--mx)*1.5deg)) rotateX(calc(var(--my)*-1.5deg))(±0.75° 极轻微),JS 监听 mousemove 更新 --mx/--my(-1~1 归一化,平滑过渡 transition transform .18s ease-out),移动端无 mousemove 保持 0 不倾斜);禁止写 @media (prefers-reduced-motion: reduce) 禁用动画的媒体查询块(官方模板无此块,用户系统开启减少动画时该块会禁用全部动效,是竖线不动/发光不呼吸的根因);页面 JS 需支持 `?shot=content` 参数(检测 location.search 含 shot=content 时给 header-card、copy-wrap、footer 设 display:none,body 四周 padding 统一 40px,供主体内容整体截图用、保证截图四周留白对称合适)
8
+ - FORMATS 含 content-png 时额外生成内容区截图 `daily-report-YYYYMMDD-content.png`:整页内容区截图一张(头部标题卡片 + 今日完成任务/明日计划/风险阻塞点三张分节卡片整体截出,头部卡片必须带上,图片四周保留对称合适的外边距约 40px 留白):html 内置 `?shot=content` 参数(页面 JS 检测后仅统一 body 四周 padding 40px、不隐藏任何元素(头部标题卡/三张分节卡/页脚全部保留),正常浏览不受影响);用 Chrome headless 访问带参 URL 截图(路径按系统选:macOS=`/Applications/Google Chrome.app/Contents/MacOS/Google Chrome`;Windows 按序探测 `C:\Program Files\Google\Chrome\Application\chrome.exe` → `C:\Program Files (x86)\Google\Chrome\Application\chrome.exe` → `%LOCALAPPDATA%\Google\Chrome\Application\chrome.exe`,经 node child_process 执行 `--headless --disable-gpu --no-sandbox --hide-scrollbars --user-data-dir=<临时目录> --screenshot=<png路径> --window-size=760,<估算高度> --virtual-time-budget=4000 "file:///<html路径>?shot=content"`(Windows 下 URL 写作 file:///C:/...,用 node url.pathToFileURL 生成),跑完删除临时目录;禁止用 `--headless=new`(单例模式会静默失败生成占位图);若 Chrome 不存在则换 Edge(macOS=`/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge`;Windows=`C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe` → `C:\Program Files\Microsoft\Edge\Application\msedge.exe`),都找不到时跳过截图并在对话注明);高度按整页内容区估算(body 上下留白~80 + 头部标题卡片~180 + 每节卡片(45+条目数×70+40,含各卡片 margin-bottom 18) + 余量~15,底部留白仅 body 下 padding 40px、与顶部对称,余量只防截断不可多给),截图后用 Read 校验:头部标题卡片与三张分节卡片整体完整在图内、四周留白对称合适、不截断,底部留白过大则减高度、截断则加高度重截
9
+ - md/txt/html 均含生成时间行,精确到时分秒(如 2026-10-22 19:10:38);HTML 采用参考图式深蓝面板风格 + ask 同款发光动效的融合样式(不换其它色系,颜色全部用 CSS 变量统一 ask 色板:--cyan #0ea5e9、--bg #0a1929、--card #0b1e37、--border rgba(14,165,233,.15)、--text #bae6fd、--muted #5b7fa5、--green #14b8a6、--orange #f97316、--purple #6366f1、--rose #f43f5e):禁用任何 CDN 与外部网络引用(@import、外链 CSS/JS/图片/网络字体一律禁止,页面必须公司内网离线双击可打开、零外部依赖),字体全用系统本地字体栈 ui-monospace/'SF Mono'/SFMono-Regular/Menlo/Consolas/'Microsoft YaHei'/monospace(macOS 走 SF Mono/Menlo、Windows 走 Consolas,中文回退 Microsoft YaHei;字母数字等宽自带科技感),正文同栈 400、标题同栈 900 渐变文字(var(--cyan) #0ea5e9→var(--purple) #6366f1,background-clip:text,发光用 ask-result 模板同款 text-shadow 双圈(titleGlow 动画 3s 呼吸:基线 20px/.4 + 60px/.15 ↔ 峰值 30px/.7 + 80px/.3,h1 留静态基线;24px 小字同参数观感与官方一致,禁止改三圈小模糊——会糊在字内边界不清));页面背景纯深蓝黑 #0a1929(参考图同款色值)、正文浅青 #bae6fd、全屏极轻微噪点纹理(body::before fixed 覆盖层,background-image 用 SVG feTurbulence data URI(<svg xmlns='http://www.w3.org/2000/svg' width='240' height='240'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/><feColorMatrix type='saturate' values='0'/></filter><rect width='100%' height='100%' filter='url(#n)'/></svg>),opacity .04,pointer-events:none,z-index 0 在卡片之下,消除大面积纯色死板感),body 纯 #0a1929 背景不加径向辉光(onboarding 同款);全屏背景叠加 speccore dashboard 同款三层科技感底纹:60px 网格底纹(.grid-pattern fixed inset 0,background-image linear-gradient(rgba(0,240,255,.03) 1px, transparent 1px) 纵横双向、background-size 60px 60px、z-index 0)+ 彩色星点层(.stars fixed inset 0,8 个 1-1.5px 星点 radial-gradient(1px 1px at <位置>, <色>, transparent) 多背景组合:白色 rgba(255,255,255,.3-.4) 与青色 rgba(0,240,255,.45-.5)、紫色 rgba(168,85,247,.4)、绿色 rgba(0,255,136,.4),位置分散 10%-90%,z-index 0)+ 全屏 2px 周期细扫描线(.scanlines fixed inset 0,repeating-linear-gradient(0deg, transparent 0 2px, rgba(0,240,255,.015) 2px 4px),z-index 999 罩最上层,pointer-events none;三层均 fixed 不随滚动,营造星野+网格+扫描的科技氛围,不破坏参考图纯深蓝黑质感);内容区宽度响应窗口自适应(.wrap width:clamp(640px, 60%, 1200px) + margin:0 auto:最小 640px、最大 1200px、中间按窗口 60% 缩放,页面左右留白对称);头部卡片参考图式实心深蓝底(var(--card) 实心 #0b1e37,略亮于背景、更偏蓝)+ 8px 周期细密水平条纹(background-image 叠加 repeating-linear-gradient(180deg, rgba(255,255,255,.012) 0 1px, transparent 1px 8px))+ 上下边缘 1px 微亮描边(border-top/border-bottom 1px solid #0f3350,参考图「边缘点亮一线」效果,与 ask 四边浮光扫描线动画共存、动画层在上)+ 圆角 6px + 外发光与 inset 内发光(0 0 20px rgba(14,165,233,.08) + inset 0 1px 24px rgba(14,165,233,.04)),overflow:hidden,标题区仅标题与青色胶囊生成时间徽章(badge 后直接收尾,不加底部细线/装饰光带,避免悬空多余线);标题与徽章下加 TL;DR 一句话摘要行(.summary-line flex 布局 max-width 540px 居中:左侧 .summary-tag「TL;DR」青色小标签 系统等宽 10px 粗体、rgba(14,165,233,.35) 细边圆角 4px、rgba(14,165,233,.07) 底、青色 text-shadow 光晕 + 右侧 .summary-text 12.5px 浅青正文 line-height 1.75 text-align left;摘要带判断给结论——整体节奏/主要风险/明日重点,不罗列条目);分节卡片同参考图式质感(实心深蓝底 #0b1e37 + 8px 周期细密水平条纹 + 上下边缘 1px 微亮描边 #0f3350 + 圆角缩小至 6px + overflow:hidden,保留阴影与 inset 内发光,去掉原全框青色细边),每张分节卡片左侧带参考图式左缘色条(8px 宽竖线贯穿整卡高度,节色渐变带同色光晕:完成 linear-gradient(180deg,#5eead4,#14b8a6) / 计划 linear-gradient(180deg,#fdba74,#f97316) / 风险 linear-gradient(180deg,#fda4af,#e11d48),box-shadow 0 0 12px 同色 30% 透明度;卡片内容 padding-left 24px 避让色条),节标题带 18px 同色渐变 SVG 语义图标+文字微光晕(h2 flex 布局 gap 10px,图标替换原竖向短条:完成=圆形对勾、计划=日历、风险=三角警示;inline SVG 内 linearGradient 同节色系渐变 完成 #5eead4→#14b8a6 / 计划 #fdba74→#f97316 / 风险 #fda4af→#e11d48 + 白色描边细节 + drop-shadow 同色光晕;标题色:完成青绿 #5eead4、计划橙 #fdba74、风险玫红 #fda4af + h2 文字同色双圈发光字 3s 呼吸 secGlow 动画(基线 14px/.45+40px/.18 ↔ 峰值 22px/.75+60px/.3,各节动画用本节主题色,与主标题同节奏;仅节标题文字发光,SVG 图标与日期徽章不加))+ 「今日完成任务」节标题右侧带目标日期小胶囊徽章 sec-date(margin-left:auto 推右、flex:0 0 auto;11px var(--muted) 字、padding 3px 10px、圆角 999px、青色细边 rgba(14,165,233,.18)、背景 rgba(14,165,233,.05),如 2026-10-22;仅完成节显示、计划/风险节不加,让截图自带具体日期)+ 条目 3D 立体圆球序号徽章(28px 白字,立体感克制的柔和球面——弱化版三段收窄色阶:受光球面渐变 radial-gradient(受光点 circle at 30% 28%,浅亮→主色→深色:完成 #7dd9cf→#14b8a6→#0d9488、计划 #fdc69a→#f97316→#ea580c、风险 #fdaab4→#f43f5e→#e11d48)+ inset 右下内暗影 -3px -4px 6px rgba(0,0,0,.3) 与左上内亮缘 1px 2px 3px rgba(255,255,255,.2) + ::before 左上椭圆高光点(position:relative 定位,top 5px/left 7px、8x6px、rotate -28deg、白色径向渐隐 rgba(255,255,255,.7)→0)+ 底部投影 0 2px 4px rgba(0,0,0,.25) 与同色光晕 0 0 8px + 数字 text-shadow 0 1px 1px rgba(0,0,0,.25) 贴球面) + 条目内部留白:li 水平 padding 10px(hover 淡青底 rgba(14,165,233,.06) 与文字间留 10px 间距)+ 序号圆形徽章 28px(数字距圆边约 8px,不贴圆边)+ 列表轻微缩进 12px(ol/ul padding 0 12px)+ 描述与进度双层错落排版(描述 15px、进度用时 12px 青灰小字 #5b7fa5、百分比加粗强调且两侧 margin 0 2px 呼吸留白、进度与用时之间用「 - 」连接(与 md/txt 版一致,不用 · )、条目间青色虚线分隔);风险节条目三环展开:desc 主行(问题)+ meta 影响行(12px 青灰小字「影响:xxx」)+ .advice 建议行(12px 青色小字,「建议:」加粗前缀,margin-top 6px);md/txt 版同条目依次写问题、影响、建议,文本格式不变+ 青色渐变 40px 大胶囊「一键复制」按钮(var(--cyan)→#0284c7,30px 青色光晕,hover 45px 光晕上浮,模板同款;flex 居中布局,内置 16px 内联 SVG 双矩形复制图标(白色 currentColor 描边、图标与文字 gap 8px、禁用 emoji 图标),复制成功后图标切换为对勾 SVG、文字短暂变「已复制」);头部 speccore ask 风格发光特效(与 ask 页面完全同款):四边 1px 青色浮光线,渐变 transparent→var(--cyan)→transparent 整条线平移扫动(亮段长、无 box-shadow 光晕,四边亮段构成顺时针环绕循环,与 ask 看板卡片完全同款(上横线 scanX 左→右、右竖线 scanY 上→下、下横线 scanX-rev 右→左、左竖线 scanY-rev 下→上,四线同周期同速度 3s linear 单向平移);实现为 1px 整线渐变元素平铺整条边(上/下横线 left:0/right:0 + height:1px + linear-gradient(90deg, transparent, var(--cyan), transparent);左/右竖线 top:0/bottom:0 + width:1px + linear-gradient(180deg, transparent, var(--cyan), transparent)),随线体 translateX/translateY 平移 ±100%(相对线长):scanX -100%→100%、scanX-rev 100%→-100%、scanY -100%→100%、scanY-rev 100%→-100%;亮段(线中央渐变段)完整穿越卡片后消失于两端界外(卡片 overflow:hidden 裁剪),带「出现→穿越→消失」节奏;禁止自创 background-position 滚动/常驻辉光/往返摆动/亮段半嵌常驻等变体)+ 顶部光斑 ask 同款 cardGlow(radial-gradient ellipse at 50% 10% rgba(14,165,233,.25)→transparent 70%,opacity .5→1 + scale 1→1.6,transform-origin top center,3s 循环;头部卡片与每张分节卡片内均放 .card-glow 光斑层,覆盖整卡顶部)+ 标题文字青色光晕呼吸(text-shadow 双圈 3s 循环);入场动画:头部淡入下滑、卡片依次错峰上浮淡入(完成 0.26s/计划 0.4s/风险 0.54s)、按钮弹入(卡片入场动画 fadeDown/fadeUp/riseIn 的 fill-mode 必须用 backwards 严禁 both——both 使动画结束后最后一帧 transform:none 永久覆盖 hover 的 3D 偏转 transform,CSS 动画 applied 值优先级高于普通声明,hover 偏转会完全失效;cometFade 与按钮 pop 保持 both 不受此限);hover 微交互:卡片上浮+阴影加深+inset 发光增强、条目淡青底、序号徽章放大微旋、按钮上浮/按压回缩;页脚 10px muted 文字(无分隔线、不加边框),署名固定 GENERATED BY SPECCORE TEAM · <目标日期>(日期动态,如 GENERATED BY SPECCORE TEAM · 20261022);三段分节列表,任务点保持中文顿号序号;当日节奏条(.day-strip 完成任务节内三时段横条:上午/下午/晚上按提交数分段高亮、.strip-item position:relative、hover 弹出 .strip-tip 浮层(bottom:calc(100% + 6px) 向上弹出避卡片 overflow:hidden 裁剪;position:absolute、translateX(-50%) scale(.85)→hover scale(1)、opacity 0→1、pointer-events:none、z-index:30、background:#0b2a4a、border:1px solid rgba(14,165,233,.4)、圆角、小字两行「时段 · N 次提交」+主题词));节奏条下量化指标行(.day-metrics flex 居中 gap:22px、10.5px muted 字、数字用 .day-metrics b 青色等宽加粗(3 次提交 / 56 个文件 / +1.8k −285 行,删行数字 .minus 用 --rose 玫红);纯文字模式无 git 数据时省略此行);进度条终点圆点 + 流星扫描填充(.pbar-fill 必须 display:block + position:relative——行内 span 忽略 width/height 会变成 0×0,填充与圆点全部不可见;.pbar-fill::before 终点圆点 7px 径向渐变圆 right:0 + transform:translate(50%,-50%) 骑在填充右缘(done 青绿 radial-gradient(circle at 35% 30%,#a7f3d0,#2dd4bf 62%,#0d9488)、plan 橙 #fdba74/#f97316/#c2410c,box-shadow 同色光晕、z-index:2;.pbar-track/.pbar-fill 均不得加 overflow:hidden——圆点右半伸出填充 3.5px 骑边渲染);流星 = JS 注入 .pbar-track 内的 .pbar-sweep(absolute 左贴轨道、width:0 起点隐藏、height:16px、transform:translateY(-50%) 垂直居中、z-index:1、pointer-events:none)+ sweep 右缘 .pbar-comet 光体(absolute left:100% 贴 sweep 右缘随宽度移动,严禁 right:62%/right:100% 等右侧定位——彗星会停在轨道中段、进度 100% 时也到不了终点;子弹头形光核:20×11px 横向泪滴 border-radius:55% 100% 100% 55% / 85% 100% 100% 85%(右端全圆弧=前进弹头、左端 55%/85% 大圆角=后部饱满钝圆接尾不露尖(比 35%/60% 更钝,禁尖窄收尾),严禁 13×7 小椭圆方块感、严禁 20px 大圆球形态)background 三层:底层 linear-gradient(90deg,rgba(153,246,228,.3),rgba(224,254,255,.6) 55%,#fff) 铺底(形状内不得透底)+ 右前缘青蓝冷光 radial-gradient(ellipse 70% 85% at 74% 45%,rgba(125,211,252,.9),transparent) + 青白核 radial-gradient(circle 12px at 66% 50%,#fff,rgba(224,254,255,.95) 45%,rgba(153,246,228,.5) 75%,transparent)(circle 半径必须显式 12px——自动半径按最远角计、四角渐隐至透明会露出轨道深色背景成「黑三角」,显式半径让光核饱满),box-shadow 双圈柔光 0 0 5px 2px rgba(186,230,253,.75) + 0 0 12px 4px rgba(45,212,191,.3)——光晕总高控制在 2~2.5 倍条高以内,不用 drop-shadow;整体前大后收窄的扫帚流星:头部 20×11 大头 → ::after 彗尾 right:40%、84×12px 细长锥形拖尾 linear-gradient(90deg,transparent,rgba(153,246,228,.18) 26%,rgba(186,230,253,.55) 64%,rgba(255,255,255,.9)) + clip-path:polygon(4% 40%,16% 24%,100% 0,100% 100%,16% 76%,4% 60%)(左端收成 2.4px 高平口钝头、右端全高平接光核、16% 处起渐收——远窄近宽,禁矩形方块形、禁 1px 尖点)+ blur 1px + z-index:0——长度约 4 倍头宽;剥落粒子流(JS 为每颗 .pbar-comet 注入 12 个 span.cp,绝对定位在光核中后段出生):12 粒椭圆小块前大后小(3.2×2.2 → 1.2×0.9px,宽高不等 + rotate -12°~12° 不规则椭圆,禁用标准圆形、禁用 box-shadow 静态星屑——静态点没有剥落飘散的生命感),出生点从头部稍靠后(left 9~17px)开始,y 紧贴中心水平线(中线 ±2.5px,各粒角度基本一致不散乱),cpFlow 1.5~1.8s cubic-bezier(.2,.05,.55,1) infinite + 负延迟 -0.1~-1.5s 错峰:0%→10% 淡入渐现(渐渐出现)、10%→100% 沿水平线加速向后飘 translate3d(-45~-62px, dy, 0)(加速向后)、55% 后 opacity 渐隐 + scale(.16) 渐小(向尾部消失)、dy 取与出生 y 反向小值让飞行终点向中心水平线收敛,box-shadow 光晕 0%→55% 增强再减弱(每粒生命期一次明灭=呼吸发光,周期 1.5~1.8s 与主体 2.4s 呼吸非整数倍错开,禁止同频齐步闪);粒子 z-index:1 在彗尾之上(尾 z-index:0)、opacity:0 起步呼吸发光分层不同频:主体光核与彗尾 2.4s 周期呼吸(comet 双动画 cometFade + glowPulse 2.4s ease-in-out infinite:box-shadow 双圈光晕 0%↔50% 周期扩缩;::after 挂 tailGlow 2.4s ease-in-out infinite:filter blur(1px) brightness(1) ↔ blur(1.5px) brightness(1.28) 亮度呼吸),粒子 1.5~1.8s 明灭与主体 2.4s 呼吸非整数倍错开(视觉错落不同频);opacity:0 常驻隐藏);.pbar-track.sheen-on 时 sweep transition:width 1.1s cubic-bezier(.3,.8,.4,1) 生长(comet 贴 sweep 右缘 left:100% 随宽度从左扫到右),comet 的 animation 严禁写在 .pbar-comet 基类(基类动画页面加载 t=0 即播、1.1s 后 both 定格 opacity:0,而扫动 setTimeout 1.5s 才开始——时序错位会让流星全程不可见);必须挂在 .pbar-track.sheen-on .pbar-comet 选择器上(cometFade 1.1s ease-out both, glowPulse 2.4s ease-in-out infinite 逗号并列双动画:cometFade 7% 淡入、86% 保持、100% 到终点消失、glowPulse 光晕呼吸循环;::after 彗尾另挂 tailGlow 2.4s ease-in-out infinite 亮度呼吸),靠 playSweep 内 remove/add sheen-on 类切换重启动画,与 dotPulse 同机制;扫动终点按各条目标进度 data-w:sheen 内 sweep inline width 终点 = data-w(done 条 100% 扫满轨道、有进度的 plan 条如 30% 即 30% 停在进度点不越界)——sweep 宽度过渡与 fill 宽度过渡同参数天然同步,comet 与彗尾/星屑无需任何反向补偿(scaleX 压缩方案会把彗尾一同拉长数倍,禁用);填充同步生长:入场 sheen(el,'wave') 给 fill 设 transition width 1.1s 同 easing + width 0→data-w,与流星同步——流星扫到哪、填充长到哪,流星到终点消失、留下各自进度,之后填充保持不再变化;圆点 .pbar-done/.pbar-plan .pbar-track.sheen-on .pbar-fill::before animation:dotPulse 1.1s(90% 处 filter:brightness(2) + 白光 drop-shadow 爆亮,done/plan 通用)流星到达终点时爆亮——dotPulse 选择器必须与 JS 加类位置一致:JS 把 sheen-on 加在 .pbar-track 上,严禁写 .pbar-fill.sheen-on::before(JS 从不在 fill 上加类,选择器永不命中、爆亮不触发);流星注入与入场波浪覆盖完成条 + 有进度的计划条(JS 遍历 .pbar-track:plan 且进度<=0 的条 return 跳过——0 进度的计划条不注入流星、不扫、保持静态),其余条 data-w 记录目标进度后 fill 归零;入场波浪:setTimeout 1500+i*420ms 逐条 sheen(el,'wave') 错峰(上→下必然可见);hover 重扫:li 上 mouseenter+pointerenter 双监听,sheen(el,'hover') 只 remove/add fill 与 track 的 sheen-on 类重放流星扫过(comet 再扫一遍,0 进度的 plan 条同样跳过),fill 宽度与颜色完全不重置(进度不再变化),sheen(el,src) 按来源独立节流(wave 1s / hover 300ms);重启动画 remove 类→sweep inline 归零 width:0(transition:none 无过渡)→void offsetWidth 强制回流→同步 add 类→sweep inline 目标 width=data-w(恢复 transition;双 RAF 在 headless 虚拟时间下不推进,不可用));液态玻璃(@supports((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))) 内 .header-card/.section 加 backdrop-filter:blur(16px) saturate(1.35) + background-color:rgba(11,30,55,.42),不支持的老浏览器走默认实心深蓝不白屏);CRT 扫描光带(.scanband position:fixed、left:0/right:0、height:150px、linear-gradient(180deg,transparent,rgba(0,240,255,.03) 50%,transparent)、animation:scanMove 11s linear infinite(top -22%→112%)、pointer-events:none、z-index:998,置于 scanlines 之下一层);卡片级 3D 微倾斜(严禁全页级 mousemove 倾斜——页面容器整页旋转会让所有卡片一起偏转,与「仅当前卡片响应」不符):每张卡片 hover 时仅该卡片随鼠标偏转,卡片 transform 写 perspective(900px) + rotateY(calc(var(--mx,0)*2.5deg)) rotateX(calc(var(--my,0)*-2.5deg))(±1.25° 极轻微),与 hover 上浮 translateY(-2px) 合并写同一条 transform(严禁拆两条相互覆盖);hover 态选择器带 tilt(header-card/overview/section 或 header-card/card),非 hover 卡片不倾斜;JS 对每张卡片监听 mousemove 计算卡内相对位置((clientX-rect.left)/rect.width*2-1 归一化 -1~1)只更新该卡 --mx/--my,mouseleave 归零回正,transition transform .18s 平滑;移动端无 mousemove 保持 0 不倾斜);禁止写 @media (prefers-reduced-motion: reduce) 禁用动画的媒体查询块(官方模板无此块,用户系统开启减少动画时该块会禁用全部动效,是竖线不动/发光不呼吸的根因);页面 JS 需支持 `?shot=content` 参数(检测 location.search 含 shot=content 时仅统一 body 四周 padding 40px(不隐藏任何元素),供整页内容区截图用、保证截图四周留白对称合适)
10
10
  - HTML 顶部带「一键复制」按钮:点击复制的是 txt 版纯文本全文(复制源必须用 txt 文件内容:含换行、无 #/##/> 等 Markdown 符号,严禁用 md 内容当复制源),按钮短暂变"已复制";JS 用 navigator.clipboard.writeText,失败回退隐藏 textarea + document.execCommand('copy')(兼容 file:// 打开)
11
11
  - 用户临时说"不落盘/别写文件"时(覆盖 DISK):只在对话输出,不写文件、不开浏览器;临时说"写到桌面/存到 X"(覆盖 DIR)、"只要 md/只出 html/只要内容区截图/只要截图/这次不截图"(覆盖 FORMATS)、"别开浏览器"(覆盖 OPEN_HTML)同理,均只对当次生效、不改配置
12
12
  - 同名目录处理:日期子目录已存在时直接复用(不重建、不清空),仅覆盖 FORMATS 清单内的同名文件(md/txt/html/content-png),目录内其它文件(时间戳另存的历史文件、full.png 等用户自放文件)一律保留不动、绝不删除或清空(该目录可能是用户此前自建、作其它用途的目录,我们只并列写入自己的专属命名文件,不与用户文件冲突混淆);落盘前查看目录内已有内容,若存在非本 skill 命名的其它文件(daily-report-/weekly-report- 前缀之外),对话中提示用户「该目录内已有其它文件,本次日报已与它们并列存放,未做任何改动」;同一日期重复生成默认直接覆盖原文件,用户说"保留之前的/另存/不覆盖"时,文件名追加时间戳(如 `daily-report-20261022-1530.html`)另存不覆盖
@@ -0,0 +1,36 @@
1
+ # 用户配置(升级技能时本文件不会被覆盖)
2
+
3
+ > 你的个人配置全放在这里。skill-forge 升级技能时官方只更新 SKILL.md 与 resources/,
4
+ > 本文件始终保留你的版本——落盘目录、格式、角色画像、自定义模板放心改。
5
+
6
+
7
+ ## ⚙️ 默认配置(用户可手动修改;临时口头要求永远优先)
8
+
9
+ ```yaml
10
+ DISK: true # 是否落盘写文件;false = 默认只在对话输出,不写文件不开浏览器
11
+ FORMATS: [md, txt, html, content-png] # 落盘哪些格式(数组,可删减/增,如 [md, html] / [md, txt, html](不截图);content-png = 整页内容区截图(头部标题卡片 + 今日完成任务/明日计划/风险阻塞点三张分节卡片整体截出,头部卡片必须带上),删除该项即不截图;不影响对话中的 md 正文输出)
12
+ DIR: auto # 落盘根目录:auto = 按当前系统自动选 DIR_MAC / DIR_WIN(也可直接写死某个绝对路径)
13
+ DIR_MAC: /Users/luzhaosheng/MyWork/智慧食堂/reports # macOS 落盘根目录(自动按目标日期建子目录;目录不存在时回退用户主目录下 reports)
14
+ DIR_WIN: d:\Workspace_QCoder\reports # Windows 落盘根目录(自动按目标日期建子目录;目录/盘符不存在时回退用户主目录下 reports)
15
+ OPEN_HTML: true # 落盘后是否自动用浏览器打开 html(FORMATS 不含 html 时忽略)
16
+ TEMPLATE: default # 报告模板:default = 内置三段式(完成任务/明日计划/风险阻塞点);custom = 使用下方「📝 自定义模板」节;口头临时指定模板仅当次生效
17
+ ROLE: 全栈开发工程师(企业内技术开发) # 用户默认职业角色与主要工作内容(两者并存:职业名 + 括号内工作内容,生成内容/术语/量化指标/节奏条/风险话术全部按此画像走);用户随口描述职业时(如「我搞装修的,天天跑工地」)→ AI 提炼为规范表述(装修项目经理(负责工地现场管理、施工进度与质量巡检))更新此处;说「以 XX 的身份写」→ 当次临时换角色不改配置;说「以后默认用 XX 角色 / 我的职业是 XX / 我的主要工作是 XX」→ 永久更新此处
18
+ CONFIRM: never # 落盘前确认:never = 直接生成落盘不确认(默认);text = 纯文字整理模式先出效果确认后再落盘;always = 任何方式生成都先确认;临时说「先看看效果」当次先确认、说「不用确认」当次跳过
19
+ ```
20
+
21
+ > 临时口头要求(仅对当次生效,不修改上方配置):说「不落盘/别写文件」→ 当次 DISK=false;说「写到桌面/存到 ~/report(macOS)或 D:\report(Windows)」→ 当次改用该 DIR;说「只要 md / 只出 html / 只要内容区截图」→ 当次只落指定格式;说「这次不截图」→ 当次不生成内容区截图;说「只要截图/重新截个图」→ 当次只对现有 html 执行内容区截图(不重新收集 git、不重写 md/txt/html 内容文件);说「别开浏览器」→ 当次 OPEN_HTML=false;说「这次按 xxx 模板来」→ 当次临时换模板(不改配置);说「以后都用这个模板」→ 自动写入下方「📝 自定义模板」节并把 TEMPLATE 改为 custom(永久生效);说「先看看效果/先出效果再落盘」→ 当次先出效果确认后再落盘;说「不用确认/直接落盘」→ 当次跳过确认直接落盘。
22
+
23
+ ## 📝 自定义模板(TEMPLATE: custom 时启用,用户可手改,适配各类岗位)
24
+
25
+ 把顶部 TEMPLATE 改为 custom 后,按下面结构生成报告(段名、段数、条目格式均可改):
26
+
27
+ ```text
28
+ 段一:今日工作内容(每条:工作描述 - 完成情况)
29
+ 段二:存在问题与困难(只列描述)
30
+ 段三:明日工作计划(每条:计划描述 - 预计完成时间)
31
+ ```
32
+
33
+ > 只写段结构与条目格式即可;未写明的细节(中文顿号序号、生成时间行、落盘行为、HTML 样式)沿用默认规范。
34
+
35
+ ---
36
+ > 更多用法见 SKILL.md 的「生成流程」与 resources/ 分册。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skill-forge-hub",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "SkillForge (技能锻造坊) — a curated collection of AI craft skills. Install once, then pick skills interactively: daily/weekly reports, article-to-HTML, SpecCore document converters.",
5
5
  "bin": {
6
6
  "skill-forge": "cli.js"
@@ -9,6 +9,7 @@
9
9
  "cli.js",
10
10
  "daily-report",
11
11
  "weekly-report",
12
+ "annual-report",
12
13
  "article-to-html",
13
14
  "spec-doc2spec",
14
15
  "spec-spec2doc",