# AtomUI 版本规范与 Git 分支策略 > 本文档定义了 AtomUI 项目的版本号规范和 Git 分支管理策略。 > 参考依据:[SemVer 2.0.0](https://semver.org/)、[Avalonia 分支与版本模型](https://github.com/AvaloniaUI/Avalonia)、[NuGet 版本约定](https://learn.microsoft.com/nuget/concepts/package-versioning)、以及 AtomUI 项目自身的历史实践。 --- ## 1. 版本号规范 ### 1.1 版本号格式 AtomUI 采用 **语义化版本 (Semantic Versioning 2.0.0)** 规范,完整格式如下: ``` MAJOR.MINOR.PATCH[-PRERELEASE][+BUILD] ``` | 字段 | 含义 | 示例 | |---|---|---| | `MAJOR` | **主版本号** — 与 Ant Design 设计规范大版本对齐(见 §1.2) | `5` | | `MINOR` | **次版本号** — 新增功能(向后兼容) | `5.1` | | `PATCH` | **修订号** — Bug 修复、性能优化(向后兼容) | `5.1.3` | | `PRERELEASE` | **预发布标签** — 标识非正式发布(见 §1.3) | `5.2.0-beta.1` | | `BUILD` | **构建元数据**(仅信息性,不影响排序) | `5.2.0-beta.1+20260410` | ### 1.2 主版本号 (MAJOR) 严格锚定 Ant Design > **核心原则:AtomUI 的 MAJOR 版本号严格锚定 Ant Design 的 MAJOR 版本号,两者保持一致。** AtomUI 是 Ant Design 设计规范在 .NET / Avalonia 平台上的完整实现。为了让使用者一眼就能识别 AtomUI 实现的是哪个版本的 Ant Design 设计语言,AtomUI 的主版本号 **直接采用** 对应 Ant Design 的主版本号。 #### Ant Design 发版节奏(参考 [antd Release Schedule](https://ant.design/changelog#release-schedule)) Ant Design 自身遵循如下发版计划: | 发布类型 | 频率 | 说明 | |---|---|---| | **Patch Release** (修订版) | 每周 | 常规 Bug 修复(紧急情况随时发布) | | **Minor Release** (次版本) | 每月 | 新增功能、向后兼容的变更 | | **Major Release** (大版本) | 不定期 | 包含破坏性变更 (Breaking Changes),长周期演进 | Ant Design 的大版本历史: | Ant Design 版本 | 发布时间 | 关键变化 | |---|---|---| | Ant Design 1.x | 2016 | 初始版本 | | Ant Design 2.x | 2016-12 | 全面重构 | | Ant Design 3.x | 2017-12 | 引入新设计语言 | | Ant Design 4.x | 2020-02 | 暗色主题、无障碍、性能优化 | | **Ant Design 5.x** | **2022-11** | **CSS-in-JS、Design Token 系统、组件级定制** | | Ant Design 6.x | *未来* | *待定* | #### AtomUI ↔ Ant Design 版本映射 | AtomUI 版本 | 锚定 Ant Design 版本 | 状态 | 说明 | |---|---|---|---| | `0.x.x` | — | 🏁 已结束 | 早期孵化阶段,AtomUI 尚未正式对齐 AntD 版本 | | `1.x.x` | — | 🏁 已结束 | 早期正式版,AtomUI 架构确立前的过渡版本 | | **`5.x.x`** | **Ant Design 5.x** | **🟢 当前主线** | 完整实现 AntD 5 Design Token 系统、所有 5.x 组件 | | `6.x.x` | Ant Design 6.x | 🔮 未来计划 | 待 AntD 6 正式发布后启动 | > **注意**:AtomUI 没有 `2.x`、`3.x`、`4.x` 版本。这是因为 AtomUI 项目启动时 Ant Design 已经发布到 5.x,所以 AtomUI 从 `0.x` / `1.x`(孵化期)直接跳到 `5.x`,以实现主版本号对齐。 #### MAJOR 版本递增的严格规则 AtomUI 的 MAJOR 版本递增 **仅由 Ant Design 大版本驱动**: - 当 Ant Design 从 5.x 升级到 6.x 时,AtomUI 同步从 `5.x.x` 升级到 `6.0.0`。 - 这是 MAJOR 递增的 **唯一驱动力**,没有任何其他因素可以独立触发 MAJOR 递增。 **不会触发 MAJOR 递增的情况:** - AtomUI 自身的功能新增(使用 MINOR 递增) - AtomUI 自身的 Bug 修复(使用 PATCH 递增) - **Avalonia 的任何版本升级**(包括 MAJOR 升级,详见 §1.6) #### AtomUI MINOR/PATCH 与 Ant Design MINOR/PATCH 的关系 AtomUI 的 MINOR 和 PATCH 版本号是 **独立管理的**,不与 Ant Design 的 MINOR/PATCH 一一对应: ``` Ant Design 5.x 系列: 5.0.0 5.1.0 5.2.0 ... 5.12.0 ... 5.22.0 │ ▼ (AtomUI 锚定 MAJOR=5,MINOR/PATCH 独立演进) AtomUI 5.x 系列: 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 ... 5.2.0 ``` **原因**:Ant Design(React 实现)的发版节奏非常快(每周 Patch、每月 Minor),而 AtomUI 作为跨平台 .NET 实现有自己的开发节奏和功能里程碑。强行对齐 MINOR/PATCH 会导致版本号跳跃或频繁空发版,没有实际意义。 **但需遵循以下原则:** - AtomUI 每个 MAJOR 系列必须在该系列生命周期内 **最终实现** 对应 Ant Design 大版本的 **全部组件和设计规范** - 如果 Ant Design 在某个 Minor 版本中引入了重要的设计变更(如新增 Design Token),AtomUI 应在后续版本中及时跟进 ### 1.6 Avalonia 大版本升级的版本处理策略 AtomUI 的每个 MAJOR 系列绑定一个 Avalonia 大版本系列作为 **初始支持版本**,但 Avalonia 的大版本升级 **不会** 触发 AtomUI 的 MAJOR 递增。当 Avalonia 发布新的大版本时,AtomUI 通过 **MINOR 版本升级** 来新增支持。 #### 核心规则 > **AtomUI MAJOR 只跟 Ant Design MAJOR 走。Avalonia 大版本升级 → AtomUI MINOR 升级。** 每个 AtomUI MAJOR 系列内部,Avalonia 大版本的支持范围只增不减: | AtomUI MAJOR | 初始绑定的 Avalonia 版本 | 后续可新增支持 | |---|---|---| | `5.x.x` | Avalonia 11.x | 不会新增 Avalonia 12.x 支持(5.x 系列固定在 Avalonia 11.x) | | `6.x.x` | Avalonia 12.x | 若 Avalonia 13.x 在 AntD 仍为 6.x 期间发布,AtomUI 通过 MINOR 升级新增支持 | #### 场景举例 **场景 A:Avalonia 发布新大版本,但 Ant Design 未发布新大版本** > 假设 Avalonia 发布 v13,但 Ant Design 仍然是 6.x。 - AtomUI **不递增 MAJOR**(因为 Ant Design 没有变) - AtomUI 在当前 `6.x` 系列中递增 MINOR,发布如 `6.3.0` - 在 Release Notes 中注明:"AtomUI 6.3.0 起新增对 Avalonia 13.x 的支持" - 对应分支仍在 `release/6.0` 上开发 ``` AtomUI 6.0.0 ── 6.1.0 ── 6.2.0 ── 6.3.0 (新增 Avalonia 13 支持) ── 6.3.1 ──► │ Avalonia 13.0 发布 Ant Design 仍为 6.x ``` **场景 B:Avalonia 发布新大版本,恰好 Ant Design 也发布新大版本** > 假设 Avalonia 发布 v13,同时 Ant Design 发布 7.0。 - AtomUI 递增 MAJOR 到 `7.0.0`(因为 Ant Design 升级了) - 新的 `7.x` 系列从一开始就基于 Avalonia 13.x - 创建 `release/7.0` 分支 ``` AtomUI 6.x 系列 (Avalonia 12.x, AntD 6.x) ── 维护模式 │ AtomUI 7.0.0 (Avalonia 13.x, AntD 7.x) ─────────┘── 新活跃开发主线 ``` **场景 C:当前已有系列(如 5.x)不会跨 Avalonia 大版本** > AtomUI 5.x 系列固定绑定 Avalonia 11.x,不会在 5.x 中支持 Avalonia 12.x。 - Avalonia 12.x 的支持从 AtomUI `6.0.0` 开始 - 这确保了同一 MAJOR 系列内的 Avalonia 依赖稳定性,用户不会在 PATCH/MINOR 升级中遭遇 Avalonia 大版本切换 #### 总结表 | 事件 | AtomUI 版本动作 | 说明 | |---|---|---| | Avalonia PATCH 升级 (11.3.x → 11.3.y) | 更新 `AvaloniaVersion`,AtomUI 版本不变 | 最小变更 | | Avalonia MINOR 升级 (11.2 → 11.3) | AtomUI MINOR 或 PATCH 升级 | 视影响范围而定 | | Avalonia MAJOR 升级 (12 → 13),AntD 未变 | **AtomUI MINOR 升级** | 在当前 MAJOR 系列内新增支持 | | Avalonia MAJOR 升级 + AntD MAJOR 升级同时发生 | **AtomUI MAJOR 升级**(跟随 AntD) | 新 MAJOR 系列直接基于新 Avalonia | ### 1.3 预发布版本标签 预发布版本遵循 SemVer 的预发布标识符规范,按稳定性递增排列: | 标签 | 格式 | 用途 | NuGet 排序 | |---|---|---|---| | `build` | `X.Y.Z-build.N` | **内部开发构建**,仅用于团队内部测试和 CI,不对外发布 | 最低 | | `alpha` | `X.Y.Z-alpha.N` | **Alpha 预览版**,功能不完整,API 可能大幅变动 | ↓ | | `beta` | `X.Y.Z-beta.N` | **Beta 测试版**,功能基本完整,API 趋于稳定 | ↓ | | `rc` | `X.Y.Z-rc.N` | **发布候选版**,除关键 Bug 外不再变更 | ↓ | | *(无)* | `X.Y.Z` | **正式发布版** (Stable Release) | 最高 | **示例版本演进:** ``` 5.2.0-build.1 → 5.2.0-build.2 → ... → 5.2.0-alpha.1 → 5.2.0-alpha.2 → 5.2.0-beta.1 → 5.2.0-rc.1 → 5.2.0 ``` **规则:** - `N` 为从 1 开始的递增整数(如 `alpha.1`, `alpha.2`) - `build` 标签的内部构建版本不发布到公共 NuGet,仅推送到本地/私有源 - 同一预发布阶段内若需修复问题,递增 `N` - 预发布标签中 **不得** 包含日期或 commit hash(这些信息放入 `+BUILD` 元数据) ### 1.4 版本号递增规则 | 场景 | 递增规则 | 示例 | |---|---|---| | Bug 修复、文档修正、无功能变更 | `PATCH += 1` | `5.1.3` → `5.1.4` | | 新增控件、新增 API、新增功能(向后兼容) | `MINOR += 1, PATCH = 0` | `5.1.4` → `5.2.0` | | 破坏性变更、AntD 大版本对齐 | `MAJOR = AntD版本, MINOR = 0, PATCH = 0` | `5.2.0` → `6.0.0` | | 预发布版 Bug 修复 | 递增预发布计数器 `N` | `5.2.0-beta.1` → `5.2.0-beta.2` | | 预发布阶段升级 | 切换到下一个阶段标签 | `5.2.0-beta.3` → `5.2.0-rc.1` | ### 1.5 版本号在代码中的管理 所有版本号统一定义在 `build/Version.props` 中: ```xml 11.3.12 5.2.0-build.3 5.2.0-build.3 ``` **规则:** - `AtomUIVersion` 和 `AtomUIGalleryVersion` **必须保持同步** - 版本更新通过修改此文件完成,不允许在单个项目 `.csproj` 中硬编码版本号 - `AvaloniaVersion` 记录当前依赖的 Avalonia 版本,用于跨团队协调 --- ## 2. Git 分支策略 AtomUI 采用 **Release Branch 模型**(与 Avalonia 一致),以 `release/X.Y` 分支作为开发主线。 ### 2.1 分支类型总览 ``` 长期分支 (Long-lived) ├── main # 历史归档主干(不活跃开发) ├── release/5.0 # 5.0.x 系列稳定维护线(当前活跃开发主线) ├── release/6.0 # 6.0.x 系列开发线(下一大版本) │ 短期分支 (Short-lived) ├── feature/ # 功能开发分支 ├── bugfix/ # Bug 修复分支 ├── hotfix/ # 紧急修复分支(针对已发布版本) └── docs/ # 文档专用分支 ``` ### 2.2 长期分支 #### `main` | 属性 | 值 | |---|---| | **用途** | 项目历史归档主干 | | **保护** | 受保护分支,禁止直接推送 | | **合并来源** | 里程碑发布时由 `release/X.Y` 合并入 | | **说明** | 早期项目使用 `main` 作为活跃开发主线。在切换到 Release Branch 模型后,`main` 保留为历史归档,所有活跃开发转移到 `release/X.Y` 分支 | #### `release/X.Y` — **活跃开发主线** | 属性 | 值 | |---|---| | **命名** | `release/{MAJOR}.{MINOR}` — 如 `release/5.0`, `release/6.0` | | **用途** | 该 MAJOR.MINOR 系列的所有开发、发布、维护活动的主线 | | **保护** | 受保护分支,禁止直接推送,必须通过 PR 合并 | | **生命周期** | 从首个预发布版创建,到该系列停止维护 (EOL) | | **从何分叉** | 新 MINOR:从前一个 `release/X.{Y-1}` 分叉;新 MAJOR:从前一个 `release/{X-1}.Y` 最新稳定点分叉 | **与 Avalonia 模型对比:** | 特性 | Avalonia | AtomUI | |---|---|---| | 活跃开发主线 | `master` (下一大版本) | `release/X.Y` (当前活跃版本) | | 发布分支 | `release/11.3`, `release/11.3.12` | `release/5.0` (整个 MAJOR.MINOR 系列) | | 每个 PATCH 独立分支 | ✅ `release/11.3.12` | ❌ 在 `release/X.Y` 上打 Tag | | 预发布分支 | ✅ `release/11.3.0-beta1` | ❌ 在 `release/X.Y` 上打 Tag | **简化说明:** AtomUI 项目规模较 Avalonia 小,因此不为每个 PATCH 或预发布版本创建独立分支。所有 `X.Y.Z` 版本均在 `release/X.Y` 分支上通过 **Git Tag** 标记发布点。 ### 2.3 短期分支 #### `feature/` — 功能开发 | 属性 | 值 | |---|---| | **命名** | `feature/<描述性名称>` — 如 `feature/qrcode`, `feature/tour`, `feature/dark-theme` | | **从何分叉** | 从目标 `release/X.Y` 分叉 | | **合并目标** | 合并回对应的 `release/X.Y` | | **生命周期** | 开发完成并合并后删除 | **命名规则:** - 使用小写英文 + 连字符分隔:`feature/color-picker` - 若关联 Issue,可包含编号:`feature/123-color-picker` - 保持简短、描述性:不超过 3~4 个单词 #### `bugfix/` — Bug 修复 | 属性 | 值 | |---|---| | **命名** | `bugfix/<描述性名称>` — 如 `bugfix/memoryleak`, `bugfix/input-focus` | | **从何分叉** | 从目标 `release/X.Y` 分叉 | | **合并目标** | 合并回对应的 `release/X.Y` | | **生命周期** | 修复完成并合并后删除 | #### `hotfix/` — 紧急修复 | 属性 | 值 | |---|---| | **命名** | `hotfix/<描述性名称>` — 如 `hotfix/crash-on-startup` | | **从何分叉** | 从最近的正式发布 Tag(如 `v5.1.4`)分叉 | | **合并目标** | 合并回 `release/X.Y`,并打新的 PATCH Tag | | **用途** | 仅用于已发布正式版本的紧急 Bug 修复,需要立即发布新 PATCH | | **生命周期** | 修复、发布后立即删除 | #### `docs/` — 文档分支 | 属性 | 值 | |---|---| | **命名** | `docs/<描述性名称>` — 如 `docs/api-reference`, `docs/getting-started` | | **从何分叉** | 从目标 `release/X.Y` 分叉 | | **合并目标** | 合并回对应的 `release/X.Y` | ### 2.4 分支流转示意 ``` main ───────────────────────────────────────────────────────────────────────── │ ▲ (milestone merge) │ │ └── release/5.0 ─── • ─── • ─── • ─── • ─── • ─── • ─── • ─── • ───► │ ▲ │ ▲ │ ▲ ▲ │ │ │ │ │ │ │ │ └── feature/qrcode │ │ │ │ │ │ │ │ │ │ │ └── bugfix/memoryleak │ │ │ │ │ Tag: v5.1.4 Tag: v5.2.0 │ └──── release/6.0 ─── • ─── • ─── • ───► │ ▲ │ │ └── feature/tour ``` ### 2.5 Tag 命名规范 所有正式发布和预发布均通过 **Git Tag** 标记: | Tag 格式 | 示例 | 说明 | |---|---|---| | `v{MAJOR}.{MINOR}.{PATCH}` | `v5.1.4` | 正式发布版 | | `v{MAJOR}.{MINOR}.{PATCH}-{PRERELEASE}` | `v5.2.0-beta.1` | 预发布版 | | `v{MAJOR}.{MINOR}.{PATCH}-build.{N}` | `v5.2.0-build.3` | 内部构建版(可选,用于 CI) | **规则:** - Tag **必须** 以 `v` 前缀开头(保持与历史 Tag 一致) - Tag 必须在 `release/X.Y` 分支上创建 - Tag 创建后 **不得** 删除或移动(除明显错误外) - 正式发布 Tag 必须是 **Annotated Tag**,包含发布说明 **创建 Tag 示例:** ```bash # 正式发布 git tag -a v5.2.0 -m "Release v5.2.0: ..." # 预发布 git tag -a v5.2.0-rc.1 -m "Release Candidate v5.2.0-rc.1" # 内部构建(Lightweight Tag 即可) git tag v5.2.0-build.3 ``` --- ## 3. 发布流程 ### 3.1 正式版本发布流程 ``` 1. 在 release/X.Y 分支上确认所有功能和修复已合并 2. 更新 build/Version.props 中的版本号(移除预发布标签) 3. 更新 CHANGELOG.md 4. 提交版本变更:git commit -m "chore(release): bump version to X.Y.Z" 5. 创建 Annotated Tag:git tag -a vX.Y.Z -m "Release vX.Y.Z" 6. 推送:git push origin release/X.Y --tags 7. CI/CD 自动构建并发布到 NuGet 8. (里程碑发布时)将 release/X.Y 合并到 main ``` ### 3.2 预发布版本发布流程 ``` 1. 在 release/X.Y 分支上更新 build/Version.props(如 5.2.0-beta.1) 2. 提交:git commit -m "chore(release): bump version to 5.2.0-beta.1" 3. 创建 Tag:git tag -a v5.2.0-beta.1 -m "Pre-release v5.2.0-beta.1" 4. 推送:git push origin release/X.Y --tags 5. CI/CD 构建并发布到 NuGet(标记为 Pre-release) ``` ### 3.3 Hotfix 发布流程 ``` 1. 从最近的正式版 Tag 创建 hotfix 分支: git checkout -b hotfix/critical-bug v5.1.4 2. 修复问题并提交 3. 更新 build/Version.props:5.1.4 → 5.1.5 4. 通过 PR 合并回 release/5.0 5. 在 release/5.0 上创建 Tag:v5.1.5 6. 推送并删除 hotfix 分支 ``` --- ## 4. 多版本并行维护策略 当存在多个活跃的 `release/X.Y` 分支时(如 `release/5.0` 和 `release/6.0`): ### 4.1 维护窗口 | 分支 | 状态 | 接受的变更 | |---|---|---| | `release/6.0` | **活跃开发** (Active) | 新功能 + Bug 修复 + 文档 | | `release/5.0` | **维护模式** (Maintenance) | 仅 Bug 修复和安全补丁 | | `release/1.0` | **停止维护** (EOL) | 不再接受任何变更 | ### 4.2 变更回移 (Backport) 当 Bug 修复需要应用到多个维护版本时: 1. 在最新的活跃开发分支(如 `release/6.0`)上首先修复 2. 使用 `cherry-pick` 回移到维护分支(如 `release/5.0`) 3. 在维护分支上发布新的 PATCH 版本 --- ## 5. 上下游版本依赖关系 AtomUI 处于 Ant Design(设计规范上游)和 Avalonia(技术框架上游)之间,三者的版本关系如下: ``` ┌─────────────────────┐ 设计规范锚定 ┌─────────────────────┐ 技术框架依赖 ┌─────────────────────┐ │ Ant Design 5.x │ ◄══════════════════► │ AtomUI 5.x.x │ ──────────────────► │ Avalonia 11.x │ │ (设计语言上游) │ MAJOR 严格一致 │ (本项目) │ 运行时依赖 │ (UI 框架上游) │ │ React 实现 │ │ .NET/Avalonia 实现 │ │ .NET 跨平台 UI │ └─────────────────────┘ └─────────────────────┘ └─────────────────────┘ ``` ### 5.1 AtomUI ↔ Ant Design 版本关系(设计规范锚定) > 详见 §1.2。此处为总结。 | 关系维度 | 规则 | |---|---| | MAJOR | **严格锚定** — `AtomUI MAJOR == Ant Design MAJOR` | | MINOR / PATCH | **独立管理** — AtomUI 有自己的开发节奏 | | 设计规范 | AtomUI 每个 MAJOR 系列最终须完整实现对应 AntD 大版本的全部组件和 Design Token | | 新版本启动 | AntD 发布新 MAJOR 后,AtomUI 在 `release/{新MAJOR}.0` 分支启动对应开发 | ### 5.2 AtomUI ↔ Avalonia 版本关系(技术框架依赖) > 详见 §1.6。此处为总结。 每个 AtomUI MAJOR 系列绑定一个 Avalonia 大版本作为初始支持版本。Avalonia 大版本升级不触发 AtomUI MAJOR 递增,而是通过 MINOR 升级在当前 MAJOR 系列内新增支持。 | AtomUI 版本 | Avalonia 版本 | .NET 版本 | 说明 | |---|---|---|---| | `5.0.x` ~ `5.2.x` | Avalonia 11.x | .NET 8 / .NET 10 | 5.x 系列固定绑定 Avalonia 11.x | | `6.0.x` (计划) | Avalonia 12.x (计划) | .NET 10+ | 6.x 系列初始绑定 Avalonia 12.x | | `6.N.x` (假设) | Avalonia 13.x (假设) | .NET 10+ | 若 AntD 仍为 6.x 时 Avalonia 13 发布,MINOR 升级新增支持 | | `7.0.x` (假设) | Avalonia 13.x+ (假设) | — | 若 AntD 7.0 与 Avalonia 新大版本同期发布 | **规则:** - Avalonia 的 **PATCH** 升级 — 更新 `build/Version.props` 中的 `AvaloniaVersion`,**不影响** AtomUI 版本号 - Avalonia 的 **MINOR** 升级 — 通常对应 AtomUI 的 MINOR 或 PATCH 升级,视影响范围而定 - Avalonia 的 **MAJOR** 升级 — **不触发** AtomUI MAJOR 递增;在当前 MAJOR 系列内通过 MINOR 升级新增支持(或在新 AntD MAJOR 同期发布时合并处理) - 同一 AtomUI MAJOR 系列内,早期版本 **不会** 跨 Avalonia 大版本(如 5.x 不会支持 Avalonia 12.x) --- ## 6. 总结对照表 ### 分支命名速查 | 分支类型 | 命名格式 | 示例 | |---|---|---| | 归档主干 | `main` | `main` | | 发布主线 | `release/{MAJOR}.{MINOR}` | `release/5.0`, `release/6.0` | | 功能分支 | `feature/{name}` | `feature/qrcode` | | 修复分支 | `bugfix/{name}` | `bugfix/memoryleak` | | 紧急修复 | `hotfix/{name}` | `hotfix/crash-on-startup` | | 文档分支 | `docs/{name}` | `docs/api-reference` | ### 版本 Tag 速查 | 类型 | Tag 格式 | 示例 | |---|---|---| | 正式版 | `v{MAJOR}.{MINOR}.{PATCH}` | `v5.2.0` | | Alpha | `v{M}.{m}.{p}-alpha.{N}` | `v5.2.0-alpha.1` | | Beta | `v{M}.{m}.{p}-beta.{N}` | `v5.2.0-beta.1` | | RC | `v{M}.{m}.{p}-rc.{N}` | `v5.2.0-rc.1` | | 内部构建 | `v{M}.{m}.{p}-build.{N}` | `v5.2.0-build.3` | ### 完整版本生命周期 ``` feature/xxx ─┐ bugfix/xxx ─┤ docs/xxx ─┴──► release/5.0 ──► v5.2.0-build.1 v5.2.0-build.2 v5.2.0-alpha.1 v5.2.0-beta.1 v5.2.0-rc.1 v5.2.0 ──► NuGet (stable) ──► merge to main (milestone) ```