用 Awesome Copilot 的 Release Notes Showcase 插件撰写可发布级 Release Notes:安装、数据模型与邮件导出全解析
【免费下载链接】awesome-copilotCommunity-contributed instructions, agents, skills, and configurations to help you make the most of GitHub Copilot.项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-copilot
在 GitHub Copilot 的扩展生态中,Awesome Copilot(仓库GitHub_Trending/aw/awesome-copilot)汇聚了大量社区贡献的 instructions、agents、skills 与配置。其中Release Notes Showcase是一个以 Copilot 扩展 Canvas(画布)形态交付的发布说明工作台:它从 Git 标签、提交历史和 GitHub Pull Request / Issue 数据中自动生成发布说明草稿,以可视化面板进行校对与精修,并一键导出为邮件 HTML / 纯文本。阅读完本文,你将掌握该插件的安装方式、完整的数据输入模型、发布草稿的生成链路,以及如何通过 Canvas 上的 Agent Action(export_email、get_release_snapshot)把发布内容接入自动化发布流程。
插件定位与安装
插件本身由两部分构成:位于 plugins/release-notes-showcase/plugin.json 的插件清单(com.github.awesome-copilot扩展点声明),以及位于 extensions/release-notes-showcase/ 的真实扩展实现。插件描述为:“Compose and refine launch-ready release notes with contributor callouts and export-friendly output.”——即面向发布时刻、自带贡献者致谢板块、输出便于导出分发。
在支持 Copilot 插件市场的环境中,安装命令为:
copilot plugin install release-notes-showcase@awesome-copilot安装后,Copilot 会话即可识别release-notes-showcase这个 Canvas 并提供给 Agent 调用。插件清单中的关键词(changelog、contributor-callouts、email-export、launch-summary、product-updates、release-notes)也反映了它的能力边界:变更日志、贡献者点名、邮件导出、发布摘要。
说明:扩展实现依赖 @github/copilot-sdk 中
"@github/copilot-sdk": "1.0.1"),并基于 SDK 的 Canvas 机制注册,源码入口为 extensions/release-notes-showcase/extension.mjs:通过joinSession({ canvases: [releaseNotesShowcaseCanvas] })将画布挂载进会话。
画布与数据模型:一个可编程的 Release Notes 结构
Canvas 的注册位于 extensions/release-notes-showcase/releaseNotesShowcase.mjs,使用createCanvas({ id: "release-notes-showcase", ... })定义。其inputSchema(L15-L101)定义了整份发布说明的数据结构,这是 Agent 向画布注入内容时唯一被允许的字段集合(additionalProperties: false会拒绝未知字段):
| 字段 | 类型 | 说明 |
|---|---|---|
releaseName | string | 发布名称,如仓库展示名 |
version | string | 版本号,如v1.2.0或vNext |
releaseDate | string | 发布日期 |
tagline | string | 一句话卖点(邮件头部与画布英雄区展示) |
summary | string | 发布摘要(同时作为默认 preheader) |
emailSubject | string | 邮件主题 |
emailPreheader | string | 邮件预览文本 |
heroStats | array | 顶部指标卡,元素{ label, value }均必填 |
sections | array | 发布章节,元素{ title, summary }必填,可选kind、metric、bullets |
contributors | array | 贡献者名单,name必填,可选githubHandle、avatarUrl、profileUrl、area、summary |
communityThanks | array | 社区致谢的 GitHub 用户名列表(字符串) |
otherChanges | array | 其他零散变更,text必填,可选label |
callToAction | object | CTA 按钮,label、url均必填 |
其中sections.kind是一个受约束的枚举,只能取三个值,对应发布说明的三种内容基调:
kind: { type: "string", enum: ["feature", "improvement", "quality"] }feature:新能力与面向用户的功能(画布中显示为蓝色渐变标记,标签 “🚀 Feature work”);improvement:稳定性、性能与可靠性改进(紫色,标签 “✨ Improvement”);quality:基础维护与代码质量收尾(橙色,标签 “🛡️ Quality”)。
这三种 kind 也直接决定了邮件模板中章节徽章(badge)与配色的选取(emailAccent,见 L2304-L2323)。
发布数据从哪来:Git 历史 + GitHub API 双重数据源
画布不会要求你手动录入所有内容。当它被打开时,会先解析当前会话所在的仓库上下文,再按“加载已发布 Tag”或“草拟未发布内容”两种模式生成草稿。整个数据装配逻辑集中在buildReleaseFromRepository(L572-L618)。
仓库上下文解析
resolveRepositoryContext(L151-L173)按优先级依次探测仓库根目录:会话工作目录 → 会话元数据(~/.copilot/session-state/<sessionId>/vscode.metadata.json或workspace.yaml中的cwd:)→process.cwd()→ 扩展自身目录;随后向上逐级查找含.git的目录(findRepositoryRoot,L175-L194)。拿到根目录后,通过git config --get remote.origin.url读取远端地址(L196-L206),并用正则解析出owner/repo形式的仓库 slug(parseRepositorySlug,L208-L224,同时支持 HTTPS 与 SSH 两种格式),仓库名经humanizeRepoName转成展示名。
两种草稿模式
- Tag 模式:读取按创建时间倒序的标签列表(
git tag --sort=-creatordate,L295-L305),选定某个 Tag 后取其上一个 Tag 作为比较基线,用git log <prev>..<tag>拉取提交(L572-L595)。若没有上一个 Tag,则退化为该 Tag 自身的历史。 - Unreleased 模式:以最近 Tag 到
HEAD(<latest>..HEAD)的提交为主体(L597-L617),同时调用 GitHub REST API 拉取自最近 Tag 日期以来合并的 PR 与关闭的 Issue——两者分别命中GET /repos/{owner}/{repo}/pulls?state=closed&sort=updated&per_page=100和GET /repos/{owner}/{repo}/issues?state=closed&since=<iso>&per_page=100(L527-L570)。请求会优先使用GITHUB_TOKEN或形如COPILOT_GH_ACCOUNT_github_2E_com_*的环境变量注入 Bearer 认证(getGitHubToken,L484-L494)。
提交摘要的读取上限为 250 条(git log --max-count=250 --pretty=format:%s%x1f%an,L312-L332),并用分隔符把主题与作者分开;随后cleanCommitSubject会剥掉 Conventional Commits 前缀(如feat(scope):)和结尾的 PR 编号(#123),得到干净的标题文本。
提交自动归类
每一条提交会经过classifyCommit(L341-L352)打上feature/improvement/quality标签:
- 主题以
feat、feature开头,或包含add、introduce、support、new→feature; - 以
fix、perf、refactor开头,或包含improv、stabil、reliab、optim→improvement; - 其余全部归入
quality。
随后toReleaseStateFromCommits(L354-L482)把归好类的提交装配为结构化状态:每个分类生成一个章节(如 “Feature work shipped”“Improvements and fixes”“Quality and maintenance updates”),取前 6 条作为 bullets;合并的 PR 单独生成 “Merged pull requests” 章节;贡献者按提交次数降序取前 6 名生成contributors卡片;其余提交与关闭的 Issue 落到otherChanges。顶部指标heroStats默认汇总Commits / Merged PRs / Closed issues / Features四项数据。
画布交互:从草稿到定稿的可视化工作流
Canvas 打开后会在本机启动一个监听127.0.0.1随机端口的 HTTP 服务(startServer,L1104-L1166),并返回画布 URL。服务端暴露四个路由:
| 路由 | 方法 | 作用 |
|---|---|---|
/ | GET | 渲染画布主页面(renderHtml) |
/actions/export-email | POST | 按format返回邮件载荷 |
/actions/release-options | GET | 返回仓库 slug、Tag 列表与最新 Tag |
/actions/load-release | POST | 按mode: tag \| unreleased重建草稿状态 |
画布页面本身(renderHtml)由几个区块构成:
- Hero 区:发布名、版本徽章、tagline、summary、发布日期,以及一个 “Top hit” 头条(取首个章节标题);
- Release dashboard:右侧指标卡墙,展示
heroStats,配色取自一套圆角调色板; - Release source:Tag 下拉选择器与两个按钮——“Load selected release”(加载已发布 Tag)与“Draft unreleased”(草拟未发布内容);
- Top hits:按 kind 着色的章节卡片网格,每条卡片展示徽章、指标与最多 2 条 bullets;
- Also in this release:
otherChanges列表,带彩色标签; - Contributors:贡献者卡片(头像、GitHub 昵称、贡献领域与摘要),以及带头像的 Community thanks 徽章墙;
- Email export:实时预览 Subject / Preheader / CTA,并提供 Copy / Download HTML 与纯文本按钮。
两个 Agent Action:把发布内容接进自动化流程
除了页面上的按钮,同一套能力还以 Copilot Agent Action 的形式暴露给模型(L626-L668),这意味着 Agent 可以在对话中直接调用它们,把发布说明送入后续的自动化工作流:
export_email
返回“可直接用于邮件发送”的载荷,输入format为html/text/both(默认both,schema 见 L103-L112)。返回体包含subject、preheader、fileNameBase(由slugify("${releaseName}-${version}-release-notes-email")生成,见 L857-L876),以及按需附带的html/text。若画布尚未打开,会抛出canvas_state_missing错误,提示先打开画布。
get_release_snapshot
返回一份精简快照:title({releaseName} {version})、summary、各章节的title与kind、以及贡献者姓名列表——适合 Agent 快速读取当前发布故事的摘要,用于会议总结、PR 描述或自动化报告中引用。
邮件模板的工程细节
buildEmailHtml(L878-L1056)生成一封邮件客户端友好的 HTML:顶部隐藏的 preheader、渐变头部、hero 指标四宫格、带徽章的章节列表、“Also in this release” 列表、“Contributors in the spotlight” 贡献者卡片与社区致谢链接、底部 CTA 圆角按钮;所有动态文本都经过escapeHtml(L2334-L2341)转义,防止注入。buildEmailText(L1058-L1102)则输出对应的纯文本版本,二者内容结构完全对齐。
源码结构与二次阅读指引
理解这个插件最直接的方式是按以下顺序阅读实现文件:
- extensions/release-notes-showcase/extension.mjs——扩展入口,
joinSession注册 Canvas; - extensions/release-notes-showcase/releaseNotesShowcase.mjs——核心实现,约 2300 行,包含数据 schema、Git/GitHub 数据装配、邮件生成与画布渲染四大部分;
- plugins/release-notes-showcase/plugin.json——插件清单,声明了名称、作者、关键词、logo 与扩展引用;
- plugins/release-notes-showcase/README.md——插件层面的安装与说明文档。
整体来看,Release Notes Showcase 的典型使用闭环是:打开画布 → 用 “Draft unreleased” 从仓库历史自动生成草稿 → 在画布上核对章节分类与贡献者名单 → 通过export_email或页面按钮导出 HTML/纯文本 → 将同一份载荷接入 Agent 驱动的发布邮件与更新公告流程。由于画布基于@github/copilot-sdk的createCanvasAPI 构建,且数据模型完全结构化,它也可以作为参考模板,帮助你基于仓库历史打造自己的发布工作流扩展。
【免费下载链接】awesome-copilotCommunity-contributed instructions, agents, skills, and configurations to help you make the most of GitHub Copilot.项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-copilot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考