@@ -22,44 +22,75 @@ async function verifyReleaseAssets() {
2222 const token = process . env . GITHUB_TOKEN ;
2323
2424 if ( ! token ) {
25- throw new Error ( "GITHUB_TOKEN environment variable is required" ) ;
25+ console . error ( "❌ Missing GITHUB_TOKEN environment variable!" ) ;
26+ process . exit ( 1 ) ;
2627 }
2728
28- // Log token permissions for debugging
29- console . log ( `🔐 Checking token permissions...` ) ;
30- try {
31- const userResponse = await fetch ( "https://api.github.com/user" , {
29+ const inGitHubActions = process . env . GITHUB_ACTIONS === "true" ;
30+
31+ // ✅ Skip token validation in GitHub Actions (since built-in token is limited)
32+ if ( ! inGitHubActions ) {
33+ console . log ( "🔐 Checking GITHUB_TOKEN permissions..." ) ;
34+
35+ const userCheck = await fetch ( "https://api.github.com/user" , {
3236 headers : {
3337 Authorization : `token ${ token } ` ,
3438 Accept : "application/vnd.github.v3+json" ,
3539 "User-Agent" : "dyad-release-verifier" ,
3640 } ,
3741 } ) ;
3842
39- if ( userResponse . ok ) {
40- const userData = await userResponse . json ( ) ;
41- console . log ( `👤 Authenticated as: ${ userData . login } ` ) ;
42- console . log ( `🔑 Token scopes:` , userResponse . headers . get ( "x-oauth-scopes" ) || "Not available" ) ;
43- console . log ( `📋 Accepted permissions:` , userResponse . headers . get ( "x-accepted-github-permissions" ) || "Not available" ) ;
44- } else {
45- console . warn ( `⚠️ Could not verify token permissions: ${ userResponse . status } ${ userResponse . statusText } ` ) ;
43+ if ( ! userCheck . ok ) {
44+ const body = await userCheck . text ( ) ;
45+ console . error ( "❌ Token authentication failed!" ) ;
46+ console . error ( `Status: ${ userCheck . status } ${ userCheck . statusText } ` ) ;
47+ console . error ( `Response body: ${ body } ` ) ;
48+ process . exit ( 1 ) ;
49+ }
50+
51+ const userData = await userCheck . json ( ) ;
52+ console . log ( `✅ Authenticated as: ${ userData . login } ` ) ;
53+ } else {
54+ console . log ( "🏃 Running inside GitHub Actions — no user authentication check needed" ) ;
55+
56+ // Test API access by fetching org/user info
57+ try {
58+ const appCheck = await fetch ( `https://api.github.com/repos/${ owner } /${ repo } ` , {
59+ headers : {
60+ Authorization : `token ${ token } ` ,
61+ Accept : "application/vnd.github.v3+json" ,
62+ "User-Agent" : "dyad-release-verifier" ,
63+ } ,
64+ } ) ;
65+
66+ if ( ! appCheck . ok ) {
67+ const body = await appCheck . text ( ) ;
68+ console . error ( "❌ Token authentication failed!" ) ;
69+ console . error ( `Status: ${ appCheck . status } ${ appCheck . statusText } ` ) ;
70+ console . error ( `Response body: ${ body } ` ) ;
71+ process . exit ( 1 ) ;
72+ }
73+
74+ const repoData = await appCheck . json ( ) ;
75+ console . log ( `✅ Token authenticated for repository: ${ repoData . full_name } ` ) ;
76+ } catch ( error ) {
77+ console . error ( "❌ Error testing token authentication:" , error . message ) ;
78+ process . exit ( 1 ) ;
4679 }
47- } catch ( error ) {
48- console . warn ( `⚠️ Error checking token permissions: ${ error . message } ` ) ;
4980 }
5081
51- // Fetch all releases (including drafts) with retry logic
82+ // --- Fetch releases with retry logic ---
5283 const tagName = `v${ version } ` ;
5384 const maxRetries = 5 ;
5485 const baseDelay = 10000 ; // 10 seconds
55-
5686 let release = null ;
5787 let lastError = null ;
5888
5989 for ( let attempt = 1 ; attempt <= maxRetries ; attempt ++ ) {
6090 try {
61- console . log ( `📡 Attempt ${ attempt } /${ maxRetries } : Fetching all releases to find: ${ tagName } ` ) ;
62- console . log ( `🔗 API URL: https://api.github.com/repos/${ owner } /${ repo } /releases` ) ;
91+ console . log (
92+ `📡 Attempt ${ attempt } /${ maxRetries } : Fetching releases to find: ${ tagName } ` ,
93+ ) ;
6394
6495 const allReleasesUrl = `https://api.github.com/repos/${ owner } /${ repo } /releases` ;
6596 const response = await fetch ( allReleasesUrl , {
@@ -70,112 +101,68 @@ async function verifyReleaseAssets() {
70101 } ,
71102 } ) ;
72103
73- console . log ( `📡 API Response Status: ${ response . status } ${ response . statusText } ` ) ;
74- console . log ( `🔑 Token scopes:` , response . headers . get ( "x-oauth-scopes" ) || "Not available" ) ;
75- console . log ( `📋 Accepted permissions:` , response . headers . get ( "x-accepted-github-permissions" ) || "Not available" ) ;
76-
77104 if ( ! response . ok ) {
78- console . error ( `❌ GitHub API error details:` ) ;
79- console . error ( ` Status: ${ response . status } ` ) ;
80- console . error ( ` Status Text: ${ response . statusText } ` ) ;
81- console . error ( ` URL: ${ allReleasesUrl } ` ) ;
82- console . error ( ` Headers:` , Object . fromEntries ( response . headers . entries ( ) ) ) ;
83-
84- // Try to get response body for more details
85- try {
86- const errorBody = await response . text ( ) ;
87- console . error ( ` Response Body: ${ errorBody } ` ) ;
88- } catch ( e ) {
89- console . error ( ` Could not read error response body: ${ e . message } ` ) ;
90- }
91-
92- throw new Error (
93- `GitHub API error: ${ response . status } ${ response . statusText } ` ,
94- ) ;
105+ console . error ( `❌ GitHub API error: ${ response . status } ${ response . statusText } ` ) ;
106+ const errorBody = await response . text ( ) ;
107+ console . error ( `Response Body: ${ errorBody } ` ) ;
108+ throw new Error ( `GitHub API returned ${ response . status } ` ) ;
95109 }
96110
97111 const allReleases = await response . json ( ) ;
98- console . log ( `📦 Total releases found: ${ allReleases . length } ` ) ;
99- console . log ( `🔍 Available release tags:` , allReleases . map ( r => r . tag_name ) . slice ( 0 , 10 ) ) ;
100112
101- // Check if release exists at all
102- const releaseExists = allReleases . some ( r => r . tag_name === tagName ) ;
113+ const releaseExists = allReleases . some ( ( r ) => r . tag_name === tagName ) ;
103114 if ( ! releaseExists ) {
104- console . error ( `❌ Release ${ tagName } does not exist in the repository!` ) ;
105- console . error ( `📋 All available releases:` ) ;
106- allReleases . forEach ( r => {
107- console . error ( ` - ${ r . tag_name } (${ r . draft ? 'DRAFT' : 'PUBLISHED' } )` ) ;
108- } ) ;
109- throw new Error ( `Release ${ tagName } not found in repository` ) ;
110- }
111-
112- release = allReleases . find ( ( r ) => r . tag_name === tagName ) ;
113-
114- if ( release ) {
115- console . log ( `✅ Found release on attempt ${ attempt } : ${ release . tag_name } (${ release . draft ? 'DRAFT' : 'PUBLISHED' } )` ) ;
116- break ;
117- } else {
118- console . warn ( `⚠️ Release ${ tagName } not found on attempt ${ attempt } . Available releases (first 10):` ) ;
119- allReleases . slice ( 0 , 10 ) . forEach ( r => {
120- console . warn ( ` - ${ r . tag_name } (${ r . draft ? 'DRAFT' : 'PUBLISHED' } )` ) ;
121- } ) ;
122-
115+ console . warn ( `⚠️ Release ${ tagName } not found. Retrying...` ) ;
123116 if ( attempt < maxRetries ) {
124- const delay = baseDelay * attempt ; // Exponential backoff: 10s, 20s, 30s, 40s, 50s
125- console . log ( `⏳ Waiting ${ delay / 1000 } seconds before retry...` ) ;
126- await new Promise ( resolve => setTimeout ( resolve , delay ) ) ;
117+ const delay = baseDelay * attempt ;
118+ console . log ( `⏳ Waiting ${ delay / 1000 } s before retry...` ) ;
119+ await new Promise ( ( r ) => setTimeout ( r , delay ) ) ;
127120 }
121+ continue ;
128122 }
129- } catch ( error ) {
130- lastError = error ;
131- console . error ( `❌ Attempt ${ attempt } failed:` , error . message ) ;
132123
124+ release = allReleases . find ( ( r ) => r . tag_name === tagName ) ;
125+ console . log (
126+ `✅ Found release: ${ release . tag_name } (${ release . draft ? "DRAFT" : "PUBLISHED" } )` ,
127+ ) ;
128+ break ;
129+ } catch ( err ) {
130+ lastError = err ;
131+ console . error ( `❌ Attempt ${ attempt } failed: ${ err . message } ` ) ;
133132 if ( attempt < maxRetries ) {
134133 const delay = baseDelay * attempt ;
135- console . log ( `⏳ Waiting ${ delay / 1000 } seconds before retry ...` ) ;
136- await new Promise ( resolve => setTimeout ( resolve , delay ) ) ;
134+ console . log ( `⏳ Retrying in ${ delay / 1000 } s ...` ) ;
135+ await new Promise ( ( r ) => setTimeout ( r , delay ) ) ;
137136 }
138137 }
139138 }
140139
141140 if ( ! release ) {
142- console . error ( `❌ Release ${ tagName } not found after ${ maxRetries } attempts!` ) ;
143- if ( lastError ) {
144- console . error ( `Last error: ${ lastError . message } ` ) ;
145- }
146- throw new Error (
147- `Release ${ tagName } not found in published releases or drafts after retries. Make sure the release exists.` ,
148- ) ;
141+ console . error ( `❌ Release ${ tagName } not found after ${ maxRetries } attempts` ) ;
142+ if ( lastError ) console . error ( `Last error: ${ lastError . message } ` ) ;
143+ process . exit ( 1 ) ;
149144 }
150145
151- console . log ( `✅ Found release: ${ release . tag_name } (${ release . draft ? 'DRAFT' : 'PUBLISHED' } )` ) ;
152-
153146 const assets = release . assets || [ ] ;
154147
155148 console . log ( `📦 Found ${ assets . length } assets in release ${ tagName } ` ) ;
156149 console . log ( `📄 Release status: ${ release . draft ? "DRAFT" : "PUBLISHED" } ` ) ;
157150
158- // Handle different beta naming conventions across platforms
151+ // --- Define expected assets ---
159152 const normalizeVersionForPlatform = ( version , platform ) => {
160- if ( ! version . includes ( "beta" ) ) {
161- return version ;
162- }
153+ if ( ! version . includes ( "beta" ) ) return version ;
163154
164155 switch ( platform ) {
165156 case "rpm" :
166157 case "deb" :
167- // RPM and DEB use dots: 0.14.0-beta.1 -> 0.14.0.beta.1
168158 return version . replace ( "-beta." , ".beta." ) ;
169159 case "nupkg" :
170- // NuGet removes the dot: 0.14.0-beta.1 -> 0.14.0-beta1
171160 return version . replace ( "-beta." , "-beta" ) ;
172161 default :
173- // Windows installer and macOS zips keep original format
174162 return version ;
175163 }
176164 } ;
177165
178- // Define expected assets with platform-specific version handling
179166 const expectedAssets = [
180167 `dyad-${ normalizeVersionForPlatform ( version , "rpm" ) } -1.x86_64.rpm` ,
181168 `dyad-${ normalizeVersionForPlatform ( version , "nupkg" ) } -full.nupkg` ,
@@ -187,47 +174,31 @@ async function verifyReleaseAssets() {
187174 ] ;
188175
189176 console . log ( "📋 Expected assets:" ) ;
190- expectedAssets . forEach ( ( asset ) => console . log ( ` - ${ asset } ` ) ) ;
177+ expectedAssets . forEach ( ( a ) => console . log ( ` - ${ a } ` ) ) ;
191178 console . log ( "" ) ;
192179
193- // Get actual asset names
194- const actualAssets = assets . map ( ( asset ) => asset . name ) ;
195-
180+ const actualAssets = assets . map ( ( a ) => a . name ) ;
196181 console . log ( "📋 Actual assets:" ) ;
197- actualAssets . forEach ( ( asset ) => console . log ( ` - ${ asset } ` ) ) ;
182+ actualAssets . forEach ( ( a ) => console . log ( ` - ${ a } ` ) ) ;
198183 console . log ( "" ) ;
199184
200- // Check for missing assets
201- const missingAssets = expectedAssets . filter (
202- ( expected ) => ! actualAssets . includes ( expected ) ,
203- ) ;
204-
185+ // --- Compare assets ---
186+ const missingAssets = expectedAssets . filter ( ( a ) => ! actualAssets . includes ( a ) ) ;
205187 if ( missingAssets . length > 0 ) {
206- console . error ( "❌ VERIFICATION FAILED!" ) ;
207- console . error ( "📭 Missing assets:" ) ;
208- missingAssets . forEach ( ( asset ) => console . error ( ` - ${ asset } ` ) ) ;
209- console . error ( "" ) ;
210- console . error (
211- "Please ensure all platforms have completed their builds and uploads." ,
212- ) ;
188+ console . error ( "❌ VERIFICATION FAILED! Missing assets:" ) ;
189+ missingAssets . forEach ( ( a ) => console . error ( ` - ${ a } ` ) ) ;
213190 process . exit ( 1 ) ;
214191 }
215192
216- // Check for unexpected assets (optional warning)
217- const unexpectedAssets = actualAssets . filter (
218- ( actual ) => ! expectedAssets . includes ( actual ) ,
219- ) ;
220-
193+ const unexpectedAssets = actualAssets . filter ( ( a ) => ! expectedAssets . includes ( a ) ) ;
221194 if ( unexpectedAssets . length > 0 ) {
222- console . warn ( "⚠️ Unexpected assets found:" ) ;
223- unexpectedAssets . forEach ( ( asset ) => console . warn ( ` - ${ asset } ` ) ) ;
195+ console . warn ( "⚠️ Unexpected assets found:" ) ;
196+ unexpectedAssets . forEach ( ( a ) => console . warn ( ` - ${ a } ` ) ) ;
224197 console . warn ( "" ) ;
225198 }
226199
227200 console . log ( "✅ VERIFICATION PASSED!" ) ;
228- console . log (
229- `🎉 All ${ expectedAssets . length } expected assets are present in release ${ tagName } ` ,
230- ) ;
201+ console . log ( `🎉 All ${ expectedAssets . length } expected assets are present in release ${ tagName } ` ) ;
231202 console . log ( "" ) ;
232203 console . log ( "📊 Release Summary:" ) ;
233204 console . log ( ` Release: ${ release . name || tagName } ` ) ;
0 commit comments