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