Skip to content
Back to skills

Release

ASecurity

CGswitch 发版流水线(**默认仅本地 commit 为止**):AI 读 CHANGELOG 历史与 git 三态(最新 tag / HEAD VERSION / working tree VERSION),CHANGELOG 草稿以**实际代码 diff**(`git diff <上一tag>..HEAD` 逐文件阅读)为唯一依据、commit 信息不可信,**单次弹窗合并确认** bump 级别 + CHANGELOG 草稿(一次 AskUserQuestion 问完)→ 确认后**一次性执行**:跑 `node scripts/bump-version.mjs <level>`(**禁止手写**)→ 写入 CHANGELOG + 本地 commit。**写入本地 commit 即终止**;AI 不主动询问、不主动执行任何 push / 盯构建 / 发布动作。Release 工作流**只手动触发**:push main / push tag 都不自动构建;dispatch 传 `release_mode` 三选一——draft(默认)构建完停在草稿、公开发布仍须用户确...

  • 4 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added October 2, 2026
ai-agentsgobashnodegitdatabase

Security analysis

A100/100

Scanned October 2, 2026

npx -y skills add zeno528/CGswitch --skill release --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Release?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Release
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/zeno528-release/badge)](https://www.skillsdirectory.com/skills/zeno528-release)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: release
description: CGswitch 发版流水线(**默认仅本地 commit 为止**):AI 读 CHANGELOG 历史与 git 三态(最新 tag / HEAD VERSION / working tree VERSION),CHANGELOG 草稿以**实际代码 diff**(`git diff <上一tag>..HEAD` 逐文件阅读)为唯一依据、commit 信息不可信,**单次弹窗合并确认** bump 级别 + CHANGELOG 草稿(一次 AskUserQuestion 问完)→ 确认后**一次性执行**:跑 `node scripts/bump-version.mjs <level>`(**禁止手写**)→ 写入 CHANGELOG + 本地 commit。**写入本地 commit 即终止**;AI 不主动询问、不主动执行任何 push / 盯构建 / 发布动作。Release 工作流**只手动触发**:push main / push tag 都不自动构建;dispatch 传 `release_mode` 三选一——draft(默认)构建完停在草稿、公开发布仍须用户确认,prerelease=构建完自动预发行,latest=构建完自动正式发行并通知关注者。当用户说"发版"、"发行"、"release"、"发个新版本"、"发布新版本"时使用。
---

# CGswitch 发版

分工:本 skill 做需要判断的部分——bump 级别建议、CHANGELOG 内容草稿(段落标题 `## [版本] - 起草日` 由 Agent 写、经用户合并确认)、本地 commit、跑 bump-version 命令;`.github/workflows/release.yml` 做确定性的部分——校验(含 CHANGELOG 第一段版本号 == VERSION 的 fail-fast 校验)、三平台构建、创建 tag 与发行页(发行说明 = CHANGELOG 第一段原文照抄)、上传资产。**工作流不回写 main**;CHANGELOG 无归档步骤。草稿不会通知关注者;执行发布那一刻 GitHub 才给关注者发通知邮件。

工作流**只手动触发**(`workflow_dispatch`),无任何自动触发器:push main / push tag 都不构建——发版是显式决策。触发时传 `release_mode` 三选一:`draft`(默认)构建完停在**草稿**,等人工发布;`prerelease` 构建完自动预发行(不占 latest 指针);`latest` 构建完自动正式发行并通知关注者。每次 dispatch 只产生**一条** run(headBranch=main)。工作流用 `GITHUB_TOKEN` 代建 tag,不会递归触发自身。

## 默认流程边界

**Step 0–1 是默认范围**:收集信息 + 单次弹窗合并确认(bump 级别与 CHANGELOG 草稿一次问完) + 一次性执行(bump → 写 CHANGELOG → commit)。**Step 1 写入本地 commit 即终止。**

Step 2–4(push / 盯构建 / 发布)属于扩展流程,**必须用户明确启动**才执行,常见触发词如"继续"、"push"、"推上去"、"触发构建"、"发布"、"发版(确认发布)"。**用户不说就停手**——AI 在 Step 1 之后只汇报 commit 结果,**不主动询问也不主动执行**任何扩展动作。

**角色分工硬约束**:

- **AI**:给 bump 级别建议 + 起草 CHANGELOG;用户合并确认后跑 `node scripts/bump-version.mjs <level>`、写入 CHANGELOG、commit。**不**直接编辑 `VERSION` / `package.json` / `src-tauri/Cargo.toml` / `src-tauri/tauri.conf.json`。
- **CHANGELOG 段落标题 = `## [<新版本号>] - <起草日>`**:版本号用 bump 后的 A.B.C(必须与 VERSION 一致——工作流照抄发行说明前会校验,不一致 fail-fast 拒绝构建);日期写起草当天。若 push/dispatch 推迟且在意日期准确性,dispatch 前顺手改这一行。
- **用户**:在单次弹窗里合并确认 bump 级别(可改 AI 建议)与 CHANGELOG 文案(可改)。
- **只问一次**:bump 级别定了之后 CHANGELOG 标题里的版本号随之确定(两问仍互不阻塞),必须在**同一次** AskUserQuestion 调用里作为两个问题一起确认;确认后一口气执行完毕,中途不再询问。仅当用户对某一项给出修改意见时,才**只对该项**重新弹窗确认(另一项沿用已确认值,不重复问)。
- **确认必须弹窗(硬约束)**:所有需要用户拍板的选择(Step 0 的版本号与 CHANGELOG、Step 4 发布确认),AI 在消息里展示完整详情后,必须用 **AskUserQuestion 弹窗**列出可选项让用户**点选**,禁止只发文本等自由回复。推荐选项放首位并标注(Recommended);完整详情(状态框、草稿全文、资产清单)仍先在弹窗前的消息里展示,弹窗选项的 description 放关键取舍信息。
- **发版 commit 只许发版文件(硬约束)**:见 Step 1 第 4 步——只 add 6 个发版文件,工作区其他改动一律不进本 commit。
- **递增必须跑脚本命令,禁手写**:`bump-version.mjs` 内已串联 `sync-version.mjs` 同步全部元数据文件,手写会漏。
- **版本号与日志基线 = GitHub 最新已发布 release(非 Draft)**:用 `gh release list --exclude-drafts --limit 1` 取其 tagName 作为唯一基线。分支测试构建的 Draft release 与带后缀的 tag(如 `v0.17.5-codex-3-plugin-optimize.7`)**不算发行**,不作为基线;该基线之后的全部用户可见变更都计入本次日志(即使部分内容曾在分支草稿构建中出现过)。版本号三态(基线 tag 解析出的版本号 + HEAD VERSION(`git show HEAD:VERSION`)+ working tree VERSION(读 `VERSION`))取**最大值**作为 bump 基线——用户在测试场景可能预先 bump,working tree 会领先 index / HEAD。
- **CHANGELOG 只认代码 diff,不认 commit 信息(硬约束)**:commit 标题/信息可能挂错(历史案例:标题写「优化发版流程描述」的提交实际改了 16 个代码文件)。起草草稿与进/不进清单必须以实际代码改动为唯一依据——先 `git diff <上一tag>..HEAD --stat` 总览,再逐个**代码文件**读完整 diff;commit 列表仅用于确定范围与计数,禁止作为内容依据。

本 skill 不限定分支:在任何分支触发都只执行本地流程(bump + CHANGELOG + commit)。分支切换、push、工作流触发、盯构建、发布由用户自行决定,AI 不主动执行也不主动询问。

## Instructions

### Step 0: 收集信息 + 单次合并确认(**等弹窗点选**,不修改任何文件)

1. 取基线 tag = GitHub 最新已发布 release(非 Draft):`gh release list --exclude-drafts --limit 1` 读其 tagName。分支测试草稿与带后缀的 tag 不算发行,不作基线(见上方硬约束)。
2. **git 三态确认基线**(取 max):
   - HEAD VERSION:`git show HEAD:VERSION`
   - working tree VERSION:读 `VERSION`
   - 最新 tag 解析出的版本号
   - 三者取 max 作为 bump 基线
3. 拉自上一 tag 起的 commit 列表:`git log <上一tag>..HEAD --oneline --no-merges`(首个版本用全部历史)——仅用于确定范围与计数。**CHANGELOG 内容禁止依据 commit 标题/信息**:必须逐文件阅读 `git diff <上一tag>..HEAD` 的实际代码改动(先 `--stat` 总览,再逐个代码文件读完整 diff,见上方硬约束)。
4. 拉 `CHANGELOG.md` 最近 5–8 段已发布段落作为"项目自有的 minor / patch / major 量级参照",并检查顶部段落是否为「幽灵版本」(标题版本号无 tag、无 GitHub Release——上次准备好但没发出去的残留,或历史遗留的 `## [Unreleased]`);若是,其内容并入本次新段落一起发布,不单独建没有 tag 的版本段,并在展示里说明并入方案。
5. **单次展示**(一条消息里同时给出):

   ┌──────────────────────────────────────────────────────────────┐
   │ 当前状态(git 三态):                                       │
   │   最新 tag:v0.7.1                                           │
   │   HEAD VERSION:0.7.2                                        │
   │   working tree VERSION:0.7.3(领先 HEAD 是测试残留)        │
   │   bump 基线(取 max):0.7.3                                 │
   │   自上一 tag 的 commit 数:N                                 │
   │                                                              │
   │ CHANGELOG 草稿(标题 ## [版本] - 起草日,全文):             │
   │   ……(含归档/并入方案说明)                                  │
   │                                                              │
   │ 进 / 不进清单(无用户可见影响的提交不进):                  │
   │   ……                                                        │
   │                                                              │
   │ 建议 bump 级别:patch / minor / major                        │
   │ 依据:参照旧段落量级 + 当前 commit 列表的关键特征            │
   └──────────────────────────────────────────────────────────────┘

6. **单次弹窗合并确认**:一次 AskUserQuestion 调用带**两个问题**,用户一次点选完:
   - 问题 1「版本号」:bump 级别选项(如「沿用基线 X.Y.Z(Recommended)」「patch → X.Y.Z+1」「minor」「major」),推荐项放首位标注(Recommended),每项 description 写关键取舍
   - 问题 2「CHANGELOG」:「确认写入(Recommended)」/「需要修改」(修改意见走 Other 自由输入或下一轮消息)
7. 两项都点选后才进入 Step 1;若某项需要修改,按意见修订后**只对该项**重新弹窗确认,另一项沿用已确认值,不重复问。
8. **硬约束**:本步骤**禁止**修改任何文件、**禁止**跑 `bump-version.mjs`。

CHANGELOG 写作规则:

- 用用户视角描述变更("新增 xxx 功能"),不要照抄 commit 标题。
- 空分区整节省略;可用分区:新增 / 修复 / 界面与样式 / 性能优化 / 重构 / 移除 / 安全;都不匹配时可自拟简洁分区名(如 文档 / 依赖升级)。
- **不进入 CHANGELOG 的改动**(从 diff 判断,非 commit 标题;无用户可见影响):
  - 纯版本号 bump(`chore(release): vX.Y.Z`)
  - 纯 CI / 工作流变更
  - 纯文档类提交
  - 纯文案 / 按钮 / 标签 / 提示语等措辞小改(不影响功能)
  - 纯图标 / 品牌资源更新(不影响功能)
- 已有段落风格时(查看 `CHANGELOG.md` 旧版本段落),沿用旧格式。

CHANGELOG 段落模板(分区按实际变更从可用分区里取,有几段写几段,不是固定三段):

```markdown
## [A.B.C] - YYYY-MM-DD

### <分区名>
- …
```

(A.B.C = 本次 bump 后的版本号,必须与 VERSION 一致;日期 = 起草当天)

> **不要**在 CHANGELOG 里写「如何选择安装包」安装指南(含 macOS 首次打开提示):这段由 `.github/workflows/release.yml` 的 release job 自动追加到发行页(安装指南兜底,必带),写进 CHANGELOG 会与工作流产出重复。旧版本段落里出现的这段是历史遗留,新版本不沿用。Full Changelog 对比链接由工作流自动生成(即使没写日志,发行页也有变更入口);发行说明就是本段落原文照抄,标题行即版本标题。

### Step 1: 一次性执行(**确认后 AI 连续完成,中途不再询问**)

1. AI 按 Step 0 用户点选的级别跑:

   ```bash
   node scripts/bump-version.mjs patch   # 或 minor / major(若用户选沿用基线则跳过)
   ```

2. 检查脚本输出"版本号已从 X.Y.Z 更新为 A.B.C",记下 A.B.C 作为本版本号;lockfile 未跟上的话 AI 跑:`cargo update -p cgswitch --manifest-path src-tauri/Cargo.toml`(lockfile 已对齐可跳过)。
3. 写入 CHANGELOG:
   - **幽灵版本并入**:若顶部已有段落且是「幽灵版本」(标题版本号无 tag、无 GitHub Release——上次准备好但没发出去的残留)或历史遗留的 `## [Unreleased]`,其内容并入本次新段落一起发布,**不**保留没有 tag 的版本段;顶部段落已正常发行则直接进行下一步。
   - 在既有段落上方插入 Step 0 已确认的新版本段落,标题写 `## [<A.B.C>] - <今天日期>`(A.B.C = bump 后版本号,必须与 VERSION 一致,工作流会校验)。
4. 提交发版文件(**硬约束:只许这 6 个文件,多一个都不行**):
   `git add VERSION package.json src-tauri/Cargo.toml src-tauri/Cargo.lock src-tauri/tauri.conf.json CHANGELOG.md`
   提交信息:`chore(release): v<版本>`
   - **禁止** `git add -A` / `git add .` / 任何路径通配或目录级 add;工作区其他一切改动(代码、测试、i18n、样式、新文件等)一律不得进入本 commit,保持原样留在工作区。
   - add 后先 `git status --short` 核对暂存区只含上述 6 个文件;发现多余文件必须 `git restore --staged <文件>` 摘掉后再提交。
5. **到此停下**:汇报版本号、commit hash、CHANGELOG 段落摘要,**会话停在此处**。**不询问用户是否继续**(避免被读成对扩展动作的暗示),**不主动执行**任何 push / 触发工作流 / 发布操作。Step 2–4 需用户用明确指令单独启动。

### Step 2: 推送并手动触发构建 — 需用户明确启动才执行

> 默认流程到 Step 1 为止。本节起必须用户明确指示(如"继续"、"push"、"推上去"、"发出去")才执行,不要自行越界。

1. 推送代码:`git push origin main`。Release 工作流**不会**因 push 自动触发,无自动构建。
2. 按用户意图手动 dispatch(三选一,发版模式就是这里的显式决策):
   - **默认(无干预,先看草稿)**:`gh workflow run release.yml --ref main`(默认 `release_mode=draft`)→ 构建完停在草稿,走 Step 4 人工发布(asset 清单 → AskUserQuestion 点选正式/预发行/暂不);
   - **干预直接正式发行**:`gh workflow run release.yml --ref main -f release_mode=latest` → 构建完自动正式发行并通知关注者,无 Step 4;
   - **干预直接预发行**:`gh workflow run release.yml --ref main -f release_mode=prerelease` → 构建完自动预发行(不占 latest 指针),无 Step 4。
3. dispatch 前确认工作区已推齐(`git status` 干净、`git log origin/main..HEAD` 为空)——构建跑的是远端 main 最新 commit,本地未推的 commit 不参与。
4. 等 10 秒后取 run:`gh run list --workflow=Release --limit 1 --json databaseId,status,headBranch`——只有一条 run(headBranch=main),盯它即可。
5. 推送前可选本地预检 `pnpm check`(与工作流 verify job 同一条链),失败就地修复并补充提交;⚠️ 项目 node_modules 是 Windows 平台构建的,必须在 **Windows 侧**执行(WSL 里跑会触发 corepack 重建依赖、破坏 Windows 开发环境);跳过也可,工作流 verify 会兜底。

### Step 3: 盯 Release 工作流 — 需用户明确启动才执行

1. 只有一条 run(Step 2 的 dispatch,headBranch=main):`gh run watch <run-id> --exit-status --interval 30` 放后台执行(约 30-40 分钟),完成时会收到通知。
2. 构建失败:`gh run view <run-id> --log-failed` 提取报错摘要,报告用户并停止(草稿若已创建则留在草稿态,不影响关注者)。
3. 构建成功后工作流已自动完成:创建 tag 与发行页(版本标题 + Full Changelog 链接 + 发行日志 + 安装指南;发行说明 = CHANGELOG 第一段原文照抄)、上传三平台资产。draft 模式停在草稿等人工发布(Step 4);prerelease / latest 模式此刻已自动发布,无 Step 4。

### Step 4: 确认与发布 — 需用户明确启动才执行

> 本步仅适用于**默认草稿路径**(`release_mode=draft`)。prerelease / latest 模式构建完成即自动公开,跳过本步。

1. 展示给用户(这一步必须等用户明确确认,不得自动发布):
   - `gh release view v<版本> --json name,isDraft,assets` 的资产清单(文件名 + 大小)
   - 发行日志全文预览
2. 必须用 AskUserQuestion 弹窗让用户点选:「正式发布(--latest)」/「预发布(--prerelease)」/「暂不发布」;点选后才执行对应命令(正式发布 `gh release edit v<版本> --draft=false --latest`)。
3. 变体处理:
   - 用户点选「预发布」:加 `--prerelease`,去掉 `--latest`
   - 用户要改日志:改 `CHANGELOG.md` 对应版本段落,提交推送后工作流自动重跑,用新段落更新既有草稿后再发布
4. 发布后告知用户:关注者通知已发出,附 release 页面链接 `https://github.com/zeno528/CGswitch/releases/tag/v<版本>`

## 示例

**场景 A(默认流程)**:用户说"发版"

1. **Step 0**:AI 看 git 三态(最新 tag `v0.7.1` / HEAD VERSION `0.7.2` / working tree VERSION `0.7.3`,取 max = `0.7.3`) + `git log v0.7.1..HEAD` + `CHANGELOG.md` 最近段落 → 单条消息展示状态框 + "建议 patch(依据:参照 v0.7.1 类似量级,单 `fix:` commit)" + CHANGELOG 草稿 + 进/不进 → **一次 AskUserQuestion 弹窗**(问题 1 版本号级别、问题 2 CHANGELOG 确认)→ 用户两项点选确认
2. **Step 1**:AI 一次跑完:`node scripts/bump-version.mjs patch` → 写入 `CHANGELOG.md` → `git commit -m "chore(release): v0.7.4"` → 汇报版本号、commit hash、CHANGELOG 段落摘要,**会话终止**。不询问、不执行 push / 触发工作流 / 发布;这些动作必须等用户在下一轮显式启动(例如"推上去"、"继续")。

**场景 B(扩展流程 · 干预直接发行,需用户明确指示)**:用户在场景 A 之后说"直接发出去"

1. **Step 2**:`git push origin main` 后 `gh workflow run release.yml --ref main -f release_mode=latest` → 一条 run
2. **Step 3**:盯该 run 至全绿——构建完成即自动正式发行并通知关注者,无 Step 4
3. 想先出预发行:`-f release_mode=prerelease`,不占 latest 指针

**场景 B2(扩展流程 · 默认草稿路径,需用户明确指示)**:用户说"推上去,先看草稿"

1. **Step 2**:`git push origin main` 后 `gh workflow run release.yml --ref main`(默认 draft)→ 一条 run,构建完停在草稿
2. **Step 3**:后台 `gh run watch` 盯至全绿(工作流自动建 tag、草稿并上传资产)
3. **Step 4**:展示资产(Windows setup/msi、macOS x64/arm64 dmg)+ 日志全文 → AskUserQuestion 弹窗点选「正式发布」 → `gh release edit v0.7.4 --draft=false --latest`,报告链接

## Troubleshooting

**push 后没有构建**:设计如此——工作流只手动触发,push 永不自动构建。要出包必须 dispatch:`gh workflow run release.yml --ref main`(默认草稿)或带 `-f release_mode=<mode>`;队列用 `gh run list --workflow=Release` 查。

**verify 绿色跳过(重复 dispatch,`::notice` 提示)**:属正常——该版本(VERSION 对应 tag)已公开发布,重复 dispatch 不重发(改 CHANGELOG 文案不会重出发行页)。

**verify 失败(VERSION 为空)**:说明版本号没提交。跑 `node scripts/bump-version.mjs <level>` 后把 VERSION 等发版文件一起提交推送,再重新 dispatch。

**工作流报「CHANGELOG.md 第一段版本号与 VERSION 不一致」**:起草后 VERSION 又被改动(如补 bump),或段落标题手滑。把 CHANGELOG 顶部段落标题改成与 VERSION 一致(或按需重跑 bump),commit push 后重新 dispatch。

**草稿已存在(重跑场景)**:工作流会检测到草稿并更新(`gh release edit`),不会重复建。

**发行已公开后工作流又跑**:工作流会拒绝修改已发布内容("发行 vX 已经公开,拒绝修改已发布内容"),属正常保护,不是 bug;需要发新版本时递增 VERSION 重来。

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.