本文用于给 AI 一个固定、完整、可重复执行的版本发布流程。
当用户在本仓库中引用本文,并明确说出类似下面的话时:
更新版本到 6.5.0按本文发布 6.5.0引用这个文件,把版本更新到 6.5.0 并发版AI 必须按本文执行,不能猜流程,不能跳步骤,不能只做一半。
AI 在收到“更新版本到 x.x.x”后,必须完成下面两段流程。
发布前流程。
修改 manifest.json 中的版本号。
提交本次准备发布的代码。
基于“上一个 GitHub Release 到当前 HEAD”的真实差异分析更新内容。
把发布文案先返回给用户看,且必须放在代码块里。
用户确认后的发布流程。 把用户确认过的文案作为 GitHub Release 正文发布。 发布完成后,再次从 GitHub 线上读取正文。 审查正文是否乱码、是否异常、是否与用户确认稿一致。 如果有问题,必须立刻修正后再汇报完成。
gh 是否存在、是否登录、是否在 PATH、是否可用,也不要先跑 gh auth status。直接使用固定路径命令执行。gh 固定路径使用:
$GH = 'C:\Program Files\GitHub CLI\gh.exe'
if (-not (Test-Path $GH)) {
throw 'gh.exe fixed path not found: C:\Program Files\GitHub CLI\gh.exe'
}
默认 GitHub 仓库固定为:
$Repo = 'QLHazyCoder/codex-oauth-automation-extension'
默认不编译、不跑测试。完成后提醒用户自行测试。
如果当前工作区里存在无法确认是否属于本次发布的改动,必须先停下来问用户,不能猜哪些该一起发、哪些不该一起发。
发布完成后,必须做一次“线上正文复检”,确认不是乱码,不是空正文,不是错误版本,不是错误标签。
AI 至少要从用户输入中拿到下面这些信息:
6.5.0如果用户没有给版本号,就不能猜。
每次执行本文时,先统一使用下面这组变量:
$GH = 'C:\Program Files\GitHub CLI\gh.exe'
if (-not (Test-Path $GH)) {
throw 'gh.exe fixed path not found: C:\Program Files\GitHub CLI\gh.exe'
}
$Repo = 'QLHazyCoder/codex-oauth-automation-extension'
$TargetVersion = '<用户指定的版本号,但是必须按照版本标准写,v+x.x.x。比如: v6.5.0>'
$TargetTag = "v$TargetVersion"
$ManifestPath = 'manifest.json'
先执行:
git status --short --branch
git remote -v
要求:
执行:
$Manifest = Get-Content -Path $ManifestPath -Raw | ConvertFrom-Json
$CurrentVersion = [string]$Manifest.version
$CurrentVersion
要求:
manifest.json 真实读取。示例校验:
if ([version]$TargetVersion -le [version]$CurrentVersion) {
throw "Target version $TargetVersion must be greater than current version $CurrentVersion"
}
先查 GitHub Releases:
$ExistingReleaseTag = ([string](& $GH api "repos/$Repo/releases?per_page=100" --jq ".[] | select(.tag_name == `"$TargetTag`") | .tag_name")).Trim()
再查本地 tag:
$ExistingLocalTag = ([string](git tag --list $TargetTag)).Trim()
再查最新一个正式 Release:
$LatestReleaseTag = ([string](& $GH api "repos/$Repo/releases?per_page=100" --jq "[.[] | select(.draft == false and .prerelease == false)][0].tag_name")).Trim()
$LatestReleaseVersion = if ($LatestReleaseTag) { $LatestReleaseTag.TrimStart('v') } else { '' }
规则:
示例校验:
if ($LatestReleaseVersion -and ([version]$TargetVersion -le [version]$LatestReleaseVersion)) {
throw "Target version $TargetVersion must be greater than latest released version $LatestReleaseVersion"
}
manifest.jsonAI 必须只把 manifest.json 中的 version 更新为目标版本。
执行:
git diff --stat
git diff -- manifest.json
如果工作区里还有其他变更,也要继续真实查看它们的 diff,确认是否属于本次发布内容。
规则:
提交信息统一使用:
chore(release): bump version to vX.Y.Z
示例:
git add -A
git commit -m "chore(release): bump version to $TargetTag"
提交后,必须记录真实提交哈希:
git rev-parse HEAD
执行:
$PreviousReleaseTag = ([string](& $GH api "repos/$Repo/releases?per_page=100" --jq "[.[] | select(.draft == false and .prerelease == false)][0].tag_name")).Trim()
$PreviousReleaseTag
规则:
如果仓库还没有任何正式 Release,再退回到本地最新 tag:
if (-not $PreviousReleaseTag) {
$PreviousReleaseTag = ([string](git tag --sort=-creatordate | Select-Object -First 1)).Trim()
}
如果仍然拿不到上一个版本,就按“首个版本发布”处理,并明确告诉用户这是首发版文案。
如果存在上一个版本,执行:
git log --oneline "$PreviousReleaseTag"..HEAD
git diff --stat "$PreviousReleaseTag"..HEAD
git diff --name-only "$PreviousReleaseTag"..HEAD
然后根据变更文件继续往下读真实 diff,不能只看 commit 标题。
必要时继续执行:
git diff "$PreviousReleaseTag"..HEAD -- <具体文件路径>
AI 必须基于真实 diff 和真实代码上下文,分析并提炼:
禁止行为:
在真正发布前,AI 必须把文案返回给用户确认。
返回给用户时,必须同时说明:
manifest.json 已改到哪个版本发布文案草稿必须放在代码块中,格式建议如下:
## vX.Y.Z
### 更新内容
- ...
- ...
### 修复与优化
- ...
- ...
注意:
发布前先把当前分支 HEAD 推到远端:
git push origin HEAD
不要直接把长正文硬塞进命令参数里,先写入临时文件。
示例:
$ReleaseNotesFile = Join-Path $env:TEMP "codex-release-$TargetVersion.md"
$Utf8NoBom = New-Object System.Text.UTF8Encoding($false)
[System.IO.File]::WriteAllText($ReleaseNotesFile, $ReleaseNotes, $Utf8NoBom)
执行:
& $GH release create $TargetTag `
--repo $Repo `
--target HEAD `
--title $TargetTag `
--notes-file $ReleaseNotesFile
要求:
vX.Y.Z。Release 创建完成后,必须立刻重新读取线上内容。
执行:
& $GH api "repos/$Repo/releases/tags/$TargetTag"
& $GH api "repos/$Repo/releases/tags/$TargetTag" --jq '.html_url'
& $GH api "repos/$Repo/releases/tags/$TargetTag" --jq '.tag_name'
& $GH api "repos/$Repo/releases/tags/$TargetTag" --jq '.name'
& $GH api "repos/$Repo/releases/tags/$TargetTag" --jq '.body'
复检重点:
尤其注意下面这些异常:
必须立刻修复,不准带病汇报完成。
修复示例:
& $GH release edit $TargetTag `
--repo $Repo `
--title $TargetTag `
--notes-file $ReleaseNotesFile
修复后,再重复执行一次“发布后线上正文复检”,直到线上内容正常为止。
AI 完成后,对用户的最终反馈至少要说明:
manifest.json 更新到哪个版本当用户引用本文并说“更新版本到 x.x.x”时,AI 必须按下面顺序执行:
manifest.json 版本号不能跳步骤,不能猜,不能偷懒。