@@ -19,6 +19,7 @@ import { extractArtifact, getPomCacheStats, normalizeScmUrl } from './extract'
1919import { isMavenFetchError , resolveVersionsList } from './metadata'
2020import { isPrerelease , parseRepoUrl } from './normalize'
2121import {
22+ GRADLE_PLUGIN_PORTAL_BASE_URL ,
2223 MAVEN_CENTRAL_BASE_URL ,
2324 isAlternativeRegistry ,
2425 resolveRegistryBaseUrl ,
@@ -141,6 +142,19 @@ async function processCriticalPackage(qx: QueryExecutor, pkg: PackageRow, forceF
141142 }
142143 }
143144
145+ // Third fallback: Gradle Plugin Portal. Plugins can be published under any groupId
146+ // (not just gradle.plugin.*), so this is worth trying for all NOT_FOUND packages.
147+ // Skip when GPP is already the primary registry (gradle.plugin.*) to avoid a
148+ // redundant second call to the same URL.
149+ if ( isMavenFetchError ( metadata ) && metadata . kind === 'NOT_FOUND' && baseUrl !== GRADLE_PLUGIN_PORTAL_BASE_URL ) {
150+ const gradlePortalMetadata = await resolveVersionsList ( groupId , artifactId , GRADLE_PLUGIN_PORTAL_BASE_URL )
151+ if ( ! isMavenFetchError ( gradlePortalMetadata ) ) {
152+ log . info ( { groupId, artifactId } , 'Not found in primary/Central — resolved via Gradle Plugin Portal fallback' )
153+ baseUrl = GRADLE_PLUGIN_PORTAL_BASE_URL
154+ metadata = gradlePortalMetadata
155+ }
156+ }
157+
144158 if ( isMavenFetchError ( metadata ) ) {
145159 if ( metadata . kind === 'NOT_FOUND' ) {
146160 await upsertPackage ( qx , {
0 commit comments