@@ -107,14 +107,35 @@ async function hasFindingsChurn(teamscaleClient: TeamscaleClient, projectCandida
107107 */
108108export async function retrieveRequirementsConnectorId ( teamscaleClient : TeamscaleClient , projectCandidate : string ) {
109109 let connectorId : string = '' ;
110- const projectConnectorList = await teamscaleClient . retrieveProjectConnectorList ( ) ;
110+ const [ projectConnectorList , connectorIdOptionName ] = await Promise . all ( [
111+ teamscaleClient . retrieveProjectConnectorList ( ) ,
112+ getConnectorIdOptionName ( teamscaleClient )
113+ ] ) ;
111114 if ( projectConnectorList . hasOwnProperty ( projectCandidate ) ) {
112115 for ( const projectConnector of projectConnectorList [ projectCandidate ] ) {
113116 if ( projectConnector . type !== 'Azure DevOps Boards as Requirement Management Tool' ) {
114117 continue ;
115118 }
116- connectorId = projectConnector . options [ 'Requirements Connector Identifier' ] ;
119+ connectorId = projectConnector . options [ connectorIdOptionName ] ;
117120 }
118121 }
119122 return connectorId ;
123+ }
124+
125+ /**
126+ * Returns the correct option name for the connector identifier based on the Teamscale server version.
127+ * Before 2026.1 it was "Requirements Connector identifier", from 2026.1 onwards "Requirements Connector Identifier".
128+ */
129+ async function getConnectorIdOptionName ( teamscaleClient : TeamscaleClient ) : Promise < string > {
130+ try {
131+ const versionInfo = await teamscaleClient . retrieveServerVersion ( ) ;
132+ const version = versionInfo . maxApiVersion ;
133+ if ( version . major > 2026 || ( version . major === 2026 && version . minor >= 1 ) ) {
134+ return 'Requirements Connector Identifier' ;
135+ }
136+ } catch ( e ) {
137+ // Fall back to new name if version check fails
138+ return 'Requirements Connector Identifier' ;
139+ }
140+ return 'Requirements Connector identifier' ;
120141}
0 commit comments