用途
该技能把最近一段时间的提交与已合并 PR 转化为一份面向用户的变更日志。它的核心理念是:变更日志不等同于提交日志,按 conventional 前缀分组的原始提交转储是噪音反模式,用户无法分辨哪些改动重要。因此本技能输出 Keep a Changelog 风格的摘要:分类清晰、使用通俗英文、突出破坏性变更、过滤内部杂项。
两种运行模式
技能通过 ${var} 选择器决定运行分支:
- 留空:in-repo 模式(分支 A),扫描 memory/watched-repos.md 中列出的所有仓库。
- owner/repo(裸 slug):in-repo 模式,仅扫描该单个仓库。
- push-to:owner/website-repo:push-to 跨仓库模式(分支 B),website 为 owner/website-repo,product 来自配置中的 product_repo。
- owner/product->owner/website(箭头形式):跨仓库模式,product 与 website 仓库均显式指定。
判别规则:带 push-to: 前缀或 -> 箭头走分支 B;其余(空或裸 owner/repo)走分支 A。
分支 A:in-repo 变更日志
在仓库内写入一份分类整理的变更日志文章,不涉及跨仓库 PR,无需 GH_GLOBAL。
- 从 memory/watched-repos.md 读取仓库列表;若文件不存在则中止并通知,不静默创建。
- 选定扫描集合后,按 UTC 7 天前计算 SINCE,检测默认分支(不假设为 main),拉取该窗口内的提交与已合并 PR。
- 每个仓库独立处理失败,用 sources 字典记录 ok/empty/fail 状态。
- 过滤噪音:机器人作者、重复的合并提交、成对 revert、纯自动生成提交,并统计被过滤的提交数。
- 按 Keep a Changelog 分类:⚠️ Breaking、Added、Changed、Fixed、Security、Internal(Internal 仅显示一行计数)。Deprecated 和 Removed 仅在确实存在时列出。
- 将每条改写为用户语言:去除 type(scope): 前缀、改为过去时用户陈述、合并相关提交、每条一句话不超过 20 词、附一个链接引用(优先 PR 编号,退化到短 sha)。
- 组装文章保存至 output/articles/changelog-${today}.md,并为每个仓库生成 Highlights。省略空分类,空仓库可省略整节,失败仓库插入占位说明。
- 通过 ./notify 发送一段简洁通知,零用户可见变更时发送 CHANGELOG_QUIET,全部仓库失败时发送 CHANGELOG_ERROR 并以非零状态退出。
分支 B:push-to 跨仓库变更日志 PR
把产品近期已合并的 PR 作为变更日志发布到产品的官网/文档仓库,通过官网仓库的分支 + PR 实现。该分支需要 GH_GLOBAL(具备对官网仓库跨仓库写权限的 token);仅 GITHUB_TOKEN 无法推送到官网仓库。此分支由配置驱动,从 memory/docs-sync.md 读取仓库信息,不硬编码任何仓库名、账号或提交身份。
配置项包括:product_repo、website_repo、min_prs(默认 1)、lookback_days(默认 7)、draft(默认 true)、git_user_name / git_user_email(默认 aeon / aeon@users.noreply.github.com)。
- 按 lookback_days 计算窗口截止时间,拉取最近 50 个已关闭 PR 并只保留窗口内已合并的,按合并时间倒序。
- 读取已发布内容实现幂等:克隆官网仓库读取 app/changelog-data.ts,收集 PUBLISHED_PR_NUMBERS,只保留未发布的 PR 编号。PR 编号是幂等键而非日期,因此同窗口内重复运行安全且不会重复。
- 新集合为空则静默退出 DOCS_SYNC_NOTHING_NEW;数量低于 min_prs 则退出 DOCS_SYNC_BELOW_THRESHOLD。
- 分类并撰写条目:区分 Highlights(面向用户的特性/修复)与维护类噪音(dependabot、chore(deps) 等归入一条维护汇总,但仍进 prs 数组以保持幂等)。
- 组合一个 ChangelogEntry:date、4–8 词的主题 title、1–2 句 summary、每条不超过 18 词的 highlights、完整 prs 数组。禁用营销套话(exciting、robust、leverage 等),所有生成字符串仅用 ASCII 连字符(em/en dash 替换为 -)。
- 应用到官网上:正常运行时只修改 app/changelog-data.ts,将新条目前插;bootstrap 运行时(无该文件)创建数据文件与 app/changelog/page.tsx 渲染页,并复用站点现有导航、页脚、CSS 模块与元数据约定,在 docs 页加 Recent changes 区块并在主导航加变更日志链接。
- 强制格式化:官网 CI 运行 format:check 门禁,每次运行提交前必须用仓库格式化工具格式化改动文件。
- 若可用则运行 lint / tsc / build 并修复引入的错误,npm 不可用则跳过并在 PR 正文注明。
适用场景
适用于维护多个仓库、需要定期对用户发布清晰变更说明的团队,或需要把产品仓库的已合并 PR 自动同步到官网/文档站点变更日志页的场景。
限制
跨仓库模式需要 GH_GLOBAL token,仅 GITHUB_TOKEN 无法推送到官网仓库。in-repo 模式依赖 memory/watched-repos.md 存在。gh 失败时不回退到 WebFetch(公共 API 有限流且增加噪音)。涉及 Next.js 站点文件创建与修改的具体设计需匹配站点已有约定,不新建设计系统。部分配置细节(如具体超时未在资料中给出)暂未提供。