关于 release-openspec
用于分步审计和执行 OpenSpec 发布流程的技能,可在后续调用中恢复进度。它检查 GitHub 实时状态,处理 changeset 与版本 PR 阶段,并验证发布产物,同时保留用户当前检出状态。
主要功能
- 01从 GitHub 审计发布状态
- 02跟踪 changeset 和版本 PR
- 03准备 changeset 拉取请求
- 04校验版本 PR 内容
- 05验证已发布的产物
适用场景
- 01检查发布准备情况和待办事项
- 02为已合并改动准备发布记录
- 03通过审核关卡后继续发布
- 04确认 npm、标签和 GitHub 产物
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ fission-ai/ openspec --skill release-openspec安装后在 Claude Code 中输入/release-openspec确认已加载。
附带文件agents/openai.yamlreferences/release-notes.md
详细介绍
发布 OpenSpec
将 OpenSpec 发布工作流作为可恢复的状态机运行。每次调用时都检查 GitHub 实时状态,并且只执行下一步安全操作。不要假设先前的调用已完成。
原则
- 将
Fission-AI/OpenSpec和origin/main视为发布的事实来源。 - 用户询问状态、准备情况或建议时,默认只进行只读审计。
- 用户要求发布、准备发布、继续或恢复时,视为已授权执行适用的发布操作。
- 保留用户的检出状态。绝不丢弃无关更改,也绝不只是为了准备变更集而切换用户当前分支。
- 如果检出状态有未提交更改,或当前不在
main分支上,则从当前origin/main创建临时工作树,用于提交发布相关更改。 - 绝不批准自己的 PR。人工审核是一个有意设置的关卡。
- 将进入合并队列视为中间状态,而非已合并。只有 GitHub 报告
mergedAt且该提交已出现在main上之后,才继续推进。 - 绝不手动创建自动生成的 Version Packages PR。该 PR 由 Changesets 操作负责。
- 绝不为了重新触发 CI 而推送空提交。应先诊断运行失败或缺失的原因。
- 暂停时,报告 URL、当前达到的状态以及所需的具体人工操作。
了解两种 PR 类型
在输出和决策中明确区分:
- Changeset PR:由人员正常创建的 PR,其中添加一个或多个
.changeset/*.md文件。优先在功能或修复 PR 中添加变更集;仅当已合并的工作应纳入发布时,才创建补充变更集 PR。 - Version Packages PR:自动生成的
changeset-release/mainPR,标题为chore(release): version packages。合并更改集或向main添加更改集,都会更新同一个 PR。合并此 PR 即会发布稳定版。
存在尚未关闭的 Version Packages PR,并不妨碍创建补充变更集 PR。这意味着只有审计发现了尚未纳入发布、且值得发布的工作时,补充 PR 才有用。该 PR 合并后,等待现有 Version Packages PR 更新。
从发布审计开始
-
验证仓库和工具:
- 使用
gh repo view --json nameWithOwner,url确认 GitHub 仓库。 - 执行写入操作前,确保已通过
gh、git和pnpm完成身份验证。 - 如果规范仓库不是
Fission-AI/OpenSpec,则停止所有发布变更操作。
- 使用
-
刷新信息,但不要修改工作树:
git fetch origin main不要不加区分地获取所有标签。此仓库可能存在冲突的历史本地标签,导致
git fetch --tags失败,即使origin/main已成功获取也是如此。 -
找到最新的稳定版 GitHub Release。排除草稿和预发布版本;不要使用
git describe,因为 beta 标签可能比稳定版基线更新。gh release list --repo Fission-AI/OpenSpec \ --exclude-drafts --exclude-pre-releases --limit 100 \ --json tagName,publishedAt \ --jq 'max_by(.publishedAt) | {tagName, publishedAt}'确保该稳定标签在本地可解析,然后再将其用作
git log的边界。如果缺少该标签,只获取该标签。如果同名本地标签与规范远程标签不一致,请报告差异并单独解析规范提交;审计过程中绝不要强制改写用户的标签。 -
查找未关闭的发布相关 PR:
gh pr list --repo Fission-AI/OpenSpec --state open \ --head changeset-release/main \ --json number,title,headRefName,baseRefName,url,reviewDecision,statusCheckRollup根据
headRefName == "changeset-release/main"识别 Version Packages PR,而不只看标题。另行列出可能的 changeset PR 并检查其文件;必须确认.changeset/*.md中有新增内容。不要把 Version Packages PR 删除的 changeset 误认为作者编写的 changeset,也不要仅凭标题判断,因为功能或修复 PR 也可能添加发布跟踪信息。 -
阅读实时发布策略
.changeset/README.md、origin/main上待处理的.changeset/*.md文件,以及存在时的 Version Packages PR 正文和文件。 -
列出自最新稳定标签以来的第一父级提交:
git log --first-parent --date=short \ --pretty=format:'%h%x09%ad%x09%s' <stable-tag>..origin/main -
将值得发布的已合并 PR 与现有 changeset 对应起来。使用 PR 文件和 changeset 历史;不要仅凭措辞相似就推断已覆盖。
-
将审计分类为:
missing-tracking:计划在本次发布中包含的面向用户的工作缺少 changeset;awaiting-changeset-review:已有合适的 changeset PR;awaiting-merge-queue:已批准的 changeset 或 Version Packages PR 正在合并队列中,但尚未进入main;awaiting-version-update:所需 changeset 已在main上,但 Version Packages PR 尚未纳入这些 changeset;awaiting-version-review:Version Packages PR 已是最新,但尚未获批;ready-to-publish:Version Packages PR 已是最新、已获批且检查通过;publishing:Version Packages PR 已合并,但发布产物尚未齐备;needs-finalization:npm 包、标签和 GitHub Release 均已就绪,但发布说明仍是原始内容;complete:包、标签、GitHub Release 和润色后的发布说明一致。
提供一份简洁的审计结果,包含稳定版基线、拟议版本、已覆盖内容、可能的遗漏、有意跳过的内部工作或文档工作、未关闭的 PR,以及下一步操作。
判断 changeset 覆盖范围
遵循 .changeset/README.md,不要假设每个已合并 PR 都需要 changeset。
纳入选定用于发布跟踪的工作,尤其是:
- 面向用户的新功能或命令;
- 重要修复或热修复;
- 破坏性变更或弃用;
- 用户可见的性能改进。
通常跳过仅涉及文档、测试、CI 或工具,以及内部重构的工作。对于面向用户与否存在歧义的变更,应予以标记,不要默默排除。只有当歧义会实质性改变发布范围或语义化版本时,才询问用户;否则自行判断,并通过 PR 审查作为审批关卡。
创建或继续变更集 PR
仅对 missing-tracking 执行此操作。
-
如果已有开放的变更集 PR 涵盖了缺失的工作,请复用该 PR。检查其
headRefName、头部分支所属仓库和maintainerCanModify;从其所属仓库将确切的头部分支拉取到临时工作树,在那里进行更新,并推送回同一个 PR 的头部分支。如果该分支不可写,则停止。不要创建重复 PR 或替代分支。 -
编写前立即阅读
.changeset/README.md。 -
仅当不存在合适的 PR 时,才从当前的
origin/main创建一个简短的changeset-<scope>分支。使用临时工作树,以免改动操作员的检出目录。 -
每个连贯的发布单元优先使用一个变更集。单个补齐变更集可以概述为同一发布选择的多个小项。
-
使用准确的包名
"@fission-ai/openspec"、所需的最高语义化版本更新级别、仅包含相关标题,以及面向用户的描述。 -
推送前进行验证:
pnpm exec changeset status -
提交、推送并创建 PR;PR 正文须列出所涵盖的已合并 PR,并说明为何需要补齐变更集。
-
返回 PR URL 并请求人工批准后即停止。不要自行批准。
后续调用时,如果 PR 已获批准且检查均通过,则仅当用户要求继续或完成发布时,才合并或加入队列。如果 GitHub 使用合并队列,请检查 mergeQueueEntry、队列检查和 mergedAt;在 PR 确实合入 main 之前,保持 awaiting-merge-queue 状态。然后等待 Changesets action 更新 main 上现有的 Version Packages PR。简要汇报进度并轮询;不要推送空提交或再次更新分支,因为这可能撤销批准并使队列重新开始。
验证 Version Packages PR
确认其已就绪前:
- 确认该 PR 的目标分支是
main、来源分支是changeset-release/main,并且由预期的自动化流程生成。 - 枚举当前
main上所有待处理的.changeset/*.md文件,排除.changeset/README.md。验证 PR 已消耗全部这些文件,并包含对应的变更日志内容。如果任何待处理变更集应推迟处理,则停止:通过单独审核的更改移除或修订它,并等待自动化流程重新生成 Version Packages PR 后再继续。 - 使用
gh pr view获取baseRefOid和headRefOid,要求baseRefOid与当前的origin/main一致,并为两个修订版本创建干净的分离式临时工作树。如果本地缺少头部对象,先拉取不可变的pull/<number>/head引用。切勿在操作员当前的工作树中进行验证。 - 在基础版本的工作树中运行
pnpm exec changeset status --output changeset-status.json,并从该文件读取预期的包和版本。如果临时工作树中没有可用的 Changesets CLI,先安装锁定的依赖项。 - 比较基础版本的状态和完整的待处理变更集集合与头部工作树:
package.json、CHANGELOG.md、已移除的变更集文件、PR 正文和拟议版本必须全部一致。这是基础版本到头部的比较,因为头部已消耗这些变更集,无法自行计算待发布内容。 - 验证后移除临时工作树,然后使用
gh pr view/gh pr checks检查所有必需的检查和审核状态。
如果内容是最新的但尚未获批,返回 URL 并等待人工批准。如果已获批且检查通过,则仅当用户要求发布或继续时,才合并或加入队列。启用合并队列时,不要将批准、启用自动合并或进入队列视为稳定的发布触发条件;等待 mergedAt,并确认合并已进入 main。
验证稳定版发布
Version Packages PR 合并后:
- 找到对应合并提交的发布工作流运行记录,并等待其完成。
- 分别验证以下 3 项:
npm view @fission-ai/openspec@<version> version- 远程标签
v<version>指向预期的提交; gh release view v<version>存在,且不是预发布版本。- 发布版本的资源中包含 8 个
openspec-*独立二进制文件和SHA256SUMS。这些资源由 Binaries 工作流(binaries.yml)在发布版本发布约 10 分钟后附加。在SHA256SUMS就绪之前,安装脚本会继续安装上一个发布版本,因此用户始终有可用版本。
- 如果只有部分资源存在,请报告当前状态,并在重试任何发布操作之前继续验证。绝不要重新发布已在 npm 上发布的版本。缺少二进制文件时无需执行 npm 操作:使用
workflow_dispatch和发布标签重新运行binaries.yml,以附加这些文件。 - 所有资源就绪后,阅读 references/release-notes.md,润色 GitHub Release,并验证已保存的标题和正文。
发布 Beta 版
仅在用户明确要求 Beta 版或预发布版本时进入此流程。
- 执行相同的审核,并确认待处理的 changeset 会生成下一个稳定版本。
- 说明发布 Beta 版不会消耗 changeset,也不会取代稳定版 Version Packages PR。
- 在
main上触发现有的release-prepare.yml工作流;不要在本地计算或设置 Beta 版版本号。 - 验证工作流选定的版本、npm
betadist-tag、远程标签和预发布版 GitHub Release。 - 用户要求发布 Beta 版时,不要合并稳定版 Version Packages PR。
处理失败
- 对于 CI 失败,先检查失败的检查项和日志,再提议重新运行或更改代码。
- 对于过期的 Version Packages PR,先确认在最新 changeset 到达
main后,release-prepare.yml已成功运行push。 - 对于分支分歧,让 Changesets 操作更新其分支。不要强制推送
changeset-release/main。 - 对于排队中的 PR,检查合并组检查和队列状态。如果进展正常,不要重新入队、更新分支或重新运行无关检查。
- 对于已存在于 npm 上的版本,请停止操作并协调标签/GitHub Release,而不是隐式递增版本号或重新发布。
- 对于缺少 GitHub 权限或必需审核的情况,报告具体门槛和 URL;保留检测到的状态,以便下次调用时可以通过检查继续处理。
完成报告
报告以下内容:
- 已发布的版本及稳定版/Beta 版渠道;
- changeset PR 和 Version Packages PR 的 URL(如适用);
- 发布工作流结果;
- npm 包、标签和 GitHub Release 的验证结果;
- 发布说明的最终定稿状态;
- 有意延后的任何更改。