From 4f52adbb50cba9df5d3e3d0e853bad2bf4783250 Mon Sep 17 00:00:00 2001 From: Cameron Cooke Date: Thu, 7 May 2026 19:18:51 +0100 Subject: [PATCH 1/2] feat(rendering): Add configurable file path rendering Add a file path render style setting for text output so CLI output can use labeled file lists while MCP text output preserves compact path trees. Expose the setting through project config, environment, and the CLI option, and update rendering tests and snapshots to cover both modes. --- CHANGELOG.md | 1 + config.example.yaml | 1 + src/cli.ts | 12 +- .../__tests__/register-tool-commands.test.ts | 56 ++++++ src/cli/register-tool-commands.ts | 35 ++-- src/cli/yargs-app.ts | 5 + src/mcp/resources/devices.ts | 16 +- src/mcp/resources/simulators.ts | 16 +- .../__tests__/text-render-parity.test.ts | 36 +++- src/rendering/render.ts | 45 +++-- .../cli/device/build--error-compiler.txt | 5 +- .../cli/device/build--error-wrong-scheme.txt | 5 +- .../cli/device/build--success.txt | 5 +- .../device/build-and-run--error-compiler.txt | 5 +- .../build-and-run--error-wrong-scheme.txt | 5 +- .../cli/device/build-and-run--success.txt | 7 +- .../cli/device/get-app-path--success.txt | 7 +- .../cli/device/install--success.txt | 2 +- .../cli/device/test--error-compiler.txt | 7 +- .../__fixtures__/cli/device/test--failure.txt | 7 +- .../__fixtures__/cli/device/test--success.txt | 7 +- .../cli/macos/build--error-compiler.txt | 5 +- .../cli/macos/build--error-wrong-scheme.txt | 5 +- .../__fixtures__/cli/macos/build--success.txt | 5 +- .../macos/build-and-run--error-compiler.txt | 5 +- .../build-and-run--error-wrong-scheme.txt | 5 +- .../cli/macos/build-and-run--success.txt | 7 +- .../cli/macos/get-app-path--success.txt | 7 +- .../cli/macos/launch--success.txt | 2 +- .../cli/macos/test--error-compiler.txt | 7 +- .../cli/macos/test--error-wrong-scheme.txt | 7 +- .../__fixtures__/cli/macos/test--failure.txt | 7 +- .../__fixtures__/cli/macos/test--success.txt | 7 +- .../cli/simulator/build--error-compiler.txt | 5 +- .../simulator/build--error-wrong-scheme.txt | 5 +- .../cli/simulator/build--success.txt | 5 +- .../build-and-run--error-compiler.txt | 5 +- .../build-and-run--error-wrong-scheme.txt | 5 +- .../cli/simulator/build-and-run--success.txt | 11 +- .../cli/simulator/get-app-path--success.txt | 7 +- .../cli/simulator/install--success.txt | 2 +- .../cli/simulator/launch-app--success.txt | 5 +- .../cli/simulator/screenshot--success.txt | 5 +- .../cli/simulator/test--error-compiler.txt | 5 +- .../simulator/test--error-wrong-scheme.txt | 5 +- .../cli/simulator/test--failure.txt | 7 +- .../cli/simulator/test--success.txt | 7 +- .../swift-package/build--error-bad-path.txt | 3 +- .../cli/swift-package/build--success.txt | 3 +- .../cli/swift-package/run--success.txt | 5 +- .../swift-package/test--error-bad-path.txt | 5 +- .../cli/swift-package/test--failure.txt | 5 +- .../cli/swift-package/test--success.txt | 5 +- .../documentation-search--success.txt | 3 +- .../cli/xcode-ide/list-tools--success.txt | 3 +- .../json/device/build--error-compiler.json | 4 +- .../device/build--error-wrong-scheme.json | 4 +- .../json/device/build--success.json | 4 +- .../device/build-and-run--error-compiler.json | 4 +- .../build-and-run--error-wrong-scheme.json | 4 +- .../json/device/build-and-run--success.json | 6 +- .../json/device/get-app-path--success.json | 2 +- .../json/device/install--success.json | 2 +- .../json/device/test--error-compiler.json | 6 +- .../json/device/test--failure.json | 6 +- .../json/device/test--success.json | 6 +- .../json/macos/build--error-compiler.json | 4 +- .../json/macos/build--error-wrong-scheme.json | 4 +- .../json/macos/build--success.json | 4 +- .../macos/build-and-run--error-compiler.json | 4 +- .../build-and-run--error-wrong-scheme.json | 4 +- .../json/macos/build-and-run--success.json | 6 +- .../json/macos/get-app-path--success.json | 2 +- .../json/macos/launch--success.json | 2 +- .../json/macos/test--error-compiler.json | 6 +- .../json/macos/test--error-wrong-scheme.json | 6 +- .../json/macos/test--failure.json | 6 +- .../json/macos/test--success.json | 6 +- .../json/simulator/build--error-compiler.json | 4 +- .../simulator/build--error-wrong-scheme.json | 4 +- .../json/simulator/build--success.json | 4 +- .../build-and-run--error-compiler.json | 4 +- .../build-and-run--error-wrong-scheme.json | 4 +- .../simulator/build-and-run--success.json | 10 +- .../json/simulator/get-app-path--success.json | 2 +- .../json/simulator/install--success.json | 2 +- .../json/simulator/launch-app--success.json | 4 +- .../json/simulator/test--error-compiler.json | 4 +- .../simulator/test--error-wrong-scheme.json | 4 +- .../json/simulator/test--failure.json | 6 +- .../json/simulator/test--success.json | 6 +- .../swift-package/build--error-bad-path.json | 2 +- .../json/swift-package/build--success.json | 2 +- .../run--error-bad-executable.json | 2 +- .../json/swift-package/run--success.json | 6 +- .../swift-package/test--error-bad-path.json | 2 +- .../json/swift-package/test--failure.json | 2 +- .../json/swift-package/test--success.json | 2 +- ...-coverage-report--error-invalid-bundle.txt | 2 - .../coverage/get-coverage-report--success.txt | 3 - ...et-file-coverage--error-invalid-bundle.txt | 3 - .../coverage/get-file-coverage--success.txt | 3 - .../lldb-command--error-no-session.txt | 2 - .../mcp/debugging/lldb-command--success.txt | 2 - .../mcp/device/build--error-compiler.txt | 9 +- .../mcp/device/build--error-wrong-scheme.txt | 9 +- .../mcp/device/build--success.txt | 9 +- .../device/build-and-run--error-compiler.txt | 10 +- .../build-and-run--error-wrong-scheme.txt | 10 +- .../mcp/device/build-and-run--success.txt | 13 +- .../get-app-path--error-wrong-scheme.txt | 5 - .../mcp/device/get-app-path--success.txt | 12 +- .../mcp/device/install--error-invalid-app.txt | 3 - .../mcp/device/install--success.txt | 3 - .../device/launch--error-invalid-bundle.txt | 3 - .../mcp/device/launch--success.txt | 3 - .../mcp/device/stop--error-no-app.txt | 3 - .../__fixtures__/mcp/device/stop--success.txt | 3 - .../mcp/device/test--error-compiler.txt | 15 +- .../__fixtures__/mcp/device/test--failure.txt | 13 +- .../__fixtures__/mcp/device/test--success.txt | 15 +- .../mcp/macos/build--error-compiler.txt | 9 +- .../mcp/macos/build--error-wrong-scheme.txt | 9 +- .../__fixtures__/mcp/macos/build--success.txt | 9 +- .../macos/build-and-run--error-compiler.txt | 9 +- .../build-and-run--error-wrong-scheme.txt | 9 +- .../mcp/macos/build-and-run--success.txt | 12 +- .../get-app-path--error-wrong-scheme.txt | 5 - .../mcp/macos/get-app-path--success.txt | 12 +- ...get-macos-bundle-id--error-missing-app.txt | 2 - .../macos/get-macos-bundle-id--success.txt | 2 - .../mcp/macos/launch--error-invalid-app.txt | 2 - .../mcp/macos/launch--success.txt | 2 - .../mcp/macos/stop--error-no-app.txt | 2 - .../__fixtures__/mcp/macos/stop--success.txt | 2 - .../mcp/macos/test--error-compiler.txt | 15 +- .../mcp/macos/test--error-wrong-scheme.txt | 12 +- .../__fixtures__/mcp/macos/test--failure.txt | 12 +- .../__fixtures__/mcp/macos/test--success.txt | 15 +- .../discover-projs--error-invalid-root.txt | 4 - .../discover-projs--success.txt | 4 - .../get-app-bundle-id--error-missing-app.txt | 2 - .../get-app-bundle-id--success.txt | 2 - ...get-macos-bundle-id--error-missing-app.txt | 2 - .../get-macos-bundle-id--success.txt | 2 - .../list-schemes--error-invalid-workspace.txt | 2 - .../list-schemes--success.txt | 2 - ...how-build-settings--error-wrong-scheme.txt | 3 - .../show-build-settings--success.txt | 3 - .../scaffold-ios--error-existing.txt | 4 - .../scaffold-ios--success.txt | 4 - .../scaffold-macos--error-existing.txt | 4 - .../scaffold-macos--success.txt | 4 - .../mcp/resources/doctor--success.txt | 1 + .../session-clear-defaults--success.txt | 2 - .../session-set-defaults--scheme.txt | 3 - .../session-set-defaults--success.txt | 4 - .../session-use-defaults-profile--success.txt | 2 - .../boot--error-invalid-id.txt | 2 - .../simulator-management/boot--success.txt | 2 - .../erase--error-invalid-id.txt | 2 - .../simulator-management/erase--success.txt | 2 - ...eset-location--error-invalid-simulator.txt | 2 - .../reset-location--success.txt | 2 - ...et-appearance--error-invalid-simulator.txt | 3 - .../set-appearance--success.txt | 3 - .../set-location--error-invalid-simulator.txt | 3 - .../set-location--success.txt | 3 - .../statusbar--error-invalid-simulator.txt | 3 - .../statusbar--success.txt | 3 - ...ware-keyboard--error-invalid-simulator.txt | 2 - ...gle-connect-hardware-keyboard--success.txt | 2 - ...ware-keyboard--error-invalid-simulator.txt | 2 - .../toggle-software-keyboard--success.txt | 2 - .../mcp/simulator/build--error-compiler.txt | 10 +- .../simulator/build--error-wrong-scheme.txt | 10 +- .../mcp/simulator/build--success.txt | 10 +- .../build-and-run--error-compiler.txt | 10 +- .../build-and-run--error-wrong-scheme.txt | 10 +- .../mcp/simulator/build-and-run--success.txt | 18 +- .../get-app-path--error-wrong-scheme.txt | 6 - .../mcp/simulator/get-app-path--success.txt | 13 +- .../simulator/install--error-invalid-app.txt | 3 - .../mcp/simulator/install--success.txt | 3 - .../launch-app--error-not-installed.txt | 3 - .../mcp/simulator/launch-app--success.txt | 9 +- .../screenshot--error-invalid-simulator.txt | 2 - .../mcp/simulator/screenshot--success.txt | 7 +- .../mcp/simulator/stop--error-no-app.txt | 3 - .../mcp/simulator/stop--success.txt | 3 - .../mcp/simulator/test--error-compiler.txt | 12 +- .../simulator/test--error-wrong-scheme.txt | 10 +- .../mcp/simulator/test--failure.txt | 13 +- .../mcp/simulator/test--success.txt | 15 +- .../swift-package/build--error-bad-path.txt | 5 +- .../mcp/swift-package/build--success.txt | 5 +- .../swift-package/clean--error-bad-path.txt | 2 - .../mcp/swift-package/clean--success.txt | 2 - .../run--error-bad-executable.txt | 3 - .../mcp/swift-package/run--success.txt | 8 +- .../swift-package/stop--error-no-process.txt | 2 - .../swift-package/test--error-bad-path.txt | 8 +- .../mcp/swift-package/test--failure.txt | 8 +- .../mcp/swift-package/test--success.txt | 8 +- .../button--error-no-simulator.txt | 2 - .../mcp/ui-automation/button--success.txt | 2 - .../gesture--error-no-simulator.txt | 2 - .../mcp/ui-automation/gesture--success.txt | 2 - .../key-press--error-no-simulator.txt | 2 - .../mcp/ui-automation/key-press--success.txt | 2 - .../key-sequence--error-no-simulator.txt | 2 - .../ui-automation/key-sequence--success.txt | 2 - .../long-press--error-no-simulator.txt | 2 - .../mcp/ui-automation/long-press--success.txt | 2 - .../snapshot-ui--error-no-simulator.txt | 2 - .../ui-automation/snapshot-ui--success.txt | 2 - .../swipe--error-no-simulator.txt | 2 - .../mcp/ui-automation/swipe--success.txt | 2 - .../ui-automation/tap--error-no-simulator.txt | 2 - .../mcp/ui-automation/tap--success.txt | 2 - .../touch--error-no-simulator.txt | 2 - .../mcp/ui-automation/touch--success.txt | 2 - .../type-text--error-no-simulator.txt | 2 - .../mcp/ui-automation/type-text--success.txt | 2 - .../utilities/clean--error-wrong-scheme.txt | 5 - .../mcp/utilities/clean--success.txt | 5 - .../documentation-search--success.txt | 5 +- .../mcp/xcode-ide/list-tools--success.txt | 3 +- .../__tests__/normalize.test.ts | 44 +++++ src/snapshot-tests/normalize.ts | 24 +-- src/snapshot-tests/suites/xcode-ide-suite.ts | 9 +- src/utils/__tests__/config-store.test.ts | 24 ++- src/utils/__tests__/project-config.test.ts | 14 ++ .../__tests__/snapshot-normalize.test.ts | 23 ++- src/utils/config-store.ts | 25 ++- src/utils/file-path-render-style.ts | 27 +++ src/utils/project-config.ts | 4 + .../__tests__/cli-text-renderer.test.ts | 75 ++++++-- .../__tests__/event-formatting.test.ts | 56 +++++- .../renderers/__tests__/path-tree.test.ts | 122 +++++++++++++ src/utils/renderers/cli-text-renderer.ts | 24 ++- src/utils/renderers/domain-result-text.ts | 83 +++++---- src/utils/renderers/event-formatting.ts | 75 +++++++- src/utils/renderers/path-tree.ts | 170 ++++++++++++++++++ src/utils/runtime-config-schema.ts | 1 + src/utils/runtime-config-types.ts | 1 + src/utils/typed-tool-factory.ts | 8 + 247 files changed, 1256 insertions(+), 860 deletions(-) create mode 100644 src/utils/file-path-render-style.ts create mode 100644 src/utils/renderers/__tests__/path-tree.test.ts create mode 100644 src/utils/renderers/path-tree.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 6aafbdcfb..29ea9e348 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 056d0cd13..fc6ab8271 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 b20efb62f..9777a3e2f 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 a7d77712b..8a744bacb 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 e0fc3dea6..4c8d6107a 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 5a56816fe..f9836d265 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 156b7fd2c..65d892065 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 5965eaaca..d18935d27 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 aec051a03..fbe4cac85 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 19fe24308..f9eabae56 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 d6863893a..57f7369c3 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 b8e4d8710..b872bf0f5 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 d96de7f41..4dc9c62e2 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 228fef711..044ddf736 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 6e7216823..66ad3c609 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 3d194b3de..71835a264 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 9e6d4af7a..c5eb3418a 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 dd596fc87..425f11a28 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 224314860..ddbc13588 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 25f199327..cbd595b3f 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 20d8372c0..ae68d6925 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 3f3ffcb88..8c97dd1d8 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 57a867a93..0d7ef994c 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 c765274f3..7bee545a3 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 553b0c527..6c40977a8 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 66796aa6a..711ff7b31 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 a4dae8076..dc91eca6e 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 1e81b9039..dd45771fc 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 ac05ad090..2362ab71b 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 7821e1375..0a357bdbe 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 bf22f9ece..795e8d84e 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 301f586d1..2a220f7aa 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 0b1f6dede..cb54b9b7a 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 57ebbb0cf..bc83057bf 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 a1380d8ed..dae2a4233 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 acacb4288..77b2b0efc 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 ababd6338..0d23f830c 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 79876668b..21075fecf 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 1b9b02e6e..db9bccbbf 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 0bd60788a..05af71f91 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 8c2c554dd..30600dc2f 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 1efee9431..f55796ce7 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 4a990b953..1fccb4751 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 cd6956141..bad0431de 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 50e49847c..85568ca7f 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 961239d2c..6500f0f76 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 0e0a625b6..6f2c5e1aa 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 1e8b416ee..bbf70264d 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 eb8eee4ef..5a4cd434b 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 5b6b35fdb..0d2112cc5 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 639bf732a..750e0865b 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 9b59b7435..0516de499 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 5cefd1817..4f5f3683b 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 e78b2f4cf..ffc5b39de 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 80a36abbe..3ca912f96 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 f85d8f742..553c9a60b 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 d20e3bd48..90651be36 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 72bd8294e..32a27debe 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 bbe999485..eb4e6eaee 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 193ec49e5..df2f3da04 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 c1d15aa24..dfe0d6712 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 c39cf894e..8b7417280 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 50412f4a7..1735ba24f 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 be0cc4c0c..40d15f446 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 d694e3fb1..09f5698cf 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 5dc894811..2c00bdbc6 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 5036f7739..8c0963566 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 9e407d70d..9136bf8b1 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 1d9f5091b..3b2153926 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 8d2e6abb1..9cb2ca2cf 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 5abc9d44f..4941fad3a 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 0f47df87a..f9766f75f 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 0ae14e082..9872ebc07 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 baa19c2f5..8150d1cd1 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 a6521794b..6daee8b40 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 494cc28b0..17eb6d3c5 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 ffdbc19e6..4c7f4e982 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 01f82f0fa..262236eb3 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 1d0c340f0..70293cf21 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 93dda05bf..ce485dba7 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 17680c2f5..6e8b82eab 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 6625f7535..e65165d46 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 2fadffeed..902c92816 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 121b45f63..3b0476dca 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 2b45efb7a..19883c403 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 f13506883..6d757dcde 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 71c3482bb..a423c45e3 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 b424f3b93..8bd844e75 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 7720890aa..5545ce84e 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 3eb1aa905..da4d5cdec 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 ada1fae84..e6b0d7b01 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 4741b6973..63e725313 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 eaf49ad78..9cf857f1c 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 89108e058..ef0789c1f 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 16dbe956e..bf84bf4b2 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 33817b29a..9d83b726e 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 db70bd5d8..124f91289 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 7351eae64..2bdba97e0 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 5e54457a1..1c4510257 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 d33a26999..bae11ffd9 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 e47d59fd6..2ccc08561 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 a44ae8943..2d539e0a3 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 0413c89bc..330cad0f7 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 08c3d66a8..b0170c41d 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 7a6b95ea6..c720ef98e 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 b8e4d8710..a65c33fe1 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 5b415b7b5..9f8794f70 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 02ca9c5e8..dff811af7 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 6e7216823..1bc367e72 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 2c3864bcd..10d63318d 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 6817789b7..4e7787b54 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 039e38734..9fc79b8fd 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 af3837d8a..b9deeae4c 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 dd596fc87..52de910b5 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 14626ef93..202133116 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 a48871241..888b3e002 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 f0fab5b38..a09f9c2ab 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 2fa577551..46f6293dd 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 d00ef7687..2bb489471 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 41805834f..d4fe8e5d6 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 0165555ff..aeba621eb 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 52ffe01a8..6de954a4a 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 57a867a93..0da1f22f8 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 179a8145c..6d3ee03ab 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 14f54f4c6..81cdf1260 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 66796aa6a..353cd5785 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 a4dae8076..f45718388 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 0661e1121..296c376fa 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 6bd49335d..48d88a45c 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 a7d25d46a..fac62d2f5 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 3e5965436..288ae4bd6 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 246d1544b..dcca7160f 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 ac05ad090..cfcaa8277 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 22a43dddc..1b4234de0 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 dffe5e4ef..8703f9407 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 8a26848ee..12a1f9e69 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 bf22f9ece..28957ac8b 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 8222e1703..c7db60d85 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 a17c9d713..bef7e6229 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 d125c5547..f3c9f7a3c 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 30ab25e49..d0dcf8201 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 221306336..0b6633c5f 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 3824c1cb3..4c98c6293 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 a7d25d46a..fac62d2f5 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 c8a66f0ec..651c014ad 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 90a4a6376..546cf09d8 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 c52404530..0c1dd2b20 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 4ca56370b..09c666b3f 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 2ad674a32..13d5cb6b7 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 a7ac832ba..514c3c6d9 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 d705138b8..29ac1a0a7 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 6811a1b91..1bf0b9a51 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 087c46f02..101a55267 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 f999f376c..9ee4bd2b6 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 7e2331d65..a2893fdad 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 947ea4317..7b2d21665 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 773d40cd4..51c8b54bc 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 099bd99f9..7e9e35c20 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 0e7ff8ed5..201c24707 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 db86c72ce..2332e3920 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 4305c3860..0c67f775c 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 f80554028..ab201bb51 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 ab5eac84e..8611b2d80 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 0626956e0..1ac0a86cb 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 decd97e62..0d4b6b1cb 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 bd3a256c9..ccacaed4c 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 ba9f902a3..d45259c62 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 783dc9f28..1155fee3a 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 ef32ae2b4..0946af0c6 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 3d93eeaff..c2b9efdf8 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 7f385d3f0..3f112bc75 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 90e09c78d..66b072400 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 f57b7d9bc..7ec5db79c 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 4d511834c..d7605a030 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 de3c6c2a3..e94f9f3a0 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 a1380d8ed..2bf85ad02 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 ab64c799b..cb5804c08 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 147e596e2..3dcc58bda 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 79876668b..e0d2be21d 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 d88d37c48..354429bd5 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 4ccab0533..e29930daf 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 1478122f4..7efb25cf8 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 15b9f3dbb..73fd1b14d 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 52806565e..27371057c 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 1ef69e2db..95797f204 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 d87bbccbc..03062aab6 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 9176afa74..836a0f670 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 4a990b953..ddceb358b 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 39dfa4503..f99cf8b74 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 855e08888..46f6293dd 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 5eaa7aa30..a9d7a15e7 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 50e49847c..4359a4439 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 f74680d25..6edf231d7 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 8db8f9c8c..d32b486b8 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 1e8b416ee..466e7b1a2 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 eb8eee4ef..63071b991 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 cb4abdeb9..0363983ec 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 a0e316a04..c5fc476ea 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 049283385..73fa3f574 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 5b6b35fdb..1d5912b34 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 4266d3c40..8854f7123 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 639bf732a..2d2fe3081 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 ece0337ac..821bb760b 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 8db02e9bf..fb8934ae3 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 a1e445335..adaecbac2 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 58a78296a..18de11b04 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 57682ba41..42fc4b4ec 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 f7cbf6735..c693a2f5d 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 e84fc4708..8669a176b 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 c687f6b65..c886800b4 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 899891ce4..a837a0300 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 6950454c4..6faf04241 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 b04be39af..10acee620 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 678f04137..faeec8350 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 419ba4770..30268b61e 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 204148194..5766d2720 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 4716920bc..05a6c9606 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 f78015c16..9b5ca8373 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 d45f020a2..3aa5515fa 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 d4a41a58c..6c3da0d59 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 751d9f3fd..ad4778d4a 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 5197f0e74..b9dad4d4d 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 bba706413..40a192802 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 72a6ac50b..a3abffa98 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 e7b605f86..809848922 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 3e0c7025a..a77cc7835 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 e78b2f4cf..9d250db0c 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 80a36abbe..071862301 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 f46bbdeb0..ff2773c66 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 9ef1894af..4630aab5c 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 801f5e82e..0de1bf03a 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 436204a6e..e0f6307bd 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 fb2e3a578..c72483cd6 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 fe1c66c23..2448d58e4 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 76c3afc42..dafd35759 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 000000000..de3dea293 --- /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 e8526fda5..ce291bb9d 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 d0dd647cb..78da2b98f 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 64442d620..e179ec3dc 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 000000000..af7cb8aa0 --- /dev/null +++ b/src/utils/renderers/__tests__/path-tree.test.ts @@ -0,0 +1,122 @@ +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', () => { + 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}/`, + ` ├── ${homeDirectoryName}/Library/Logs/build.log — User Logs`, + ' └── other/Library/Logs/build.log — Other Logs', + ]); + }); + + 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 96a3c44ee..82b932910 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 10c6f1fb9..40a5f6186 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 41403c90f..75fcdba85 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 000000000..b0119fe7f --- /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 190cc0e6c..7f4766bc7 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 3d9531132..6559350bd 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 7ea21f958..a6690caa8 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 }> = []; From d432ec4149e6ad5f624a8bc1e43aaea6889e32b4 Mon Sep 17 00:00:00 2001 From: Cameron Cooke Date: Thu, 7 May 2026 19:28:06 +0100 Subject: [PATCH 2/2] test: Stabilize path tree ancestry ordering Sort expected child path lines so the renderer test does not depend on locale-sensitive ordering of home-directory and sibling paths. --- src/utils/renderers/__tests__/path-tree.test.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/utils/renderers/__tests__/path-tree.test.ts b/src/utils/renderers/__tests__/path-tree.test.ts index af7cb8aa0..27ee9239e 100644 --- a/src/utils/renderers/__tests__/path-tree.test.ts +++ b/src/utils/renderers/__tests__/path-tree.test.ts @@ -78,6 +78,11 @@ describe('formatPathTree', () => { }); 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( [ @@ -86,11 +91,7 @@ describe('formatPathTree', () => { ], { formatPath: displayPath }, ), - ).toEqual([ - `└── ${homeParentPath}/`, - ` ├── ${homeDirectoryName}/Library/Logs/build.log — User Logs`, - ' └── other/Library/Logs/build.log — Other Logs', - ]); + ).toEqual([`└── ${homeParentPath}/`, ` ├── ${childLines[0]}`, ` └── ${childLines[1]}`]); }); it('sorts relative paths before rendering', () => {