diff --git a/src/mcp/tools/device/__tests__/build_device.test.ts b/src/mcp/tools/device/__tests__/build_device.test.ts index 06aee637..10b7a6a1 100644 --- a/src/mcp/tools/device/__tests__/build_device.test.ts +++ b/src/mcp/tools/device/__tests__/build_device.test.ts @@ -161,8 +161,6 @@ describe('build_device plugin', () => { '/path/to/MyProject.xcworkspace', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-skipMacroValidation', '-destination', 'generic/platform=iOS', @@ -195,8 +193,6 @@ describe('build_device plugin', () => { '/path/to/MyProject.xcodeproj', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-skipMacroValidation', '-destination', 'generic/platform=iOS', diff --git a/src/mcp/tools/device/__tests__/get_device_app_path.test.ts b/src/mcp/tools/device/__tests__/get_device_app_path.test.ts index f1068c6a..7b885b6b 100644 --- a/src/mcp/tools/device/__tests__/get_device_app_path.test.ts +++ b/src/mcp/tools/device/__tests__/get_device_app_path.test.ts @@ -129,8 +129,6 @@ describe('get_device_app_path plugin', () => { '/path/to/project.xcodeproj', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-destination', 'generic/platform=iOS', '-derivedDataPath', @@ -188,8 +186,6 @@ describe('get_device_app_path plugin', () => { '/path/to/project.xcodeproj', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-destination', 'generic/platform=watchOS', '-derivedDataPath', @@ -246,8 +242,6 @@ describe('get_device_app_path plugin', () => { '/path/to/workspace.xcworkspace', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-destination', 'generic/platform=iOS', '-derivedDataPath', @@ -388,8 +382,6 @@ describe('get_device_app_path plugin', () => { '/path/to/project.xcodeproj', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-destination', 'generic/platform=iOS', '-derivedDataPath', diff --git a/src/mcp/tools/device/build_device.ts b/src/mcp/tools/device/build_device.ts index f5787f61..e3921d24 100644 --- a/src/mcp/tools/device/build_device.ts +++ b/src/mcp/tools/device/build_device.ts @@ -36,7 +36,7 @@ function createBuildDeviceRequest(params: BuildDeviceParams): BuildInvocationReq workspacePath: params.workspacePath, projectPath: params.projectPath, derivedDataPath: resolveEffectiveDerivedDataPath(params), - configuration: params.configuration ?? 'Debug', + configuration: params.configuration, platform: String(mapDevicePlatform(params.platform)), target: 'device', }; @@ -77,7 +77,7 @@ export function createBuildDeviceExecutor( const platform = mapDevicePlatform(params.platform); const processedParams = { ...params, - configuration: params.configuration ?? 'Debug', + configuration: params.configuration, }; const started = createDomainStreamingPipeline('build_device', 'BUILD', ctx, 'build-result'); diff --git a/src/mcp/tools/device/build_run_device.ts b/src/mcp/tools/device/build_run_device.ts index ca2b44b0..f5929462 100644 --- a/src/mcp/tools/device/build_run_device.ts +++ b/src/mcp/tools/device/build_run_device.ts @@ -43,7 +43,7 @@ function createBuildRunDeviceRequest(params: BuildRunDeviceParams): BuildInvocat workspacePath: params.workspacePath, projectPath: params.projectPath, derivedDataPath: resolveEffectiveDerivedDataPath(params), - configuration: params.configuration ?? 'Debug', + configuration: params.configuration, platform: String(mapDevicePlatform(params.platform)), deviceId: params.deviceId, target: 'device', @@ -87,7 +87,7 @@ export function createBuildRunDeviceExecutor( ): StreamingExecutor { return async (params, ctx) => { const platform = mapDevicePlatform(params.platform); - const configuration = params.configuration ?? 'Debug'; + const configuration = params.configuration; const request = createBuildRunDeviceRequest(params); const sharedBuildParams: SharedBuildParams = { projectPath: params.projectPath, diff --git a/src/mcp/tools/device/get_device_app_path.ts b/src/mcp/tools/device/get_device_app_path.ts index df6bae45..5f831f87 100644 --- a/src/mcp/tools/device/get_device_app_path.ts +++ b/src/mcp/tools/device/get_device_app_path.ts @@ -62,7 +62,7 @@ function createRequest(params: GetDeviceAppPathParams) { scheme: params.scheme, projectPath: params.projectPath, workspacePath: params.workspacePath, - configuration: params.configuration ?? 'Debug', + configuration: params.configuration, platform: String(mapDevicePlatform(params.platform)), }; } @@ -72,7 +72,7 @@ export function createGetDeviceAppPathExecutor( ): NonStreamingExecutor { return async (params) => { const platform = mapDevicePlatform(params.platform); - const configuration = params.configuration ?? 'Debug'; + const configuration = params.configuration; log('info', `Getting app path for scheme ${params.scheme} on platform ${platform}`); diff --git a/src/mcp/tools/device/test_device.ts b/src/mcp/tools/device/test_device.ts index 234590fa..c5582a37 100644 --- a/src/mcp/tools/device/test_device.ts +++ b/src/mcp/tools/device/test_device.ts @@ -73,7 +73,7 @@ const publicSchemaObject = baseSchemaObject.omit({ } as const); interface PreparedTestDeviceExecution { - configuration: string; + configuration?: string; platform: XcodePlatform; preflight?: TestPreflightResult; invocationRequest: BuildInvocationRequest; @@ -83,7 +83,7 @@ async function prepareTestDeviceExecution( params: TestDeviceParams, fileSystemExecutor: FileSystemExecutor, ): Promise { - const configuration = params.configuration ?? 'Debug'; + const configuration = params.configuration; const platform = mapDevicePlatform(params.platform); const preflight = await resolveTestPreflight( { diff --git a/src/mcp/tools/macos/__tests__/build_macos.test.ts b/src/mcp/tools/macos/__tests__/build_macos.test.ts index fc7d12e2..ef24f550 100644 --- a/src/mcp/tools/macos/__tests__/build_macos.test.ts +++ b/src/mcp/tools/macos/__tests__/build_macos.test.ts @@ -207,8 +207,6 @@ describe('build_macos plugin', () => { '/path/to/project.xcodeproj', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-skipMacroValidation', '-destination', 'platform=macOS', @@ -274,8 +272,6 @@ describe('build_macos plugin', () => { '/path/to/project.xcodeproj', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-skipMacroValidation', '-destination', 'platform=macOS', @@ -305,8 +301,6 @@ describe('build_macos plugin', () => { '/path/to/project.xcodeproj', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-skipMacroValidation', '-destination', 'platform=macOS,arch=arm64', @@ -335,8 +329,6 @@ describe('build_macos plugin', () => { '/Users/dev/My Project/MyProject.xcodeproj', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-skipMacroValidation', '-destination', 'platform=macOS', @@ -365,8 +357,6 @@ describe('build_macos plugin', () => { '/path/to/workspace.xcworkspace', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-skipMacroValidation', '-destination', 'platform=macOS', diff --git a/src/mcp/tools/macos/__tests__/get_mac_app_path.test.ts b/src/mcp/tools/macos/__tests__/get_mac_app_path.test.ts index 5bafb450..e91f3d46 100644 --- a/src/mcp/tools/macos/__tests__/get_mac_app_path.test.ts +++ b/src/mcp/tools/macos/__tests__/get_mac_app_path.test.ts @@ -126,8 +126,6 @@ describe('get_mac_app_path plugin', () => { '/path/to/MyProject.xcworkspace', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-destination', 'generic/platform=macOS', '-derivedDataPath', @@ -168,8 +166,6 @@ describe('get_mac_app_path plugin', () => { '/path/to/MyProject.xcodeproj', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-destination', 'generic/platform=macOS', '-derivedDataPath', @@ -315,7 +311,7 @@ describe('get_mac_app_path plugin', () => { ]); }); - it('should use default configuration when not provided', async () => { + it('should omit configuration when not provided', async () => { // Manual call tracking for command verification const calls: any[] = []; const mockExecutor: CommandExecutor = async (...args) => { @@ -345,8 +341,6 @@ describe('get_mac_app_path plugin', () => { '/path/to/MyProject.xcworkspace', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-destination', 'platform=macOS,arch=arm64', '-derivedDataPath', diff --git a/src/mcp/tools/macos/build_macos.ts b/src/mcp/tools/macos/build_macos.ts index 8faac202..cadf3382 100644 --- a/src/mcp/tools/macos/build_macos.ts +++ b/src/mcp/tools/macos/build_macos.ts @@ -31,7 +31,7 @@ function createBuildMacOSRequest(params: BuildMacOSParams): BuildInvocationReque workspacePath: params.workspacePath, projectPath: params.projectPath, derivedDataPath: resolveEffectiveDerivedDataPath(params), - configuration: params.configuration ?? 'Debug', + configuration: params.configuration, platform: 'macOS', arch: params.arch, target: 'macos', @@ -74,7 +74,7 @@ export function createBuildMacOSExecutor( executor: CommandExecutor, ): StreamingExecutor { return async (params, ctx) => { - const configuration = params.configuration ?? 'Debug'; + const configuration = params.configuration; const started = createDomainStreamingPipeline('build_macos', 'BUILD', ctx, 'build-result'); const buildResult = await executeXcodeBuildCommand( { ...params, configuration }, diff --git a/src/mcp/tools/macos/build_run_macos.ts b/src/mcp/tools/macos/build_run_macos.ts index 9f3e8f71..ba30415e 100644 --- a/src/mcp/tools/macos/build_run_macos.ts +++ b/src/mcp/tools/macos/build_run_macos.ts @@ -32,7 +32,7 @@ function createBuildRunMacOSRequest(params: BuildRunMacOSParams): BuildInvocatio workspacePath: params.workspacePath, projectPath: params.projectPath, derivedDataPath: resolveEffectiveDerivedDataPath(params), - configuration: params.configuration ?? 'Debug', + configuration: params.configuration, platform: 'macOS', arch: params.arch, target: 'macos', @@ -82,7 +82,7 @@ export function createBuildRunMacOSExecutor( executor: CommandExecutor, ): StreamingExecutor { return async (params, ctx) => { - const configuration = params.configuration ?? 'Debug'; + const configuration = params.configuration; const request = createBuildRunMacOSRequest(params); const started = createDomainStreamingPipeline('build_run_macos', 'BUILD', ctx); try { diff --git a/src/mcp/tools/macos/get_mac_app_path.ts b/src/mcp/tools/macos/get_mac_app_path.ts index 887069be..bf7f0063 100644 --- a/src/mcp/tools/macos/get_mac_app_path.ts +++ b/src/mcp/tools/macos/get_mac_app_path.ts @@ -58,7 +58,7 @@ function createRequest(params: GetMacosAppPathParams) { scheme: params.scheme, projectPath: params.projectPath, workspacePath: params.workspacePath, - configuration: params.configuration ?? 'Debug', + configuration: params.configuration, platform: 'macOS', }; } @@ -67,7 +67,7 @@ export function createGetMacAppPathExecutor( executor: CommandExecutor, ): NonStreamingExecutor { return async (params) => { - const configuration = params.configuration ?? 'Debug'; + const configuration = params.configuration; log('info', `Getting app path for scheme ${params.scheme} on platform macOS`); diff --git a/src/mcp/tools/macos/test_macos.ts b/src/mcp/tools/macos/test_macos.ts index 2338f831..a0bf1117 100644 --- a/src/mcp/tools/macos/test_macos.ts +++ b/src/mcp/tools/macos/test_macos.ts @@ -66,7 +66,7 @@ export type TestMacosParams = z.infer; type TestMacosResult = TestResultDomainResult; interface PreparedTestMacosExecution { - configuration: string; + configuration?: string; preflight?: TestPreflightResult; invocationRequest: BuildInvocationRequest; } @@ -75,7 +75,7 @@ async function prepareTestMacosExecution( params: TestMacosParams, fileSystemExecutor: FileSystemExecutor, ): Promise { - const configuration = params.configuration ?? 'Debug'; + const configuration = params.configuration; const preflight = await resolveTestPreflight( { projectPath: params.projectPath, diff --git a/src/mcp/tools/simulator/__tests__/build_run_sim.test.ts b/src/mcp/tools/simulator/__tests__/build_run_sim.test.ts index f68c189d..2288dd03 100644 --- a/src/mcp/tools/simulator/__tests__/build_run_sim.test.ts +++ b/src/mcp/tools/simulator/__tests__/build_run_sim.test.ts @@ -407,8 +407,6 @@ describe('build_run_sim tool', () => { '/path/to/MyProject.xcworkspace', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-skipMacroValidation', '-destination', 'platform=iOS Simulator,name=iPhone 17,OS=latest', @@ -466,8 +464,6 @@ describe('build_run_sim tool', () => { '/path/to/MyProject.xcworkspace', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-skipMacroValidation', '-destination', 'platform=iOS Simulator,name=iPhone 17,OS=latest', @@ -665,8 +661,6 @@ describe('build_run_sim tool', () => { '/Users/dev/My Project/MyProject.xcworkspace', '-scheme', 'My Scheme', - '-configuration', - 'Debug', '-skipMacroValidation', '-destination', 'platform=iOS Simulator,name=iPhone 17 Pro,OS=latest', @@ -699,8 +693,6 @@ describe('build_run_sim tool', () => { '/path/to/MyProject.xcworkspace', '-scheme', 'MyTVScheme', - '-configuration', - 'Debug', '-skipMacroValidation', '-destination', 'platform=tvOS Simulator,name=Apple TV 4K,OS=latest', diff --git a/src/mcp/tools/simulator/__tests__/build_sim.test.ts b/src/mcp/tools/simulator/__tests__/build_sim.test.ts index ff0011fa..34a2130f 100644 --- a/src/mcp/tools/simulator/__tests__/build_sim.test.ts +++ b/src/mcp/tools/simulator/__tests__/build_sim.test.ts @@ -208,8 +208,6 @@ describe('build_sim tool', () => { '/path/to/MyProject.xcworkspace', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-skipMacroValidation', '-destination', 'platform=iOS Simulator,name=iPhone 17,OS=latest', @@ -243,8 +241,6 @@ describe('build_sim tool', () => { '/path/to/MyProject.xcodeproj', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-skipMacroValidation', '-destination', 'platform=iOS Simulator,name=iPhone 17,OS=latest', @@ -318,8 +314,6 @@ describe('build_sim tool', () => { '/Users/dev/My Project/MyProject.xcworkspace', '-scheme', 'My Scheme', - '-configuration', - 'Debug', '-skipMacroValidation', '-destination', 'platform=iOS Simulator,name=iPhone 17 Pro,OS=latest', @@ -354,8 +348,6 @@ describe('build_sim tool', () => { '/path/to/MyProject.xcworkspace', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-skipMacroValidation', '-destination', 'platform=iOS Simulator,name=iPhone 17,OS=latest', @@ -389,8 +381,6 @@ describe('build_sim tool', () => { '/path/to/MyProject.xcworkspace', '-scheme', 'MyWatchScheme', - '-configuration', - 'Debug', '-skipMacroValidation', '-destination', 'platform=watchOS Simulator,name=Apple Watch Ultra 2,OS=latest', diff --git a/src/mcp/tools/simulator/__tests__/get_sim_app_path.test.ts b/src/mcp/tools/simulator/__tests__/get_sim_app_path.test.ts index 93f0c7b1..5aed22a7 100644 --- a/src/mcp/tools/simulator/__tests__/get_sim_app_path.test.ts +++ b/src/mcp/tools/simulator/__tests__/get_sim_app_path.test.ts @@ -156,8 +156,6 @@ describe('get_sim_app_path tool', () => { '/path/to/workspace.xcworkspace', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-destination', 'platform=iOS Simulator,name=iPhone 17,OS=latest', '-derivedDataPath', @@ -219,8 +217,6 @@ describe('get_sim_app_path tool', () => { '/path/to/workspace.xcworkspace', '-scheme', 'MyScheme', - '-configuration', - 'Debug', '-destination', 'platform=iOS Simulator,name=iPhone 17,OS=latest', '-derivedDataPath', diff --git a/src/mcp/tools/simulator/build_run_sim.ts b/src/mcp/tools/simulator/build_run_sim.ts index d738714f..3b8d6ad1 100644 --- a/src/mcp/tools/simulator/build_run_sim.ts +++ b/src/mcp/tools/simulator/build_run_sim.ts @@ -104,7 +104,7 @@ export type SimulatorLauncher = typeof launchSimulatorAppWithLogging; type BuildRunSimulatorResult = BuildRunResultDomainResult; interface PreparedBuildRunSimExecution { - configuration: string; + configuration?: string; detectedPlatform: InferPlatformResult['platform']; displayPlatform: string; platformName: string; @@ -135,7 +135,7 @@ async function prepareBuildRunSimExecution( executor, ); const detectedPlatform = inferred.platform; - const configuration = params.configuration ?? 'Debug'; + const configuration = params.configuration; const displayPlatform = params.simulatorId && inferred.source !== 'simulator-runtime' ? 'Simulator' @@ -542,7 +542,7 @@ export async function build_run_simLogic( workspacePath: params.workspacePath, projectPath: params.projectPath, derivedDataPath: resolveEffectiveDerivedDataPath(params), - configuration: params.configuration ?? 'Debug', + configuration: params.configuration, platform: 'Simulator', simulatorName: params.simulatorName, simulatorId: params.simulatorId, diff --git a/src/mcp/tools/simulator/build_sim.ts b/src/mcp/tools/simulator/build_sim.ts index 5a6a02f0..e28136fe 100644 --- a/src/mcp/tools/simulator/build_sim.ts +++ b/src/mcp/tools/simulator/build_sim.ts @@ -81,10 +81,10 @@ export type BuildSimulatorParams = z.infer; type BuildSimulatorResult = BuildResultDomainResult; interface PreparedBuildSimExecution { - configuration: string; + configuration?: string; detectedPlatform: InferPlatformResult['platform']; platformName: string; - sharedBuildParams: BuildSimulatorParams & { configuration: string }; + sharedBuildParams: BuildSimulatorParams; platformOptions: { platform: InferPlatformResult['platform']; simulatorName?: string; @@ -100,7 +100,7 @@ async function prepareBuildSimExecution( params: BuildSimulatorParams, executor: CommandExecutor, ): Promise { - const configuration = params.configuration ?? 'Debug'; + const configuration = params.configuration; const useLatestOS = params.useLatestOS ?? true; const inferred = await inferPlatform( { diff --git a/src/mcp/tools/simulator/get_sim_app_path.ts b/src/mcp/tools/simulator/get_sim_app_path.ts index fc19eef8..51dda98b 100644 --- a/src/mcp/tools/simulator/get_sim_app_path.ts +++ b/src/mcp/tools/simulator/get_sim_app_path.ts @@ -85,7 +85,7 @@ function createRequest(params: GetSimulatorAppPathParams) { scheme: params.scheme, projectPath: params.projectPath, workspacePath: params.workspacePath, - configuration: params.configuration ?? 'Debug', + configuration: params.configuration, platform: params.platform, simulator: params.simulatorName ?? params.simulatorId, }; @@ -95,7 +95,7 @@ export function createGetSimAppPathExecutor( executor: CommandExecutor, ): NonStreamingExecutor { return async (params) => { - const configuration = params.configuration ?? 'Debug'; + const configuration = params.configuration; const useLatestOS = params.useLatestOS ?? true; if (params.simulatorId && params.useLatestOS !== undefined) { diff --git a/src/mcp/tools/simulator/test_sim.ts b/src/mcp/tools/simulator/test_sim.ts index f6d425cf..e50516f2 100644 --- a/src/mcp/tools/simulator/test_sim.ts +++ b/src/mcp/tools/simulator/test_sim.ts @@ -91,7 +91,7 @@ type TestSimulatorParams = z.infer; type TestSimulatorResult = TestResultDomainResult; interface PreparedTestSimExecution { - configuration: string; + configuration?: string; platform: InferPlatformResult['platform']; preflight?: TestPreflightResult; resolvedSimulatorId?: string; @@ -105,7 +105,7 @@ async function prepareTestSimExecution( executor: CommandExecutor, fileSystemExecutor: FileSystemExecutor, ): Promise { - const configuration = params.configuration ?? 'Debug'; + const configuration = params.configuration; const inferred = await inferPlatform( { projectPath: params.projectPath, diff --git a/src/mcp/tools/utilities/clean.ts b/src/mcp/tools/utilities/clean.ts index 011e9fad..aa3d6cb2 100644 --- a/src/mcp/tools/utilities/clean.ts +++ b/src/mcp/tools/utilities/clean.ts @@ -90,13 +90,13 @@ const SIMULATOR_TO_DEVICE_PLATFORM: Partial function createCleanArtifacts( params: CleanParams, - configuration: string, + configuration: string | undefined, platform: XcodePlatform, ): CleanResult['artifacts'] { return { ...(params.workspacePath ? { workspacePath: params.workspacePath } : {}), ...(params.scheme ? { scheme: params.scheme } : {}), - configuration, + ...(configuration ? { configuration } : {}), platform: String(platform), }; } @@ -130,7 +130,7 @@ function createCleanResult( }, ): CleanResult { const cleanPlatform = options?.cleanPlatform ?? resolveCleanPlatform(params) ?? XcodePlatform.iOS; - const configuration = options?.configuration ?? params.configuration ?? 'Debug'; + const configuration = options?.configuration ?? params.configuration; return { kind: 'build-result', @@ -182,7 +182,7 @@ export function createCleanExecutor( ); } - const configuration = params.configuration ?? 'Debug'; + const configuration = params.configuration; const stderrChunks: string[] = []; try { diff --git a/src/types/common.ts b/src/types/common.ts index 64ecd325..4beb35cd 100644 --- a/src/types/common.ts +++ b/src/types/common.ts @@ -132,7 +132,7 @@ export interface SharedBuildParams { workspacePath?: string; projectPath?: string; scheme: string; - configuration: string; + configuration?: string; derivedDataPath?: string; extraArgs?: string[]; } diff --git a/src/utils/__tests__/app-path-resolver.test.ts b/src/utils/__tests__/app-path-resolver.test.ts index 94aabf49..704f654a 100644 --- a/src/utils/__tests__/app-path-resolver.test.ts +++ b/src/utils/__tests__/app-path-resolver.test.ts @@ -61,6 +61,60 @@ describe('resolveAppPathFromBuildSettings', () => { expect(capturedCommand).toContain(expected); }); + it('omits -configuration when configuration is not provided', async () => { + let capturedCommand: string[] | undefined; + + const mockExecutor = createMockExecutor({ + success: true, + output: + 'BUILT_PRODUCTS_DIR = /Build/Products/Debug-iphonesimulator\nFULL_PRODUCT_NAME = App.app\n', + exitCode: 0, + onExecute: (command) => { + capturedCommand = command; + }, + }); + + await resolveAppPathFromBuildSettings( + { + projectPath: '/abs/path/App.xcodeproj', + scheme: 'App', + platform: XcodePlatform.iOSSimulator, + }, + mockExecutor, + ); + + expect(capturedCommand).toBeDefined(); + expect(capturedCommand).not.toContain('-configuration'); + }); + + it('includes -configuration when configuration is provided', async () => { + let capturedCommand: string[] | undefined; + + const mockExecutor = createMockExecutor({ + success: true, + output: + 'BUILT_PRODUCTS_DIR = /Build/Products/Release-iphonesimulator\nFULL_PRODUCT_NAME = App.app\n', + exitCode: 0, + onExecute: (command) => { + capturedCommand = command; + }, + }); + + await resolveAppPathFromBuildSettings( + { + projectPath: '/abs/path/App.xcodeproj', + scheme: 'App', + configuration: 'Release', + platform: XcodePlatform.iOSSimulator, + }, + mockExecutor, + ); + + const index = capturedCommand?.indexOf('-configuration') ?? -1; + expect(index).toBeGreaterThanOrEqual(0); + expect(capturedCommand?.[index + 1]).toBe('Release'); + }); + it('leaves absolute paths unchanged', async () => { let capturedCommand: string[] | undefined; diff --git a/src/utils/__tests__/build-utils.test.ts b/src/utils/__tests__/build-utils.test.ts index 7799523f..42d80872 100644 --- a/src/utils/__tests__/build-utils.test.ts +++ b/src/utils/__tests__/build-utils.test.ts @@ -344,6 +344,67 @@ describe('build-utils Sentry Classification', () => { }); }); + describe('Configuration Flag', () => { + it('should omit -configuration when configuration is not provided', async () => { + let capturedCommand: string[] | undefined; + const mockExecutor = createMockExecutor({ + success: true, + output: 'BUILD SUCCEEDED', + exitCode: 0, + onExecute: (command) => { + capturedCommand = command; + }, + }); + + await executeXcodeBuildCommand( + { + scheme: 'TestScheme', + projectPath: '/path/to/project.xcodeproj', + }, + mockPlatformOptions, + false, + 'build', + mockExecutor, + undefined, + createMockPipeline(), + ); + + expect(capturedCommand).toBeDefined(); + expect(capturedCommand).not.toContain('-configuration'); + }); + + it('should include -configuration when configuration is provided', async () => { + let capturedCommand: string[] | undefined; + const mockExecutor = createMockExecutor({ + success: true, + output: 'BUILD SUCCEEDED', + exitCode: 0, + onExecute: (command) => { + capturedCommand = command; + }, + }); + + await executeXcodeBuildCommand( + { + scheme: 'TestScheme', + configuration: 'Release', + projectPath: '/path/to/project.xcodeproj', + }, + mockPlatformOptions, + false, + 'build', + mockExecutor, + undefined, + createMockPipeline(), + ); + + expect(capturedCommand).toBeDefined(); + const index = capturedCommand?.indexOf('-configuration') ?? -1; + expect(index).toBeGreaterThanOrEqual(0); + expect(capturedCommand?.[index + 1]).toBe('Release'); + }); + }); + describe('Working Directory (cwd) Handling', () => { it('should pass project directory as cwd for workspace builds', async () => { let capturedOptions: Record | undefined; diff --git a/src/utils/app-path-resolver.ts b/src/utils/app-path-resolver.ts index a4b61079..a5e07553 100644 --- a/src/utils/app-path-resolver.ts +++ b/src/utils/app-path-resolver.ts @@ -65,7 +65,9 @@ export async function resolveAppPathFromBuildSettings( } command.push('-scheme', params.scheme); - command.push('-configuration', params.configuration ?? 'Debug'); + if (params.configuration) { + command.push('-configuration', params.configuration); + } const destination = params.destination ?? getBuildSettingsDestination(params.platform, params.deviceId); diff --git a/src/utils/build-utils.ts b/src/utils/build-utils.ts index aebca862..1415768a 100644 --- a/src/utils/build-utils.ts +++ b/src/utils/build-utils.ts @@ -94,7 +94,9 @@ export async function executeXcodeBuildCommand( } command.push('-scheme', params.scheme); - command.push('-configuration', params.configuration); + if (params.configuration) { + command.push('-configuration', params.configuration); + } command.push('-skipMacroValidation'); let destinationString: string; diff --git a/src/utils/test-common.ts b/src/utils/test-common.ts index 689cc031..c3bffc46 100644 --- a/src/utils/test-common.ts +++ b/src/utils/test-common.ts @@ -84,7 +84,7 @@ export interface SharedTestExecutorParams { workspacePath?: string; projectPath?: string; scheme: string; - configuration: string; + configuration?: string; simulatorName?: string; simulatorId?: string; deviceId?: string; diff --git a/src/utils/test-preflight.ts b/src/utils/test-preflight.ts index e0c4024a..2e67f028 100644 --- a/src/utils/test-preflight.ts +++ b/src/utils/test-preflight.ts @@ -21,7 +21,7 @@ export interface ResolvedTestTarget { export interface TestPreflightResult { scheme: string; - configuration: string; + configuration?: string; workspacePath?: string; projectPath?: string; destinationName: string; @@ -359,7 +359,7 @@ export async function resolveTestPreflight( workspacePath?: string; projectPath?: string; scheme: string; - configuration: string; + configuration?: string; extraArgs?: string[]; destinationName: string; },