@@ -224,24 +224,25 @@ if (!version || !/^\d+\.\d+\.\d+(-[\w.]+)?$/.test(version)) {
224224}
225225const dryRun = ! args . includes ( "--publish" ) ;
226226
227- // 1. Preflight — must be on main or preview, and local verification must pass.
227+ // 1. Preflight — every release runs from main (release.yml rejects any other ref),
228+ // and local verification must pass. Stable versions publish to the `latest` dist-tag,
229+ // prereleases to `preview`; the only supported prerelease shape is X.Y.Z-preview.N,
230+ // which is what the update client and the release-notes helper recognize.
228231const branch = ( await $ `git rev-parse --abbrev-ref HEAD` . text ( ) ) . trim ( ) ;
229- const allowedBranches = [ "main" , "preview" ] ;
230- const expectedTag = branch === "preview" ? "preview" : "latest" ;
232+ const releaseBranch = "main" ;
233+ const isPrerelease = version . includes ( "-" ) ;
234+ const expectedTag = isPrerelease ? "preview" : "latest" ;
231235const tag = args . includes ( "--tag" ) ? ( args [ args . indexOf ( "--tag" ) + 1 ] ?? expectedTag ) : expectedTag ;
232236if ( tag !== expectedTag ) {
233- console . error ( `Release tag mismatch: ${ branch } releases must use npm dist-tag '${ expectedTag } ' (got '${ tag } ').` ) ;
237+ const kind = isPrerelease ? "Pre-release" : "Stable" ;
238+ console . error ( `Release tag mismatch: ${ kind } versions must use npm dist-tag '${ expectedTag } ' (got '${ tag } ').` ) ;
234239 process . exit ( 1 ) ;
235240}
236- if ( branch === "preview" && ! version . includes ( " -preview." ) ) {
237- console . error ( `Preview releases must use a preview prerelease version (got ${ version } ).` ) ;
241+ if ( isPrerelease && ! / ^ \d + \. \d + \. \d + - p r e v i e w \. \d + $ / . test ( version ) ) {
242+ console . error ( `Pre-release versions must be X.Y.Z- preview.N (got ${ version } ).` ) ;
238243 process . exit ( 1 ) ;
239244}
240- if ( branch === "main" && version . includes ( "-" ) ) {
241- console . error ( `Main releases must use a stable semver version (got ${ version } ).` ) ;
242- process . exit ( 1 ) ;
243- }
244- if ( ! allowedBranches . includes ( branch ) ) { console . error ( `✗ must be on ${ allowedBranches . join ( " or " ) } (currently ${ branch } ).` ) ; process . exit ( 1 ) ; }
245+ if ( branch !== releaseBranch ) { console . error ( `✗ must be on ${ releaseBranch } (currently ${ branch } ).` ) ; process . exit ( 1 ) ; }
245246if ( ( await $ `git status --porcelain` . text ( ) ) . trim ( ) ) { console . error ( "✗ working tree not clean — commit or stash first." ) ; process . exit ( 1 ) ; }
246247const packageName = await readPackageName ( ) ;
247248console . log ( `→ release metadata preflight (${ packageName } @${ version } )` ) ;
0 commit comments