| name | magazine-collect |
| description | 月刊收集 / 任意技术领域近 N 月动态汇总 skill。当用户要求按"月刊收集规则"产出某个技术领域(编译器、推荐系统、搜索、广告、数据库、操作系统、安全、AI、大数据、Web3 等任意领域均可)近 1~3 个月的中文要闻速览、月报、季报、digest 时使用。也包括用户提供一份月刊收集规则 md(含信息源、筛选类别、特别关注点)并要求"按规则跑一遍收集"、"做一份月刊"、"出一份 digest"、"汇总近几个月动态"的所有场景。即使用户没有显式说"月刊"、"digest",只要意图是"按一组信息源 + 筛选规则汇总技术领域近期动态",都应优先触发本 skill。本 skill 与领域解耦——领域特定的信息源、筛选关键词、特别关注点都由用户提供的规则文件指定,skill 主体不绑定任何具体技术领域。 |
月刊收集 (magazine-collect)
一个 LLM-first、零脚本 的月刊收集 skill。Agent 读一份"月刊收集规则"md,按规则去各信息源抓取近 N 个月的内容,按统一模板产出中文 digest。
何时使用本 skill
只要用户的请求满足下面任一描述,就用本 skill:
- 给了一份月刊收集规则 md(含"信息源 / 筛选方式 / 筛选类别 / 特别关注点 / 总结方式"),让你"按规则收集"
- 让你做某个技术领域(无论是编译器、推荐系统、搜索、广告、数据库、操作系统、安全、AI、大数据、Web3,还是用户自定义的任意领域)的"近 N 月动态汇总 / 月刊 / 季报 / digest / 要闻速览"
- 让你"看看 XX 最近三个月有什么进展",且目标产物是一份结构化的 markdown 汇总
- 让你参照
examples/llvm-2026-02-23_2026-05-23.md 那种风格做汇总(该示例为编译器领域,结构和写作 quality bar 适用于任何领域)
单纯"帮我读一下这篇文章 / 这条 commit"——不属于本 skill,直接答即可。
实时性强的"今天发生了什么"——不属于本 skill,那是新闻查询。
核心原则
阅读后续工作流之前,先内化这七条原则,它们决定了 skill 是否能产出真正贴近用户需求的内容。前两条是新增的硬性约束,违反任何一条都意味着 skill 产物的核心价值流失。
- 以"规则文件"为唯一真理来源(HARD CONSTRAINT)。 规则文件里的每一个字段都是 指令,不是 提示。所有领域特定内容(板块名、信息源、关键词、关注点、横评对照对象)都由规则文件提供,skill 主体不预设任何具体领域:
- "信息源" → 必须全部覆盖;如要降级必须在产物的源覆盖表里明示
- "筛选类别" → 决定一条事件是否进入产物的初筛标准
- "特别关注点" → 决定一条事件能否进入"核心事件"段的强筛标准(见 Step 4)
- "总结和表达方式" → 这是事件的写作格式约束(如规则说"背景,要点,启发",那每个事件就必须按这三段写;规则里若额外加了"工业界价值"等扩展段,原样保留,不要按本 skill 默认三段裁剪)
- 任何时候你想"为了简洁省一段"或"为了模板美观换格式",先回头读一次规则文件再决定
- 只留高相关性事件(HARD CONSTRAINT)。 时间线绝不能简单按日期升序平铺——只收录命中规则文件"特别关注点"的事件(与读者业务直接相关的);中等相关性事件视情况合并到主题段落或舍弃;与"特别关注点"无关、纯生态/治理/小特性类的低相关性事件直接不收录,不再走附录降级。这把篇幅紧凑度和信噪比都拉满。
- LLM-first,不写脚本。 全程用
WebSearch / WebFetch / Read / Write / Grep 即可,不要为这个 skill 创建任何 .py / .sh。这是一个把"专家阅读流程"封装成 prompt 的 skill,不是工程产品。
- 不死磕被防爬的源。 很多目标站点(典型如 Phoronix、部分商业新闻站)有 Cloudflare 反爬,
WebFetch 拿回来会是 "Just a moment..." 挑战页。遇到这种情况立刻换路,详见 references/fetch-strategies.md,而不是反复 retry 同一 URL。
- 保留来源链接,不要编造。 每一条要点都必须附原文 URL;如果某条信息只能从搜索引擎摘要/缓存/转述拿到而不能核到原文,要在源覆盖表"备注"列里坦白讲清楚。
- 源覆盖要可审计。 跑完后必须在产物里附一张"源覆盖表",让用户能一眼看到:规则文件列了 N 个源、你实际跑了 M 个、每个源贡献了多少条事件、哪些被降级了、降级理由。
- 每条事件的"启发"必须 actionable。 单纯罗列事件没有价值,"启发"段哪怕只有 1-2 句,也要直接告诉读者"如果你在做 X,下一步该 Y"。
调用约定
用户调用本 skill 时通常会用自然语言,你需要从里面解析出以下参数:
| 参数 | 是否必需 | 默认值 | 说明 |
|---|
rule_file | 必需 | — | 月刊规则 md 的绝对路径。若用户没给,问一次:「请告诉我月刊规则文件的路径,我会按它的信息源和筛选规则去收集。」 |
mode | 可选 | single | single(按 board 产独立 digest)/ magazine(先跑全板块独立 digest,再额外拼接一份完整月刊)/ html(必须基于 magazine 产物,额外产出月刊 HTML 视觉版,含海报+边框,可双击浏览器看或复制到邮件正文)/ eml(必须基于 html 产物,把月刊 HTML 打包为 .eml 邮件文件,双击在邮件客户端打开即可填收件人直发)。详见"运行粒度"与"mode 参数触发条件"。 |
board | 可选 | 规则文件里的全部板块 | 即规则文件里某一节的标题(不限领域,可以是任何板块名)。若未指定且规则文件含多个板块,默认逐个跑(详见"运行粒度")。mode=magazine 时此参数被忽略——月刊必须覆盖所有板块;已有同期 single digest 直接复用,不再重抓。 |
window | 可选 | 近 3 个月 | 例如 "近 1 个月"、"2026 Q1"、"2026-02-01 到 2026-05-01"。 |
source | 可选 | 板块下全部信息源 | 当用户只想看某单一源时使用(如"只看 Phoronix"、"只看 RecSys")。 |
output_dir | 可选 | <规则文件所在目录>/magazine-collect-output/<domain_slug>-<start>_<end>/ | 产物根目录。每次跑独立一个"领域-窗口"目录(避免不同时间窗的产物互相覆盖);月刊落根,板块 digest 落 <board>/ 子目录(详见 Step 6)。规则文件应放在仓库根(如 magazine-skills/<domain>-magazine-collect.md),产物会落到 magazine-skills/magazine-collect-output/<domain>-<start>_<end>/;不要用 skill 自带的 examples/<...>-magazine-collect.md 直接跑,否则产物会落到 skill 内部。 |
domain_slug | 可选 | 规则文件名 stem 去掉 -magazine-collect 后缀 | 领域 slug(拼路径用)。例如 compiler-magazine-collect.md → compiler,最终路径 magazine-collect-output/compiler-2026-02-23_2026-05-23/...。用户可显式指定覆盖。 |
mode 参数触发条件
- 默认
mode=single
- 用户说 "做月刊 / 拼月刊 / 出一期月刊 / 全板块拼一份" 等 →
mode=magazine
- 用户说 "出一份 HTML / 网页版 / 给我个可视化" 等 →
mode=html(必须先有月刊 md——即先跑 mode=magazine)
- 用户说 "打包成邮件 / 转 .eml / 邮件版直接发送 / 在邮件里直接呈现" 等 →
mode=eml(必须先有月刊 HTML——即先跑 mode=html)
- 模式之间是"递进关系":
single < magazine < html < eml,高阶模式自动包含所有前置步骤
magazine:跑完所有板块独立 digest 后走 Step 8 拼月刊 md
html:要求 magazine-<start>_<end>.md 已存在,走 Step 9 把月刊 md 转成 HTML(含海报+边框);HTML 仅作为月刊视觉版产物落本地,分发由用户自行决定(双击浏览器看 / 复制到邮件客户端 / 上传内部 wiki 等)。本 skill 不为单板块 digest 单独产 HTML——HTML 是月刊级的视觉成品
eml:要求 magazine-<start>_<end>.html 已存在,走 Step 10 把月刊 HTML 套上 MIME 信封打包为 .eml;双击在系统默认邮件客户端打开后,标题与正文已就绪,用户填收件人直接发。仅打本地包,不调 SMTP、不带任何凭据
运行粒度(默认按板块聚合多源)
- 规则文件里可能有多个板块(数量、领域、命名都由规则文件决定,skill 不预设),每个板块下可能有多个源。
- 默认按板块跑:一次产出一份"板块 × 时间窗"的聚合 md,把该板块所有源的内容合并、去重、统一汇总。
- 如果用户没指定 board 且规则文件有 N 个板块,逐个板块跑、产 N 份 md。每跑完一个用一句话告诉用户进度。
- 如果某板块特别大(同时有 4+ 个源),可以先告诉用户"这个板块有 X 个源,预计耗时 Y 分钟"再开始。
mode=magazine 时:把规则文件按"叶子板块"展平——"叶子"= 规则文件目录树里最深一层、且自带完整"信息源/筛选类别/特别关注点/总结方式"字段的子节。若规则文件某一节直接挂源(无子节),它本身就是一个叶子;若它把多个并列子项放在同一节下(每个子项各有自己的源和关注点),就把每个子项展为一个叶子。对每个叶子按 single 模式跑一遍独立 digest,最后走 Step 8 拼接月刊。叶子总数 K 由规则文件决定,全量跑预计 K × 3~5 分钟,开跑前先告诉用户叶子清单与预计耗时。
叶子展平示例(来自 examples/compiler-magazine-collect.md):规则文件有 5 大节,但第三节内嵌 Java/Python/Rust/Go/WASM 5 个独立子项、第四节内嵌"异构计算/AI编译"2 个独立子项、第五节内嵌"编译算法/软硬协同优化"2 个独立子项,因此最终展平为 11 个叶子(1+1+5+2+2)。换一个领域的规则文件,叶子数会完全不同——本规则只看"是否带独立信息源+关注点",不看节标题。
工作流
下面 Step 1~7 是一次完整收集的标准流程(mode=single 默认走完即结束),每一步都不要跳。Step 8 仅 mode=magazine 触发,对前 7 步产出的 K 份独立 digest 做月刊拼接。Step 9 仅 mode=html 触发,把月刊 md 转成 HTML 视觉版。Step 10 仅 mode=eml 触发,把月刊 HTML 打包成可双击直发的 .eml。
Step 1 | 解析规则文件
读 rule_file 整文件,提取每个板块的:
- 信息源 URL 列表
- 初步筛选方式
- 筛选类别
- 特别关注点
- 总结和表达方式
如果规则文件结构不规整(例如某板块缺"特别关注点"段),按上下文合理推断,并在产物的"抓取说明"里 short note 提示一下,方便用户回头补规则。
Step 2 | 确定时间窗
- 默认 = 以"今天"为基准的近 3 个月(含今天,含 3 个月前那天)。
- 标题里写明完整时段:
(YYYY-MM-DD ~ YYYY-MM-DD)。
- 时间窗也用于"对边界事件的判断"——如果某事件刚好在窗口外 1~2 天,可以收录但要在描述里注一句
*(注:本事件 YYYY-MM-DD 发生,刚好在本窗口外)*,避免遗漏读者会期待的近期热点。
Step 3 | 对每个源选合适的抓取策略 + 跟踪覆盖情况
抓取策略详见 references/fetch-strategies.md。本步骤的关键约束:
3.1 抓取顺序
- 优先
WebFetch 源的"列表/聚合页",拿到近期 N 条目标的标题+日期+URL
- 列表页能拿到 → 对每条目标再
WebFetch 详情页
- 列表/详情页被反爬 → 立刻切到
WebSearch(不要 retry 超过 2 次同一 URL)
- GitHub 结构化源:优先 release notes 与 changelog,不要 commit-by-commit 读
- arXiv 控量:给自己一个上限(如 top 30 篇/板块)
3.2 覆盖完整性(NEW)
规则文件列了什么源你就跑什么源,默认覆盖所有。出现以下任一情况时可以降级,但必须在最后产物的"源覆盖表"里写明降级理由:
| 降级理由 | 是否允许 |
|---|
| 源被反爬,且镜像/搜索绕路也失败 | ✅ 允许,标注"无法抓取" |
| 源信噪比极低(如邮件列表月新增 1 万条),抓取成本超过收益 | ✅ 允许,但要量化("该月归档 8500 条,按关键词过滤后 0 条强相关") |
| 时间窗外的源(如 Weekly 期号超过窗口) | ✅ 允许,标注覆盖期数 |
| "我觉得它不重要" / "我觉得 weekly 读首尾两期就够了" | ❌ 不允许——这是 skill 替用户做决定,是 bug |
每个源至少要给出一次"我尝试了"的证据(一次 WebFetch 或 WebSearch 尝试),不能跳过不试。
3.3 维护源覆盖账本
抓取过程中持续记录(脑内或简要笔记,不需要落盘):
源 A:WebFetch 直连成功,拿到 N 条候选
源 B:WebFetch 超时 × 2 → WebSearch 绕路成功,拿到 M 条候选
源 C:抓到 1 万条原始邮件,按关键词过滤后 0 条强相关,降级
源 D:未抓取(窗口外)
这份账本是 Step 5 产物里"源覆盖表"的原始数据。
Step 4 | 用"特别关注点"筛事件(入选/不入选二值判断)
抓到的原始事件池往往是最终产出的 3~5 倍。这一步用规则文件的"特别关注点"做严格筛选:
| 事件类型 | 处理 |
|---|
| 直接命中规则文件该板块的"特别关注点" | ✅ 入选,进"核心事件"段。判定方式:把规则文件该板块"特别关注点"字段里列出的所有关键词/对象/指标作为 OR 条件,事件描述命中任一即入选 |
| 大版本发布 / 跨板块重大事件(虽未直接命中关注点,但读者大概率想知道) | ✅ 入选,写法与其他事件一致 |
| 命中"筛选类别"但与"特别关注点"无直接交集(如生态新闻、横评、综述) | ⚠️ 视情况入选;如果它对读者的"特别关注点"工作有间接价值(如同领域横评数据可被参考),入选;否则舍弃 |
| 与"特别关注点"无关、纯文档/治理/小特性、非本板块主题的内容 | ❌ 不收录 |
事件总数控制在 8~15 条为宜(参考 examples/llvm-2026-02-23_2026-05-23.md 的 10 条)。宁缺毋滥——一份 10 条全部命中规则文件特别关注点的 digest,远胜一份混了 5 条"看似相关但读者不在意"的 20 条 digest。
筛选过程是 LLM 自己做的,但要在"源覆盖表"的"候选条目 → 入选条目"列体现取舍量级,让用户能感知到你做了真筛选。
Step 5 | 按统一模板组织内容(事件三段式 + 优先级排序)
完整模板规范见 references/output-template.md,必须读一次再写。下面只列骨架:
# <领域> 近 N 个月(YYYY-MM-DD ~ YYYY-MM-DD)要闻速览
> 数据来源:<本次实际覆盖的源列表>
> 整理时间:YYYY-MM-DD
> 覆盖时段:YYYY-MM-DD 至 YYYY-MM-DD
## 〇、源覆盖表
| 规则文件列的源 | 抓取方式 | 候选条目 | 入选条目 | 备注 |
|---|---|---|---|---|
| ... | ... | ... | ... | ... |
## 一、本期核心脉络(一句话总结)
- 4~7 个 bullet,每条一句话点出本期关键事件
## 二、核心事件(按日期降序,最新在上)
### YYYY-MM-DD | <事件人话标题>
- **URL**:<原文链接>
- **背景**:<1 句话,最多 2 句;说明事件发生的上下文 / 为什么会有这件事>
- **要点**:
- 子要点 1(含具体数字、CPU/ISA 名等可核验细节)
- 子要点 2
- **启发**:<1~2 句,actionable:对读者业务/技术决策意味着什么、下一步该做什么>
### YYYY-MM-DD | <下一个事件>
...
关键写作约束
- 事件三段式不可省:每个事件都必须有 背景 / 要点 / 启发 三段(规则文件硬要求)。
- 背景 = 1 句话(最多 2 句):避免长篇上下文,只点出"为什么这件事现在出现"。
- 要点 = 2~5 个 bullet:具体数字、版本号、CPU/ISA 名等可核验细节。
- 启发 = 1~2 句:直接告诉读者"如果你在做 X,下一步该 Y"——是最短但最有价值的段。
- 不再有优先级标记:所有入选事件都已通过 Step 4 的"特别关注点"筛选,标题里不加 🔥 / 🟡 / ⚪ emoji,事件元数据里不写"优先级"行。
- 排序按日期降序:最新事件在上,方便读者从头开始读。
- 不再有四、五、六、七节:不再做"按主题归档"、"补充事件附录"、"对工程师的 takeaways"、"原文链接合集"。Step 4 的强筛选已经把核心事件压到 8~15 条,二次组织对读者价值有限;URL 已在每个事件里,原文合集冗余。
Step 6 | 写入 output
- 文件名:
<board-slug>-<start>_<end>.md,例如编译器领域 llvm-2026-02-23_2026-05-23.md、搜推广领域 recall-2026-02-23_2026-05-23.md。
- 路径(领域-窗口 + 板块两级子目录):默认
<规则文件所在目录>/magazine-collect-output/<domain_slug>-<start>_<end>/<board-slug>/
- 领域 slug 按"调用约定"里的规则从规则文件名推导(如
compiler-magazine-collect.md → compiler);板块 slug 是规则文件该板块名的 kebab-case(如"LLVM 动态" → llvm、"异构计算" → heterogeneous)。
- 每次跑独立一个"领域-窗口"根目录——下个月再跑同一领域时,新窗口自动落到新目录里,历史月份的产物不会被覆盖,便于跨期对比。
- 如果领域-窗口目录或板块子目录不存在,创建 它们。
- 完整路径示例:
magazine-collect-output/compiler-2026-02-23_2026-05-23/llvm/llvm-2026-02-23_2026-05-23.md
magazine-collect-output/compiler-2026-02-23_2026-05-23/go/go-2026-02-23_2026-05-23.md
magazine-collect-output/recsys-2026-02-23_2026-05-23/rank/rank-2026-02-23_2026-05-23.md
- 同名文件已存在 → 加后缀
-v2、-v3(同一窗口同板块多次重跑场景):.../llvm/llvm-2026-02-23_2026-05-23-v2.md
Step 7 | 简短回复用户(带源覆盖账单)
跑完后给用户一段简短 summary,必须包含:
- 本次跑了哪些板块、各产出哪个文件路径
- 入选事件数(如"入选 11 条,候选 ~40 条")
- 源覆盖账单:规则文件 N 个源 → 跑通了哪 M 个、有哪些源被降级以及降级理由(与产物里"源覆盖表"一致,口语化)
- 是否建议用户复核某些"低置信"的条目(如只能从转述拿到的)
如果有源被你判断为降级(高噪声、内容外、抓取失败),单独提示用户:"X 源我自动降级了,理由是 Y,如不同意可以让我重跑且强制覆盖"——把决策权交还给用户。
mode=magazine 时,Step 7 在 Step 8 之后讲,summary 里要额外汇报"月刊已拼接到 magazine-collect-output/<domain>-<start>_<end>/magazine-<start>_<end>.md,共合并 K 个叶子板块、总入选 X 条事件"。
Step 8 |(仅 mode=magazine)拼接月刊
仅当用户调用模式为 magazine 时执行。single 模式跑完 Step 7 即结束。
完整月刊布局规范见 references/aggregate-template.md,必须读一次再写。本步关键约束:
8.1 输入
Step 1~7 跑完后 output/ 目录里有 K 份独立 digest md(每个叶子板块一份)。这一步不重新抓取,只做读取与拼接。
8.2 抽取规则
对每份独立 digest,抽取以下两个章节,但分别去往月刊的不同位置:
## 一、本期核心脉络(一句话总结) 整段 → 统一上移,汇总进月刊开头(目录之后)的 ## 本期全局脉络 总览区,按规则文件 section 顺序分组(多叶子大节用 **子板块名**:… 收敛成概览)。不要再把脉络留在各板块小节里。
## 二、核心事件(按日期降序,最新在上) 整段 → 进入对应板块小节,改写为 ### 核心事件,子事件标题从 ### YYYY-MM-DD | … 降为 #### YYYY-MM-DD | …(嵌套加深一级)
跳过 ## 〇、源覆盖表——这是单板块过程透明性的内容,不进月刊正文;月刊末尾用"全月覆盖速览"做合并精简版。
8.3 月刊层级(全局脉络上移)
排版顺序固定为:目录 → 本期全局脉络(汇总所有板块脉络)→ 各板块核心事件 → 全月覆盖速览。各板块小节里只放核心事件,不再各自带脉络。section 顺序与子板块嵌套按规则文件原始目录结构组织:
# 编译技术月刊 <YYYY-MM>(<start> ~ <end>)
## 目录
## 本期全局脉络 ← 紧跟目录,汇总所有叶子板块的核心脉络
### 一、<第一节标题> ← 单叶子 section 直接平铺脉络 bullet
- ...
### 三、<第三节标题> ← 多叶子 section 用 **子板块名**:… 收敛
- **Java**:...
- **Python**:...
## 一、<规则文件第一节标题> ← 板块正文只剩核心事件
### 核心事件
#### YYYY-MM-DD | ...
## 二、<规则文件第二节标题>
### 核心事件
## 三、<规则文件第三节标题> ← 多叶子时嵌套子板块
### 第三节·Java
#### 核心事件
##### YYYY-MM-DD | ...
### 第三节·Python
...
## 全月覆盖速览 ← 合并所有叶子板块源覆盖的精简表
8.4 全月覆盖速览(月刊末尾)
合并所有叶子 digest 的"〇、源覆盖表"为一张精简汇总表,列:
| 叶子板块 | 候选 → 入选 | 跑通源 / 规则列源 | 主要降级源(一句话理由) |
|---|
| LLVM | 40 → 11 | 4/4 | — |
| GCC | 25 → 8 | 3/3 | gcc-patches 邮件列表(高噪声) |
| AI 编译 | ~50 → 14 | 13/15 | OpenXLA / IREE blog(landing/教程页) |
详细单板块源覆盖表保留在各板块独立 digest 文件里,月刊正文不再重复。
8.5 月刊文件命名
- 路径:
magazine-collect-output/<domain_slug>-<start>_<end>/magazine-<start>_<end>.md(月刊落在"领域-窗口"根下,不进任何板块子目录——它是跨板块汇总产物)
- 同名已存在 →
magazine-<start>_<end>-v2.md(同独立 digest 命名规范)
- 示例:
magazine-collect-output/compiler-2026-02-23_2026-05-23/magazine-2026-02-23_2026-05-23.md
- 各叶子板块独立 digest 此时已落在
magazine-collect-output/<domain_slug>-<start>_<end>/<board-slug>/;月刊正文里的相对链接指向 ./<board-slug>/<board-slug>-<start>_<end>.md
8.6 月刊里的写作约束
- 月刊不引入新事件——所有事件都来自独立 digest,不要在拼接时临场补抓
- 月刊不再做事件三段式裁剪——背景/要点/启发等内容直接保留独立 digest 里的原文
- 月刊不加汇总分析段("对工程师的 takeaways"那种)——独立 digest 的"启发"已经够用,月刊层面再写一遍是噪声
- 月刊目录是必需的——K 个叶子板块挨着读容易迷路,目录给读者锚点跳转
- 月刊必须有「本期全局脉络」总览区——紧跟目录、领先所有核心事件,把各叶子脉络汇总在一处,让读者先建立全局认识再读各板块事件;不要把脉络打散回各板块小节
Step 9 |(仅 mode=html)生成 HTML 视觉版
仅当模式为 html 时执行。magazine 与 single 跑完 Step 8 即结束。
完整 HTML 模板规范见 references/html-template.md,必须读一次再写。本步关键约束:
9.1 触发与输入
mode=html:要求 magazine-<start>_<end>.md 已存在(即先跑过 mode=magazine);本步只基于月刊 md 转换出对应 HTML,不重新抓取、不重新生成 md
- HTML 文件与月刊 md 同目录并列存放,文件名后缀
.html:
magazine-collect-output/<domain>-<start>_<end>/magazine-<start>_<end>.html
- 不为单板块 digest 单独产 HTML——单板块阅读用 md 即可;HTML 是月刊级的视觉成品(含目录 + 全月覆盖速览 + 海报 banner)
9.2 HTML 模板核心要素
- 顶部海报 banner:突出
<领域>动态 大标题 + 副标题(时间窗 + 整理日期)+ 渐变背景
- 整体边框:外层
<div> 带 box-shadow + border-radius,营造"卡片"视觉
- 目录浮于左侧 / 顶部:保留月刊原目录,做锚点跳转
- 核心脉络高亮:用 callout 卡片样式
- 事件按日期分组:每个事件独立卡片,URL / 背景 / 要点 / 启发分块
- 邮件客户端兼容:内联 CSS(不要用外部 stylesheet 或
<style> 块——很多邮件客户端会剥离);优先用 table-based 布局兼容旧 Outlook
- CJK 字体:font-family 优先列
-apple-system, "PingFang SC", "Microsoft YaHei", "Segoe UI", sans-serif
- 不依赖外部资源:不引用任何 CDN / 图片外链 / Web Font——所有视觉用 CSS 实现
9.3 转换约束
- markdown 到 HTML 由 LLM 直接转换(用 Read 读 md + Write 写 html,全在 LLM 工作流内),不要为此写转换脚本
- 月刊 HTML 内嵌全文(与 md 1:1 对应),不省略事件细节、不裁剪事件三段式
9.4 产物用途与分发
HTML 落本地后由用户自行决定分发方式:
- 双击浏览器看 —— 离线预览,单文件 HTML 零外部依赖
- 打包成
.eml 邮件版 —— 走 mode=eml(详见 Step 10),生成可双击直接在邮件客户端打开的 .eml,正文即渲染好的杂志,填收件人即可发送
- 复制到邮件正文 —— Outlook / Foxmail / 钉邮 / 飞书邮箱等客户端的"插入 HTML"或直接粘贴富文本,再转发给团队
- 上传内部 wiki / 共享盘 —— 单文件 HTML,转贴方便
- 截图分享 —— banner + 卡片视觉适合截图发到 IM 群
说明:本 skill 内置 .eml 打包(见 Step 10),但不内置 SMTP 发送——.eml 是本地静态文件,由用户在自己的邮件客户端里登录账号后人工确认发送,skill 不掌握任何邮箱凭据。如团队需要"无人值守自动推送",请在 skill 外另写独立脚本,那是工程化范畴。
Step 10 |(仅 mode=eml)打包为 .eml 邮件文件
仅当模式为 eml 时执行。html 跑完 Step 9 即结束。
完整 .eml 打包规范见 references/eml-template.md,必须读一次再写。本步关键约束:
10.1 触发与输入
mode=eml:要求 magazine-<start>_<end>.html 已存在(即先跑过 mode=html);本步只基于月刊 HTML 套 MIME 信封,不重新生成 HTML、不重新抓取
- 输出
.eml 与月刊 HTML 同目录并列存放,文件名同 stem,后缀替换为 .eml:
magazine-collect-output/<domain>-<start>_<end>/magazine-<start>_<end>.eml
- 同目录额外落一个
build_eml.py 脚本,方便用户日后手动重跑(例如想改标题后重打包)
10.2 打包要点
- 用 Python 标准库
email.message.EmailMessage 生成 multipart/alternative 邮件,不要 hand-craft MIME 字符串——中文 Subject 的 RFC 2047 编码和 HTML 主体的 quoted-printable 都由标准库正确处理
From 字段留空——让邮件客户端用当前登录账号自动作为发件人,避免跨账号/跨用户跑 skill 时撞 From 不一致
To 字段留空——收件人由用户在客户端里填
- 同时塞
text/plain 兜底(一行说明),避免被反垃圾网关降权
- Subject = 月刊人话标题,与 HTML banner 主标一致(例:
编译技术动态 2026-05(2026-02-23 ~ 2026-05-23))
10.3 脚本与执行
- 用
Write 把 references/eml-template.md 里的脚本模板写到 build_eml.py,仅替换 {SUBJECT} 占位符
- 用
Bash 跑 python3 build_eml.py,确认输出 OK -> ....eml (... bytes)
- 用
head 校验头部含 Subject: =?utf-8?b?...?= 与 Content-Type: multipart/alternative
10.4 Step 7 summary 里要额外告诉用户
.eml 文件绝对路径
- 使用方法:"双击
.eml → 系统默认邮件客户端打开 → 标题与正文已就绪 → 填收件人 → 发送"
- 提示 Outlook 桌面版(Word 引擎)对
box-shadow / linear-gradient 支持有限,banner 渐变可能退化为纯色,但内容卡片正常
失败模式备忘(来自踩过的坑)
- 不要把 commit hash 当事件标题。 读者关心"发生了什么"不是 "abc1234"。
- 不要列只有标题没有要点的事件。 每条事件必须有 2~5 条要点,不然没价值。
- 不要漏事件三段式(背景/要点/启发)。 这是规则文件的硬要求,跳过任何一段都是 bug;但背景要 1 句话,启发要 1~2 句话,不要灌水。规则文件若扩展了额外段(如"工业界价值""学术界价值"),同样必写。
- 不要让单事件的"要点"段超过 10 行 bullet(含嵌套子项)。 大版本发布事件最容易踩这个坑——一堆子主题铺开数十行 bullet 让读者放弃读。超过 10 行就合并同类项或舍弃次要信息;读者要细节会点 URL,不需要在 digest 里读完整 release notes。详见
references/output-template.md 的"要点"段约束。
- 不要漏源覆盖表。 不写就等于让用户没有审计心智,跑了什么用户必须看得到。
- 不要替用户做降级判断。 想跳过某个源就明示并解释,不要默默跳过。
- 不要把无关条目硬塞进核心事件。 Step 4 已经定了筛选门槛,不命中"特别关注点"且无跨板块影响力的事件直接舍弃,不要补充到 digest 里凑数。
- 不要在抓不到原文时假装抓到了。 写"基于 X 的页面摘要整理"是诚实,"原文要点 ..." 是误导。
- 不要忽略规则文件的"特别关注点"。 这是入选的唯一硬筛标准;如果一份 digest 里看不出规则文件指定的特别关注点被显式照顾,整份产物就失去了核心价值。
- 不要自带预设领域关键词去筛事件。 Skill 主体不预设任何具体领域关键词,所有筛选标准都来自当前规则文件该板块的"特别关注点"字段;不要把过往跑过的领域(如编译器的"鲲鹏 / SVE")当作通用筛选词带到新领域。
- 不要加 emoji、优先级标签、主题归档、takeaways 段。 模板已精简到 〇/一/二,不要自作主张加回老格式。
- "近 3 个月"不是季度,是 90 天。 跨季度时不要硬切到自然季度边界。
mode=magazine 不要在拼接时临场补抓事件。 月刊只是各叶子 digest 的 脉络上移汇总 + 核心事件拼接 + 末尾全月覆盖速览,看到某板块事件少不要现场加;要补就回头改对应叶子 digest 然后重新拼接。
mode=magazine 不要拼上各叶子的"〇、源覆盖表"。 它属于过程透明性产物,应该合并精简到月刊末尾"全月覆盖速览",否则月刊正文一半都是表格。
mode=magazine 把各叶子「核心脉络」统一上移、汇总到目录之后的「本期全局脉络」总览区,不要再留在各板块小节。 这是本版月刊排版的核心:先给读者全局认识,再进入各板块核心事件。
mode=magazine 不要套用编译器月刊的板块层级。 月刊一级 section 与子板块嵌套必须按当前规则文件的实际目录结构生成,不要复用编译器月刊的"一、LLVM / 二、GCC / 三、Rust/Go/Java/Python/WASM ..." 默认骨架。
参考文件索引
主流程之外的所有细节都在下面文件里,需要时按需读:
references/fetch-strategies.md — 抓取策略与防爬应对(必读)。按通用源类型(项目官方/Weekly/代码仓/学术/公司新闻/技术媒体)给出抓取顺序、防爬绕行手册,以及"规则文件特别关注点的反向搜索增强"通用模式。
references/output-template.md — 单板块 digest 输出模板的字段级详细说明,含写作要求和反例。
references/aggregate-template.md — 月刊(mode=magazine)拼接布局规范,含目录生成、按规则文件实际板块结构动态生成层级标题、全月覆盖速览表格式、反例。Step 8 必读。
references/html-template.md — HTML 输出模板(mode=html),含海报 banner、边框、邮件客户端兼容性约束、内联 CSS 样例。Step 9 必读。
references/eml-template.md — .eml 邮件打包模板(mode=eml),含 Python EmailMessage 脚本模板、MIME 头部校验、邮件客户端兼容性矩阵。Step 10 必读。
references/sources-catalog.md — 抓取经验沉淀(信息源友好度/建议路径/替代源)。当前已沉淀编译器/语言/AI 编译类经验,新领域跑完后可逐步追加;不为任何领域占位。
examples/llvm-2026-02-23_2026-05-23.md — 一份真实的 LLVM 板块 digest,完整体现 〇/一/二 三段模板,作为输出 quality bar 的 few-shot 参考(结构与写作密度适用于任何领域,领域特定的关键词/对照对象只是 LLVM 这个 case 的具体填充)。
examples/compiler-magazine-collect.md — 月刊规则文件的 few-shot 范例,所有领域特定的关键词、信息源、关注点都沉淀在这里。用户写新领域规则文件时照搬其字段结构(信息源 / 初步筛选方式 / 筛选类别 / 特别关注点 / 总结和表达方式),把每一字段替换为新领域的具体内容即可。
如果你是第一次跑本 skill:至少先读 references/fetch-strategies.md 和 references/output-template.md,再读一遍 example,然后再开始 Step 1。如果是 mode=magazine,跑完 Step 7 进入 Step 8 前再读一次 references/aggregate-template.md。