You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-**Main branch** at `1.3.0-beta.2` (has release-root tag) → create RC checks for breaking changes → if none, RC is `1.3.0-rc.0`, main bumps to `1.4.0-beta.0` with new release-root tag → `1.4.0-beta.1` (preview, tagged) → create RC for v1.4.0 → main bumps to `1.5.0-beta.0`
91
-
-**Release branch**`release/v1.3` created from main at `1.3.0-beta.2`, starts at `1.3.0-rc.0` (tagged) → `1.3.0` (stable, tagged) → `1.3.1-beta.0` → `1.3.1-rc.0` (tagged) → `1.3.1` (stable, tagged) → `1.3.2-beta.0`
90
+
-**Main branch** at `1.3.0-beta.2` (has release-root tag) → create RC checks for breaking changes → if none, RC is `1.3.0-rc.1`, main bumps to `1.4.0-beta.0` with new release-root tag → `1.4.0-beta.1` (preview, tagged) → create RC for v1.4.0 → main bumps to `1.5.0-beta.0`
91
+
-**Release branch**`release/v1.3` created from main at `1.3.0-beta.2`, starts at `1.3.0-rc.1` (tagged) → `1.3.0` (stable, tagged) → `1.3.1-beta.0` → `1.3.1-rc.1` (tagged) → `1.3.1` (stable, tagged) → `1.3.2-beta.0`
92
92
-**Tags**: 🏷️ = version tag, 📍 = release-root tag (for breaking change detection)
93
-
-**Breaking changes**: If breaking changes detected when cutting RC from `1.3.0-beta.2`, the RC would be `2.0.0-rc.0` and main would bump to `2.1.0-beta.0`
93
+
-**Breaking changes**: If breaking changes detected when cutting RC from `1.3.0-beta.2`, the RC would be `2.0.0-rc.1` and main would bump to `2.1.0-beta.0`
94
94
95
95
**Note**: All commits are linear on their respective branches. `beta.0` = unreleased, `beta.1+` = published previews.
96
96
@@ -114,19 +114,20 @@ Trigger the **"Publish Beta"** workflow:
114
114
-**dry_run**: Test first with `true`
115
115
116
116
This workflow:
117
-
- For main branch at `beta.0` (unreleased): Checks for breaking changes and bumps version accordingly
118
-
-**Breaking changes found**: Bumps to next major `beta.1` (e.g., `1.4.0-beta.0` → `2.0.0-beta.1`)
119
-
-**No breaking changes**: Keep current version, bump to `beta.1` (e.g., `1.4.0-beta.0` → `1.4.0-beta.1`)
120
-
- For other beta versions: Bumps beta prerelease number (`beta.N` → `beta.N+1`)
117
+
- For main branch: Checks for breaking changes and bumps version accordingly
118
+
-**Breaking changes found AND current major == base major**: Bumps to next major `beta.1` (e.g., `1.4.0-beta.1` → `2.0.0-beta.1`)
119
+
-**Breaking changes found AND current major > base major**: Already bumped, just increment beta (e.g., `2.0.0-beta.1` → `2.0.0-beta.2`)
120
+
-**No breaking changes**: Keep current major, bump to next beta (e.g., `1.4.0-beta.0` → `1.4.0-beta.1`)
121
+
- For release branches: Bumps beta prerelease number (`beta.N` → `beta.N+1`)
121
122
- Creates beta tag
122
-
- Publishes artifacts to fury.io
123
+
- Publishes artifacts
123
124
124
-
**Note**: The version was already incremented during RC creation, so without breaking changes we just convert `beta.0` to `beta.1`.
125
+
**Note**: Breaking change detection happens on every beta publish from main. Major version bumps occur when breaking changes are first detected, and the major version is only bumped once per breaking change detection cycle.
125
126
126
127
**Use cases**:
127
128
- Testing features before RC
128
129
- Regular preview releases for early adopters
129
-
-Converting unreleased beta.0 to published beta.1 (triggers breaking change detection on main)
130
+
-Incremental beta releases with automatic breaking change detection
130
131
131
132
## Breaking Change Detection
132
133
@@ -142,12 +143,12 @@ Release root tags mark the base commits for breaking change detection. The tag n
- The tag name indicates which beta version series uses this base
144
145
- The tag points to the commit on main branch before the RC was created (the comparison base)
145
-
- The tag message stores the base RC version (e.g., "Base: 1.3.0-rc.0") - this is what we compare against to detect major version bumps
146
+
- The tag message stores the base RC version (e.g., "Base: 1.3.0-rc.1") - this is what we compare against to detect major version bumps
146
147
- The base RC version in the message stays constant even when multiple release-root tags point to the same commit
147
148
148
149
**When created**:
149
150
1.**When creating a major/minor RC**: After bumping main to the next version
150
-
- Example: After cutting v1.3.0-rc.1, create `release-root/1.4.0-beta.N` pointing to the RC commit
151
+
- Example: After cutting v1.3.0-rc.1, create `release-root/1.4.0-beta.N` pointing to the commit before the RC branch was created (the last commit on main before branching)
151
152
2.**When breaking changes bump major version**: When major version is bumped during beta publish
152
153
- Example: When bumping 1.4.0-beta.5 → 2.0.0-beta.1, create `release-root/2.0.0-beta.N` pointing to the SAME commit with the SAME base RC version
153
154
@@ -164,7 +165,7 @@ Breaking change detection happens **on every beta publish from main branch**. Th
164
165
165
166
1.**Find release-root tag**: Look for `release-root/{current_version}-beta.N`
166
167
- If NOT found → Bump to next major immediately (no comparison base exists)
167
-
2.**Extract base RC version**: Read from tag message (e.g., "Base: 1.3.0-rc.0" → base major is `1`)
168
+
2.**Extract base RC version**: Read from tag message (e.g., "Base: 1.3.0-rc.1" → base major is `1`)
168
169
3.**Compare**: Check for breaking changes since the commit pointed to by the release-root tag
169
170
4.**Determine action**:
170
171
- If breaking changes AND current_major == base_major → bump to next major
@@ -173,10 +174,10 @@ Breaking change detection happens **on every beta publish from main branch**. Th
173
174
174
175
**Examples:**
175
176
176
-
Starting from v1.3.0-rc.0 cut, main at 1.4.0-beta.0 with `release-root/1.4.0-beta.N` (Base: 1.3.0-rc.0):
177
+
Starting from v1.3.0-rc.1 cut, main at 1.4.0-beta.0 with `release-root/1.4.0-beta.N` (Base: 1.3.0-rc.1):
177
178
-`1.4.0-beta.0` + no breaking → `1.4.0-beta.1`
178
179
-`1.4.0-beta.1` + breaking → `2.0.0-beta.1`
179
-
- Creates `release-root/2.0.0-beta.N` pointing to same commit, message still "Base: 1.3.0-rc.0"
180
+
- Creates `release-root/2.0.0-beta.N` pointing to same commit, message still "Base: 1.3.0-rc.1"
180
181
- Base major from tag message is 1, current major is 1, so bump to 2
181
182
-`2.0.0-beta.1` + breaking → `2.0.0-beta.2`
182
183
- Base major from `release-root/2.0.0-beta.N` tag message is 1, current major is 2
@@ -187,7 +188,7 @@ Starting from v1.3.0-rc.0 cut, main at 1.4.0-beta.0 with `release-root/1.4.0-bet
187
188
-`1.4.0-beta.1` but `release-root/1.4.0-beta.N` doesn't exist → `2.0.0-beta.1`
188
189
- No comparison base, automatically bump to next major
189
190
- Creates `release-root/2.0.0-beta.N` pointing to the commit before the version bump
190
-
- Tag message: "Base: 1.4.0-rc.0" (the hypothetical RC version we're comparing against)
191
+
- Tag message: "Base: 1.4.0-rc.1" (the hypothetical RC version we're comparing against)
191
192
- Future beta publishes from 2.0.0 series will compare against this base
192
193
- Useful for migration or when starting fresh
193
194
@@ -238,20 +239,20 @@ This workflow:
238
239
- Reads current version from main (e.g., `1.3.0-beta.2`)
239
240
- Checks for breaking changes since the release-root tag
240
241
- If breaking changes detected:
241
-
- Creates RC with bumped major version: `2.0.0-rc.0`
242
+
- Creates RC with bumped major version: `2.0.0-rc.1`
242
243
- Bumps main to: `2.1.0-beta.0`
243
244
- If no breaking changes:
244
-
- Creates RC with current version: `1.3.0-rc.0`
245
+
- Creates RC with current version: `1.3.0-rc.1`
245
246
- Bumps main to: `1.4.0-beta.0`
246
247
- Creates `release/v{major}.{minor}` branch from main HEAD
247
-
- Tags the RC: `v{version}-rc.0`
248
-
- Creates `release-root/{next_version}-beta.N` tag at the RC commit for future breaking change comparison
248
+
- Tags the RC: `v{version}-rc.1`
249
+
- Creates `release-root/{next_version}-beta.N` tag at the commit before the RC branch (for future breaking change comparison)
249
250
- Creates GitHub Discussion for voting
250
251
251
252
**Important**:
252
253
- Always creates RC from the tip of main branch (HEAD)
253
-
- Breaking change detection happens during RC creation, not during beta publish
254
-
- If breaking changes are found, both RC and next main version get major version bump
254
+
- Breaking change detection happens during both RC creation AND beta publish
255
+
- If breaking changes are found during RC creation, both RC and next main version get major version bump
255
256
256
257
### Step 2: Vote on Release Candidate
257
258
@@ -343,7 +344,7 @@ Workflow: Publish Beta
343
344
branch: main
344
345
Result:
345
346
- Looks for release-root/1.4.0-beta.N → found
346
-
- Extracts base: 1.3.0-rc.0 (major: 1) from tag message
347
+
- Extracts base: 1.3.0-rc.1 (major: 1) from tag message
347
348
- No breaking changes detected
348
349
- Bumped to 1.4.0-beta.1
349
350
- Tagged v1.4.0-beta.1
@@ -354,10 +355,10 @@ Workflow: Publish Beta
354
355
branch: main
355
356
Result:
356
357
- Looks for release-root/1.4.0-beta.N → found
357
-
- Extracts base: 1.3.0-rc.0 (major: 1) from tag message
358
+
- Extracts base: 1.3.0-rc.1 (major: 1) from tag message
358
359
- Breaking changes detected, current major (1) == base major (1)
359
360
- Bumped to 2.0.0-beta.1 (beta resets on major bump)
360
-
- Created release-root/2.0.0-beta.N → same commit, message "Base: 1.3.0-rc.0"
361
+
- Created release-root/2.0.0-beta.N → same commit, message "Base: 1.3.0-rc.1"
361
362
- Tagged v2.0.0-beta.1
362
363
- Published artifacts
363
364
@@ -366,7 +367,7 @@ Workflow: Publish Beta
366
367
branch: main
367
368
Result:
368
369
- Looks for release-root/2.0.0-beta.N → found
369
-
- Extracts base: 1.3.0-rc.0 (major: 1) from tag message
370
+
- Extracts base: 1.3.0-rc.1 (major: 1) from tag message
370
371
- Breaking changes detected, but current major (2) > base major (1)
0 commit comments