diff --git a/CHANGELOG.md b/CHANGELOG.md index 6aafbdcf..29ea9e34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Added +- Added configurable file artifact text rendering with CLI output defaulting to labeled `Files:` lists, MCP text preserving compact trees, and `filePathRenderStyle` / `XCODEBUILDMCP_FILE_PATH_RENDER_STYLE` / `--file-path-render-style` overrides. - Added workspace-scoped default xcresult bundles for simulator, device, and macOS test tools so test artifacts are available in structured and text output even when callers do not pass `-resultBundlePath`. - Added opt-in MCP server idle shutdown via `XCODEBUILDMCP_MCP_IDLE_TIMEOUT_MS`, allowing unused MCP server processes to gracefully exit after a configured idle period ([#394](https://github.com/getsentry/XcodeBuildMCP/issues/394)). diff --git a/config.example.yaml b/config.example.yaml index 056d0cd1..fc6ab827 100644 --- a/config.example.yaml +++ b/config.example.yaml @@ -10,6 +10,7 @@ disableSessionDefaults: false incrementalBuildsEnabled: false debug: false sentryDisabled: false +filePathRenderStyle: 'list' # text output file artifacts: list or tree sessionDefaults: projectPath: './MyApp.xcodeproj' # xor workspacePath workspacePath: './MyApp.xcworkspace' # xor projectPath diff --git a/src/cli.ts b/src/cli.ts index b20efb62..9777a3e2 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -10,7 +10,12 @@ import { coerceLogLevel, setLogLevel, type LogLevel } from './utils/logger.ts'; import { hydrateSentryDisabledEnvFromProjectConfig } from './utils/sentry-config.ts'; function findTopLevelCommand(argv: string[]): string | undefined { - const flagsWithValue = new Set(['--socket', '--log-level', '--style']); + const flagsWithValue = new Set([ + '--socket', + '--log-level', + '--style', + '--file-path-render-style', + ]); let skipNext = false; for (const token of argv) { @@ -75,6 +80,11 @@ async function buildLightweightYargsApp(): Promise { const level = argv['log-level'] as LogLevel | undefined; if (level) { diff --git a/src/cli/__tests__/register-tool-commands.test.ts b/src/cli/__tests__/register-tool-commands.test.ts index a7d77712..8a744bac 100644 --- a/src/cli/__tests__/register-tool-commands.test.ts +++ b/src/cli/__tests__/register-tool-commands.test.ts @@ -374,6 +374,62 @@ describe('registerToolCommands', () => { stdoutWrite.mockRestore(); }); + it('applies --file-path-render-style to text output without forwarding it to tool args', async () => { + vi.spyOn(DefaultToolInvoker.prototype, 'invokeDirect').mockImplementation( + async (tool, args, opts) => { + const handlerContext: ToolHandlerContext = opts.handlerContext ?? { + emit: (fragment) => { + opts.renderSession?.emit(fragment); + }, + attach: (image) => { + opts.renderSession?.attach(image); + }, + }; + + await tool.handler(args, handlerContext); + + if (handlerContext.structuredOutput) { + opts.renderSession?.setStructuredOutput?.(handlerContext.structuredOutput); + opts.onStructuredOutput?.(handlerContext.structuredOutput); + } + }, + ); + const stdoutChunks: string[] = []; + vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => { + stdoutChunks.push(String(chunk)); + return true; + }); + + const tool = createTool({ + handler: vi.fn(async (_args, ctx) => { + if (ctx) { + ctx.structuredOutput = { + schema: 'xcodebuildmcp.output.app-path', + schemaVersion: '1', + result: { + kind: 'app-path', + didError: false, + error: null, + artifacts: { appPath: '/tmp/MyApp.app' }, + }, + }; + } + }) as ToolDefinition['handler'], + }); + const app = createApp(createCatalog([tool])); + + await expect( + app.parseAsync(['simulator', 'run-tool', '--file-path-render-style', 'tree']), + ).resolves.toBeDefined(); + + expect(tool.handler).toHaveBeenCalledWith( + { workspacePath: 'Profile.xcworkspace' }, + expect.any(Object), + ); + expect(stdoutChunks.join('')).toContain('└── /tmp/MyApp.app — App Path'); + expect(stdoutChunks.join('')).not.toContain('└ App Path: /tmp/MyApp.app'); + }); + it('writes a structured envelope for tools that provide structured output', async () => { mockInvokeDirectThroughHandler(); const stdoutChunks: string[] = []; diff --git a/src/cli/register-tool-commands.ts b/src/cli/register-tool-commands.ts index e0fc3dea..4c8d6107 100644 --- a/src/cli/register-tool-commands.ts +++ b/src/cli/register-tool-commands.ts @@ -9,6 +9,7 @@ import { groupToolsByWorkflow } from '../runtime/tool-catalog.ts'; import { getWorkflowMetadataFromManifest } from '../core/manifest/load-manifest.ts'; import type { ResolvedRuntimeConfig } from '../utils/config-store.ts'; import type { ToolHandlerContext } from '../rendering/types.ts'; +import type { FilePathRenderStyle } from '../utils/runtime-config-types.ts'; import type { AnyFragment } from '../types/domain-fragments.ts'; import { transcriptEmitterStorage } from '../utils/transcript-context.ts'; import { @@ -138,7 +139,10 @@ export function registerToolCommands( workflowDescription, (yargs) => { // Hide root-level options from workflow help - yargs.option('log-level', { hidden: true }).option('style', { hidden: true }); + yargs + .option('log-level', { hidden: true }) + .option('style', { hidden: true }) + .option('file-path-render-style', { hidden: true }); // Register each tool as a subcommand under this workflow for (const tool of tools) { @@ -201,7 +205,10 @@ function registerToolSubcommand( tool.description ?? `Run the ${tool.mcpName} tool`, (subYargs) => { // Hide root-level options from tool help - subYargs.option('log-level', { hidden: true }).option('style', { hidden: true }); + subYargs + .option('log-level', { hidden: true }) + .option('style', { hidden: true }) + .option('file-path-render-style', { hidden: true }); // Parse option-like values as arguments (e.g. --extra-args "-only-testing:...") subYargs.parserConfiguration({ @@ -270,6 +277,7 @@ function registerToolSubcommand( const outputFormat = (argv.output as OutputFormat) ?? 'text'; const socketPath = argv.socket as string; const logLevel = argv['log-level'] as string | undefined; + const filePathRenderStyle = argv.filePathRenderStyle as FilePathRenderStyle | undefined; if ( profileOverride && @@ -302,6 +310,8 @@ function registerToolSubcommand( 'socket', 'log-level', 'logLevel', + 'file-path-render-style', + 'filePathRenderStyle', '_', '$0', ]); @@ -340,14 +350,19 @@ function registerToolSubcommand( const restoreCliOutputFormat = setEnvScoped('XCODEBUILDMCP_CLI_OUTPUT_FORMAT', outputFormat); try { - const session = - outputFormat === 'text' - ? createRenderSession('cli-text', { - interactive: process.stdout.isTTY === true, - }) - : outputFormat === 'raw' - ? createRenderSession('raw') - : createRenderSession('text'); + let renderStrategy: 'cli-text' | 'raw' | 'text'; + if (outputFormat === 'text') { + renderStrategy = 'cli-text'; + } else if (outputFormat === 'raw') { + renderStrategy = 'raw'; + } else { + renderStrategy = 'text'; + } + const session = createRenderSession(renderStrategy, { + interactive: outputFormat === 'text' && process.stdout.isTTY === true, + runtime: 'cli', + filePathRenderStyle, + }); const writeJsonlFragment = outputFormat === 'jsonl' ? (fragment: AnyFragment) => { diff --git a/src/cli/yargs-app.ts b/src/cli/yargs-app.ts index 5a56816f..f9836d26 100644 --- a/src/cli/yargs-app.ts +++ b/src/cli/yargs-app.ts @@ -55,6 +55,11 @@ export function buildYargsApp(opts: YargsAppOptions): ReturnType { choices: ['normal', 'minimal'] as const, default: 'normal', }) + .option('file-path-render-style', { + type: 'string', + describe: 'Render file artifacts as a compact tree or labeled list in text output', + choices: ['tree', 'list'] as const, + }) .middleware((argv) => { const level = argv['log-level'] as LogLevel | undefined; if (level) { diff --git a/src/mcp/resources/devices.ts b/src/mcp/resources/devices.ts index 156b7fd2..65d89206 100644 --- a/src/mcp/resources/devices.ts +++ b/src/mcp/resources/devices.ts @@ -11,8 +11,7 @@ import { getDefaultCommandExecutor } from '../../utils/execution/index.ts'; import { list_devicesLogic } from '../tools/device/list_devices.ts'; import { handlerContextStorage } from '../../utils/typed-tool-factory.ts'; import type { ToolHandlerContext } from '../../rendering/types.ts'; - -import { renderCliTextTranscript } from '../../utils/renderers/cli-text-renderer.ts'; +import { renderTranscript } from '../../rendering/render.ts'; export async function devicesResourceLogic( executor: CommandExecutor = getDefaultCommandExecutor(), @@ -25,10 +24,15 @@ export async function devicesResourceLogic( try { log('info', 'Processing devices resource request'); await handlerContextStorage.run(ctx, () => list_devicesLogic({}, executor)); - const text = renderCliTextTranscript({ - structuredOutput: ctx.structuredOutput, - nextSteps: ctx.nextSteps, - }); + const text = renderTranscript( + { + structuredOutput: ctx.structuredOutput, + nextSteps: ctx.nextSteps, + nextStepsRuntime: 'mcp', + }, + 'text', + { runtime: 'mcp' }, + ); const isError = ctx.structuredOutput?.result.didError === true; if (isError) { throw new Error(text || 'Failed to retrieve device data'); diff --git a/src/mcp/resources/simulators.ts b/src/mcp/resources/simulators.ts index 5965eaac..d18935d2 100644 --- a/src/mcp/resources/simulators.ts +++ b/src/mcp/resources/simulators.ts @@ -11,8 +11,7 @@ import type { CommandExecutor } from '../../utils/execution/index.ts'; import { list_simsLogic } from '../tools/simulator/list_sims.ts'; import { handlerContextStorage } from '../../utils/typed-tool-factory.ts'; import type { ToolHandlerContext } from '../../rendering/types.ts'; - -import { renderCliTextTranscript } from '../../utils/renderers/cli-text-renderer.ts'; +import { renderTranscript } from '../../rendering/render.ts'; export async function simulatorsResourceLogic( executor: CommandExecutor = getDefaultCommandExecutor(), @@ -25,10 +24,15 @@ export async function simulatorsResourceLogic( try { log('info', 'Processing simulators resource request'); await handlerContextStorage.run(ctx, () => list_simsLogic({ enabled: true }, executor)); - const text = renderCliTextTranscript({ - structuredOutput: ctx.structuredOutput, - nextSteps: ctx.nextSteps, - }); + const text = renderTranscript( + { + structuredOutput: ctx.structuredOutput, + nextSteps: ctx.nextSteps, + nextStepsRuntime: 'mcp', + }, + 'text', + { runtime: 'mcp' }, + ); const structuredError = ctx.structuredOutput?.result.didError ? (ctx.structuredOutput.result.error ?? null) : null; diff --git a/src/rendering/__tests__/text-render-parity.test.ts b/src/rendering/__tests__/text-render-parity.test.ts index aec051a0..fbe4cac8 100644 --- a/src/rendering/__tests__/text-render-parity.test.ts +++ b/src/rendering/__tests__/text-render-parity.test.ts @@ -285,7 +285,7 @@ describe('text render parity', () => { expect(output).toBe(captureCliText(fixture)); expect(output.match(/Discovered 2 test\(s\):/g)).toHaveLength(1); - expect(output.match(/MCPTestTests\n ✗ testTwo\(\):/g)).toHaveLength(1); + expect(output.match(/MCPTestTests\n {2}✗ testTwo\(\):/g)).toHaveLength(1); expect(output.match(/1 test failed, 1 passed, 0 skipped/g)).toHaveLength(1); expect(output).toContain('Result Bundle: /tmp/App Tests.xcresult'); expect(output).toContain('Build Logs: /tmp/Test.log'); @@ -340,6 +340,40 @@ describe('text render parity', () => { expect(rendered).not.toContain('❌ Build failed. (⏱️ 9.9s)'); }); + it('omits header frontmatter for MCP runtime text transcripts', () => { + const output = renderTranscript( + { + items: [], + structuredOutput: { + schema: 'xcodebuildmcp.output.build-run-result', + schemaVersion: '1.0.0', + result: { + kind: 'build-run-result', + request: { + scheme: 'MyApp', + projectPath: '/tmp/MyApp.xcodeproj', + configuration: 'Debug', + platform: 'iOS Simulator', + }, + didError: false, + error: null, + summary: { status: 'SUCCEEDED', durationMs: 5000 }, + artifacts: { appPath: '/tmp/build/MyApp.app', buildLogPath: '/tmp/build.log' }, + diagnostics: { warnings: [], errors: [] }, + }, + }, + }, + 'text', + { runtime: 'mcp' }, + ); + + expect(output).toContain('🚀 Build & Run'); + expect(output).not.toContain('Scheme: MyApp'); + expect(output).not.toContain('Project: /tmp/MyApp.xcodeproj'); + expect(output).not.toContain('Configuration: Debug'); + expect(output).toContain('✅ Build succeeded. (⏱️ 5.0s)'); + }); + it('renders next steps in MCP tool-call syntax for MCP runtime text transcripts', () => { const fixture: TranscriptFixture = { progressEvents: [], diff --git a/src/rendering/render.ts b/src/rendering/render.ts index 19fe2430..f9eabae5 100644 --- a/src/rendering/render.ts +++ b/src/rendering/render.ts @@ -2,6 +2,12 @@ import type { AnyFragment } from '../types/domain-fragments.ts'; import type { NextStep } from '../types/common.ts'; import { sessionStore } from '../utils/session-store.ts'; import { getConfig } from '../utils/config-store.ts'; +import { + normalizeRenderRuntime, + resolveFilePathRenderStyle, + type FilePathRenderRuntime, +} from '../utils/file-path-render-style.ts'; +import type { FilePathRenderStyle } from '../utils/runtime-config-types.ts'; import { createCliTextRenderer, renderCliTextTranscript, @@ -86,10 +92,23 @@ function createBaseRenderSession(hooks: RenderSessionHooks): RenderSession { function createRenderHooks( strategy: RenderStrategy, - options: { interactive: boolean }, + options: { + interactive: boolean; + runtime?: FilePathRenderRuntime; + filePathRenderStyle?: FilePathRenderStyle; + includeHeaderDetails?: boolean; + }, ): RenderSessionHooks { const suppressWarnings = sessionStore.get('suppressWarnings'); - const showTestTiming = getConfig().showTestTiming; + const config = getConfig(); + const showTestTiming = config.showTestTiming; + const runtime = options.runtime ?? normalizeRenderRuntime(process.env.XCODEBUILDMCP_RUNTIME); + const filePathRenderStyle = resolveFilePathRenderStyle({ + explicit: options.filePathRenderStyle, + configured: config.filePathRenderStyle, + runtime, + }); + const includeHeaderDetails = options.includeHeaderDetails ?? runtime !== 'mcp'; switch (strategy) { case 'text': @@ -99,6 +118,8 @@ function createRenderHooks( ...input, suppressWarnings: suppressWarnings ?? false, showTestTiming, + filePathRenderStyle, + includeHeaderDetails, }), }; case 'raw': @@ -123,6 +144,8 @@ function createRenderHooks( nextStepsRuntime: input.nextStepsRuntime, suppressWarnings: suppressWarnings ?? false, showTestTiming, + filePathRenderStyle, + includeHeaderDetails, }); if (text) { process.stdout.write(text); @@ -135,6 +158,8 @@ function createRenderHooks( ...options, suppressWarnings: suppressWarnings ?? false, showTestTiming, + filePathRenderStyle, + includeHeaderDetails, }); return { @@ -152,6 +177,9 @@ function createRenderHooks( export interface RenderSessionOptions { interactive?: boolean; + runtime?: FilePathRenderRuntime; + filePathRenderStyle?: FilePathRenderStyle; + includeHeaderDetails?: boolean; } export function createRenderSession( @@ -159,17 +187,14 @@ export function createRenderSession( options?: RenderSessionOptions, ): RenderSession { return createBaseRenderSession( - createRenderHooks(strategy, { interactive: options?.interactive ?? false }), + createRenderHooks(strategy, { ...options, interactive: options?.interactive ?? false }), ); } -export function renderTranscript(input: RenderTranscriptInput, strategy: RenderStrategy): string { - return createRenderHooks(strategy, { interactive: false }).finalize(input); -} - -export function renderFragments( - fragments: readonly AnyFragment[], +export function renderTranscript( + input: RenderTranscriptInput, strategy: RenderStrategy, + options?: Pick, ): string { - return renderTranscript({ items: fragments }, strategy); + return createRenderHooks(strategy, { ...options, interactive: false }).finalize(input); } diff --git a/src/snapshot-tests/__fixtures__/cli/device/build--error-compiler.txt b/src/snapshot-tests/__fixtures__/cli/device/build--error-compiler.txt index d6863893..57f7369c 100644 --- a/src/snapshot-tests/__fixtures__/cli/device/build--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/cli/device/build--error-compiler.txt @@ -5,7 +5,7 @@ Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace Configuration: Debug Platform: iOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- Compiler Errors (1): @@ -13,4 +13,5 @@ Compiler Errors (1): example_projects/iOS_Calculator/CalculatorApp/CalculatorApp.swift:33:42 ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/device/build--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/cli/device/build--error-wrong-scheme.txt index b8e4d871..b872bf0f 100644 --- a/src/snapshot-tests/__fixtures__/cli/device/build--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/cli/device/build--error-wrong-scheme.txt @@ -5,11 +5,12 @@ Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace Configuration: Debug Platform: iOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- Errors (1): ✗ The workspace named "CalculatorApp" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the workspace. ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/device/build--success.txt b/src/snapshot-tests/__fixtures__/cli/device/build--success.txt index d96de7f4..4dc9c62e 100644 --- a/src/snapshot-tests/__fixtures__/cli/device/build--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/device/build--success.txt @@ -5,10 +5,11 @@ Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace Configuration: Debug Platform: iOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- ✅ Build succeeded. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log Next steps: 1. Get built device app path: xcodebuildmcp device get-app-path --scheme "CalculatorApp" diff --git a/src/snapshot-tests/__fixtures__/cli/device/build-and-run--error-compiler.txt b/src/snapshot-tests/__fixtures__/cli/device/build-and-run--error-compiler.txt index 228fef71..044ddf73 100644 --- a/src/snapshot-tests/__fixtures__/cli/device/build-and-run--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/cli/device/build-and-run--error-compiler.txt @@ -6,7 +6,7 @@ Configuration: Debug Platform: iOS Device: () - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- Compiler Errors (1): @@ -14,4 +14,5 @@ Compiler Errors (1): example_projects/iOS_Calculator/CalculatorApp/CalculatorApp.swift:33:42 ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_device__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_device__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/device/build-and-run--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/cli/device/build-and-run--error-wrong-scheme.txt index 6e721682..66ad3c60 100644 --- a/src/snapshot-tests/__fixtures__/cli/device/build-and-run--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/cli/device/build-and-run--error-wrong-scheme.txt @@ -6,11 +6,12 @@ Configuration: Debug Platform: iOS Device: () - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- Errors (1): ✗ The workspace named "CalculatorApp" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the workspace. ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_device__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_device__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/device/build-and-run--success.txt b/src/snapshot-tests/__fixtures__/cli/device/build-and-run--success.txt index 3d194b3d..71835a26 100644 --- a/src/snapshot-tests/__fixtures__/cli/device/build-and-run--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/device/build-and-run--success.txt @@ -6,7 +6,7 @@ Configuration: Debug Platform: iOS Device: () - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- ℹ️ Resolving app path ✅ Resolving app path @@ -16,10 +16,11 @@ ✅ Build succeeded. (⏱️ ) ✅ Build & Run complete - ├ App Path: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app ├ Bundle ID: io.sentry.calculatorapp ├ Process ID: - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_device__pid.log + └ Files: + ├ App Path: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_device__pid.log Next steps: 1. Stop app on device: xcodebuildmcp device stop --device-id "" --process-id "" diff --git a/src/snapshot-tests/__fixtures__/cli/device/get-app-path--success.txt b/src/snapshot-tests/__fixtures__/cli/device/get-app-path--success.txt index 9e6d4af7..c5eb3418 100644 --- a/src/snapshot-tests/__fixtures__/cli/device/get-app-path--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/device/get-app-path--success.txt @@ -7,9 +7,10 @@ Platform: iOS ✅ Success - └ App Path: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app + └ Files: + └ App Path: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app Next steps: -1. Get bundle ID: xcodebuildmcp device get-app-bundle-id --app-path "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app" -2. Install app on device: xcodebuildmcp device install --device-id "DEVICE_UDID" --app-path "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app" +1. Get bundle ID: xcodebuildmcp device get-app-bundle-id --app-path "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app" +2. Install app on device: xcodebuildmcp device install --device-id "DEVICE_UDID" --app-path "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app" 3. Launch app on device: xcodebuildmcp device launch --device-id "DEVICE_UDID" --bundle-id "BUNDLE_ID" diff --git a/src/snapshot-tests/__fixtures__/cli/device/install--success.txt b/src/snapshot-tests/__fixtures__/cli/device/install--success.txt index dd596fc8..425f11a2 100644 --- a/src/snapshot-tests/__fixtures__/cli/device/install--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/device/install--success.txt @@ -2,6 +2,6 @@ 📦 Install App Device: () - App: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app + App: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app ✅ App installed successfully. diff --git a/src/snapshot-tests/__fixtures__/cli/device/test--error-compiler.txt b/src/snapshot-tests/__fixtures__/cli/device/test--error-compiler.txt index 22431486..ddbc1358 100644 --- a/src/snapshot-tests/__fixtures__/cli/device/test--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/cli/device/test--error-compiler.txt @@ -6,7 +6,7 @@ Configuration: Debug Platform: iOS Device: () - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- Selective Testing: CalculatorAppTests/CalculatorAppTests/testAddition @@ -19,5 +19,6 @@ Compiler Errors (1): example_projects/iOS_Calculator/CalculatorApp/CalculatorApp.swift:33:42 ❌ Test failed. (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_device__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_device__pid.log + └ Files: + ├ Result Bundle: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_device__pid.xcresult + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_device__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/device/test--failure.txt b/src/snapshot-tests/__fixtures__/cli/device/test--failure.txt index 25f19932..cbd595b3 100644 --- a/src/snapshot-tests/__fixtures__/cli/device/test--failure.txt +++ b/src/snapshot-tests/__fixtures__/cli/device/test--failure.txt @@ -6,7 +6,7 @@ Configuration: Debug Platform: iOS Device: () - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- Discovered 57 test(s): CalculatorAppFeatureTests/CalculatorBasicTests/testClear @@ -51,5 +51,6 @@ IntentionalFailureTests example_projects/iOS_Calculator/CalculatorAppTests/CalculatorAppTests.swift:286 ❌ tests failed, passed, skipped (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_device__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_device__pid.log + └ Files: + ├ Result Bundle: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_device__pid.xcresult + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_device__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/device/test--success.txt b/src/snapshot-tests/__fixtures__/cli/device/test--success.txt index 20d8372c..ae68d692 100644 --- a/src/snapshot-tests/__fixtures__/cli/device/test--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/device/test--success.txt @@ -6,7 +6,7 @@ Configuration: Debug Platform: iOS Device: () - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- Selective Testing: CalculatorAppTests/CalculatorAppTests/testAddition @@ -15,5 +15,6 @@ Discovered 1 test(s): Running tests (1 completed, 0 failures, 0 skipped) ✅ 1 test passed, 0 failed, 0 skipped (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_device__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_device__pid.log + └ Files: + ├ Result Bundle: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_device__pid.xcresult + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_device__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/macos/build--error-compiler.txt b/src/snapshot-tests/__fixtures__/cli/macos/build--error-compiler.txt index 3f3ffcb8..8c97dd1d 100644 --- a/src/snapshot-tests/__fixtures__/cli/macos/build--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/cli/macos/build--error-compiler.txt @@ -5,7 +5,7 @@ Project: example_projects/macOS/MCPTest.xcodeproj Configuration: Debug Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- Compiler Errors (1): @@ -13,4 +13,5 @@ Compiler Errors (1): example_projects/macOS/MCPTest/MCPTestApp.swift:20:42 ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/macos/build--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/cli/macos/build--error-wrong-scheme.txt index 57a867a9..0d7ef994 100644 --- a/src/snapshot-tests/__fixtures__/cli/macos/build--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/cli/macos/build--error-wrong-scheme.txt @@ -5,11 +5,12 @@ Project: example_projects/macOS/MCPTest.xcodeproj Configuration: Debug Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- Errors (1): ✗ The project named "MCPTest" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the project. ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/macos/build--success.txt b/src/snapshot-tests/__fixtures__/cli/macos/build--success.txt index c765274f..7bee545a 100644 --- a/src/snapshot-tests/__fixtures__/cli/macos/build--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/macos/build--success.txt @@ -5,11 +5,12 @@ Project: example_projects/macOS/MCPTest.xcodeproj Configuration: Debug Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- ✅ Build succeeded. (⏱️ ) ├ Bundle ID: io.sentry.MCPTest.macOS - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log Next steps: 1. Get built macOS app path: xcodebuildmcp macos get-app-path --scheme "MCPTest" diff --git a/src/snapshot-tests/__fixtures__/cli/macos/build-and-run--error-compiler.txt b/src/snapshot-tests/__fixtures__/cli/macos/build-and-run--error-compiler.txt index 553b0c52..6c40977a 100644 --- a/src/snapshot-tests/__fixtures__/cli/macos/build-and-run--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/cli/macos/build-and-run--error-compiler.txt @@ -5,7 +5,7 @@ Project: example_projects/macOS/MCPTest.xcodeproj Configuration: Debug Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- Compiler Errors (1): @@ -13,4 +13,5 @@ Compiler Errors (1): example_projects/macOS/MCPTest/MCPTestApp.swift:20:42 ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_macos__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_macos__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/macos/build-and-run--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/cli/macos/build-and-run--error-wrong-scheme.txt index 66796aa6..711ff7b3 100644 --- a/src/snapshot-tests/__fixtures__/cli/macos/build-and-run--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/cli/macos/build-and-run--error-wrong-scheme.txt @@ -5,11 +5,12 @@ Project: example_projects/macOS/MCPTest.xcodeproj Configuration: Debug Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- Errors (1): ✗ The project named "MCPTest" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the project. ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_macos__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_macos__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/macos/build-and-run--success.txt b/src/snapshot-tests/__fixtures__/cli/macos/build-and-run--success.txt index a4dae807..dc91eca6 100644 --- a/src/snapshot-tests/__fixtures__/cli/macos/build-and-run--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/macos/build-and-run--success.txt @@ -5,7 +5,7 @@ Project: example_projects/macOS/MCPTest.xcodeproj Configuration: Debug Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- ℹ️ Resolving app path ✅ Resolving app path @@ -14,10 +14,11 @@ ✅ Build succeeded. (⏱️ ) ✅ Build & Run complete - ├ App Path: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app ├ Bundle ID: io.sentry.MCPTest.macOS ├ Process ID: - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_macos__pid.log + └ Files: + ├ App Path: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_macos__pid.log Next steps: 1. Interact with the launched app in the foreground diff --git a/src/snapshot-tests/__fixtures__/cli/macos/get-app-path--success.txt b/src/snapshot-tests/__fixtures__/cli/macos/get-app-path--success.txt index 1e81b903..dd45771f 100644 --- a/src/snapshot-tests/__fixtures__/cli/macos/get-app-path--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/macos/get-app-path--success.txt @@ -7,8 +7,9 @@ Platform: macOS ✅ Success - └ App Path: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app + └ Files: + └ App Path: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app Next steps: -1. Get bundle ID: xcodebuildmcp macos get-macos-bundle-id --app-path "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app" -2. Launch app: xcodebuildmcp macos launch --app-path "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app" +1. Get bundle ID: xcodebuildmcp macos get-macos-bundle-id --app-path "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app" +2. Launch app: xcodebuildmcp macos launch --app-path "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app" diff --git a/src/snapshot-tests/__fixtures__/cli/macos/launch--success.txt b/src/snapshot-tests/__fixtures__/cli/macos/launch--success.txt index ac05ad09..2362ab71 100644 --- a/src/snapshot-tests/__fixtures__/cli/macos/launch--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/macos/launch--success.txt @@ -1,7 +1,7 @@ 🚀 Launch macOS App - App: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app + App: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app ✅ App launched successfully ├ Bundle ID: io.sentry.MCPTest.macOS diff --git a/src/snapshot-tests/__fixtures__/cli/macos/test--error-compiler.txt b/src/snapshot-tests/__fixtures__/cli/macos/test--error-compiler.txt index 7821e137..0a357bdb 100644 --- a/src/snapshot-tests/__fixtures__/cli/macos/test--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/cli/macos/test--error-compiler.txt @@ -5,7 +5,7 @@ Project: example_projects/macOS/MCPTest.xcodeproj Configuration: Debug Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- Selective Testing: MCPTestTests/MCPTestTests/appNameIsCorrect() MCPTestTests/MCPTestsXCTests/testAppNameIsCorrect @@ -20,5 +20,6 @@ Compiler Errors (1): example_projects/macOS/MCPTest/MCPTestApp.swift:20:42 ❌ Test failed. (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log + └ Files: + ├ Result Bundle: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/macos/test--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/cli/macos/test--error-wrong-scheme.txt index bf22f9ec..795e8d84 100644 --- a/src/snapshot-tests/__fixtures__/cli/macos/test--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/cli/macos/test--error-wrong-scheme.txt @@ -5,12 +5,13 @@ Project: example_projects/macOS/MCPTest.xcodeproj Configuration: Debug Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- Errors (1): ✗ The project named "MCPTest" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the project. ❌ Test failed. (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log + └ Files: + ├ Result Bundle: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/macos/test--failure.txt b/src/snapshot-tests/__fixtures__/cli/macos/test--failure.txt index 301f586d..2a220f7a 100644 --- a/src/snapshot-tests/__fixtures__/cli/macos/test--failure.txt +++ b/src/snapshot-tests/__fixtures__/cli/macos/test--failure.txt @@ -5,7 +5,7 @@ Project: example_projects/macOS/MCPTest.xcodeproj Configuration: Debug Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- Discovered 4 test(s): MCPTestTests/MCPTestTests/appNameIsCorrect @@ -28,5 +28,6 @@ MCPTestTests example_projects/macOS/MCPTestTests/MCPTestTests.swift:11 ❌ tests failed, passed, skipped (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log + └ Files: + ├ Result Bundle: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/macos/test--success.txt b/src/snapshot-tests/__fixtures__/cli/macos/test--success.txt index 0b1f6ded..cb54b9b7 100644 --- a/src/snapshot-tests/__fixtures__/cli/macos/test--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/macos/test--success.txt @@ -5,7 +5,7 @@ Project: example_projects/macOS/MCPTest.xcodeproj Configuration: Debug Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- Selective Testing: MCPTestTests/MCPTestTests/appNameIsCorrect() MCPTestTests/MCPTestsXCTests/testAppNameIsCorrect @@ -17,5 +17,6 @@ Running tests (1 completed, 0 failures, 0 skipped) Running tests (2 completed, 0 failures, 0 skipped) ✅ 2 tests passed, 0 failed, 0 skipped (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log + └ Files: + ├ Result Bundle: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/simulator/build--error-compiler.txt b/src/snapshot-tests/__fixtures__/cli/simulator/build--error-compiler.txt index 57ebbb0c..bc83057b 100644 --- a/src/snapshot-tests/__fixtures__/cli/simulator/build--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/cli/simulator/build--error-compiler.txt @@ -6,7 +6,7 @@ Configuration: Debug Platform: iOS Simulator Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- Compiler Errors (1): @@ -14,4 +14,5 @@ Compiler Errors (1): example_projects/iOS_Calculator/CalculatorApp/CalculatorApp.swift:33:42 ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/simulator/build--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/cli/simulator/build--error-wrong-scheme.txt index a1380d8e..dae2a423 100644 --- a/src/snapshot-tests/__fixtures__/cli/simulator/build--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/cli/simulator/build--error-wrong-scheme.txt @@ -6,11 +6,12 @@ Configuration: Debug Platform: iOS Simulator Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- Errors (1): ✗ The workspace named "CalculatorApp" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the workspace. ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/simulator/build--success.txt b/src/snapshot-tests/__fixtures__/cli/simulator/build--success.txt index acacb428..77b2b0ef 100644 --- a/src/snapshot-tests/__fixtures__/cli/simulator/build--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/simulator/build--success.txt @@ -6,10 +6,11 @@ Configuration: Debug Platform: iOS Simulator Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- ✅ Build succeeded. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log Next steps: 1. Get built app path in simulator derived data: xcodebuildmcp simulator get-app-path --simulator-name "iPhone 17" --scheme "CalculatorApp" --platform "iOS Simulator" diff --git a/src/snapshot-tests/__fixtures__/cli/simulator/build-and-run--error-compiler.txt b/src/snapshot-tests/__fixtures__/cli/simulator/build-and-run--error-compiler.txt index ababd633..0d23f830 100644 --- a/src/snapshot-tests/__fixtures__/cli/simulator/build-and-run--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/cli/simulator/build-and-run--error-compiler.txt @@ -6,7 +6,7 @@ Configuration: Debug Platform: iOS Simulator Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- Compiler Errors (1): @@ -14,4 +14,5 @@ Compiler Errors (1): example_projects/iOS_Calculator/CalculatorApp/CalculatorApp.swift:33:42 ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_sim__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_sim__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/simulator/build-and-run--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/cli/simulator/build-and-run--error-wrong-scheme.txt index 79876668..21075fec 100644 --- a/src/snapshot-tests/__fixtures__/cli/simulator/build-and-run--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/cli/simulator/build-and-run--error-wrong-scheme.txt @@ -6,11 +6,12 @@ Configuration: Debug Platform: iOS Simulator Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- Errors (1): ✗ The workspace named "CalculatorApp" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the workspace. ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_sim__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_sim__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/simulator/build-and-run--success.txt b/src/snapshot-tests/__fixtures__/cli/simulator/build-and-run--success.txt index 1b9b02e6..db9bccbb 100644 --- a/src/snapshot-tests/__fixtures__/cli/simulator/build-and-run--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/simulator/build-and-run--success.txt @@ -6,7 +6,7 @@ Configuration: Debug Platform: iOS Simulator Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- ℹ️ Resolving app path ✅ Resolving app path @@ -18,12 +18,13 @@ ✅ Build succeeded. (⏱️ ) ✅ Build & Run complete - ├ App Path: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app ├ Bundle ID: io.sentry.calculatorapp ├ Process ID: - ├ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_sim__pid.log - ├ Runtime Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp__pid.log - └ OSLog: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp_oslog__pid.log + └ Files: + ├ App Path: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app + ├ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_sim__pid.log + ├ Runtime Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp__pid.log + └ OSLog: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp_oslog__pid.log Next steps: 1. Stop app in simulator: xcodebuildmcp simulator stop --simulator-id "" --bundle-id "io.sentry.calculatorapp" diff --git a/src/snapshot-tests/__fixtures__/cli/simulator/get-app-path--success.txt b/src/snapshot-tests/__fixtures__/cli/simulator/get-app-path--success.txt index 0bd60788..05af71f9 100644 --- a/src/snapshot-tests/__fixtures__/cli/simulator/get-app-path--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/simulator/get-app-path--success.txt @@ -8,10 +8,11 @@ Simulator: iPhone 17 ✅ Get app path successful (⏱️ ) - └ App Path: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app + └ Files: + └ App Path: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app Next steps: -1. Get bundle ID: xcodebuildmcp device get-app-bundle-id --app-path "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app" +1. Get bundle ID: xcodebuildmcp device get-app-bundle-id --app-path "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app" 2. Boot simulator: xcodebuildmcp simulator-management boot --simulator-id "SIMULATOR_UUID" -3. Install app: xcodebuildmcp simulator install --simulator-id "SIMULATOR_UUID" --app-path "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app" +3. Install app: xcodebuildmcp simulator install --simulator-id "SIMULATOR_UUID" --app-path "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app" 4. Launch app: xcodebuildmcp simulator launch-app --simulator-id "SIMULATOR_UUID" --bundle-id "BUNDLE_ID" diff --git a/src/snapshot-tests/__fixtures__/cli/simulator/install--success.txt b/src/snapshot-tests/__fixtures__/cli/simulator/install--success.txt index 8c2c554d..30600dc2 100644 --- a/src/snapshot-tests/__fixtures__/cli/simulator/install--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/simulator/install--success.txt @@ -2,7 +2,7 @@ 📦 Install App Simulator: - App Path: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app + App Path: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app ✅ App installed successfully diff --git a/src/snapshot-tests/__fixtures__/cli/simulator/launch-app--success.txt b/src/snapshot-tests/__fixtures__/cli/simulator/launch-app--success.txt index 1efee943..f55796ce 100644 --- a/src/snapshot-tests/__fixtures__/cli/simulator/launch-app--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/simulator/launch-app--success.txt @@ -6,8 +6,9 @@ ✅ App launched successfully ├ Process ID: - ├ Runtime Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp__pid.log - └ OSLog: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp_oslog__pid.log + └ Files: + ├ Runtime Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp__pid.log + └ OSLog: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp_oslog__pid.log Next steps: 1. Open Simulator app to see it: xcodebuildmcp simulator-management open diff --git a/src/snapshot-tests/__fixtures__/cli/simulator/screenshot--success.txt b/src/snapshot-tests/__fixtures__/cli/simulator/screenshot--success.txt index 4a990b95..1fccb475 100644 --- a/src/snapshot-tests/__fixtures__/cli/simulator/screenshot--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/simulator/screenshot--success.txt @@ -4,6 +4,7 @@ Simulator: ✅ Screenshot captured - ├ Screenshot: ├ Format: image/jpeg - └ Size: 368x800px + ├ Size: 368x800px + └ Files: + └ Screenshot: diff --git a/src/snapshot-tests/__fixtures__/cli/simulator/test--error-compiler.txt b/src/snapshot-tests/__fixtures__/cli/simulator/test--error-compiler.txt index cd695614..bad0431d 100644 --- a/src/snapshot-tests/__fixtures__/cli/simulator/test--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/cli/simulator/test--error-compiler.txt @@ -6,7 +6,7 @@ Configuration: Debug Platform: iOS Simulator Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- Selective Testing: CalculatorAppTests/CalculatorAppTests/testAddition @@ -19,4 +19,5 @@ Compiler Errors (1): example_projects/iOS_Calculator/CalculatorApp/CalculatorApp.swift:33:42 ❌ Test failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/simulator/test--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/cli/simulator/test--error-wrong-scheme.txt index 50e49847..85568ca7 100644 --- a/src/snapshot-tests/__fixtures__/cli/simulator/test--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/cli/simulator/test--error-wrong-scheme.txt @@ -6,11 +6,12 @@ Configuration: Debug Platform: iOS Simulator Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- Errors (1): ✗ The workspace named "CalculatorApp" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the workspace. ❌ Test failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/simulator/test--failure.txt b/src/snapshot-tests/__fixtures__/cli/simulator/test--failure.txt index 961239d2..6500f0f7 100644 --- a/src/snapshot-tests/__fixtures__/cli/simulator/test--failure.txt +++ b/src/snapshot-tests/__fixtures__/cli/simulator/test--failure.txt @@ -6,7 +6,7 @@ Configuration: Debug Platform: iOS Simulator Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- Discovered 57 test(s): CalculatorAppFeatureTests/CalculatorBasicTests/testClear @@ -36,5 +36,6 @@ IntentionalFailureTests example_projects/iOS_Calculator/CalculatorAppTests/CalculatorAppTests.swift:286 ❌ tests failed, passed, skipped (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_sim__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log + └ Files: + ├ Result Bundle: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_sim__pid.xcresult + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/simulator/test--success.txt b/src/snapshot-tests/__fixtures__/cli/simulator/test--success.txt index 0e0a625b..6f2c5e1a 100644 --- a/src/snapshot-tests/__fixtures__/cli/simulator/test--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/simulator/test--success.txt @@ -6,7 +6,7 @@ Configuration: Debug Platform: iOS Simulator Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- Selective Testing: CalculatorAppTests/CalculatorAppTests/testAddition @@ -15,5 +15,6 @@ Discovered 1 test(s): Running tests (1 completed, 0 failures, 0 skipped) ✅ 1 test passed, 0 failed, 0 skipped (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_sim__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log + └ Files: + ├ Result Bundle: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_sim__pid.xcresult + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/swift-package/build--error-bad-path.txt b/src/snapshot-tests/__fixtures__/cli/swift-package/build--error-bad-path.txt index 1e8b416e..bbf70264 100644 --- a/src/snapshot-tests/__fixtures__/cli/swift-package/build--error-bad-path.txt +++ b/src/snapshot-tests/__fixtures__/cli/swift-package/build--error-bad-path.txt @@ -8,4 +8,5 @@ Errors (1): ✗ chdir error: No such file or directory (2): /example_projects/NONEXISTENT ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_spm__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_spm__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/swift-package/build--success.txt b/src/snapshot-tests/__fixtures__/cli/swift-package/build--success.txt index eb8eee4e..5a4cd434 100644 --- a/src/snapshot-tests/__fixtures__/cli/swift-package/build--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/swift-package/build--success.txt @@ -4,4 +4,5 @@ Package: /example_projects/spm ✅ Build succeeded. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_spm__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_spm__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/swift-package/run--success.txt b/src/snapshot-tests/__fixtures__/cli/swift-package/run--success.txt index 5b6b35fd..0d2112cc 100644 --- a/src/snapshot-tests/__fixtures__/cli/swift-package/run--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/swift-package/run--success.txt @@ -6,9 +6,10 @@ ✅ Build succeeded. (⏱️ ) ✅ Build & Run complete - ├ App Path: example_projects/spm/.build/arm64-apple-macosx/debug/spm ├ Process ID: - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_spm__pid.log + └ Files: + ├ App Path: example_projects/spm/.build/arm64-apple-macosx/debug/spm + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_spm__pid.log Output Hello, world! diff --git a/src/snapshot-tests/__fixtures__/cli/swift-package/test--error-bad-path.txt b/src/snapshot-tests/__fixtures__/cli/swift-package/test--error-bad-path.txt index 639bf732..750e0865 100644 --- a/src/snapshot-tests/__fixtures__/cli/swift-package/test--error-bad-path.txt +++ b/src/snapshot-tests/__fixtures__/cli/swift-package/test--error-bad-path.txt @@ -4,11 +4,12 @@ Scheme: NONEXISTENT Configuration: debug Platform: Swift Package - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData Errors (1): ✗ chdir error: No such file or directory (2): /example_projects/NONEXISTENT ❌ Test failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/swift-package/test--failure.txt b/src/snapshot-tests/__fixtures__/cli/swift-package/test--failure.txt index 9b59b743..0516de49 100644 --- a/src/snapshot-tests/__fixtures__/cli/swift-package/test--failure.txt +++ b/src/snapshot-tests/__fixtures__/cli/swift-package/test--failure.txt @@ -4,7 +4,7 @@ Scheme: spm Configuration: debug Platform: Swift Package - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData Running tests (1 completed, 1 failure, 0 skipped) Running tests (2 completed, 1 failure, 0 skipped) Running tests (3 completed, 1 failure, 0 skipped) @@ -25,4 +25,5 @@ Test failed SimpleTests.swift:57 ❌ tests failed, passed, skipped (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/swift-package/test--success.txt b/src/snapshot-tests/__fixtures__/cli/swift-package/test--success.txt index 5cefd181..4f5f3683 100644 --- a/src/snapshot-tests/__fixtures__/cli/swift-package/test--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/swift-package/test--success.txt @@ -4,9 +4,10 @@ Scheme: spm Configuration: debug Platform: Swift Package - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData + Derived Data: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData Running tests (0 completed, 0 failures, 0 skipped) Running tests (1 completed, 0 failures, 0 skipped) ✅ 1 test passed, 0 failed, 0 skipped (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log + └ Files: + └ Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log diff --git a/src/snapshot-tests/__fixtures__/cli/xcode-ide/documentation-search--success.txt b/src/snapshot-tests/__fixtures__/cli/xcode-ide/documentation-search--success.txt index e78b2f4c..ffc5b39d 100644 --- a/src/snapshot-tests/__fixtures__/cli/xcode-ide/documentation-search--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/xcode-ide/documentation-search--success.txt @@ -4,4 +4,5 @@ Remote Tool: DocumentationSearch ✅ Tool "DocumentationSearch" completed successfully. Raw response saved to artifact. - └ Raw Response JSON: + └ Files: + └ Raw Response JSON: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/state/xcode-ide/call-tool/ownerpid_/-DocumentationSearch-.json diff --git a/src/snapshot-tests/__fixtures__/cli/xcode-ide/list-tools--success.txt b/src/snapshot-tests/__fixtures__/cli/xcode-ide/list-tools--success.txt index 80a36abb..3ca912f9 100644 --- a/src/snapshot-tests/__fixtures__/cli/xcode-ide/list-tools--success.txt +++ b/src/snapshot-tests/__fixtures__/cli/xcode-ide/list-tools--success.txt @@ -2,4 +2,5 @@ 🔧 Xcode IDE List Tools ✅ Found tool(s). Raw response saved to artifact. - └ Raw Response JSON: + └ Files: + └ Raw Response JSON: ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/state/xcode-ide/call-tool/ownerpid_/-list-tools-.json diff --git a/src/snapshot-tests/__fixtures__/json/device/build--error-compiler.json b/src/snapshot-tests/__fixtures__/json/device/build--error-compiler.json index f85d8f74..553c9a60 100644 --- a/src/snapshot-tests/__fixtures__/json/device/build--error-compiler.json +++ b/src/snapshot-tests/__fixtures__/json/device/build--error-compiler.json @@ -7,7 +7,7 @@ "request": { "scheme": "CalculatorApp", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS", "target": "device" @@ -18,7 +18,7 @@ "target": "device" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/device/build--error-wrong-scheme.json b/src/snapshot-tests/__fixtures__/json/device/build--error-wrong-scheme.json index d20e3bd4..90651be3 100644 --- a/src/snapshot-tests/__fixtures__/json/device/build--error-wrong-scheme.json +++ b/src/snapshot-tests/__fixtures__/json/device/build--error-wrong-scheme.json @@ -7,7 +7,7 @@ "request": { "scheme": "NONEXISTENT", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS", "target": "device" @@ -18,7 +18,7 @@ "target": "device" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/device/build--success.json b/src/snapshot-tests/__fixtures__/json/device/build--success.json index 72bd8294..32a27deb 100644 --- a/src/snapshot-tests/__fixtures__/json/device/build--success.json +++ b/src/snapshot-tests/__fixtures__/json/device/build--success.json @@ -7,7 +7,7 @@ "request": { "scheme": "CalculatorApp", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS", "target": "device" @@ -18,7 +18,7 @@ "target": "device" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/device/build-and-run--error-compiler.json b/src/snapshot-tests/__fixtures__/json/device/build-and-run--error-compiler.json index bbe99948..eb4e6eae 100644 --- a/src/snapshot-tests/__fixtures__/json/device/build-and-run--error-compiler.json +++ b/src/snapshot-tests/__fixtures__/json/device/build-and-run--error-compiler.json @@ -7,7 +7,7 @@ "request": { "scheme": "CalculatorApp", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS", "deviceId": "", @@ -20,7 +20,7 @@ }, "artifacts": { "deviceId": "", - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_device__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_device__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/device/build-and-run--error-wrong-scheme.json b/src/snapshot-tests/__fixtures__/json/device/build-and-run--error-wrong-scheme.json index 193ec49e..df2f3da0 100644 --- a/src/snapshot-tests/__fixtures__/json/device/build-and-run--error-wrong-scheme.json +++ b/src/snapshot-tests/__fixtures__/json/device/build-and-run--error-wrong-scheme.json @@ -7,7 +7,7 @@ "request": { "scheme": "NONEXISTENT", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS", "deviceId": "", @@ -20,7 +20,7 @@ }, "artifacts": { "deviceId": "", - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_device__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_device__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/device/build-and-run--success.json b/src/snapshot-tests/__fixtures__/json/device/build-and-run--success.json index c1d15aa2..dfe0d671 100644 --- a/src/snapshot-tests/__fixtures__/json/device/build-and-run--success.json +++ b/src/snapshot-tests/__fixtures__/json/device/build-and-run--success.json @@ -7,7 +7,7 @@ "request": { "scheme": "CalculatorApp", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS", "deviceId": "", @@ -19,11 +19,11 @@ "target": "device" }, "artifacts": { - "appPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app", + "appPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app", "bundleId": "io.sentry.calculatorapp", "processId": 99999, "deviceId": "", - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_device__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_device__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/device/get-app-path--success.json b/src/snapshot-tests/__fixtures__/json/device/get-app-path--success.json index c39cf894..8b741728 100644 --- a/src/snapshot-tests/__fixtures__/json/device/get-app-path--success.json +++ b/src/snapshot-tests/__fixtures__/json/device/get-app-path--success.json @@ -15,7 +15,7 @@ "target": "device" }, "artifacts": { - "appPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app" + "appPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app" } } } diff --git a/src/snapshot-tests/__fixtures__/json/device/install--success.json b/src/snapshot-tests/__fixtures__/json/device/install--success.json index 50412f4a..1735ba24 100644 --- a/src/snapshot-tests/__fixtures__/json/device/install--success.json +++ b/src/snapshot-tests/__fixtures__/json/device/install--success.json @@ -9,7 +9,7 @@ }, "artifacts": { "deviceId": "", - "appPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app" + "appPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/device/test--error-compiler.json b/src/snapshot-tests/__fixtures__/json/device/test--error-compiler.json index be0cc4c0..40d15f44 100644 --- a/src/snapshot-tests/__fixtures__/json/device/test--error-compiler.json +++ b/src/snapshot-tests/__fixtures__/json/device/test--error-compiler.json @@ -7,7 +7,7 @@ "request": { "scheme": "CalculatorApp", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS", "deviceId": "", @@ -29,8 +29,8 @@ }, "artifacts": { "deviceId": "", - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_device__pid.log", - "xcresultPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_device__pid.xcresult" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_device__pid.log", + "xcresultPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_device__pid.xcresult" }, "tests": { "selected": [ diff --git a/src/snapshot-tests/__fixtures__/json/device/test--failure.json b/src/snapshot-tests/__fixtures__/json/device/test--failure.json index d694e3fb..09f5698c 100644 --- a/src/snapshot-tests/__fixtures__/json/device/test--failure.json +++ b/src/snapshot-tests/__fixtures__/json/device/test--failure.json @@ -7,7 +7,7 @@ "request": { "scheme": "CalculatorApp", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS", "deviceId": "", @@ -27,8 +27,8 @@ }, "artifacts": { "deviceId": "", - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_device__pid.log", - "xcresultPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_device__pid.xcresult" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_device__pid.log", + "xcresultPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_device__pid.xcresult" }, "tests": { "discovered": { diff --git a/src/snapshot-tests/__fixtures__/json/device/test--success.json b/src/snapshot-tests/__fixtures__/json/device/test--success.json index 5dc89481..2c00bdbc 100644 --- a/src/snapshot-tests/__fixtures__/json/device/test--success.json +++ b/src/snapshot-tests/__fixtures__/json/device/test--success.json @@ -7,7 +7,7 @@ "request": { "scheme": "CalculatorApp", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS", "deviceId": "", @@ -29,8 +29,8 @@ }, "artifacts": { "deviceId": "", - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_device__pid.log", - "xcresultPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_device__pid.xcresult" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_device__pid.log", + "xcresultPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_device__pid.xcresult" }, "tests": { "selected": [ diff --git a/src/snapshot-tests/__fixtures__/json/macos/build--error-compiler.json b/src/snapshot-tests/__fixtures__/json/macos/build--error-compiler.json index 5036f773..8c096356 100644 --- a/src/snapshot-tests/__fixtures__/json/macos/build--error-compiler.json +++ b/src/snapshot-tests/__fixtures__/json/macos/build--error-compiler.json @@ -7,7 +7,7 @@ "request": { "scheme": "MCPTest", "projectPath": "example_projects/macOS/MCPTest.xcodeproj", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", "configuration": "Debug", "platform": "macOS", "target": "macos" @@ -18,7 +18,7 @@ "target": "macos" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/macos/build--error-wrong-scheme.json b/src/snapshot-tests/__fixtures__/json/macos/build--error-wrong-scheme.json index 9e407d70..9136bf8b 100644 --- a/src/snapshot-tests/__fixtures__/json/macos/build--error-wrong-scheme.json +++ b/src/snapshot-tests/__fixtures__/json/macos/build--error-wrong-scheme.json @@ -7,7 +7,7 @@ "request": { "scheme": "NONEXISTENT", "projectPath": "example_projects/macOS/MCPTest.xcodeproj", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", "configuration": "Debug", "platform": "macOS", "target": "macos" @@ -18,7 +18,7 @@ "target": "macos" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/macos/build--success.json b/src/snapshot-tests/__fixtures__/json/macos/build--success.json index 1d9f5091..3b215392 100644 --- a/src/snapshot-tests/__fixtures__/json/macos/build--success.json +++ b/src/snapshot-tests/__fixtures__/json/macos/build--success.json @@ -7,7 +7,7 @@ "request": { "scheme": "MCPTest", "projectPath": "example_projects/macOS/MCPTest.xcodeproj", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", "configuration": "Debug", "platform": "macOS", "target": "macos" @@ -19,7 +19,7 @@ }, "artifacts": { "bundleId": "io.sentry.MCPTest.macOS", - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/macos/build-and-run--error-compiler.json b/src/snapshot-tests/__fixtures__/json/macos/build-and-run--error-compiler.json index 8d2e6abb..9cb2ca2c 100644 --- a/src/snapshot-tests/__fixtures__/json/macos/build-and-run--error-compiler.json +++ b/src/snapshot-tests/__fixtures__/json/macos/build-and-run--error-compiler.json @@ -7,7 +7,7 @@ "request": { "scheme": "MCPTest", "projectPath": "example_projects/macOS/MCPTest.xcodeproj", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", "configuration": "Debug", "platform": "macOS", "target": "macos" @@ -18,7 +18,7 @@ "target": "macos" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_macos__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_macos__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/macos/build-and-run--error-wrong-scheme.json b/src/snapshot-tests/__fixtures__/json/macos/build-and-run--error-wrong-scheme.json index 5abc9d44..4941fad3 100644 --- a/src/snapshot-tests/__fixtures__/json/macos/build-and-run--error-wrong-scheme.json +++ b/src/snapshot-tests/__fixtures__/json/macos/build-and-run--error-wrong-scheme.json @@ -7,7 +7,7 @@ "request": { "scheme": "NONEXISTENT", "projectPath": "example_projects/macOS/MCPTest.xcodeproj", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", "configuration": "Debug", "platform": "macOS", "target": "macos" @@ -18,7 +18,7 @@ "target": "macos" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_macos__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_macos__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/macos/build-and-run--success.json b/src/snapshot-tests/__fixtures__/json/macos/build-and-run--success.json index 0f47df87..f9766f75 100644 --- a/src/snapshot-tests/__fixtures__/json/macos/build-and-run--success.json +++ b/src/snapshot-tests/__fixtures__/json/macos/build-and-run--success.json @@ -7,7 +7,7 @@ "request": { "scheme": "MCPTest", "projectPath": "example_projects/macOS/MCPTest.xcodeproj", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", "configuration": "Debug", "platform": "macOS", "target": "macos" @@ -18,10 +18,10 @@ "target": "macos" }, "artifacts": { - "appPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app", + "appPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app", "bundleId": "io.sentry.MCPTest.macOS", "processId": 99999, - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_macos__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_macos__pid.log" }, "output": { "stdout": [], diff --git a/src/snapshot-tests/__fixtures__/json/macos/get-app-path--success.json b/src/snapshot-tests/__fixtures__/json/macos/get-app-path--success.json index 0ae14e08..9872ebc0 100644 --- a/src/snapshot-tests/__fixtures__/json/macos/get-app-path--success.json +++ b/src/snapshot-tests/__fixtures__/json/macos/get-app-path--success.json @@ -15,7 +15,7 @@ "target": "macos" }, "artifacts": { - "appPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app" + "appPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app" } } } diff --git a/src/snapshot-tests/__fixtures__/json/macos/launch--success.json b/src/snapshot-tests/__fixtures__/json/macos/launch--success.json index baa19c2f..8150d1cd 100644 --- a/src/snapshot-tests/__fixtures__/json/macos/launch--success.json +++ b/src/snapshot-tests/__fixtures__/json/macos/launch--success.json @@ -8,7 +8,7 @@ "status": "SUCCEEDED" }, "artifacts": { - "appPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app", + "appPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app", "bundleId": "io.sentry.MCPTest.macOS", "processId": 99999 }, diff --git a/src/snapshot-tests/__fixtures__/json/macos/test--error-compiler.json b/src/snapshot-tests/__fixtures__/json/macos/test--error-compiler.json index a6521794..6daee8b4 100644 --- a/src/snapshot-tests/__fixtures__/json/macos/test--error-compiler.json +++ b/src/snapshot-tests/__fixtures__/json/macos/test--error-compiler.json @@ -7,7 +7,7 @@ "request": { "scheme": "MCPTest", "projectPath": "example_projects/macOS/MCPTest.xcodeproj", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", "configuration": "Debug", "platform": "macOS", "onlyTesting": [ @@ -27,8 +27,8 @@ "target": "macos" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log", - "xcresultPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log", + "xcresultPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult" }, "tests": { "selected": [ diff --git a/src/snapshot-tests/__fixtures__/json/macos/test--error-wrong-scheme.json b/src/snapshot-tests/__fixtures__/json/macos/test--error-wrong-scheme.json index 494cc28b..17eb6d3c 100644 --- a/src/snapshot-tests/__fixtures__/json/macos/test--error-wrong-scheme.json +++ b/src/snapshot-tests/__fixtures__/json/macos/test--error-wrong-scheme.json @@ -7,7 +7,7 @@ "request": { "scheme": "NONEXISTENT", "projectPath": "example_projects/macOS/MCPTest.xcodeproj", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", "configuration": "Debug", "platform": "macOS", "onlyTesting": [], @@ -24,8 +24,8 @@ "target": "macos" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log", - "xcresultPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log", + "xcresultPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/macos/test--failure.json b/src/snapshot-tests/__fixtures__/json/macos/test--failure.json index ffdbc19e..4c7f4e98 100644 --- a/src/snapshot-tests/__fixtures__/json/macos/test--failure.json +++ b/src/snapshot-tests/__fixtures__/json/macos/test--failure.json @@ -7,7 +7,7 @@ "request": { "scheme": "MCPTest", "projectPath": "example_projects/macOS/MCPTest.xcodeproj", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", "configuration": "Debug", "platform": "macOS", "onlyTesting": [], @@ -24,8 +24,8 @@ "target": "macos" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log", - "xcresultPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log", + "xcresultPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult" }, "tests": { "discovered": { diff --git a/src/snapshot-tests/__fixtures__/json/macos/test--success.json b/src/snapshot-tests/__fixtures__/json/macos/test--success.json index 01f82f0f..262236eb 100644 --- a/src/snapshot-tests/__fixtures__/json/macos/test--success.json +++ b/src/snapshot-tests/__fixtures__/json/macos/test--success.json @@ -7,7 +7,7 @@ "request": { "scheme": "MCPTest", "projectPath": "example_projects/macOS/MCPTest.xcodeproj", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-", "configuration": "Debug", "platform": "macOS", "onlyTesting": [ @@ -27,8 +27,8 @@ "target": "macos" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log", - "xcresultPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log", + "xcresultPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult" }, "tests": { "selected": [ diff --git a/src/snapshot-tests/__fixtures__/json/simulator/build--error-compiler.json b/src/snapshot-tests/__fixtures__/json/simulator/build--error-compiler.json index 1d0c340f..70293cf2 100644 --- a/src/snapshot-tests/__fixtures__/json/simulator/build--error-compiler.json +++ b/src/snapshot-tests/__fixtures__/json/simulator/build--error-compiler.json @@ -7,7 +7,7 @@ "request": { "scheme": "CalculatorApp", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS Simulator", "simulatorName": "iPhone 17" @@ -18,7 +18,7 @@ "target": "simulator" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/simulator/build--error-wrong-scheme.json b/src/snapshot-tests/__fixtures__/json/simulator/build--error-wrong-scheme.json index 93dda05b..ce485dba 100644 --- a/src/snapshot-tests/__fixtures__/json/simulator/build--error-wrong-scheme.json +++ b/src/snapshot-tests/__fixtures__/json/simulator/build--error-wrong-scheme.json @@ -7,7 +7,7 @@ "request": { "scheme": "NONEXISTENT", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS Simulator", "simulatorName": "iPhone 17" @@ -18,7 +18,7 @@ "target": "simulator" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/simulator/build--success.json b/src/snapshot-tests/__fixtures__/json/simulator/build--success.json index 17680c2f..6e8b82ea 100644 --- a/src/snapshot-tests/__fixtures__/json/simulator/build--success.json +++ b/src/snapshot-tests/__fixtures__/json/simulator/build--success.json @@ -7,7 +7,7 @@ "request": { "scheme": "CalculatorApp", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS Simulator", "simulatorName": "iPhone 17" @@ -18,7 +18,7 @@ "target": "simulator" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/simulator/build-and-run--error-compiler.json b/src/snapshot-tests/__fixtures__/json/simulator/build-and-run--error-compiler.json index 6625f753..e65165d4 100644 --- a/src/snapshot-tests/__fixtures__/json/simulator/build-and-run--error-compiler.json +++ b/src/snapshot-tests/__fixtures__/json/simulator/build-and-run--error-compiler.json @@ -7,7 +7,7 @@ "request": { "scheme": "CalculatorApp", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS Simulator", "simulatorName": "iPhone 17" @@ -18,7 +18,7 @@ "target": "simulator" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_sim__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_sim__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/simulator/build-and-run--error-wrong-scheme.json b/src/snapshot-tests/__fixtures__/json/simulator/build-and-run--error-wrong-scheme.json index 2fadffee..902c9281 100644 --- a/src/snapshot-tests/__fixtures__/json/simulator/build-and-run--error-wrong-scheme.json +++ b/src/snapshot-tests/__fixtures__/json/simulator/build-and-run--error-wrong-scheme.json @@ -7,7 +7,7 @@ "request": { "scheme": "NONEXISTENT", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS Simulator", "simulatorName": "iPhone 17" @@ -18,7 +18,7 @@ "target": "simulator" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_sim__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_sim__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/simulator/build-and-run--success.json b/src/snapshot-tests/__fixtures__/json/simulator/build-and-run--success.json index 121b45f6..3b0476dc 100644 --- a/src/snapshot-tests/__fixtures__/json/simulator/build-and-run--success.json +++ b/src/snapshot-tests/__fixtures__/json/simulator/build-and-run--success.json @@ -7,7 +7,7 @@ "request": { "scheme": "CalculatorApp", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS Simulator", "simulatorName": "iPhone 17" @@ -18,13 +18,13 @@ "target": "simulator" }, "artifacts": { - "appPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app", + "appPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app", "bundleId": "io.sentry.calculatorapp", "processId": 99999, "simulatorId": "", - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_sim__pid.log", - "runtimeLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp__pid.log", - "osLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp_oslog__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_sim__pid.log", + "runtimeLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp__pid.log", + "osLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp_oslog__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/simulator/get-app-path--success.json b/src/snapshot-tests/__fixtures__/json/simulator/get-app-path--success.json index 2b45efb7..19883c40 100644 --- a/src/snapshot-tests/__fixtures__/json/simulator/get-app-path--success.json +++ b/src/snapshot-tests/__fixtures__/json/simulator/get-app-path--success.json @@ -17,7 +17,7 @@ "durationMs": 1234 }, "artifacts": { - "appPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app" + "appPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app" } } } diff --git a/src/snapshot-tests/__fixtures__/json/simulator/install--success.json b/src/snapshot-tests/__fixtures__/json/simulator/install--success.json index f1350688..6d757dcd 100644 --- a/src/snapshot-tests/__fixtures__/json/simulator/install--success.json +++ b/src/snapshot-tests/__fixtures__/json/simulator/install--success.json @@ -9,7 +9,7 @@ }, "artifacts": { "simulatorId": "", - "appPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app" + "appPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/simulator/launch-app--success.json b/src/snapshot-tests/__fixtures__/json/simulator/launch-app--success.json index 71c3482b..a423c45e 100644 --- a/src/snapshot-tests/__fixtures__/json/simulator/launch-app--success.json +++ b/src/snapshot-tests/__fixtures__/json/simulator/launch-app--success.json @@ -11,8 +11,8 @@ "simulatorId": "", "bundleId": "io.sentry.calculatorapp", "processId": 99999, - "runtimeLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp__pid.log", - "osLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp_oslog__pid.log" + "runtimeLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp__pid.log", + "osLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp_oslog__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/simulator/test--error-compiler.json b/src/snapshot-tests/__fixtures__/json/simulator/test--error-compiler.json index b424f3b9..8bd844e7 100644 --- a/src/snapshot-tests/__fixtures__/json/simulator/test--error-compiler.json +++ b/src/snapshot-tests/__fixtures__/json/simulator/test--error-compiler.json @@ -7,7 +7,7 @@ "request": { "scheme": "CalculatorApp", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS Simulator", "simulatorName": "iPhone 17", @@ -22,7 +22,7 @@ "target": "simulator" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log" }, "tests": { "selected": [ diff --git a/src/snapshot-tests/__fixtures__/json/simulator/test--error-wrong-scheme.json b/src/snapshot-tests/__fixtures__/json/simulator/test--error-wrong-scheme.json index 7720890a..5545ce84 100644 --- a/src/snapshot-tests/__fixtures__/json/simulator/test--error-wrong-scheme.json +++ b/src/snapshot-tests/__fixtures__/json/simulator/test--error-wrong-scheme.json @@ -7,7 +7,7 @@ "request": { "scheme": "NONEXISTENT", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS Simulator", "simulatorName": "iPhone 17", @@ -20,7 +20,7 @@ "target": "simulator" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/simulator/test--failure.json b/src/snapshot-tests/__fixtures__/json/simulator/test--failure.json index 3eb1aa90..da4d5cde 100644 --- a/src/snapshot-tests/__fixtures__/json/simulator/test--failure.json +++ b/src/snapshot-tests/__fixtures__/json/simulator/test--failure.json @@ -7,7 +7,7 @@ "request": { "scheme": "CalculatorApp", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS Simulator", "simulatorName": "iPhone 17", @@ -25,8 +25,8 @@ "target": "simulator" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log", - "xcresultPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_sim__pid.xcresult" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log", + "xcresultPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_sim__pid.xcresult" }, "tests": { "discovered": { diff --git a/src/snapshot-tests/__fixtures__/json/simulator/test--success.json b/src/snapshot-tests/__fixtures__/json/simulator/test--success.json index ada1fae8..e6b0d7b0 100644 --- a/src/snapshot-tests/__fixtures__/json/simulator/test--success.json +++ b/src/snapshot-tests/__fixtures__/json/simulator/test--success.json @@ -7,7 +7,7 @@ "request": { "scheme": "CalculatorApp", "workspacePath": "example_projects/iOS_Calculator/CalculatorApp.xcworkspace", - "derivedDataPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", + "derivedDataPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-", "configuration": "Debug", "platform": "iOS Simulator", "simulatorName": "iPhone 17", @@ -27,8 +27,8 @@ "target": "simulator" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log", - "xcresultPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_sim__pid.xcresult" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log", + "xcresultPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_sim__pid.xcresult" }, "tests": { "selected": [ diff --git a/src/snapshot-tests/__fixtures__/json/swift-package/build--error-bad-path.json b/src/snapshot-tests/__fixtures__/json/swift-package/build--error-bad-path.json index 4741b697..63e72531 100644 --- a/src/snapshot-tests/__fixtures__/json/swift-package/build--error-bad-path.json +++ b/src/snapshot-tests/__fixtures__/json/swift-package/build--error-bad-path.json @@ -15,7 +15,7 @@ }, "artifacts": { "packagePath": "/example_projects/NONEXISTENT", - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_spm__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_spm__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/swift-package/build--success.json b/src/snapshot-tests/__fixtures__/json/swift-package/build--success.json index eaf49ad7..9cf857f1 100644 --- a/src/snapshot-tests/__fixtures__/json/swift-package/build--success.json +++ b/src/snapshot-tests/__fixtures__/json/swift-package/build--success.json @@ -15,7 +15,7 @@ }, "artifacts": { "packagePath": "/example_projects/spm", - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_spm__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_spm__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/swift-package/run--error-bad-executable.json b/src/snapshot-tests/__fixtures__/json/swift-package/run--error-bad-executable.json index 89108e05..ef0789c1 100644 --- a/src/snapshot-tests/__fixtures__/json/swift-package/run--error-bad-executable.json +++ b/src/snapshot-tests/__fixtures__/json/swift-package/run--error-bad-executable.json @@ -16,7 +16,7 @@ }, "artifacts": { "packagePath": "/example_projects/spm", - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_spm__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_spm__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/swift-package/run--success.json b/src/snapshot-tests/__fixtures__/json/swift-package/run--success.json index 16dbe956..bf84bf4b 100644 --- a/src/snapshot-tests/__fixtures__/json/swift-package/run--success.json +++ b/src/snapshot-tests/__fixtures__/json/swift-package/run--success.json @@ -18,7 +18,7 @@ "packagePath": "/example_projects/spm", "executablePath": "/example_projects/spm/.build/arm64-apple-macosx/debug/spm", "processId": 99999, - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_spm__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_spm__pid.log" }, "output": { "stdout": [ @@ -29,8 +29,8 @@ "[0/6] Write sources", "[1/6] Write spm-entitlement.plist", "[2/6] Write swift-version--6988338F2F200930.txt", - "[4/8] Compiling spm main.swift", - "[5/8] Emitting module spm", + "[4/8] Emitting module spm", + "[5/8] Compiling spm main.swift", "[5/8] Write Objects.LinkFileList", "[6/8] Linking spm", "[7/8] Applying spm", diff --git a/src/snapshot-tests/__fixtures__/json/swift-package/test--error-bad-path.json b/src/snapshot-tests/__fixtures__/json/swift-package/test--error-bad-path.json index 33817b29..9d83b726 100644 --- a/src/snapshot-tests/__fixtures__/json/swift-package/test--error-bad-path.json +++ b/src/snapshot-tests/__fixtures__/json/swift-package/test--error-bad-path.json @@ -16,7 +16,7 @@ "target": "swift-package" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log", + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log", "packagePath": "/example_projects/NONEXISTENT" }, "diagnostics": { diff --git a/src/snapshot-tests/__fixtures__/json/swift-package/test--failure.json b/src/snapshot-tests/__fixtures__/json/swift-package/test--failure.json index db70bd5d..124f9128 100644 --- a/src/snapshot-tests/__fixtures__/json/swift-package/test--failure.json +++ b/src/snapshot-tests/__fixtures__/json/swift-package/test--failure.json @@ -21,7 +21,7 @@ "target": "swift-package" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/json/swift-package/test--success.json b/src/snapshot-tests/__fixtures__/json/swift-package/test--success.json index 7351eae6..2bdba97e 100644 --- a/src/snapshot-tests/__fixtures__/json/swift-package/test--success.json +++ b/src/snapshot-tests/__fixtures__/json/swift-package/test--success.json @@ -21,7 +21,7 @@ "target": "swift-package" }, "artifacts": { - "buildLogPath": "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log" + "buildLogPath": "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log" }, "diagnostics": { "warnings": [], diff --git a/src/snapshot-tests/__fixtures__/mcp/coverage/get-coverage-report--error-invalid-bundle.txt b/src/snapshot-tests/__fixtures__/mcp/coverage/get-coverage-report--error-invalid-bundle.txt index 5e54457a..1c451025 100644 --- a/src/snapshot-tests/__fixtures__/mcp/coverage/get-coverage-report--error-invalid-bundle.txt +++ b/src/snapshot-tests/__fixtures__/mcp/coverage/get-coverage-report--error-invalid-bundle.txt @@ -1,8 +1,6 @@ 📊 Coverage Report - xcresult: /invalid.xcresult - Errors (1): ✗ Error Domain=XCCovErrorDomain Code=0 "Failed to load result bundle" UserInfo={NSLocalizedDescription=Failed to load result bundle, NSUnderlyingError= {Error Domain=XCResultStorage.ResultBundleFactory.Error Code=0 "Failed to create a new result bundle reader, underlying error: Info.plist at /invalid.xcresult/Info.plist does not exist, the result bundle might be corrupted or the provided path is not a result bundle"}} diff --git a/src/snapshot-tests/__fixtures__/mcp/coverage/get-coverage-report--success.txt b/src/snapshot-tests/__fixtures__/mcp/coverage/get-coverage-report--success.txt index d33a2699..bae11ffd 100644 --- a/src/snapshot-tests/__fixtures__/mcp/coverage/get-coverage-report--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/coverage/get-coverage-report--success.txt @@ -1,9 +1,6 @@ 📊 Coverage Report - xcresult: /TestResults.xcresult - Target Filter: CalculatorAppTests - ℹ️ Overall: 94.9% (371/391 lines) Targets diff --git a/src/snapshot-tests/__fixtures__/mcp/coverage/get-file-coverage--error-invalid-bundle.txt b/src/snapshot-tests/__fixtures__/mcp/coverage/get-file-coverage--error-invalid-bundle.txt index e47d59fd..2ccc0856 100644 --- a/src/snapshot-tests/__fixtures__/mcp/coverage/get-file-coverage--error-invalid-bundle.txt +++ b/src/snapshot-tests/__fixtures__/mcp/coverage/get-file-coverage--error-invalid-bundle.txt @@ -1,9 +1,6 @@ 📊 File Coverage - xcresult: /invalid.xcresult - File: SomeFile.swift - Errors (1): ✗ Error Domain=XCCovErrorDomain Code=0 "Failed to load result bundle" UserInfo={NSLocalizedDescription=Failed to load result bundle, NSUnderlyingError= {Error Domain=XCResultStorage.ResultBundleFactory.Error Code=0 "Failed to create a new result bundle reader, underlying error: Info.plist at /invalid.xcresult/Info.plist does not exist, the result bundle might be corrupted or the provided path is not a result bundle"}} diff --git a/src/snapshot-tests/__fixtures__/mcp/coverage/get-file-coverage--success.txt b/src/snapshot-tests/__fixtures__/mcp/coverage/get-file-coverage--success.txt index a44ae894..2d539e0a 100644 --- a/src/snapshot-tests/__fixtures__/mcp/coverage/get-file-coverage--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/coverage/get-file-coverage--success.txt @@ -1,9 +1,6 @@ 📊 File Coverage - xcresult: /TestResults.xcresult - File: CalculatorService.swift - File: example_projects/iOS_Calculator/CalculatorAppPackage/Sources/CalculatorAppFeature/CalculatorService.swift ℹ️ Coverage: 83.1% (157/189 lines) diff --git a/src/snapshot-tests/__fixtures__/mcp/debugging/lldb-command--error-no-session.txt b/src/snapshot-tests/__fixtures__/mcp/debugging/lldb-command--error-no-session.txt index 0413c89b..330cad0f 100644 --- a/src/snapshot-tests/__fixtures__/mcp/debugging/lldb-command--error-no-session.txt +++ b/src/snapshot-tests/__fixtures__/mcp/debugging/lldb-command--error-no-session.txt @@ -1,8 +1,6 @@ 🐛 LLDB Command - Command: bt - Errors (1): ✗ No active debug session. Provide debugSessionId or attach first. diff --git a/src/snapshot-tests/__fixtures__/mcp/debugging/lldb-command--success.txt b/src/snapshot-tests/__fixtures__/mcp/debugging/lldb-command--success.txt index 08c3d66a..b0170c41 100644 --- a/src/snapshot-tests/__fixtures__/mcp/debugging/lldb-command--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/debugging/lldb-command--success.txt @@ -1,8 +1,6 @@ 🐛 LLDB Command - Command: breakpoint list - ✅ Command executed Output: diff --git a/src/snapshot-tests/__fixtures__/mcp/device/build--error-compiler.txt b/src/snapshot-tests/__fixtures__/mcp/device/build--error-compiler.txt index 7a6b95ea..c720ef98 100644 --- a/src/snapshot-tests/__fixtures__/mcp/device/build--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/mcp/device/build--error-compiler.txt @@ -1,16 +1,11 @@ 🔨 Build - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - Errors (1): ✗ cannot convert value of type 'String' to specified type 'Int' /example_projects/iOS_Calculator/CalculatorApp/CalculatorApp.swift:33 ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/device/build--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/mcp/device/build--error-wrong-scheme.txt index b8e4d871..a65c33fe 100644 --- a/src/snapshot-tests/__fixtures__/mcp/device/build--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/mcp/device/build--error-wrong-scheme.txt @@ -1,15 +1,10 @@ 🔨 Build - Scheme: NONEXISTENT - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - Errors (1): ✗ The workspace named "CalculatorApp" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the workspace. ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/device/build--success.txt b/src/snapshot-tests/__fixtures__/mcp/device/build--success.txt index 5b415b7b..9f8794f7 100644 --- a/src/snapshot-tests/__fixtures__/mcp/device/build--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/device/build--success.txt @@ -1,14 +1,9 @@ 🔨 Build - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - ✅ Build succeeded. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_device__pid.log — Build Logs Next steps: 1. Get built device app path: get_device_app_path({ scheme: "CalculatorApp" }) diff --git a/src/snapshot-tests/__fixtures__/mcp/device/build-and-run--error-compiler.txt b/src/snapshot-tests/__fixtures__/mcp/device/build-and-run--error-compiler.txt index 02ca9c5e..dff811af 100644 --- a/src/snapshot-tests/__fixtures__/mcp/device/build-and-run--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/mcp/device/build-and-run--error-compiler.txt @@ -1,17 +1,11 @@ 🚀 Build & Run - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS - Device: () - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - Errors (1): ✗ cannot convert value of type 'String' to specified type 'Int' /example_projects/iOS_Calculator/CalculatorApp/CalculatorApp.swift:33 ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_device__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_device__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/device/build-and-run--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/mcp/device/build-and-run--error-wrong-scheme.txt index 6e721682..1bc367e7 100644 --- a/src/snapshot-tests/__fixtures__/mcp/device/build-and-run--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/mcp/device/build-and-run--error-wrong-scheme.txt @@ -1,16 +1,10 @@ 🚀 Build & Run - Scheme: NONEXISTENT - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS - Device: () - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - Errors (1): ✗ The workspace named "CalculatorApp" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the workspace. ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_device__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_device__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/device/build-and-run--success.txt b/src/snapshot-tests/__fixtures__/mcp/device/build-and-run--success.txt index 2c3864bc..10d63318 100644 --- a/src/snapshot-tests/__fixtures__/mcp/device/build-and-run--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/device/build-and-run--success.txt @@ -1,13 +1,6 @@ 🚀 Build & Run - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS - Device: () - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - ℹ️ Resolving app path ✅ Resolving app path ℹ️ Installing app @@ -16,10 +9,12 @@ ✅ Build succeeded. (⏱️ ) ✅ Build & Run complete - ├ App Path: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app ├ Bundle ID: io.sentry.calculatorapp ├ Process ID: - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_device__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/ + ├── DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app — App Path + └── logs/build_run_device__pid.log — Build Logs Next steps: 1. Stop app on device: stop_app_device({ deviceId: "", processId: }) diff --git a/src/snapshot-tests/__fixtures__/mcp/device/get-app-path--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/mcp/device/get-app-path--error-wrong-scheme.txt index 6817789b..4e7787b5 100644 --- a/src/snapshot-tests/__fixtures__/mcp/device/get-app-path--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/mcp/device/get-app-path--error-wrong-scheme.txt @@ -1,11 +1,6 @@ 🔍 Get App Path - Scheme: NONEXISTENT - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS - Errors (1): ✗ The workspace named "CalculatorApp" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the workspace. diff --git a/src/snapshot-tests/__fixtures__/mcp/device/get-app-path--success.txt b/src/snapshot-tests/__fixtures__/mcp/device/get-app-path--success.txt index 039e3873..9fc79b8f 100644 --- a/src/snapshot-tests/__fixtures__/mcp/device/get-app-path--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/device/get-app-path--success.txt @@ -1,15 +1,11 @@ 🔍 Get App Path - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS - ✅ Success - └ App Path: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app — App Path Next steps: -1. Get bundle ID: get_app_bundle_id({ appPath: "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app" }) -2. Install app on device: install_app_device({ deviceId: "DEVICE_UDID", appPath: "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app" }) +1. Get bundle ID: get_app_bundle_id({ appPath: "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app" }) +2. Install app on device: install_app_device({ deviceId: "DEVICE_UDID", appPath: "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app" }) 3. Launch app on device: launch_app_device({ deviceId: "DEVICE_UDID", bundleId: "BUNDLE_ID" }) diff --git a/src/snapshot-tests/__fixtures__/mcp/device/install--error-invalid-app.txt b/src/snapshot-tests/__fixtures__/mcp/device/install--error-invalid-app.txt index af3837d8..b9deeae4 100644 --- a/src/snapshot-tests/__fixtures__/mcp/device/install--error-invalid-app.txt +++ b/src/snapshot-tests/__fixtures__/mcp/device/install--error-invalid-app.txt @@ -1,9 +1,6 @@ 📦 Install App - Device: - App: /tmp/nonexistent.app - Errors (1): ✗ Failed to load provisioning paramter list due to error: Error Domain=com.apple.dt.CoreDeviceError Code=1002 "No provider was found." UserInfo={NSLocalizedDescription=No provider was found.}. diff --git a/src/snapshot-tests/__fixtures__/mcp/device/install--success.txt b/src/snapshot-tests/__fixtures__/mcp/device/install--success.txt index dd596fc8..52de910b 100644 --- a/src/snapshot-tests/__fixtures__/mcp/device/install--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/device/install--success.txt @@ -1,7 +1,4 @@ 📦 Install App - Device: () - App: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphoneos/CalculatorApp.app - ✅ App installed successfully. diff --git a/src/snapshot-tests/__fixtures__/mcp/device/launch--error-invalid-bundle.txt b/src/snapshot-tests/__fixtures__/mcp/device/launch--error-invalid-bundle.txt index 14626ef9..20213311 100644 --- a/src/snapshot-tests/__fixtures__/mcp/device/launch--error-invalid-bundle.txt +++ b/src/snapshot-tests/__fixtures__/mcp/device/launch--error-invalid-bundle.txt @@ -1,9 +1,6 @@ 🚀 Launch App - Device: - Bundle ID: com.nonexistent.app - Errors (1): ✗ Failed to load provisioning paramter list due to error: Error Domain=com.apple.dt.CoreDeviceError Code=1002 "No provider was found." UserInfo={NSLocalizedDescription=No provider was found.}. diff --git a/src/snapshot-tests/__fixtures__/mcp/device/launch--success.txt b/src/snapshot-tests/__fixtures__/mcp/device/launch--success.txt index a4887124..888b3e00 100644 --- a/src/snapshot-tests/__fixtures__/mcp/device/launch--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/device/launch--success.txt @@ -1,9 +1,6 @@ 🚀 Launch App - Device: () - Bundle ID: io.sentry.calculatorapp - ✅ App launched successfully. └ Process ID: diff --git a/src/snapshot-tests/__fixtures__/mcp/device/stop--error-no-app.txt b/src/snapshot-tests/__fixtures__/mcp/device/stop--error-no-app.txt index f0fab5b3..a09f9c2a 100644 --- a/src/snapshot-tests/__fixtures__/mcp/device/stop--error-no-app.txt +++ b/src/snapshot-tests/__fixtures__/mcp/device/stop--error-no-app.txt @@ -1,9 +1,6 @@ 🛑 Stop App - Device: - PID: - Errors (1): ✗ Failed to load provisioning paramter list due to error: Error Domain=com.apple.dt.CoreDeviceError Code=1002 "No provider was found." UserInfo={NSLocalizedDescription=No provider was found.}. diff --git a/src/snapshot-tests/__fixtures__/mcp/device/stop--success.txt b/src/snapshot-tests/__fixtures__/mcp/device/stop--success.txt index 2fa57755..46f6293d 100644 --- a/src/snapshot-tests/__fixtures__/mcp/device/stop--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/device/stop--success.txt @@ -1,7 +1,4 @@ 🛑 Stop App - Device: () - PID: - ✅ App stopped successfully diff --git a/src/snapshot-tests/__fixtures__/mcp/device/test--error-compiler.txt b/src/snapshot-tests/__fixtures__/mcp/device/test--error-compiler.txt index d00ef768..2bb48947 100644 --- a/src/snapshot-tests/__fixtures__/mcp/device/test--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/mcp/device/test--error-compiler.txt @@ -1,15 +1,6 @@ 🧪 Test - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS - Device: () - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - Selective Testing: - CalculatorAppTests/CalculatorAppTests/testAddition - Discovered 1 test(s): CalculatorAppTests/CalculatorAppTests/testAddition @@ -19,5 +10,7 @@ Errors (1): /example_projects/iOS_Calculator/CalculatorApp/CalculatorApp.swift:33 ❌ Test failed. (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_device__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_device__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/ + ├── logs/test_device__pid.log — Build Logs + └── result-bundles/test_device__pid.xcresult — Result Bundle diff --git a/src/snapshot-tests/__fixtures__/mcp/device/test--failure.txt b/src/snapshot-tests/__fixtures__/mcp/device/test--failure.txt index 41805834..d4fe8e5d 100644 --- a/src/snapshot-tests/__fixtures__/mcp/device/test--failure.txt +++ b/src/snapshot-tests/__fixtures__/mcp/device/test--failure.txt @@ -1,13 +1,6 @@ 🧪 Test - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS - Device: () - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - Discovered 57 test(s): CalculatorAppFeatureTests/CalculatorBasicTests/testClear CalculatorAppFeatureTests/CalculatorBasicTests/testInitialState @@ -26,5 +19,7 @@ Test Failures (2): /example_projects/iOS_Calculator/CalculatorAppTests/CalculatorAppTests.swift:286 ❌ tests failed, passed, skipped (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_device__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_device__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/ + ├── logs/test_device__pid.log — Build Logs + └── result-bundles/test_device__pid.xcresult — Result Bundle diff --git a/src/snapshot-tests/__fixtures__/mcp/device/test--success.txt b/src/snapshot-tests/__fixtures__/mcp/device/test--success.txt index 0165555f..aeba621e 100644 --- a/src/snapshot-tests/__fixtures__/mcp/device/test--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/device/test--success.txt @@ -1,18 +1,11 @@ 🧪 Test - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS - Device: () - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - Selective Testing: - CalculatorAppTests/CalculatorAppTests/testAddition - Discovered 1 test(s): CalculatorAppTests/CalculatorAppTests/testAddition ✅ 1 test passed, 0 failed, 0 skipped (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_device__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_device__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/ + ├── logs/test_device__pid.log — Build Logs + └── result-bundles/test_device__pid.xcresult — Result Bundle diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/build--error-compiler.txt b/src/snapshot-tests/__fixtures__/mcp/macos/build--error-compiler.txt index 52ffe01a..6de954a4 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/build--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/build--error-compiler.txt @@ -1,16 +1,11 @@ 🔨 Build - Scheme: MCPTest - Project: example_projects/macOS/MCPTest.xcodeproj - Configuration: Debug - Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- - Errors (1): ✗ cannot convert value of type 'String' to specified type 'Int' /example_projects/macOS/MCPTest/MCPTestApp.swift:20 ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/build--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/mcp/macos/build--error-wrong-scheme.txt index 57a867a9..0da1f22f 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/build--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/build--error-wrong-scheme.txt @@ -1,15 +1,10 @@ 🔨 Build - Scheme: NONEXISTENT - Project: example_projects/macOS/MCPTest.xcodeproj - Configuration: Debug - Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- - Errors (1): ✗ The project named "MCPTest" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the project. ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/build--success.txt b/src/snapshot-tests/__fixtures__/mcp/macos/build--success.txt index 179a8145..6d3ee03a 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/build--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/build--success.txt @@ -1,15 +1,10 @@ 🔨 Build - Scheme: MCPTest - Project: example_projects/macOS/MCPTest.xcodeproj - Configuration: Debug - Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- - ✅ Build succeeded. (⏱️ ) ├ Bundle ID: io.sentry.MCPTest.macOS - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_macos__pid.log — Build Logs Next steps: 1. Get built macOS app path: get_mac_app_path({ scheme: "MCPTest" }) diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/build-and-run--error-compiler.txt b/src/snapshot-tests/__fixtures__/mcp/macos/build-and-run--error-compiler.txt index 14f54f4c..81cdf126 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/build-and-run--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/build-and-run--error-compiler.txt @@ -1,16 +1,11 @@ 🚀 Build & Run - Scheme: MCPTest - Project: example_projects/macOS/MCPTest.xcodeproj - Configuration: Debug - Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- - Errors (1): ✗ cannot convert value of type 'String' to specified type 'Int' /example_projects/macOS/MCPTest/MCPTestApp.swift:20 ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_macos__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_macos__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/build-and-run--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/mcp/macos/build-and-run--error-wrong-scheme.txt index 66796aa6..353cd578 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/build-and-run--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/build-and-run--error-wrong-scheme.txt @@ -1,15 +1,10 @@ 🚀 Build & Run - Scheme: NONEXISTENT - Project: example_projects/macOS/MCPTest.xcodeproj - Configuration: Debug - Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- - Errors (1): ✗ The project named "MCPTest" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the project. ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_macos__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_macos__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/build-and-run--success.txt b/src/snapshot-tests/__fixtures__/mcp/macos/build-and-run--success.txt index a4dae807..f4571838 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/build-and-run--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/build-and-run--success.txt @@ -1,12 +1,6 @@ 🚀 Build & Run - Scheme: MCPTest - Project: example_projects/macOS/MCPTest.xcodeproj - Configuration: Debug - Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- - ℹ️ Resolving app path ✅ Resolving app path ℹ️ Launching app @@ -14,10 +8,12 @@ ✅ Build succeeded. (⏱️ ) ✅ Build & Run complete - ├ App Path: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app ├ Bundle ID: io.sentry.MCPTest.macOS ├ Process ID: - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_macos__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/ + ├── DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app — App Path + └── logs/build_run_macos__pid.log — Build Logs Next steps: 1. Interact with the launched app in the foreground diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/get-app-path--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/mcp/macos/get-app-path--error-wrong-scheme.txt index 0661e112..296c376f 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/get-app-path--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/get-app-path--error-wrong-scheme.txt @@ -1,11 +1,6 @@ 🔍 Get App Path - Scheme: NONEXISTENT - Project: example_projects/macOS/MCPTest.xcodeproj - Configuration: Debug - Platform: macOS - Errors (1): ✗ The project named "MCPTest" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the project. diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/get-app-path--success.txt b/src/snapshot-tests/__fixtures__/mcp/macos/get-app-path--success.txt index 6bd49335..48d88a45 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/get-app-path--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/get-app-path--success.txt @@ -1,14 +1,10 @@ 🔍 Get App Path - Scheme: MCPTest - Project: example_projects/macOS/MCPTest.xcodeproj - Configuration: Debug - Platform: macOS - ✅ Success - └ App Path: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app — App Path Next steps: -1. Get bundle ID: get_mac_bundle_id({ appPath: "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app" }) -2. Launch app: launch_mac_app({ appPath: "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app" }) +1. Get bundle ID: get_mac_bundle_id({ appPath: "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app" }) +2. Launch app: launch_mac_app({ appPath: "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app" }) diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/get-macos-bundle-id--error-missing-app.txt b/src/snapshot-tests/__fixtures__/mcp/macos/get-macos-bundle-id--error-missing-app.txt index a7d25d46..fac62d2f 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/get-macos-bundle-id--error-missing-app.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/get-macos-bundle-id--error-missing-app.txt @@ -1,8 +1,6 @@ 🔍 Get macOS Bundle ID - App: /nonexistent/path/Fake.app - Errors (1): ✗ File not found: '/nonexistent/path/Fake.app'. Please check the path and try again. diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/get-macos-bundle-id--success.txt b/src/snapshot-tests/__fixtures__/mcp/macos/get-macos-bundle-id--success.txt index 3e596543..288ae4bd 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/get-macos-bundle-id--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/get-macos-bundle-id--success.txt @@ -1,8 +1,6 @@ 🔍 Get macOS Bundle ID - App: /BundleTest.app - ✅ Bundle ID └ com.test.snapshot-macos diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/launch--error-invalid-app.txt b/src/snapshot-tests/__fixtures__/mcp/macos/launch--error-invalid-app.txt index 246d1544..dcca7160 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/launch--error-invalid-app.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/launch--error-invalid-app.txt @@ -1,8 +1,6 @@ 🚀 Launch macOS App - App: /NonExistent.app - Errors (1): ✗ File not found: '/NonExistent.app'. Please check the path and try again. diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/launch--success.txt b/src/snapshot-tests/__fixtures__/mcp/macos/launch--success.txt index ac05ad09..cfcaa827 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/launch--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/launch--success.txt @@ -1,8 +1,6 @@ 🚀 Launch macOS App - App: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest-/Build/Products/Debug/MCPTest.app - ✅ App launched successfully ├ Bundle ID: io.sentry.MCPTest.macOS └ Process ID: diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/stop--error-no-app.txt b/src/snapshot-tests/__fixtures__/mcp/macos/stop--error-no-app.txt index 22a43ddd..1b4234de 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/stop--error-no-app.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/stop--error-no-app.txt @@ -1,8 +1,6 @@ 🛑 Stop macOS App - App: PID 999999 - Errors (1): ✗ kill: 999999: No such process diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/stop--success.txt b/src/snapshot-tests/__fixtures__/mcp/macos/stop--success.txt index dffe5e4e..8703f940 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/stop--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/stop--success.txt @@ -1,6 +1,4 @@ 🛑 Stop macOS App - App: MCPTest - ✅ App stopped successfully diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/test--error-compiler.txt b/src/snapshot-tests/__fixtures__/mcp/macos/test--error-compiler.txt index 8a26848e..12a1f9e6 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/test--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/test--error-compiler.txt @@ -1,15 +1,6 @@ 🧪 Test - Scheme: MCPTest - Project: example_projects/macOS/MCPTest.xcodeproj - Configuration: Debug - Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- - Selective Testing: - MCPTestTests/MCPTestTests/appNameIsCorrect() - MCPTestTests/MCPTestsXCTests/testAppNameIsCorrect - Discovered 2 test(s): MCPTestTests/MCPTestTests/appNameIsCorrect MCPTestTests/MCPTestsXCTests/testAppNameIsCorrect @@ -20,5 +11,7 @@ Errors (1): /example_projects/macOS/MCPTest/MCPTestApp.swift:20 ❌ Test failed. (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/ + ├── logs/test_macos__pid.log — Build Logs + └── result-bundles/test_macos__pid.xcresult — Result Bundle diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/test--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/mcp/macos/test--error-wrong-scheme.txt index bf22f9ec..28957ac8 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/test--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/test--error-wrong-scheme.txt @@ -1,16 +1,12 @@ 🧪 Test - Scheme: NONEXISTENT - Project: example_projects/macOS/MCPTest.xcodeproj - Configuration: Debug - Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- - Errors (1): ✗ The project named "MCPTest" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the project. ❌ Test failed. (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/ + ├── logs/test_macos__pid.log — Build Logs + └── result-bundles/test_macos__pid.xcresult — Result Bundle diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/test--failure.txt b/src/snapshot-tests/__fixtures__/mcp/macos/test--failure.txt index 8222e170..c7db60d8 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/test--failure.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/test--failure.txt @@ -1,12 +1,6 @@ 🧪 Test - Scheme: MCPTest - Project: example_projects/macOS/MCPTest.xcodeproj - Configuration: Debug - Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- - Discovered 4 test(s): MCPTestTests/MCPTestTests/appNameIsCorrect MCPTestTests/MCPTestTests/deliberateFailure @@ -22,5 +16,7 @@ Test Failures (2): MCPTestTests.swift:11 ❌ tests failed, passed, skipped (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/ + ├── logs/test_macos__pid.log — Build Logs + └── result-bundles/test_macos__pid.xcresult — Result Bundle diff --git a/src/snapshot-tests/__fixtures__/mcp/macos/test--success.txt b/src/snapshot-tests/__fixtures__/mcp/macos/test--success.txt index a17c9d71..bef7e622 100644 --- a/src/snapshot-tests/__fixtures__/mcp/macos/test--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/macos/test--success.txt @@ -1,19 +1,12 @@ 🧪 Test - Scheme: MCPTest - Project: example_projects/macOS/MCPTest.xcodeproj - Configuration: Debug - Platform: macOS - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/MCPTest- - Selective Testing: - MCPTestTests/MCPTestTests/appNameIsCorrect() - MCPTestTests/MCPTestsXCTests/testAppNameIsCorrect - Discovered 2 test(s): MCPTestTests/MCPTestTests/appNameIsCorrect MCPTestTests/MCPTestsXCTests/testAppNameIsCorrect ✅ 2 tests passed, 0 failed, 0 skipped (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_macos__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_macos__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/ + ├── logs/test_macos__pid.log — Build Logs + └── result-bundles/test_macos__pid.xcresult — Result Bundle diff --git a/src/snapshot-tests/__fixtures__/mcp/project-discovery/discover-projs--error-invalid-root.txt b/src/snapshot-tests/__fixtures__/mcp/project-discovery/discover-projs--error-invalid-root.txt index d125c554..f3c9f7a3 100644 --- a/src/snapshot-tests/__fixtures__/mcp/project-discovery/discover-projs--error-invalid-root.txt +++ b/src/snapshot-tests/__fixtures__/mcp/project-discovery/discover-projs--error-invalid-root.txt @@ -1,10 +1,6 @@ 🔍 Discover Projects - Workspace root: /nonexistent/path/Fake.app - Scan path: /nonexistent/path - Max depth: 3 - Errors (1): ✗ Failed to access scan path: /nonexistent/path. Error: ENOENT: no such file or directory, stat '/nonexistent/path' diff --git a/src/snapshot-tests/__fixtures__/mcp/project-discovery/discover-projs--success.txt b/src/snapshot-tests/__fixtures__/mcp/project-discovery/discover-projs--success.txt index 30ab25e4..d0dcf820 100644 --- a/src/snapshot-tests/__fixtures__/mcp/project-discovery/discover-projs--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/project-discovery/discover-projs--success.txt @@ -1,10 +1,6 @@ 🔍 Discover Projects - Workspace root: - Scan path: - Max depth: 3 - ✅ Found 1 project and 1 workspace Projects: diff --git a/src/snapshot-tests/__fixtures__/mcp/project-discovery/get-app-bundle-id--error-missing-app.txt b/src/snapshot-tests/__fixtures__/mcp/project-discovery/get-app-bundle-id--error-missing-app.txt index 22130633..0b6633c5 100644 --- a/src/snapshot-tests/__fixtures__/mcp/project-discovery/get-app-bundle-id--error-missing-app.txt +++ b/src/snapshot-tests/__fixtures__/mcp/project-discovery/get-app-bundle-id--error-missing-app.txt @@ -1,8 +1,6 @@ 🔍 Get Bundle ID - App: /nonexistent/path/Fake.app - Errors (1): ✗ File not found: '/nonexistent/path/Fake.app'. Please check the path and try again. diff --git a/src/snapshot-tests/__fixtures__/mcp/project-discovery/get-app-bundle-id--success.txt b/src/snapshot-tests/__fixtures__/mcp/project-discovery/get-app-bundle-id--success.txt index 3824c1cb..4c98c629 100644 --- a/src/snapshot-tests/__fixtures__/mcp/project-discovery/get-app-bundle-id--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/project-discovery/get-app-bundle-id--success.txt @@ -1,8 +1,6 @@ 🔍 Get Bundle ID - App: /BundleTest.app - ✅ Bundle ID └ com.test.snapshot diff --git a/src/snapshot-tests/__fixtures__/mcp/project-discovery/get-macos-bundle-id--error-missing-app.txt b/src/snapshot-tests/__fixtures__/mcp/project-discovery/get-macos-bundle-id--error-missing-app.txt index a7d25d46..fac62d2f 100644 --- a/src/snapshot-tests/__fixtures__/mcp/project-discovery/get-macos-bundle-id--error-missing-app.txt +++ b/src/snapshot-tests/__fixtures__/mcp/project-discovery/get-macos-bundle-id--error-missing-app.txt @@ -1,8 +1,6 @@ 🔍 Get macOS Bundle ID - App: /nonexistent/path/Fake.app - Errors (1): ✗ File not found: '/nonexistent/path/Fake.app'. Please check the path and try again. diff --git a/src/snapshot-tests/__fixtures__/mcp/project-discovery/get-macos-bundle-id--success.txt b/src/snapshot-tests/__fixtures__/mcp/project-discovery/get-macos-bundle-id--success.txt index c8a66f0e..651c014a 100644 --- a/src/snapshot-tests/__fixtures__/mcp/project-discovery/get-macos-bundle-id--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/project-discovery/get-macos-bundle-id--success.txt @@ -1,8 +1,6 @@ 🔍 Get macOS Bundle ID - App: /BundleTest.app - ✅ Bundle ID └ com.test.snapshot diff --git a/src/snapshot-tests/__fixtures__/mcp/project-discovery/list-schemes--error-invalid-workspace.txt b/src/snapshot-tests/__fixtures__/mcp/project-discovery/list-schemes--error-invalid-workspace.txt index 90a4a637..546cf09d 100644 --- a/src/snapshot-tests/__fixtures__/mcp/project-discovery/list-schemes--error-invalid-workspace.txt +++ b/src/snapshot-tests/__fixtures__/mcp/project-discovery/list-schemes--error-invalid-workspace.txt @@ -1,8 +1,6 @@ 🔍 List Schemes - Workspace: /nonexistent/path/Fake.xcworkspace - Errors (1): ✗ '/nonexistent/path/Fake.xcworkspace' does not exist. diff --git a/src/snapshot-tests/__fixtures__/mcp/project-discovery/list-schemes--success.txt b/src/snapshot-tests/__fixtures__/mcp/project-discovery/list-schemes--success.txt index c5240453..0c1dd2b2 100644 --- a/src/snapshot-tests/__fixtures__/mcp/project-discovery/list-schemes--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/project-discovery/list-schemes--success.txt @@ -1,8 +1,6 @@ 🔍 List Schemes - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - ✅ Found 2 schemes Schemes: diff --git a/src/snapshot-tests/__fixtures__/mcp/project-discovery/show-build-settings--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/mcp/project-discovery/show-build-settings--error-wrong-scheme.txt index 4ca56370..09c666b3 100644 --- a/src/snapshot-tests/__fixtures__/mcp/project-discovery/show-build-settings--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/mcp/project-discovery/show-build-settings--error-wrong-scheme.txt @@ -1,9 +1,6 @@ 🔍 Show Build Settings - Scheme: NONEXISTENT - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Errors (1): ✗ The workspace named "CalculatorApp" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the workspace. diff --git a/src/snapshot-tests/__fixtures__/mcp/project-discovery/show-build-settings--success.txt b/src/snapshot-tests/__fixtures__/mcp/project-discovery/show-build-settings--success.txt index 2ad674a3..13d5cb6b 100644 --- a/src/snapshot-tests/__fixtures__/mcp/project-discovery/show-build-settings--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/project-discovery/show-build-settings--success.txt @@ -1,9 +1,6 @@ 🔍 Show Build Settings - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - ✅ Build settings retrieved Settings diff --git a/src/snapshot-tests/__fixtures__/mcp/project-scaffolding/scaffold-ios--error-existing.txt b/src/snapshot-tests/__fixtures__/mcp/project-scaffolding/scaffold-ios--error-existing.txt index a7ac832b..514c3c6d 100644 --- a/src/snapshot-tests/__fixtures__/mcp/project-scaffolding/scaffold-ios--error-existing.txt +++ b/src/snapshot-tests/__fixtures__/mcp/project-scaffolding/scaffold-ios--error-existing.txt @@ -1,10 +1,6 @@ 📝 Scaffold iOS Project - Name: SnapshotTestApp - Path: /ios-existing - Platform: iOS - Errors (1): ✗ Xcode project files already exist in /ios-existing diff --git a/src/snapshot-tests/__fixtures__/mcp/project-scaffolding/scaffold-ios--success.txt b/src/snapshot-tests/__fixtures__/mcp/project-scaffolding/scaffold-ios--success.txt index d705138b..29ac1a0a 100644 --- a/src/snapshot-tests/__fixtures__/mcp/project-scaffolding/scaffold-ios--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/project-scaffolding/scaffold-ios--success.txt @@ -1,10 +1,6 @@ 📝 Scaffold iOS Project - Name: SnapshotTestApp - Path: /ios - Platform: iOS - ✅ Project scaffolded successfully └ /ios diff --git a/src/snapshot-tests/__fixtures__/mcp/project-scaffolding/scaffold-macos--error-existing.txt b/src/snapshot-tests/__fixtures__/mcp/project-scaffolding/scaffold-macos--error-existing.txt index 6811a1b9..1bf0b9a5 100644 --- a/src/snapshot-tests/__fixtures__/mcp/project-scaffolding/scaffold-macos--error-existing.txt +++ b/src/snapshot-tests/__fixtures__/mcp/project-scaffolding/scaffold-macos--error-existing.txt @@ -1,10 +1,6 @@ 📝 Scaffold macOS Project - Name: SnapshotTestMacApp - Path: /macos-existing - Platform: macOS - Errors (1): ✗ Xcode project files already exist in /macos-existing diff --git a/src/snapshot-tests/__fixtures__/mcp/project-scaffolding/scaffold-macos--success.txt b/src/snapshot-tests/__fixtures__/mcp/project-scaffolding/scaffold-macos--success.txt index 087c46f0..101a5526 100644 --- a/src/snapshot-tests/__fixtures__/mcp/project-scaffolding/scaffold-macos--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/project-scaffolding/scaffold-macos--success.txt @@ -1,10 +1,6 @@ 📝 Scaffold macOS Project - Name: SnapshotTestMacApp - Path: /macos - Platform: macOS - ✅ Project scaffolded successfully └ /macos diff --git a/src/snapshot-tests/__fixtures__/mcp/resources/doctor--success.txt b/src/snapshot-tests/__fixtures__/mcp/resources/doctor--success.txt index f999f376..9ee4bd2b 100644 --- a/src/snapshot-tests/__fixtures__/mcp/resources/doctor--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/resources/doctor--success.txt @@ -36,6 +36,7 @@ Process Tree (ppid ): (ppid ): (ppid ): + (ppid ): Xcode Information version: diff --git a/src/snapshot-tests/__fixtures__/mcp/session-management/session-clear-defaults--success.txt b/src/snapshot-tests/__fixtures__/mcp/session-management/session-clear-defaults--success.txt index 7e2331d6..a2893fda 100644 --- a/src/snapshot-tests/__fixtures__/mcp/session-management/session-clear-defaults--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/session-management/session-clear-defaults--success.txt @@ -1,6 +1,4 @@ ⚙️ Clear Defaults - Profile: (default) - ✅ Session defaults cleared (default profile) diff --git a/src/snapshot-tests/__fixtures__/mcp/session-management/session-set-defaults--scheme.txt b/src/snapshot-tests/__fixtures__/mcp/session-management/session-set-defaults--scheme.txt index 947ea431..7b2d2166 100644 --- a/src/snapshot-tests/__fixtures__/mcp/session-management/session-set-defaults--scheme.txt +++ b/src/snapshot-tests/__fixtures__/mcp/session-management/session-set-defaults--scheme.txt @@ -1,9 +1,6 @@ ⚙️ Set Defaults - Scheme: CalculatorApp - Profile: (default) - ✅ Session defaults updated (default profile) ├ projectPath: (not set) ├ workspacePath: (not set) diff --git a/src/snapshot-tests/__fixtures__/mcp/session-management/session-set-defaults--success.txt b/src/snapshot-tests/__fixtures__/mcp/session-management/session-set-defaults--success.txt index 773d40cd..51c8b54b 100644 --- a/src/snapshot-tests/__fixtures__/mcp/session-management/session-set-defaults--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/session-management/session-set-defaults--success.txt @@ -1,10 +1,6 @@ ⚙️ Set Defaults - Workspace Path: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Scheme: CalculatorApp - Profile: (default) - ✅ Session defaults updated (default profile) ├ projectPath: (not set) ├ workspacePath: example_projects/iOS_Calculator/CalculatorApp.xcworkspace diff --git a/src/snapshot-tests/__fixtures__/mcp/session-management/session-use-defaults-profile--success.txt b/src/snapshot-tests/__fixtures__/mcp/session-management/session-use-defaults-profile--success.txt index 099bd99f..7e9e35c2 100644 --- a/src/snapshot-tests/__fixtures__/mcp/session-management/session-use-defaults-profile--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/session-management/session-use-defaults-profile--success.txt @@ -1,6 +1,4 @@ ⚙️ Use Defaults Profile - Current profile: (default) - ✅ Activated profile (MyCustomProfile profile) diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator-management/boot--error-invalid-id.txt b/src/snapshot-tests/__fixtures__/mcp/simulator-management/boot--error-invalid-id.txt index 0e7ff8ed..201c2470 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator-management/boot--error-invalid-id.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator-management/boot--error-invalid-id.txt @@ -1,8 +1,6 @@ 📱 Boot Simulator - Simulator: - Errors (1): ✗ Invalid device or device pair: diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator-management/boot--success.txt b/src/snapshot-tests/__fixtures__/mcp/simulator-management/boot--success.txt index db86c72c..2332e392 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator-management/boot--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator-management/boot--success.txt @@ -1,8 +1,6 @@ 📱 Boot Simulator - Simulator: - ✅ Simulator booted successfully Next steps: diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator-management/erase--error-invalid-id.txt b/src/snapshot-tests/__fixtures__/mcp/simulator-management/erase--error-invalid-id.txt index 4305c386..0c67f775 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator-management/erase--error-invalid-id.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator-management/erase--error-invalid-id.txt @@ -1,8 +1,6 @@ 🗑 Erase Simulator - Simulator: - Errors (1): ✗ Invalid device: diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator-management/erase--success.txt b/src/snapshot-tests/__fixtures__/mcp/simulator-management/erase--success.txt index f8055402..ab201bb5 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator-management/erase--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator-management/erase--success.txt @@ -1,6 +1,4 @@ 🗑 Erase Simulator - Simulator: - ✅ Simulators were erased successfully diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator-management/reset-location--error-invalid-simulator.txt b/src/snapshot-tests/__fixtures__/mcp/simulator-management/reset-location--error-invalid-simulator.txt index ab5eac84..8611b2d8 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator-management/reset-location--error-invalid-simulator.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator-management/reset-location--error-invalid-simulator.txt @@ -1,8 +1,6 @@ 📍 Reset Location - Simulator: - Errors (1): ✗ Invalid device: diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator-management/reset-location--success.txt b/src/snapshot-tests/__fixtures__/mcp/simulator-management/reset-location--success.txt index 0626956e..1ac0a86c 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator-management/reset-location--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator-management/reset-location--success.txt @@ -1,6 +1,4 @@ 📍 Reset Location - Simulator: - ✅ Location successfully reset to default diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator-management/set-appearance--error-invalid-simulator.txt b/src/snapshot-tests/__fixtures__/mcp/simulator-management/set-appearance--error-invalid-simulator.txt index decd97e6..0d4b6b1c 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator-management/set-appearance--error-invalid-simulator.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator-management/set-appearance--error-invalid-simulator.txt @@ -1,9 +1,6 @@ 🎨 Set Appearance - Simulator: - Mode: dark - Errors (1): ✗ Invalid device: diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator-management/set-appearance--success.txt b/src/snapshot-tests/__fixtures__/mcp/simulator-management/set-appearance--success.txt index bd3a256c..ccacaed4 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator-management/set-appearance--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator-management/set-appearance--success.txt @@ -1,7 +1,4 @@ 🎨 Set Appearance - Simulator: - Mode: dark - ✅ Appearance successfully set to dark mode diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator-management/set-location--error-invalid-simulator.txt b/src/snapshot-tests/__fixtures__/mcp/simulator-management/set-location--error-invalid-simulator.txt index ba9f902a..d45259c6 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator-management/set-location--error-invalid-simulator.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator-management/set-location--error-invalid-simulator.txt @@ -1,9 +1,6 @@ 📍 Set Location - Simulator: - Coordinates: 37.7749,-122.4194 - Errors (1): ✗ Invalid device: diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator-management/set-location--success.txt b/src/snapshot-tests/__fixtures__/mcp/simulator-management/set-location--success.txt index 783dc9f2..1155fee3 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator-management/set-location--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator-management/set-location--success.txt @@ -1,7 +1,4 @@ 📍 Set Location - Simulator: - Coordinates: 37.7749,-122.4194 - ✅ Location set successfully diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator-management/statusbar--error-invalid-simulator.txt b/src/snapshot-tests/__fixtures__/mcp/simulator-management/statusbar--error-invalid-simulator.txt index ef32ae2b..0946af0c 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator-management/statusbar--error-invalid-simulator.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator-management/statusbar--error-invalid-simulator.txt @@ -1,9 +1,6 @@ 📱 Statusbar - Simulator: - Data Network: wifi - Errors (1): ✗ Invalid device: diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator-management/statusbar--success.txt b/src/snapshot-tests/__fixtures__/mcp/simulator-management/statusbar--success.txt index 3d93eeaf..c2b9efdf 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator-management/statusbar--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator-management/statusbar--success.txt @@ -1,7 +1,4 @@ 📱 Statusbar - Simulator: - Data Network: wifi - ✅ Status bar data network set successfully diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator-management/toggle-connect-hardware-keyboard--error-invalid-simulator.txt b/src/snapshot-tests/__fixtures__/mcp/simulator-management/toggle-connect-hardware-keyboard--error-invalid-simulator.txt index 7f385d3f..3f112bc7 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator-management/toggle-connect-hardware-keyboard--error-invalid-simulator.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator-management/toggle-connect-hardware-keyboard--error-invalid-simulator.txt @@ -1,8 +1,6 @@ ⚙️ Toggle Connect Hardware Keyboard - Simulator: - Errors (1): ✗ Simulator not found. Use list_sims to see available simulators. diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator-management/toggle-connect-hardware-keyboard--success.txt b/src/snapshot-tests/__fixtures__/mcp/simulator-management/toggle-connect-hardware-keyboard--success.txt index 90e09c78..66b07240 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator-management/toggle-connect-hardware-keyboard--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator-management/toggle-connect-hardware-keyboard--success.txt @@ -1,6 +1,4 @@ ⚙️ Toggle Connect Hardware Keyboard - Simulator: - ✅ Sent Connect Hardware Keyboard (Cmd+Shift+K) diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator-management/toggle-software-keyboard--error-invalid-simulator.txt b/src/snapshot-tests/__fixtures__/mcp/simulator-management/toggle-software-keyboard--error-invalid-simulator.txt index f57b7d9b..7ec5db79 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator-management/toggle-software-keyboard--error-invalid-simulator.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator-management/toggle-software-keyboard--error-invalid-simulator.txt @@ -1,8 +1,6 @@ ⚙️ Toggle Software Keyboard - Simulator: - Errors (1): ✗ Simulator not found. Use list_sims to see available simulators. diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator-management/toggle-software-keyboard--success.txt b/src/snapshot-tests/__fixtures__/mcp/simulator-management/toggle-software-keyboard--success.txt index 4d511834..d7605a03 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator-management/toggle-software-keyboard--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator-management/toggle-software-keyboard--success.txt @@ -1,6 +1,4 @@ ⚙️ Toggle Software Keyboard - Simulator: - ✅ Sent Toggle Software Keyboard (Cmd+K) diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/build--error-compiler.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/build--error-compiler.txt index de3c6c2a..e94f9f3a 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/build--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/build--error-compiler.txt @@ -1,17 +1,11 @@ 🔨 Build - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS Simulator - Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - Errors (1): ✗ cannot convert value of type 'String' to specified type 'Int' /example_projects/iOS_Calculator/CalculatorApp/CalculatorApp.swift:33 ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/build--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/build--error-wrong-scheme.txt index a1380d8e..2bf85ad0 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/build--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/build--error-wrong-scheme.txt @@ -1,16 +1,10 @@ 🔨 Build - Scheme: NONEXISTENT - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS Simulator - Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - Errors (1): ✗ The workspace named "CalculatorApp" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the workspace. ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/build--success.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/build--success.txt index ab64c799..cb5804c0 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/build--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/build--success.txt @@ -1,15 +1,9 @@ 🔨 Build - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS Simulator - Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - ✅ Build succeeded. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_sim__pid.log — Build Logs Next steps: 1. Get built app path in simulator derived data: get_sim_app_path({ simulatorName: "iPhone 17", scheme: "CalculatorApp", platform: "iOS Simulator" }) diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/build-and-run--error-compiler.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/build-and-run--error-compiler.txt index 147e596e..3dcc58bd 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/build-and-run--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/build-and-run--error-compiler.txt @@ -1,17 +1,11 @@ 🚀 Build & Run - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS Simulator - Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - Errors (1): ✗ cannot convert value of type 'String' to specified type 'Int' /example_projects/iOS_Calculator/CalculatorApp/CalculatorApp.swift:33 ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_sim__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_sim__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/build-and-run--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/build-and-run--error-wrong-scheme.txt index 79876668..e0d2be21 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/build-and-run--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/build-and-run--error-wrong-scheme.txt @@ -1,16 +1,10 @@ 🚀 Build & Run - Scheme: NONEXISTENT - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS Simulator - Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - Errors (1): ✗ The workspace named "CalculatorApp" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the workspace. ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_sim__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_sim__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/build-and-run--success.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/build-and-run--success.txt index d88d37c4..354429bd 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/build-and-run--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/build-and-run--success.txt @@ -1,13 +1,6 @@ 🚀 Build & Run - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS Simulator - Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - ℹ️ Resolving app path ✅ Resolving app path ℹ️ Booting simulator @@ -18,12 +11,15 @@ ✅ Build succeeded. (⏱️ ) ✅ Build & Run complete - ├ App Path: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app ├ Bundle ID: io.sentry.calculatorapp ├ Process ID: - ├ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_sim__pid.log - ├ Runtime Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp__pid.log - └ OSLog: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp_oslog__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/ + ├── DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app — App Path + └── logs/ + ├── build_run_sim__pid.log — Build Logs + ├── io.sentry.calculatorapp__pid.log — Runtime Logs + └── io.sentry.calculatorapp_oslog__pid.log — OSLog Next steps: 1. Stop app in simulator: stop_app_sim({ simulatorId: "", bundleId: "io.sentry.calculatorapp" }) diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/get-app-path--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/get-app-path--error-wrong-scheme.txt index 4ccab053..e29930da 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/get-app-path--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/get-app-path--error-wrong-scheme.txt @@ -1,12 +1,6 @@ 🔍 Get App Path - Scheme: NONEXISTENT - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS Simulator - Simulator: iPhone 17 - Errors (1): ✗ The workspace named "CalculatorApp" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the workspace. diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/get-app-path--success.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/get-app-path--success.txt index 1478122f..7efb25cf 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/get-app-path--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/get-app-path--success.txt @@ -1,17 +1,12 @@ 🔍 Get App Path - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS Simulator - Simulator: iPhone 17 - ✅ Get app path successful (⏱️ ) - └ App Path: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app — App Path Next steps: -1. Get bundle ID: get_app_bundle_id({ appPath: "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app" }) +1. Get bundle ID: get_app_bundle_id({ appPath: "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app" }) 2. Boot simulator: boot_sim({ simulatorId: "SIMULATOR_UUID" }) -3. Install app: install_app_sim({ simulatorId: "SIMULATOR_UUID", appPath: "/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app" }) +3. Install app: install_app_sim({ simulatorId: "SIMULATOR_UUID", appPath: "~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app" }) 4. Launch app: launch_app_sim({ simulatorId: "SIMULATOR_UUID", bundleId: "BUNDLE_ID" }) diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/install--error-invalid-app.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/install--error-invalid-app.txt index 15b9f3db..73fd1b14 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/install--error-invalid-app.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/install--error-invalid-app.txt @@ -1,9 +1,6 @@ 📦 Install App - Simulator: - App Path: /NotAnApp.app - Errors (1): ✗ An error was encountered processing the command (domain=IXErrorDomain, code=13): diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/install--success.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/install--success.txt index 52806565..27371057 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/install--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/install--success.txt @@ -1,9 +1,6 @@ 📦 Install App - Simulator: - App Path: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-/Build/Products/Debug-iphonesimulator/CalculatorApp.app - ✅ App installed successfully Next steps: diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/launch-app--error-not-installed.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/launch-app--error-not-installed.txt index 1ef69e2d..95797f20 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/launch-app--error-not-installed.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/launch-app--error-not-installed.txt @@ -1,9 +1,6 @@ 🚀 Launch App - Simulator: - Bundle ID: com.nonexistent.app - Errors (1): ✗ App is not installed on the simulator. Please use install_app_sim before launching. Workflow: build -> install -> launch. diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/launch-app--success.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/launch-app--success.txt index d87bbccb..03062aab 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/launch-app--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/launch-app--success.txt @@ -1,13 +1,12 @@ 🚀 Launch App - Simulator: - Bundle ID: io.sentry.calculatorapp - ✅ App launched successfully ├ Process ID: - ├ Runtime Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp__pid.log - └ OSLog: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/io.sentry.calculatorapp_oslog__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/ + ├── io.sentry.calculatorapp__pid.log — Runtime Logs + └── io.sentry.calculatorapp_oslog__pid.log — OSLog Next steps: 1. Open Simulator app to see it: open_sim() diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/screenshot--error-invalid-simulator.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/screenshot--error-invalid-simulator.txt index 9176afa7..836a0f67 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/screenshot--error-invalid-simulator.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/screenshot--error-invalid-simulator.txt @@ -1,8 +1,6 @@ 📷 Screenshot - Simulator: - Errors (1): ✗ Failed to capture screenshot: Invalid device: diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/screenshot--success.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/screenshot--success.txt index 4a990b95..ddceb358 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/screenshot--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/screenshot--success.txt @@ -1,9 +1,8 @@ 📷 Screenshot - Simulator: - ✅ Screenshot captured - ├ Screenshot: ├ Format: image/jpeg - └ Size: 368x800px + ├ Size: 368x800px + └ Files: + └── — Screenshot diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/stop--error-no-app.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/stop--error-no-app.txt index 39dfa450..f99cf8b7 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/stop--error-no-app.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/stop--error-no-app.txt @@ -1,9 +1,6 @@ 🛑 Stop App - Simulator: - Bundle ID: com.nonexistent.app - Errors (1): ✗ An error was encountered processing the command (domain=NSPOSIXErrorDomain, code=3): diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/stop--success.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/stop--success.txt index 855e0888..46f6293d 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/stop--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/stop--success.txt @@ -1,7 +1,4 @@ 🛑 Stop App - Simulator: - Bundle ID: io.sentry.calculatorapp - ✅ App stopped successfully diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/test--error-compiler.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/test--error-compiler.txt index 5eaa7aa3..a9d7a15e 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/test--error-compiler.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/test--error-compiler.txt @@ -1,15 +1,6 @@ 🧪 Test - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS Simulator - Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - Selective Testing: - CalculatorAppTests/CalculatorAppTests/testAddition - Discovered 1 test(s): CalculatorAppTests/CalculatorAppTests/testAddition @@ -19,4 +10,5 @@ Errors (1): /example_projects/iOS_Calculator/CalculatorApp/CalculatorApp.swift:33 ❌ Test failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/test--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/test--error-wrong-scheme.txt index 50e49847..4359a443 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/test--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/test--error-wrong-scheme.txt @@ -1,16 +1,10 @@ 🧪 Test - Scheme: NONEXISTENT - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS Simulator - Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - Errors (1): ✗ The workspace named "CalculatorApp" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the workspace. ❌ Test failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/test--failure.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/test--failure.txt index f74680d2..6edf231d 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/test--failure.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/test--failure.txt @@ -1,13 +1,6 @@ 🧪 Test - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS Simulator - Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - Discovered 57 test(s): CalculatorAppFeatureTests/CalculatorBasicTests/testClear CalculatorAppFeatureTests/CalculatorBasicTests/testInitialState @@ -31,5 +24,7 @@ Test Failures (3): /example_projects/iOS_Calculator/CalculatorAppTests/CalculatorAppTests.swift:286 ❌ tests failed, passed, skipped (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_sim__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/ + ├── logs/test_sim__pid.log — Build Logs + └── result-bundles/test_sim__pid.xcresult — Result Bundle diff --git a/src/snapshot-tests/__fixtures__/mcp/simulator/test--success.txt b/src/snapshot-tests/__fixtures__/mcp/simulator/test--success.txt index 8db8f9c8..d32b486b 100644 --- a/src/snapshot-tests/__fixtures__/mcp/simulator/test--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/simulator/test--success.txt @@ -1,18 +1,11 @@ 🧪 Test - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS Simulator - Simulator: iPhone 17 - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp- - Selective Testing: - CalculatorAppTests/CalculatorAppTests/testAddition - Discovered 1 test(s): CalculatorAppTests/CalculatorAppTests/testAddition ✅ 1 test passed, 0 failed, 0 skipped (⏱️ ) - ├ Result Bundle: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/result-bundles/test_sim__pid.xcresult - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/test_sim__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/ + ├── logs/test_sim__pid.log — Build Logs + └── result-bundles/test_sim__pid.xcresult — Result Bundle diff --git a/src/snapshot-tests/__fixtures__/mcp/swift-package/build--error-bad-path.txt b/src/snapshot-tests/__fixtures__/mcp/swift-package/build--error-bad-path.txt index 1e8b416e..466e7b1a 100644 --- a/src/snapshot-tests/__fixtures__/mcp/swift-package/build--error-bad-path.txt +++ b/src/snapshot-tests/__fixtures__/mcp/swift-package/build--error-bad-path.txt @@ -1,11 +1,10 @@ 📦 Swift Package Build - Package: /example_projects/NONEXISTENT - Errors (1): ✗ chdir error: No such file or directory (2): /example_projects/NONEXISTENT ❌ Build failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_spm__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_spm__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/swift-package/build--success.txt b/src/snapshot-tests/__fixtures__/mcp/swift-package/build--success.txt index eb8eee4e..63071b99 100644 --- a/src/snapshot-tests/__fixtures__/mcp/swift-package/build--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/swift-package/build--success.txt @@ -1,7 +1,6 @@ 📦 Swift Package Build - Package: /example_projects/spm - ✅ Build succeeded. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_spm__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_spm__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/swift-package/clean--error-bad-path.txt b/src/snapshot-tests/__fixtures__/mcp/swift-package/clean--error-bad-path.txt index cb4abdeb..0363983e 100644 --- a/src/snapshot-tests/__fixtures__/mcp/swift-package/clean--error-bad-path.txt +++ b/src/snapshot-tests/__fixtures__/mcp/swift-package/clean--error-bad-path.txt @@ -1,8 +1,6 @@ 🧹 Swift Package Clean - Package: /example_projects/NONEXISTENT - Errors (1): ✗ chdir error: No such file or directory (2): /example_projects/NONEXISTENT diff --git a/src/snapshot-tests/__fixtures__/mcp/swift-package/clean--success.txt b/src/snapshot-tests/__fixtures__/mcp/swift-package/clean--success.txt index a0e316a0..c5fc476e 100644 --- a/src/snapshot-tests/__fixtures__/mcp/swift-package/clean--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/swift-package/clean--success.txt @@ -1,6 +1,4 @@ 🧹 Swift Package Clean - Package: /example_projects/spm - ✅ Swift package cleaned successfully diff --git a/src/snapshot-tests/__fixtures__/mcp/swift-package/run--error-bad-executable.txt b/src/snapshot-tests/__fixtures__/mcp/swift-package/run--error-bad-executable.txt index 04928338..73fa3f57 100644 --- a/src/snapshot-tests/__fixtures__/mcp/swift-package/run--error-bad-executable.txt +++ b/src/snapshot-tests/__fixtures__/mcp/swift-package/run--error-bad-executable.txt @@ -1,9 +1,6 @@ 🚀 Swift Package Run - Package: /example_projects/spm - Executable: nonexistent-executable - Errors (1): ✗ no executable product named 'nonexistent-executable' diff --git a/src/snapshot-tests/__fixtures__/mcp/swift-package/run--success.txt b/src/snapshot-tests/__fixtures__/mcp/swift-package/run--success.txt index 5b6b35fd..1d5912b3 100644 --- a/src/snapshot-tests/__fixtures__/mcp/swift-package/run--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/swift-package/run--success.txt @@ -1,14 +1,12 @@ 🚀 Swift Package Run - Package: /example_projects/spm - Executable: spm - ✅ Build succeeded. (⏱️ ) ✅ Build & Run complete - ├ App Path: example_projects/spm/.build/arm64-apple-macosx/debug/spm ├ Process ID: - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_spm__pid.log + └ Files: + ├── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build_run_spm__pid.log — Build Logs + └── example_projects/spm/.build/arm64-apple-macosx/debug/spm — App Path Output Hello, world! diff --git a/src/snapshot-tests/__fixtures__/mcp/swift-package/stop--error-no-process.txt b/src/snapshot-tests/__fixtures__/mcp/swift-package/stop--error-no-process.txt index 4266d3c4..8854f712 100644 --- a/src/snapshot-tests/__fixtures__/mcp/swift-package/stop--error-no-process.txt +++ b/src/snapshot-tests/__fixtures__/mcp/swift-package/stop--error-no-process.txt @@ -1,8 +1,6 @@ 🛑 Swift Package Stop - PID: - Errors (1): ✗ No running process found with PID 999999. Use swift_package_list to check active processes. diff --git a/src/snapshot-tests/__fixtures__/mcp/swift-package/test--error-bad-path.txt b/src/snapshot-tests/__fixtures__/mcp/swift-package/test--error-bad-path.txt index 639bf732..2d2fe308 100644 --- a/src/snapshot-tests/__fixtures__/mcp/swift-package/test--error-bad-path.txt +++ b/src/snapshot-tests/__fixtures__/mcp/swift-package/test--error-bad-path.txt @@ -1,14 +1,10 @@ 🧪 Swift Package Test - Scheme: NONEXISTENT - Configuration: debug - Platform: Swift Package - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData - Errors (1): ✗ chdir error: No such file or directory (2): /example_projects/NONEXISTENT ❌ Test failed. (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/swift-package/test--failure.txt b/src/snapshot-tests/__fixtures__/mcp/swift-package/test--failure.txt index ece0337a..821bb760 100644 --- a/src/snapshot-tests/__fixtures__/mcp/swift-package/test--failure.txt +++ b/src/snapshot-tests/__fixtures__/mcp/swift-package/test--failure.txt @@ -1,11 +1,6 @@ 🧪 Swift Package Test - Scheme: spm - Configuration: debug - Platform: Swift Package - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData - Test Failures (2): ✗ CalculatorAppTests / testCalculatorServiceFailure: XCTAssertEqual failed: ("0") is not equal to ("999") - This test should fail - display should be 0, not 999 @@ -16,4 +11,5 @@ Test Failures (2): SimpleTests.swift:57 ❌ tests failed, passed, skipped (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/swift-package/test--success.txt b/src/snapshot-tests/__fixtures__/mcp/swift-package/test--success.txt index 8db02e9b..fb8934ae 100644 --- a/src/snapshot-tests/__fixtures__/mcp/swift-package/test--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/swift-package/test--success.txt @@ -1,10 +1,6 @@ 🧪 Swift Package Test - Scheme: spm - Configuration: debug - Platform: Swift Package - Derived Data: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData - ✅ 1 test passed, 0 failed, 0 skipped (⏱️ ) - └ Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/swift_package_test__pid.log — Build Logs diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/button--error-no-simulator.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/button--error-no-simulator.txt index a1e44533..adaecbac 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/button--error-no-simulator.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/button--error-no-simulator.txt @@ -1,8 +1,6 @@ 👆 Button - Simulator: - Errors (1): ✗ CLIError(errorDescription: "Simulator with UDID not found in set.") diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/button--success.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/button--success.txt index 58a78296..18de11b0 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/button--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/button--success.txt @@ -1,6 +1,4 @@ 👆 Button - Simulator: - ✅ Hardware button 'home' pressed successfully. diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/gesture--error-no-simulator.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/gesture--error-no-simulator.txt index 57682ba4..42fc4b4e 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/gesture--error-no-simulator.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/gesture--error-no-simulator.txt @@ -1,8 +1,6 @@ 👆 Gesture - Simulator: - Errors (1): ✗ CLIError(errorDescription: "Simulator with UDID not found in set.") diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/gesture--success.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/gesture--success.txt index f7cbf673..c693a2f5 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/gesture--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/gesture--success.txt @@ -1,6 +1,4 @@ 👆 Gesture - Simulator: - ✅ Gesture 'scroll-down' executed successfully. diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/key-press--error-no-simulator.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/key-press--error-no-simulator.txt index e84fc470..8669a176 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/key-press--error-no-simulator.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/key-press--error-no-simulator.txt @@ -1,8 +1,6 @@ ⌨️ Key Press - Simulator: - Errors (1): ✗ CLIError(errorDescription: "Simulator with UDID not found in set.") diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/key-press--success.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/key-press--success.txt index c687f6b6..c886800b 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/key-press--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/key-press--success.txt @@ -1,6 +1,4 @@ ⌨️ Key Press - Simulator: - ✅ Key press (code: 4) simulated successfully. diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/key-sequence--error-no-simulator.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/key-sequence--error-no-simulator.txt index 899891ce..a837a030 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/key-sequence--error-no-simulator.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/key-sequence--error-no-simulator.txt @@ -1,8 +1,6 @@ ⌨️ Key Sequence - Simulator: - Errors (1): ✗ CLIError(errorDescription: "Simulator with UDID not found in set.") diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/key-sequence--success.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/key-sequence--success.txt index 6950454c..6faf0424 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/key-sequence--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/key-sequence--success.txt @@ -1,6 +1,4 @@ ⌨️ Key Sequence - Simulator: - ✅ Key sequence [4,5,6] executed successfully. diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/long-press--error-no-simulator.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/long-press--error-no-simulator.txt index b04be39a..10acee62 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/long-press--error-no-simulator.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/long-press--error-no-simulator.txt @@ -1,8 +1,6 @@ 👆 Long Press - Simulator: - Errors (1): ✗ CLIError(errorDescription: "Simulator with UDID not found in set.") diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/long-press--success.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/long-press--success.txt index 678f0413..faeec835 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/long-press--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/long-press--success.txt @@ -1,8 +1,6 @@ 👆 Long Press - Simulator: - Warnings (1): ⚠ snapshot_ui has not been called yet. Consider using snapshot_ui for precise coordinates instead of guessing from screenshots. diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/snapshot-ui--error-no-simulator.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/snapshot-ui--error-no-simulator.txt index 419ba477..30268b61 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/snapshot-ui--error-no-simulator.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/snapshot-ui--error-no-simulator.txt @@ -1,8 +1,6 @@ 📷 Snapshot UI - Simulator: - Errors (1): ✗ CLIError(errorDescription: "Simulator with UDID not found in set.") diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/snapshot-ui--success.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/snapshot-ui--success.txt index 20414819..5766d272 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/snapshot-ui--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/snapshot-ui--success.txt @@ -1,8 +1,6 @@ 📷 Snapshot UI - Simulator: - Accessibility Hierarchy ```json [ diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/swipe--error-no-simulator.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/swipe--error-no-simulator.txt index 4716920b..05a6c960 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/swipe--error-no-simulator.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/swipe--error-no-simulator.txt @@ -1,8 +1,6 @@ 👆 Swipe - Simulator: - Errors (1): ✗ CLIError(errorDescription: "Simulator with UDID not found in set.") diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/swipe--success.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/swipe--success.txt index f78015c1..9b5ca837 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/swipe--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/swipe--success.txt @@ -1,8 +1,6 @@ 👆 Swipe - Simulator: - Warnings (1): ⚠ snapshot_ui has not been called yet. Consider using snapshot_ui for precise coordinates instead of guessing from screenshots. diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/tap--error-no-simulator.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/tap--error-no-simulator.txt index d45f020a..3aa5515f 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/tap--error-no-simulator.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/tap--error-no-simulator.txt @@ -1,8 +1,6 @@ 👆 Tap - Simulator: - Errors (1): ✗ CLIError(errorDescription: "Simulator with UDID not found in set.") diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/tap--success.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/tap--success.txt index d4a41a58..6c3da0d5 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/tap--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/tap--success.txt @@ -1,8 +1,6 @@ 👆 Tap - Simulator: - Warnings (1): ⚠ snapshot_ui has not been called yet. Consider using snapshot_ui for precise coordinates instead of guessing from screenshots. diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/touch--error-no-simulator.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/touch--error-no-simulator.txt index 751d9f3f..ad4778d4 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/touch--error-no-simulator.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/touch--error-no-simulator.txt @@ -1,8 +1,6 @@ 👆 Touch - Simulator: - Errors (1): ✗ CLIError(errorDescription: "Simulator with UDID not found in set.") diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/touch--success.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/touch--success.txt index 5197f0e7..b9dad4d4 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/touch--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/touch--success.txt @@ -1,8 +1,6 @@ 👆 Touch - Simulator: - Warnings (1): ⚠ snapshot_ui has not been called yet. Consider using snapshot_ui for precise coordinates instead of guessing from screenshots. diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/type-text--error-no-simulator.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/type-text--error-no-simulator.txt index bba70641..40a19280 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/type-text--error-no-simulator.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/type-text--error-no-simulator.txt @@ -1,8 +1,6 @@ ⌨️ Type Text - Simulator: - Errors (1): ✗ CLIError(errorDescription: "Simulator with UDID not found in set.") diff --git a/src/snapshot-tests/__fixtures__/mcp/ui-automation/type-text--success.txt b/src/snapshot-tests/__fixtures__/mcp/ui-automation/type-text--success.txt index 72a6ac50..a3abffa9 100644 --- a/src/snapshot-tests/__fixtures__/mcp/ui-automation/type-text--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/ui-automation/type-text--success.txt @@ -1,6 +1,4 @@ ⌨️ Type Text - Simulator: - ✅ Text typing simulated successfully. diff --git a/src/snapshot-tests/__fixtures__/mcp/utilities/clean--error-wrong-scheme.txt b/src/snapshot-tests/__fixtures__/mcp/utilities/clean--error-wrong-scheme.txt index e7b605f8..80984892 100644 --- a/src/snapshot-tests/__fixtures__/mcp/utilities/clean--error-wrong-scheme.txt +++ b/src/snapshot-tests/__fixtures__/mcp/utilities/clean--error-wrong-scheme.txt @@ -1,11 +1,6 @@ 🧹 Clean - Scheme: NONEXISTENT - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS - Errors (1): ✗ xcodebuild: error: The workspace named "CalculatorApp" does not contain a scheme named "NONEXISTENT". The "-list" option can be used to find the names of the schemes in the workspace. diff --git a/src/snapshot-tests/__fixtures__/mcp/utilities/clean--success.txt b/src/snapshot-tests/__fixtures__/mcp/utilities/clean--success.txt index 3e0c7025..a77cc783 100644 --- a/src/snapshot-tests/__fixtures__/mcp/utilities/clean--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/utilities/clean--success.txt @@ -1,9 +1,4 @@ 🧹 Clean - Scheme: CalculatorApp - Workspace: example_projects/iOS_Calculator/CalculatorApp.xcworkspace - Configuration: Debug - Platform: iOS - ✅ Clean successful diff --git a/src/snapshot-tests/__fixtures__/mcp/xcode-ide/documentation-search--success.txt b/src/snapshot-tests/__fixtures__/mcp/xcode-ide/documentation-search--success.txt index e78b2f4c..9d250db0 100644 --- a/src/snapshot-tests/__fixtures__/mcp/xcode-ide/documentation-search--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/xcode-ide/documentation-search--success.txt @@ -1,7 +1,6 @@ 🔧 Xcode IDE Call Tool - Remote Tool: DocumentationSearch - ✅ Tool "DocumentationSearch" completed successfully. Raw response saved to artifact. - └ Raw Response JSON: + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/state/xcode-ide/call-tool/ownerpid_/-DocumentationSearch-.json — Raw Response JSON diff --git a/src/snapshot-tests/__fixtures__/mcp/xcode-ide/list-tools--success.txt b/src/snapshot-tests/__fixtures__/mcp/xcode-ide/list-tools--success.txt index 80a36abb..07186230 100644 --- a/src/snapshot-tests/__fixtures__/mcp/xcode-ide/list-tools--success.txt +++ b/src/snapshot-tests/__fixtures__/mcp/xcode-ide/list-tools--success.txt @@ -2,4 +2,5 @@ 🔧 Xcode IDE List Tools ✅ Found tool(s). Raw response saved to artifact. - └ Raw Response JSON: + └ Files: + └── ~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/state/xcode-ide/call-tool/ownerpid_/-list-tools-.json — Raw Response JSON diff --git a/src/snapshot-tests/__tests__/normalize.test.ts b/src/snapshot-tests/__tests__/normalize.test.ts index f46bbdeb..ff2773c6 100644 --- a/src/snapshot-tests/__tests__/normalize.test.ts +++ b/src/snapshot-tests/__tests__/normalize.test.ts @@ -10,6 +10,50 @@ function progressBlock(total: number, failed: number): string { } describe('normalizeSnapshotOutput', () => { + it('preserves display-formatted home paths while normalizing workspace hashes', () => { + expect( + normalizeSnapshotOutput( + '~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-c5da0cbe19a7/logs/build.log\n', + ), + ).toBe('~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build.log\n'); + }); + + it('normalizes absolute home XcodeBuildMCP paths to ~/', () => { + expect( + normalizeSnapshotOutput( + '/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-c5da0cbe19a7/logs/build.log\n', + ), + ).toBe('~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/logs/build.log\n'); + }); + + it('normalizes workspace hash and derived data hash together', () => { + expect( + normalizeSnapshotOutput( + '~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-c5da0cbe19a7/DerivedData/CalculatorApp-7834e7689e33\n', + ), + ).toBe( + '~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData/CalculatorApp-\n', + ); + }); + + it('normalizes workspace root nodes with trailing slash', () => { + expect( + normalizeSnapshotOutput( + '~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-c5da0cbe19a7/\n', + ), + ).toBe('~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/\n'); + }); + + it('normalizes xcode-ide raw response artifact path volatility', () => { + expect( + normalizeSnapshotOutput( + '~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-c5da0cbe19a7/state/xcode-ide/call-tool/ownerpid22817_6DDCB226-377E-4F3F-93D4-3CA386249E80/2026-05-07T17-21-14-001Z-list-tools-44fa9782.json — Raw Response JSON\n', + ), + ).toBe( + '~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/state/xcode-ide/call-tool/ownerpid_/-list-tools-.json — Raw Response JSON\n', + ); + }); + it('collapses long simulator failure progress streams while preserving final counts', () => { const normalized = normalizeSnapshotOutput(`${progressBlock(42, 3)}\n`); diff --git a/src/snapshot-tests/normalize.ts b/src/snapshot-tests/normalize.ts index 9ef1894a..4630aab5 100644 --- a/src/snapshot-tests/normalize.ts +++ b/src/snapshot-tests/normalize.ts @@ -41,6 +41,12 @@ const TARGET_DEVICE_IDENTIFIER_REGEX = /(TARGET_DEVICE_IDENTIFIER = )([0-9A-Fa-f const CODEX_ARG0_PATH_REGEX = /\/\.codex\/tmp\/arg0\/codex-arg0[A-Za-z0-9]+/g; const CODEX_WORKTREE_NODE_MODULES_REGEX = /\/\.codex\/worktrees\/[^/:]+\/node_modules\/\.bin/g; +const XCODEBUILDMCP_HOME_PREFIX_REGEX = /(?=\/Library\/Developer\/XcodeBuildMCP(?:\/|$))/g; +const XCODEBUILDMCP_WORKSPACE_KEY_REGEX = + /(~\/Library\/Developer\/XcodeBuildMCP\/workspaces\/[^/\n]+)-[0-9a-f]{12}(?=\/|$)/g; +const XCODE_IDE_ARTIFACT_OWNER_PID_REGEX = /(\/state\/xcode-ide\/call-tool\/ownerpid)\d+_/g; +const XCODE_IDE_ARTIFACT_HASH_REGEX = + /(\/state\/xcode-ide\/call-tool\/[^/\n]+\/[^/\n]+-)[0-9a-f]{8}(?=\.json)/g; const ACQUIRED_USAGE_ASSERTION_TIME_REGEX = /(^\s*)\d{2}:\d{2}:\d{2}( {2}Acquired usage assertion\.)$/gm; const BUILD_SETTINGS_PATH_REGEX = /^( {6}PATH = ).+$/gm; @@ -111,8 +117,6 @@ export function normalizeSnapshotOutput(text: string): string { const home = os.homedir(); normalized = normalized.replace(new RegExp(escapeRegex(home), 'g'), ''); - normalized = normalized.replace(/~\//g, '/'); - normalized = normalized.replace(/(?<=\s|:)~(?=\s|$)/gm, ''); const username = os.userInfo().username; normalized = normalized.replace( @@ -129,17 +133,13 @@ export function normalizeSnapshotOutput(text: string): string { new RegExp(escapeRegex(tmpDir) + '/[A-Za-z0-9._-]+(?=/|[^A-Za-z0-9._/-]|$)', 'g'), '', ); + normalized = normalized.replace(XCODEBUILDMCP_HOME_PREFIX_REGEX, '~'); + normalized = normalized.replace(XCODEBUILDMCP_WORKSPACE_KEY_REGEX, '$1-'); + normalized = normalized.replace(XCODE_IDE_ARTIFACT_OWNER_PID_REGEX, '$1_'); + normalized = normalized.replace(XCODE_IDE_ARTIFACT_HASH_REGEX, '$1'); normalized = normalized.replace( - /(\/Library\/Developer\/XcodeBuildMCP\/workspaces\/[^/]+)-[0-9a-f]{12}(?=\/(?:logs|result-bundles)\/)/g, - '$1-', - ); - normalized = normalized.replace( - /(\/Library\/Developer\/XcodeBuildMCP\/workspaces\/[^/]+)-[0-9a-f]{12}\/DerivedData(?=$|[^A-Za-z0-9])/g, - '$1-/DerivedData', - ); - normalized = normalized.replace( - /(Build Logs: )(?:|\/Library\/Developer\/XcodeBuildMCP)\/logs\//g, - '$1/Library/Developer/XcodeBuildMCP/logs/', + /(Build Logs: )(?:|~\/Library\/Developer\/XcodeBuildMCP)\/logs\//g, + '$1~/Library/Developer/XcodeBuildMCP/logs/', ); normalized = normalized.replace( /Raw Response JSON: .+\/xcode-ide\/call-tool\/.+\/[A-Za-z0-9._-]+\.json/g, diff --git a/src/snapshot-tests/suites/xcode-ide-suite.ts b/src/snapshot-tests/suites/xcode-ide-suite.ts index 801f5e82..0de1bf03 100644 --- a/src/snapshot-tests/suites/xcode-ide-suite.ts +++ b/src/snapshot-tests/suites/xcode-ide-suite.ts @@ -34,8 +34,13 @@ function getArtifactPathFromEnvelope(result: SnapshotResult): string | null { } function getArtifactPathFromText(result: SnapshotResult): string | null { - const match = result.rawText.match(/Raw Response JSON:\s*(.+)$/m); - return match?.[1]?.trim() ?? null; + const flatMatch = result.rawText.match(/Raw Response JSON:\s*(.+)$/m); + if (flatMatch?.[1]) { + return flatMatch[1].trim(); + } + + const treeMatch = result.rawText.match(/^\s*[├└]──\s*(.+?)\s+—\s+Raw Response JSON$/m); + return treeMatch?.[1]?.trim() ?? null; } function resolveArtifactPath(artifactDisplayPath: string): string { diff --git a/src/utils/__tests__/config-store.test.ts b/src/utils/__tests__/config-store.test.ts index 436204a6..e0f6307b 100644 --- a/src/utils/__tests__/config-store.test.ts +++ b/src/utils/__tests__/config-store.test.ts @@ -41,6 +41,7 @@ describe('config-store', () => { expect(config.dapRequestTimeoutMs).toBe(30000); expect(config.dapLogEvents).toBe(false); expect(config.launchJsonWaitMs).toBe(8000); + expect(config.filePathRenderStyle).toBeUndefined(); }); it('parses env values when provided', async () => { @@ -54,6 +55,7 @@ describe('config-store', () => { XCODEBUILDMCP_ENABLED_WORKFLOWS: 'simulator,logging', XCODEBUILDMCP_UI_DEBUGGER_GUARD_MODE: 'warn', XCODEBUILDMCP_DEBUGGER_BACKEND: 'lldb', + XCODEBUILDMCP_FILE_PATH_RENDER_STYLE: 'list', }; await initConfigStore({ cwd, fs: createFs(), env }); @@ -68,25 +70,43 @@ describe('config-store', () => { expect(config.enabledWorkflows).toEqual(['simulator', 'logging']); expect(config.uiDebuggerGuardMode).toBe('warn'); expect(config.debuggerBackend).toBe('lldb-cli'); + expect(config.filePathRenderStyle).toBe('list'); }); it('prefers overrides over config file values and config over env', async () => { - const yaml = ['schemaVersion: 1', 'debug: false', 'dapRequestTimeoutMs: 4000', ''].join('\n'); + const yaml = [ + 'schemaVersion: 1', + 'debug: false', + 'dapRequestTimeoutMs: 4000', + 'filePathRenderStyle: tree', + '', + ].join('\n'); const env = { XCODEBUILDMCP_DEBUG: 'true', XCODEBUILDMCP_DAP_REQUEST_TIMEOUT_MS: '999', + XCODEBUILDMCP_FILE_PATH_RENDER_STYLE: 'list', }; await initConfigStore({ cwd, fs: createFs(yaml), - overrides: { debug: true, dapRequestTimeoutMs: 12345 }, + overrides: { debug: true, dapRequestTimeoutMs: 12345, filePathRenderStyle: 'list' }, env, }); const config = getConfig(); expect(config.debug).toBe(true); expect(config.dapRequestTimeoutMs).toBe(12345); + expect(config.filePathRenderStyle).toBe('list'); + }); + + it('uses filePathRenderStyle from config before env when no override is provided', async () => { + const yaml = ['schemaVersion: 1', 'filePathRenderStyle: tree', ''].join('\n'); + const env = { XCODEBUILDMCP_FILE_PATH_RENDER_STYLE: 'list' }; + + await initConfigStore({ cwd, fs: createFs(yaml), env }); + + expect(getConfig().filePathRenderStyle).toBe('tree'); }); it('reads sentryDisabled from config file', async () => { diff --git a/src/utils/__tests__/project-config.test.ts b/src/utils/__tests__/project-config.test.ts index fb2e3a57..c72483cd 100644 --- a/src/utils/__tests__/project-config.test.ts +++ b/src/utils/__tests__/project-config.test.ts @@ -97,6 +97,17 @@ describe('project-config', () => { expect(result.notices.length).toBeGreaterThan(0); }); + it('should load filePathRenderStyle from config', async () => { + const yaml = ['schemaVersion: 1', 'filePathRenderStyle: list', ''].join('\n'); + + const { fs } = createFsFixture({ exists: true, readFile: yaml }); + const result = await loadProjectConfig({ fs, cwd }); + + if (!result.found) throw new Error('expected config to be found'); + + expect(result.config.filePathRenderStyle).toBe('list'); + }); + it('should normalize debuggerBackend and resolve template paths', async () => { const yaml = [ 'schemaVersion: 1', @@ -401,6 +412,7 @@ describe('project-config', () => { enabledWorkflows: ['simulator', 'ui-automation'], debug: true, sentryDisabled: true, + filePathRenderStyle: 'list', sessionDefaults: { workspacePath: './MyApp.xcworkspace', scheme: 'MyApp', @@ -415,12 +427,14 @@ describe('project-config', () => { enabledWorkflows?: string[]; debug?: boolean; sentryDisabled?: boolean; + filePathRenderStyle?: string; sessionDefaults?: Record; }; expect(parsed.enabledWorkflows).toEqual(['simulator', 'ui-automation']); expect(parsed.debug).toBe(true); expect(parsed.sentryDisabled).toBe(true); + expect(parsed.filePathRenderStyle).toBe('list'); expect(parsed.sessionDefaults?.workspacePath).toBe('./MyApp.xcworkspace'); expect(parsed.sessionDefaults?.projectPath).toBeUndefined(); }); diff --git a/src/utils/__tests__/snapshot-normalize.test.ts b/src/utils/__tests__/snapshot-normalize.test.ts index fe1c66c2..2448d58e 100644 --- a/src/utils/__tests__/snapshot-normalize.test.ts +++ b/src/utils/__tests__/snapshot-normalize.test.ts @@ -2,21 +2,18 @@ import { describe, it, expect } from 'vitest'; import { normalizeSnapshotOutput } from '../../snapshot-tests/normalize.ts'; describe('normalizeSnapshotOutput tilde handling', () => { - it('normalizes ~/ paths to /', () => { + it('normalizes XcodeBuildMCP ~/ paths to stable workspace-key placeholders', () => { const input = 'Workspace Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/Weather-abc123def456/logs\n'; const result = normalizeSnapshotOutput(input); - expect(result).toContain( - '/Library/Developer/XcodeBuildMCP/workspaces/Weather-abc123def456/logs', - ); - expect(result).not.toContain('~/'); + expect(result).toContain('~/Library/Developer/XcodeBuildMCP/workspaces/Weather-/logs'); + expect(result).not.toContain('Weather-abc123def456'); }); - it('normalizes bare ~ (exact home directory) to ', () => { + it('preserves bare ~ outside path-like values', () => { const input = 'Home: ~\nDone\n'; const result = normalizeSnapshotOutput(input); - expect(result).toContain('Home: '); - expect(result).not.toMatch(/: ~\n/); + expect(result).toContain('Home: ~'); }); it('does not alter tildes that are part of approximate numbers', () => { @@ -53,10 +50,10 @@ describe('normalizeSnapshotOutput tilde handling', () => { const result = normalizeSnapshotOutput(input); expect(result).toContain( - 'Build Logs: /Library/Developer/XcodeBuildMCP/workspaces/Weather-/logs/build_sim__pid.log', + 'Build Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/Weather-/logs/build_sim__pid.log', ); expect(result).toContain( - 'Runtime Logs: /Library/Developer/XcodeBuildMCP/workspaces/Weather-/logs/io.app__pid.log', + 'Runtime Logs: ~/Library/Developer/XcodeBuildMCP/workspaces/Weather-/logs/io.app__pid.log', ); }); @@ -67,7 +64,7 @@ describe('normalizeSnapshotOutput tilde handling', () => { const result = normalizeSnapshotOutput(input); expect(result).toContain( - '/Library/Developer/XcodeBuildMCP/workspaces/Weather-/result-bundles/test_macos__pid.xcresult', + '~/Library/Developer/XcodeBuildMCP/workspaces/Weather-/result-bundles/test_macos__pid.xcresult', ); expect(result).not.toContain('Weather-abc123def456'); expect(result).not.toContain('abcd1234'); @@ -80,7 +77,7 @@ describe('normalizeSnapshotOutput tilde handling', () => { const result = normalizeSnapshotOutput(input); expect(result).toContain( - '/Library/Developer/XcodeBuildMCP/workspaces/Weather-/DerivedData/CalculatorApp-', + '~/Library/Developer/XcodeBuildMCP/workspaces/Weather-/DerivedData/CalculatorApp-', ); expect(result).not.toContain('Weather-abc123def456'); expect(result).not.toContain('22d700c6d603'); @@ -93,7 +90,7 @@ describe('normalizeSnapshotOutput tilde handling', () => { const result = normalizeSnapshotOutput(input); expect(result).toContain( - '/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData\n', + '~/Library/Developer/XcodeBuildMCP/workspaces/XcodeBuildMCP-/DerivedData\n', ); expect(result).not.toContain('c5da0cbe19a7'); }); diff --git a/src/utils/config-store.ts b/src/utils/config-store.ts index 76c3afc4..dafd3575 100644 --- a/src/utils/config-store.ts +++ b/src/utils/config-store.ts @@ -8,7 +8,8 @@ import { type ProjectConfig, } from './project-config.ts'; import type { DebuggerBackendKind } from './debugger/types.ts'; -import type { UiDebuggerGuardMode } from './runtime-config-types.ts'; +import type { FilePathRenderStyle, UiDebuggerGuardMode } from './runtime-config-types.ts'; +import { isFilePathRenderStyle } from './file-path-render-style.ts'; import { normalizeSessionDefaultsProfileName } from './session-defaults-profile.ts'; export type RuntimeConfigOverrides = Partial<{ @@ -20,6 +21,7 @@ export type RuntimeConfigOverrides = Partial<{ disableSessionDefaults: boolean; disableXcodeAutoSync: boolean; showTestTiming: boolean; + filePathRenderStyle: FilePathRenderStyle; uiDebuggerGuardMode: UiDebuggerGuardMode; incrementalBuildsEnabled: boolean; dapRequestTimeoutMs: number; @@ -45,6 +47,7 @@ export type ResolvedRuntimeConfig = { disableSessionDefaults: boolean; disableXcodeAutoSync: boolean; showTestTiming: boolean; + filePathRenderStyle?: FilePathRenderStyle; uiDebuggerGuardMode: UiDebuggerGuardMode; incrementalBuildsEnabled: boolean; dapRequestTimeoutMs: number; @@ -141,6 +144,14 @@ function parseUiDebuggerGuardMode(value: string | undefined): UiDebuggerGuardMod return undefined; } +function parseFilePathRenderStyle(value: string | undefined): FilePathRenderStyle | undefined { + if (!value) return undefined; + const normalized = value.trim().toLowerCase(); + if (isFilePathRenderStyle(normalized)) return normalized; + log('warn', `Unsupported file path render style '${value}', falling back to defaults.`); + return undefined; +} + function parseDebuggerBackend(value: string | undefined): DebuggerBackendKind | undefined { if (!value) return undefined; const normalized = value.trim().toLowerCase(); @@ -199,6 +210,12 @@ function readEnvConfig(env: NodeJS.ProcessEnv): RuntimeConfigOverrides { setIfDefined(config, 'showTestTiming', parseBoolean(env.XCODEBUILDMCP_SHOW_TEST_TIMING)); + setIfDefined( + config, + 'filePathRenderStyle', + parseFilePathRenderStyle(env.XCODEBUILDMCP_FILE_PATH_RENDER_STYLE), + ); + setIfDefined( config, 'uiDebuggerGuardMode', @@ -493,6 +510,12 @@ function resolveConfig(opts: { envConfig, fallback: DEFAULT_CONFIG.showTestTiming, }), + filePathRenderStyle: resolveFromLayers({ + key: 'filePathRenderStyle', + overrides: opts.overrides, + fileConfig: opts.fileConfig, + envConfig, + }), uiDebuggerGuardMode: resolveFromLayers({ key: 'uiDebuggerGuardMode', overrides: opts.overrides, diff --git a/src/utils/file-path-render-style.ts b/src/utils/file-path-render-style.ts new file mode 100644 index 00000000..de3dea29 --- /dev/null +++ b/src/utils/file-path-render-style.ts @@ -0,0 +1,27 @@ +import type { FilePathRenderStyle } from './runtime-config-types.ts'; + +export type FilePathRenderRuntime = 'cli' | 'daemon' | 'mcp'; + +export function isFilePathRenderStyle(value: unknown): value is FilePathRenderStyle { + return value === 'tree' || value === 'list'; +} + +export function defaultFilePathRenderStyleForRuntime( + runtime: FilePathRenderRuntime, +): FilePathRenderStyle { + return runtime === 'mcp' ? 'tree' : 'list'; +} + +export function resolveFilePathRenderStyle(options: { + explicit?: FilePathRenderStyle; + configured?: FilePathRenderStyle; + runtime: FilePathRenderRuntime; +}): FilePathRenderStyle { + return ( + options.explicit ?? options.configured ?? defaultFilePathRenderStyleForRuntime(options.runtime) + ); +} + +export function normalizeRenderRuntime(runtime: string | undefined): FilePathRenderRuntime { + return runtime === 'mcp' || runtime === 'daemon' ? runtime : 'cli'; +} diff --git a/src/utils/project-config.ts b/src/utils/project-config.ts index e8526fda..ce291bb9 100644 --- a/src/utils/project-config.ts +++ b/src/utils/project-config.ts @@ -6,6 +6,7 @@ import type { SessionDefaults } from './session-store.ts'; import { log } from './logger.ts'; import { removeUndefined } from './remove-undefined.ts'; import { runtimeConfigFileSchema, type RuntimeConfigFile } from './runtime-config-schema.ts'; +import type { FilePathRenderStyle } from './runtime-config-types.ts'; import { normalizeSessionDefaultsProfileName } from './session-defaults-profile.ts'; import { resolvePathFromCwd } from './path.ts'; @@ -20,6 +21,7 @@ export type ProjectConfig = RuntimeConfigFile & { enabledWorkflows?: string[]; customWorkflows?: Record; debuggerBackend?: 'dap' | 'lldb-cli'; + filePathRenderStyle?: FilePathRenderStyle; [key: string]: unknown; }; @@ -60,6 +62,7 @@ export type PersistProjectConfigPatchOptions = { sentryDisabled?: boolean; experimentalWorkflowDiscovery?: boolean; disableSessionDefaults?: boolean; + filePathRenderStyle?: FilePathRenderStyle; sessionDefaults?: Partial; setupPreferences?: SetupPreferences | null; }; @@ -420,6 +423,7 @@ export async function persistProjectConfigPatch( sentryDisabled: options.patch.sentryDisabled, experimentalWorkflowDiscovery: options.patch.experimentalWorkflowDiscovery, disableSessionDefaults: options.patch.disableSessionDefaults, + filePathRenderStyle: options.patch.filePathRenderStyle, }); for (const [key, value] of Object.entries(topLevelPatch)) { diff --git a/src/utils/renderers/__tests__/cli-text-renderer.test.ts b/src/utils/renderers/__tests__/cli-text-renderer.test.ts index d0dd647c..78da2b98 100644 --- a/src/utils/renderers/__tests__/cli-text-renderer.test.ts +++ b/src/utils/renderers/__tests__/cli-text-renderer.test.ts @@ -11,19 +11,23 @@ vi.mock('../../cli-progress-reporter.ts', () => ({ createCliProgressReporter: () => reporter, })); -function buildOutput(overrides: Partial): StructuredToolOutput { +function buildOutput( + overrides: Partial>, +): StructuredToolOutput { + const result: Extract = { + kind: 'build-result', + didError: false, + error: null, + summary: { status: 'SUCCEEDED' }, + artifacts: { scheme: 'MyApp', buildLogPath: '/tmp/build.log' }, + diagnostics: { warnings: [], errors: [] }, + ...overrides, + }; + return { schema: 'xcodebuildmcp.output.build-result', schemaVersion: '1.0.0', - result: { - kind: 'build-result', - didError: false, - error: null, - summary: { status: 'SUCCEEDED' }, - artifacts: { scheme: 'MyApp', buildLogPath: '/tmp/build.log' }, - diagnostics: { warnings: [], errors: [] }, - ...overrides, - } as StructuredToolOutput['result'], + result, }; } @@ -517,7 +521,7 @@ describe('cli-text-renderer', () => { expect(footerIndex).toBeGreaterThan(summaryIndex); expect(nextStepsIndex).toBeGreaterThan(footerIndex); expect(output).toContain('\u{2705} Build & Run complete'); - expect(output).toContain('\u2514 App Path: /tmp/build/MyApp.app'); + expect(output).toContain('└ App Path: /tmp/build/MyApp.app'); }); it('replays buffered build failures once when only a header was emitted', () => { @@ -567,6 +571,25 @@ describe('cli-text-renderer', () => { expect(output).toContain('└ App Path: /tmp/MyApp.app'); }); + it('renders structured output path artifacts as a tree when requested', () => { + const output = renderCliTextTranscript({ + filePathRenderStyle: 'tree', + structuredOutput: { + schema: 'xcodebuildmcp.output.app-path', + schemaVersion: '1.0.0', + result: { + kind: 'app-path', + didError: false, + error: null, + artifacts: { appPath: '/tmp/MyApp.app' }, + }, + }, + }); + + expect(output).toContain('└── /tmp/MyApp.app — App Path'); + expect(output).not.toContain('└ App Path: /tmp/MyApp.app'); + }); + it('renders structured-only non-build diagnostics with a short top-level error summary', () => { const output = renderCliTextTranscript({ structuredOutput: { @@ -687,6 +710,36 @@ describe('cli-text-renderer', () => { expect(output).toContain('App Path: /tmp/build/MyApp.app'); }); + it('renders structured-only build-run headers without frontmatter when header details are disabled', () => { + const output = renderCliTextTranscript({ + includeHeaderDetails: false, + structuredOutput: { + schema: 'xcodebuildmcp.output.build-run-result', + schemaVersion: '1.0.0', + result: { + kind: 'build-run-result', + request: { + scheme: 'MyApp', + projectPath: '/tmp/MyApp.xcodeproj', + configuration: 'Debug', + platform: 'iOS Simulator', + }, + didError: false, + error: null, + summary: { status: 'SUCCEEDED', durationMs: 5000 }, + artifacts: { appPath: '/tmp/build/MyApp.app', buildLogPath: '/tmp/build.log' }, + diagnostics: { warnings: [], errors: [] }, + }, + }, + }); + + expect(output).toContain('🚀 Build & Run'); + expect(output).not.toContain('Scheme: MyApp'); + expect(output).not.toContain('Project: /tmp/MyApp.xcodeproj'); + expect(output).not.toContain('Configuration: Debug'); + expect(output).toContain('✅ Build succeeded. (⏱️ 5.0s)'); + }); + it('renders structured-only test-result with request and no fragments', () => { const output = renderCliTextTranscript({ structuredOutput: { diff --git a/src/utils/renderers/__tests__/event-formatting.test.ts b/src/utils/renderers/__tests__/event-formatting.test.ts index 64442d62..e179ec3d 100644 --- a/src/utils/renderers/__tests__/event-formatting.test.ts +++ b/src/utils/renderers/__tests__/event-formatting.test.ts @@ -26,6 +26,22 @@ describe('event formatting', () => { ).toBe('\u{1F680} Build & Run\n\n Scheme: MyApp'); }); + it('formats compact header events without params when details are disabled', () => { + expect( + formatHeaderEvent( + { + type: 'header', + operation: 'Build & Run', + params: [ + { label: 'Scheme', value: 'MyApp' }, + { label: 'Derived Data', value: '/tmp/DerivedData' }, + ], + }, + { includeDetails: false }, + ), + ).toBe('\u{1F680} Build & Run'); + }); + it('groups test selection params with human-readable labels in header output', () => { expect( formatHeaderEvent({ @@ -212,7 +228,7 @@ describe('event formatting', () => { const rendered = formatDetailTreeEvent({ type: 'detail-tree', items: [ - { label: 'App Path', value: '/tmp/build/MyApp.app' }, + { label: 'App Path', path: '/tmp/build/MyApp.app' }, { label: 'Bundle ID', value: 'com.example.myapp' }, { label: 'App ID', value: 'A1B2C3D4' }, { label: 'Process ID', value: '12345' }, @@ -220,20 +236,44 @@ describe('event formatting', () => { ], }); - expect(rendered).toContain(' \u251C App Path: /tmp/build/MyApp.app'); - expect(rendered).toContain(' \u251C Bundle ID: com.example.myapp'); - expect(rendered).toContain(' \u251C App ID: A1B2C3D4'); - expect(rendered).toContain(' \u251C Process ID: 12345'); - expect(rendered).toContain(' \u2514 Launch: Running'); + expect(rendered).toContain(' ├ Bundle ID: com.example.myapp'); + expect(rendered).toContain(' ├ App ID: A1B2C3D4'); + expect(rendered).toContain(' ├ Process ID: 12345'); + expect(rendered).toContain(' ├ Launch: Running'); + expect(rendered).toContain(' └ Files:'); + expect(rendered).toContain(' └── /tmp/build/MyApp.app — App Path'); }); it('formats detail-tree with single item using end branch', () => { expect( formatDetailTreeEvent({ type: 'detail-tree', - items: [{ label: 'App Path', value: '/tmp/build/MyApp.app' }], + items: [{ label: 'App Path', path: '/tmp/build/MyApp.app' }], }), - ).toBe(' \u2514 App Path: /tmp/build/MyApp.app'); + ).toBe([' └ Files:', ' └── /tmp/build/MyApp.app — App Path'].join('\n')); + }); + + it('formats detail-tree path items as a labeled list when requested', () => { + expect( + formatDetailTreeEvent( + { + type: 'detail-tree', + items: [ + { label: 'Bundle ID', value: 'com.example.myapp' }, + { label: 'App Path', path: '/tmp/build/MyApp.app' }, + { label: 'Build Logs', path: '/tmp/logs/build.log' }, + ], + }, + { filePathRenderStyle: 'list' }, + ), + ).toBe( + [ + ' ├ Bundle ID: com.example.myapp', + ' └ Files:', + ' ├ App Path: /tmp/build/MyApp.app', + ' └ Build Logs: /tmp/logs/build.log', + ].join('\n'), + ); }); it('groups test failures by test case within a suite', () => { diff --git a/src/utils/renderers/__tests__/path-tree.test.ts b/src/utils/renderers/__tests__/path-tree.test.ts new file mode 100644 index 00000000..27ee9239 --- /dev/null +++ b/src/utils/renderers/__tests__/path-tree.test.ts @@ -0,0 +1,123 @@ +import { homedir } from 'node:os'; +import { basename, dirname } from 'node:path'; +import { describe, expect, it } from 'vitest'; +import { displayPath } from '../../build-preflight.ts'; +import { formatPathTree } from '../path-tree.ts'; + +const homePath = homedir(); +const homeParentPath = dirname(homePath); +const homeDirectoryName = basename(homePath); +const workspaceKey = 'CalculatorApp-9f3a7c2d1b44'; +const derivedDataDirectoryName = 'CalculatorApp-7834e7689e33'; +const buildLogFileName = 'build_run_sim_2026-05-07T12-47-52-599Z_pid24748_31629ebe.log'; +const runtimeLogFileName = + 'io.sentry.calculatorapp_2026-05-07T12-48-10-840Z_helperpid25309_ownerpid24748_88fd8a4f.log'; +const osLogFileName = + 'io.sentry.calculatorapp_oslog_2026-05-07T12-48-12-805Z_helperpid25369_ownerpid24748_14da7d85.log'; +const managedWorkspacePath = `${homePath}/Library/Developer/XcodeBuildMCP/workspaces/${workspaceKey}`; + +describe('formatPathTree', () => { + it('groups paths by their shared ancestor before display formatting', () => { + expect( + formatPathTree( + [ + { + label: 'OSLog', + path: `${managedWorkspacePath}/logs/${osLogFileName}`, + }, + { + label: 'App Path', + path: `${managedWorkspacePath}/DerivedData/${derivedDataDirectoryName}/Build/Products/Debug-iphonesimulator/CalculatorApp.app`, + }, + { + label: 'Runtime Logs', + path: `${managedWorkspacePath}/logs/${runtimeLogFileName}`, + }, + { + label: 'Build Logs', + path: `${managedWorkspacePath}/logs/${buildLogFileName}`, + }, + ], + { formatPath: displayPath }, + ), + ).toEqual([ + `└── ~/Library/Developer/XcodeBuildMCP/workspaces/${workspaceKey}/`, + ` ├── DerivedData/${derivedDataDirectoryName}/Build/Products/Debug-iphonesimulator/CalculatorApp.app — App Path`, + ' └── logs/', + ` ├── ${buildLogFileName} — Build Logs`, + ` ├── ${runtimeLogFileName} — Runtime Logs`, + ` └── ${osLogFileName} — OSLog`, + ]); + }); + + it('renders separate roots when paths do not share a meaningful ancestor', () => { + expect( + formatPathTree( + [ + { + label: 'Build Logs', + path: `${managedWorkspacePath}/logs/${buildLogFileName}`, + }, + { + label: 'App Path', + path: '/Volumes/CustomDerivedData/CalculatorApp/Build/Products/Debug-iphonesimulator/CalculatorApp.app', + }, + { + label: 'Runtime Logs', + path: `${managedWorkspacePath}/logs/${runtimeLogFileName}`, + }, + ], + { formatPath: displayPath }, + ), + ).toEqual([ + `├── ~/Library/Developer/XcodeBuildMCP/workspaces/${workspaceKey}/logs/`, + `│ ├── ${buildLogFileName} — Build Logs`, + `│ └── ${runtimeLogFileName} — Runtime Logs`, + '└── /Volumes/CustomDerivedData/CalculatorApp/Build/Products/Debug-iphonesimulator/CalculatorApp.app — App Path', + ]); + }); + + it('preserves raw shared ancestry even when a descendant path would display differently alone', () => { + const childLines = [ + `${homeDirectoryName}/Library/Logs/build.log — User Logs`, + 'other/Library/Logs/build.log — Other Logs', + ].sort(); + + expect( + formatPathTree( + [ + { label: 'User Logs', path: `${homePath}/Library/Logs/build.log` }, + { label: 'Other Logs', path: `${homeParentPath}/other/Library/Logs/build.log` }, + ], + { formatPath: displayPath }, + ), + ).toEqual([`└── ${homeParentPath}/`, ` ├── ${childLines[0]}`, ` └── ${childLines[1]}`]); + }); + + it('sorts relative paths before rendering', () => { + expect( + formatPathTree([ + { label: 'Runtime Logs', path: 'tmp/runtime.log' }, + { label: 'Build Logs', path: 'tmp/build.log' }, + { label: 'App Path', path: 'build/Products/App.app' }, + ]), + ).toEqual([ + '├── build/Products/App.app — App Path', + '└── tmp/', + ' ├── build.log — Build Logs', + ' └── runtime.log — Runtime Logs', + ]); + }); + + it('ignores blank paths', () => { + expect( + formatPathTree( + [ + { label: 'Blank', path: ' ' }, + { label: 'Build Logs', path: `${homePath}/Library/Logs/build.log` }, + ], + { formatPath: displayPath }, + ), + ).toEqual(['└── ~/Library/Logs/build.log — Build Logs']); + }); +}); diff --git a/src/utils/renderers/cli-text-renderer.ts b/src/utils/renderers/cli-text-renderer.ts index 96a3c44e..82b93291 100644 --- a/src/utils/renderers/cli-text-renderer.ts +++ b/src/utils/renderers/cli-text-renderer.ts @@ -1,5 +1,6 @@ import type { NextStep } from '../../types/common.ts'; import type { StructuredToolOutput } from '../../rendering/types.ts'; +import type { FilePathRenderStyle } from '../runtime-config-types.ts'; import type { AnyFragment, BuildRunPhase } from '../../types/domain-fragments.ts'; import type { XcodebuildOperation } from '../../types/domain-fragments.ts'; import type { @@ -69,12 +70,16 @@ interface CliTextProcessorOptions { sink: CliTextSink; suppressWarnings: boolean; showTestTiming: boolean; + filePathRenderStyle: FilePathRenderStyle; + includeHeaderDetails: boolean; } interface CliTextRendererOptions { interactive: boolean; suppressWarnings?: boolean; showTestTiming?: boolean; + filePathRenderStyle?: FilePathRenderStyle; + includeHeaderDetails?: boolean; } export interface CliTextTranscriptInput { @@ -84,6 +89,8 @@ export interface CliTextTranscriptInput { nextStepsRuntime?: 'cli' | 'daemon' | 'mcp'; suppressWarnings?: boolean; showTestTiming?: boolean; + filePathRenderStyle?: FilePathRenderStyle; + includeHeaderDetails?: boolean; } interface XcodebuildParserState { @@ -95,7 +102,14 @@ interface XcodebuildParserState { type RunStateEvent = Parameters[0]; function createCliTextProcessor(options: CliTextProcessorOptions): TranscriptRenderer { - const { interactive, sink, suppressWarnings, showTestTiming } = options; + const { + interactive, + sink, + suppressWarnings, + showTestTiming, + filePathRenderStyle, + includeHeaderDetails, + } = options; const groupedCompilerErrors: CompilerErrorRenderItem[] = []; const groupedWarnings: CompilerWarningRenderItem[] = []; const groupedTestFailures: TestFailureRenderItem[] = []; @@ -177,7 +191,7 @@ function createCliTextProcessor(options: CliTextProcessorOptions): TranscriptRen case 'header': { diagnosticBaseDir = deriveDiagnosticBaseDir(item); hasDurableRuntimeContent = false; - writeSection(formatHeaderEvent(item)); + writeSection(formatHeaderEvent(item, { includeDetails: includeHeaderDetails })); lastVisibleEventType = 'header'; lastStatusLineLevel = null; break; @@ -225,7 +239,7 @@ function createCliTextProcessor(options: CliTextProcessorOptions): TranscriptRen } case 'detail-tree': { - writeDurable(formatDetailTreeEvent(item)); + writeDurable(formatDetailTreeEvent(item, { filePathRenderStyle })); lastVisibleEventType = 'detail-tree'; lastStatusLineLevel = null; break; @@ -489,6 +503,8 @@ export function createCliTextRenderer(options: CliTextRendererOptions): Transcri interactive: options.interactive, suppressWarnings: options.suppressWarnings ?? false, showTestTiming: options.showTestTiming ?? false, + filePathRenderStyle: options.filePathRenderStyle ?? 'list', + includeHeaderDetails: options.includeHeaderDetails ?? true, sink: { clearTransient(): void { reporter.clear(); @@ -512,6 +528,8 @@ export function renderCliTextTranscript(input: CliTextTranscriptInput = {}): str interactive: false, suppressWarnings: input.suppressWarnings ?? false, showTestTiming: input.showTestTiming ?? false, + filePathRenderStyle: input.filePathRenderStyle ?? 'list', + includeHeaderDetails: input.includeHeaderDetails ?? true, sink: { clearTransient(): void {}, updateTransient(): void {}, diff --git a/src/utils/renderers/domain-result-text.ts b/src/utils/renderers/domain-result-text.ts index 10c6f1fb..40a5f618 100644 --- a/src/utils/renderers/domain-result-text.ts +++ b/src/utils/renderers/domain-result-text.ts @@ -2,7 +2,6 @@ import type { NextStep } from '../../types/common.ts'; import type { BasicDiagnostics, DebugThread, - SessionDefaultsProfile, TestDiagnostics, ToolDomainResult, } from '../../types/domain-results.ts'; @@ -37,9 +36,19 @@ export interface SectionTextBlock { blankLineAfterTitle?: boolean; } +export interface DetailTreeValueItem { + label: string; + value: string; +} + +export interface DetailTreePathItem { + label: string; + path: string; +} + export interface DetailTreeTextBlock { type: 'detail-tree'; - items: Array<{ label: string; value: string }>; + items: Array; } export interface TableTextBlock { @@ -293,6 +302,14 @@ function createDetailTree(items: DetailTreeTextBlock['items']): DetailTreeTextBl return { type: 'detail-tree', items }; } +function createPathDetailItem(label: string, path: string): DetailTreePathItem { + return { label, path }; +} + +function createValueDetailItem(label: string, value: string): DetailTreeValueItem { + return { label, value }; +} + function createTable( columns: string[], rows: Array>, @@ -322,20 +339,6 @@ function formatProfileAnnotationFromLabel(profileLabel: string): string { return profileLabel === '(default)' ? '(default profile)' : `(${profileLabel} profile)`; } -function formatSessionDefaultsTree(profile: SessionDefaultsProfile): string[] { - return SESSION_DEFAULT_KEYS.map((key, index) => { - const branch = index === SESSION_DEFAULT_KEYS.length - 1 ? '└' : '├'; - return ` ${branch} ${key}: ${formatSessionDefaultsValue(profile[key])}`; - }); -} - -function formatSessionDefaultsProfileBlock( - profileLabel: string, - profile: SessionDefaultsProfile, -): string { - return [`📁 ${profileLabel}`, ...formatSessionDefaultsTree(profile)].join('\n'); -} - function inferSessionDefaultsMode( result: SessionDefaultsResultWithOperation, ): 'show' | 'set' | 'clear' | 'sync-xcode' { @@ -377,7 +380,7 @@ function formatVariable(variable: DebugVariableShape): string { function formatVariablesLines(scopes: DebugVariablesScopes): string[] { const lines: string[] = []; - const appendScope = (label: string, values: string[]) => { + const appendScope = (label: string, values: string[]): void => { lines.push(`${label}:`); if (values.length === 0) { lines.push(' (no variables)'); @@ -717,7 +720,7 @@ function createAppPathItems( ), ); if (appPath) { - items.push(createDetailTree([{ label: 'App Path', value: displayPath(appPath) }])); + items.push(createDetailTree([createPathDetailItem('App Path', appPath)])); } return items; } @@ -821,16 +824,16 @@ function createLaunchResultItems( const details: DetailTreeTextBlock['items'] = []; if (result.artifacts.bundleId && isMac) { - details.push({ label: 'Bundle ID', value: result.artifacts.bundleId }); + details.push(createValueDetailItem('Bundle ID', result.artifacts.bundleId)); } if (typeof result.artifacts.processId === 'number') { - details.push({ label: 'Process ID', value: String(result.artifacts.processId) }); + details.push(createValueDetailItem('Process ID', String(result.artifacts.processId))); } if (result.artifacts.runtimeLogPath) { - details.push({ label: 'Runtime Logs', value: displayPath(result.artifacts.runtimeLogPath) }); + details.push(createPathDetailItem('Runtime Logs', result.artifacts.runtimeLogPath)); } if (result.artifacts.osLogPath) { - details.push({ label: 'OSLog', value: displayPath(result.artifacts.osLogPath) }); + details.push(createPathDetailItem('OSLog', result.artifacts.osLogPath)); } if (details.length > 0) { items.push(createDetailTree(details)); @@ -1237,13 +1240,13 @@ function createCaptureResultItems( ); const details: DetailTreeTextBlock['items'] = []; if (typeof result.capture.fps === 'number') { - details.push({ label: 'FPS', value: String(result.capture.fps) }); + details.push(createValueDetailItem('FPS', String(result.capture.fps))); } if (result.capture.sessionId) { - details.push({ label: 'Session ID', value: result.capture.sessionId }); + details.push(createValueDetailItem('Session ID', result.capture.sessionId)); } if (result.capture.outputFile) { - details.push({ label: 'Output File', value: displayPath(result.capture.outputFile) }); + details.push(createPathDetailItem('Output File', result.capture.outputFile)); } if (details.length > 0) { items.push(createDetailTree(details)); @@ -1295,11 +1298,13 @@ function createCaptureResultItems( items.push(createStatus('success', 'Screenshot captured')); const details: DetailTreeTextBlock['items'] = []; if (result.artifacts.screenshotPath) { - details.push({ label: 'Screenshot', value: displayPath(result.artifacts.screenshotPath) }); + details.push(createPathDetailItem('Screenshot', result.artifacts.screenshotPath)); } if (result.capture && !('type' in result.capture)) { - details.push({ label: 'Format', value: result.capture.format }); - details.push({ label: 'Size', value: `${result.capture.width}x${result.capture.height}px` }); + details.push(createValueDetailItem('Format', result.capture.format)); + details.push( + createValueDetailItem('Size', `${result.capture.width}x${result.capture.height}px`), + ); } if (details.length > 0) { items.push(createDetailTree(details)); @@ -1901,10 +1906,10 @@ export function createBuildLikeTailItems(result: ToolDomainResult): TextRenderab if (!('artifacts' in result) || !result.artifacts) return []; const items: DetailTreeTextBlock['items'] = []; if ('bundleId' in result.artifacts && typeof result.artifacts.bundleId === 'string') { - items.push({ label: 'Bundle ID', value: result.artifacts.bundleId }); + items.push(createValueDetailItem('Bundle ID', result.artifacts.bundleId)); } if ('buildLogPath' in result.artifacts && typeof result.artifacts.buildLogPath === 'string') { - items.push({ label: 'Build Logs', value: displayPath(result.artifacts.buildLogPath) }); + items.push(createPathDetailItem('Build Logs', result.artifacts.buildLogPath)); } return items.length > 0 ? [createDetailTree(items)] : []; } @@ -1918,29 +1923,29 @@ export function createBuildLikeTailItems(result: ToolDomainResult): TextRenderab ? result.artifacts.executablePath : undefined; if (typeof appLikePath === 'string') { - items.push({ label: 'App Path', value: displayPath(appLikePath) }); + items.push(createPathDetailItem('App Path', appLikePath)); } if ('bundleId' in result.artifacts && typeof result.artifacts.bundleId === 'string') { - items.push({ label: 'Bundle ID', value: result.artifacts.bundleId }); + items.push(createValueDetailItem('Bundle ID', result.artifacts.bundleId)); } if ('processId' in result.artifacts && typeof result.artifacts.processId === 'number') { - items.push({ label: 'Process ID', value: String(result.artifacts.processId) }); + items.push(createValueDetailItem('Process ID', String(result.artifacts.processId))); } if ( 'buildLogPath' in result.artifacts && typeof result.artifacts.buildLogPath === 'string' && !(result.didError && result.summary.target === 'swift-package') ) { - items.push({ label: 'Build Logs', value: displayPath(result.artifacts.buildLogPath) }); + items.push(createPathDetailItem('Build Logs', result.artifacts.buildLogPath)); } if ( 'runtimeLogPath' in result.artifacts && typeof result.artifacts.runtimeLogPath === 'string' ) { - items.push({ label: 'Runtime Logs', value: displayPath(result.artifacts.runtimeLogPath) }); + items.push(createPathDetailItem('Runtime Logs', result.artifacts.runtimeLogPath)); } if ('osLogPath' in result.artifacts && typeof result.artifacts.osLogPath === 'string') { - items.push({ label: 'OSLog', value: displayPath(result.artifacts.osLogPath) }); + items.push(createPathDetailItem('OSLog', result.artifacts.osLogPath)); } if (items.length === 0) return []; const tailItems: TextRenderableItem[] = [ @@ -1961,10 +1966,10 @@ export function createBuildLikeTailItems(result: ToolDomainResult): TextRenderab if (!('artifacts' in result) || !result.artifacts) return []; const items: DetailTreeTextBlock['items'] = []; if ('xcresultPath' in result.artifacts && typeof result.artifacts.xcresultPath === 'string') { - items.push({ label: 'Result Bundle', value: displayPath(result.artifacts.xcresultPath) }); + items.push(createPathDetailItem('Result Bundle', result.artifacts.xcresultPath)); } if ('buildLogPath' in result.artifacts && typeof result.artifacts.buildLogPath === 'string') { - items.push({ label: 'Build Logs', value: displayPath(result.artifacts.buildLogPath) }); + items.push(createPathDetailItem('Build Logs', result.artifacts.buildLogPath)); } return items.length > 0 ? [createDetailTree(items)] : []; } @@ -2006,7 +2011,7 @@ function createRawResponseArtifactItems(pathValue?: string): TextRenderableItem[ createDetailTree([ { label: 'Raw Response JSON', - value: displayPath(pathValue), + path: pathValue, }, ]), ] diff --git a/src/utils/renderers/event-formatting.ts b/src/utils/renderers/event-formatting.ts index 41403c90..75fcdba8 100644 --- a/src/utils/renderers/event-formatting.ts +++ b/src/utils/renderers/event-formatting.ts @@ -18,7 +18,9 @@ import type { TestProgressRenderItem, } from '../../rendering/render-items.ts'; import type { + DetailTreePathItem, DetailTreeTextBlock, + DetailTreeValueItem, FileRefTextBlock, NextStepsTextBlock, SectionTextBlock, @@ -26,6 +28,8 @@ import type { TableTextBlock, } from './domain-result-text.ts'; import { displayPath } from '../build-preflight.ts'; +import type { FilePathRenderStyle } from '../runtime-config-types.ts'; +import { formatPathTree } from './path-tree.ts'; import { renderNextStepsSection } from '../responses/next-steps-renderer.ts'; // --- Operation emoji map --- @@ -104,13 +108,62 @@ export const OPERATION_EMOJI: Record = { // --- Detail tree formatting --- -function formatDetailTreeLines(details: Array<{ label: string; value: string }>): string[] { +type DetailTreeItem = DetailTreeValueItem | DetailTreePathItem; + +function isPathDetailItem(detail: DetailTreeItem): detail is DetailTreePathItem { + return 'path' in detail; +} + +function formatValueDetailTreeLines(details: readonly DetailTreeValueItem[]): string[] { return details.map((detail, index) => { const branch = index === details.length - 1 ? '\u2514' : '\u251C'; return ` ${branch} ${detail.label}: ${detail.value}`; }); } +export interface DetailTreeFormattingOptions { + filePathRenderStyle?: FilePathRenderStyle; +} + +function formatPathListLines(details: readonly DetailTreePathItem[]): string[] { + return details.map((detail, index) => { + const branch = index === details.length - 1 ? '└' : '├'; + const displayed = displayPath(detail.path); + return detail.label ? `${branch} ${detail.label}: ${displayed}` : `${branch} ${displayed}`; + }); +} + +function formatDetailTreeLines( + details: readonly DetailTreeItem[], + options: DetailTreeFormattingOptions = {}, +): string[] { + const valueDetails: DetailTreeValueItem[] = []; + const pathDetails: DetailTreePathItem[] = []; + for (const detail of details) { + if (isPathDetailItem(detail)) { + pathDetails.push(detail); + } else { + valueDetails.push(detail); + } + } + + if (pathDetails.length === 0) { + return formatValueDetailTreeLines(valueDetails); + } + + const pathLines = + options.filePathRenderStyle === 'list' + ? formatPathListLines(pathDetails) + : formatPathTree(pathDetails, { formatPath: displayPath }); + + const lines = valueDetails.map((detail) => ` ├ ${detail.label}: ${detail.value}`); + lines.push(' \u2514 Files:'); + for (const line of pathLines) { + lines.push(` ${line}`); + } + return lines; +} + // --- Diagnostic path resolution --- const FILE_DIAGNOSTIC_REGEX = @@ -218,10 +271,21 @@ function parseHumanDiagnostic( // --- Canonical event formatters --- -export function formatHeaderEvent(event: HeaderRenderItem): string { +export interface HeaderFormattingOptions { + includeDetails?: boolean; +} + +export function formatHeaderEvent( + event: HeaderRenderItem, + options: HeaderFormattingOptions = {}, +): string { const emoji = OPERATION_EMOJI[event.operation] ?? '\u{2699}\u{FE0F}'; const lines: string[] = [`${emoji} ${event.operation}`]; + if (options.includeDetails === false) { + return lines.join('\n'); + } + const onlyTestingParams = event.params.filter((param) => param.label === '-only-testing'); const skipTestingParams = event.params.filter((param) => param.label === '-skip-testing'); const regularParams = event.params.filter( @@ -331,8 +395,11 @@ export function formatFileRefEvent( return displayed; } -export function formatDetailTreeEvent(event: DetailTreeRenderItem | DetailTreeTextBlock): string { - return formatDetailTreeLines(event.items).join('\n'); +export function formatDetailTreeEvent( + event: DetailTreeRenderItem | DetailTreeTextBlock, + options: DetailTreeFormattingOptions = {}, +): string { + return formatDetailTreeLines(event.items, options).join('\n'); } // --- Xcodebuild-specific formatters --- diff --git a/src/utils/renderers/path-tree.ts b/src/utils/renderers/path-tree.ts new file mode 100644 index 00000000..b0119fe7 --- /dev/null +++ b/src/utils/renderers/path-tree.ts @@ -0,0 +1,170 @@ +export interface PathTreeEntry { + path: string; + label?: string; +} + +export interface PathTreeFormatOptions { + formatPath?: (path: string) => string; +} + +interface PathTreeNode { + name: string; + rawPath: string; + children: Map; + label?: string; +} + +interface ParsedPath { + components: string[]; + sortablePath: string; + label?: string; +} + +function normalizeRawPath(inputPath: string): string { + const normalized = inputPath.replace(/\/+/g, '/'); + return normalized === '/' ? normalized : normalized.replace(/\/$/, ''); +} + +function parseRawPath(entry: PathTreeEntry): ParsedPath | null { + const normalized = normalizeRawPath(entry.path.trim()); + if (normalized.length === 0) { + return null; + } + + if (normalized === '/') { + return { components: ['/'], sortablePath: normalized, label: entry.label }; + } + + const isAbsolute = normalized.startsWith('/'); + const segments = (isAbsolute ? normalized.slice(1) : normalized).split('/').filter(Boolean); + const components = isAbsolute ? ['/', ...segments] : segments; + return { components, sortablePath: normalized, label: entry.label }; +} + +function createNode(name: string, rawPath: string): PathTreeNode { + return { name, rawPath, children: new Map() }; +} + +function childRawPath(parentRawPath: string, component: string): string { + if (component === '/') { + return '/'; + } + if (parentRawPath === '' || parentRawPath === '/') { + return `${parentRawPath}${component}`; + } + return `${parentRawPath}/${component}`; +} + +function addPath(root: PathTreeNode, parsedPath: ParsedPath): void { + let node = root; + for (const component of parsedPath.components) { + const existing = node.children.get(component); + if (existing) { + node = existing; + } else { + const child = createNode(component, childRawPath(node.rawPath, component)); + node.children.set(component, child); + node = child; + } + } + node.label = parsedPath.label; +} + +function relativeRawPath(fromPath: string, toPath: string): string { + if (fromPath === '/') { + return toPath.startsWith('/') ? toPath.slice(1) : toPath; + } + if (toPath === fromPath) { + return ''; + } + if (toPath.startsWith(`${fromPath}/`)) { + return toPath.slice(fromPath.length + 1); + } + return toPath; +} + +function appendDirectorySlash(name: string, hasChildren: boolean): string { + return hasChildren && !name.endsWith('/') ? `${name}/` : name; +} + +function formatLeaf(node: PathTreeNode, displayName: string): string { + return node.label ? `${displayName} — ${node.label}` : displayName; +} + +function flattenSingleChildChain(node: PathTreeNode): PathTreeNode { + let current = node; + while (current.children.size === 1 && current.label === undefined) { + const onlyChild = current.children.values().next().value; + if (!onlyChild) break; + current = onlyChild; + } + return current; +} + +function renderNode( + node: PathTreeNode, + prefix: string, + isLast: boolean, + parentRawPath: string | undefined, + formatPath: (path: string) => string, +): string[] { + const flattened = flattenSingleChildChain(node); + const displayName = appendDirectorySlash( + parentRawPath === undefined + ? formatPath(flattened.rawPath) + : relativeRawPath(parentRawPath, flattened.rawPath), + flattened.children.size > 0, + ); + const branch = isLast ? '└── ' : '├── '; + const lines = [`${prefix}${branch}${formatLeaf(flattened, displayName)}`]; + const children = [...flattened.children.values()].sort((left, right) => + left.name.localeCompare(right.name), + ); + const childPrefix = `${prefix}${isLast ? ' ' : '│ '}`; + + children.forEach((child, index) => { + lines.push( + ...renderNode( + child, + childPrefix, + index === children.length - 1, + flattened.rawPath, + formatPath, + ), + ); + }); + + return lines; +} + +function topLevelNodes(root: PathTreeNode): PathTreeNode[] { + const children = [...root.children.values()]; + const onlyChild = children.length === 1 ? children[0] : undefined; + if (onlyChild && onlyChild.name === '/' && onlyChild.children.size > 1) { + return [...onlyChild.children.values()]; + } + return children; +} + +export function formatPathTree( + entries: readonly PathTreeEntry[], + options: PathTreeFormatOptions = {}, +): string[] { + const formatPath = options.formatPath ?? ((path: string): string => path); + const root = createNode('', ''); + const parsedPaths = entries + .map(parseRawPath) + .filter((entry): entry is ParsedPath => entry !== null) + .sort((left, right) => left.sortablePath.localeCompare(right.sortablePath)); + + for (const parsedPath of parsedPaths) { + addPath(root, parsedPath); + } + + const nodes = topLevelNodes(root).sort((left, right) => + left.rawPath.localeCompare(right.rawPath), + ); + return nodes.flatMap((child, index) => + renderNode(child, '', index === nodes.length - 1, undefined, formatPath), + ); +} diff --git a/src/utils/runtime-config-schema.ts b/src/utils/runtime-config-schema.ts index 190cc0e6..7f4766bc 100644 --- a/src/utils/runtime-config-schema.ts +++ b/src/utils/runtime-config-schema.ts @@ -12,6 +12,7 @@ export const runtimeConfigFileSchema = z disableSessionDefaults: z.boolean().optional(), disableXcodeAutoSync: z.boolean().optional(), showTestTiming: z.boolean().optional(), + filePathRenderStyle: z.enum(['tree', 'list']).optional(), uiDebuggerGuardMode: z.enum(['error', 'warn', 'off']).optional(), incrementalBuildsEnabled: z.boolean().optional(), dapRequestTimeoutMs: z.number().int().positive().optional(), diff --git a/src/utils/runtime-config-types.ts b/src/utils/runtime-config-types.ts index 3d953113..6559350b 100644 --- a/src/utils/runtime-config-types.ts +++ b/src/utils/runtime-config-types.ts @@ -1 +1,2 @@ export type UiDebuggerGuardMode = 'error' | 'warn' | 'off'; +export type FilePathRenderStyle = 'tree' | 'list'; diff --git a/src/utils/typed-tool-factory.ts b/src/utils/typed-tool-factory.ts index 7ea21f95..a6690caa 100644 --- a/src/utils/typed-tool-factory.ts +++ b/src/utils/typed-tool-factory.ts @@ -2,6 +2,8 @@ import { AsyncLocalStorage } from 'node:async_hooks'; import * as z from 'zod'; import type { ToolHandlerContext } from '../rendering/types.ts'; import { createRenderSession } from '../rendering/render.ts'; +import { getConfig } from './config-store.ts'; +import { normalizeRenderRuntime, resolveFilePathRenderStyle } from './file-path-render-style.ts'; import { renderCliTextTranscript } from './renderers/cli-text-renderer.ts'; import type { CommandExecutor } from './execution/index.ts'; import type { DomainFragment } from '../types/domain-fragments.ts'; @@ -60,11 +62,17 @@ function setValidationErrorOutput(ctx: ToolHandlerContext, message: string, code } function sessionToTestResult(session: ReturnType): ToolTestResult { + const runtime = normalizeRenderRuntime(process.env.XCODEBUILDMCP_RUNTIME); const text = renderCliTextTranscript({ items: [], structuredOutput: session.getStructuredOutput?.(), nextSteps: session.getNextSteps?.(), nextStepsRuntime: session.getNextStepsRuntime?.(), + includeHeaderDetails: runtime !== 'mcp', + filePathRenderStyle: resolveFilePathRenderStyle({ + configured: getConfig().filePathRenderStyle, + runtime, + }), }); const content: Array<{ type: 'text'; text: string }> = [];