import { z } from 'zod';
import { xcodebuildShowBuildSettings } from '../executor/xcodebuild.js';
import { resolveProjectArgs, getWorkingDirectory } from '../utils/project-resolver.js';
export const xcodebuildSettingsSchema = z.object({
workspace: z
.string()
.optional()
.describe('Explicit workspace path (.xcworkspace)'),
project: z
.string()
.optional()
.describe('Explicit project path (.xcodeproj)'),
directory: z
.string()
.optional()
.describe('Directory to search for workspace/project (defaults to cwd)'),
scheme: z
.string()
.optional()
.describe('Scheme to show settings for'),
target: z
.string()
.optional()
.describe('Target to show settings for'),
configuration: z
.string()
.optional()
.describe('Build configuration (e.g., "Debug", "Release")'),
});
export type XcodebuildSettingsInput = z.infer<typeof xcodebuildSettingsSchema>;
function validateInput(input: XcodebuildSettingsInput): void {
if (input.workspace && input.project) {
throw new Error('Cannot specify both workspace and project');
}
}
export const xcodebuildSettingsTool = {
name: 'xcodebuild_show_build_settings',
description: 'Show build settings for an Xcode project, scheme, or target. Useful for inspecting PRODUCT_BUNDLE_IDENTIFIER, SDKROOT, DEPLOYMENT_TARGET, and other build configuration.',
inputSchema: xcodebuildSettingsSchema,
handler: async (input: XcodebuildSettingsInput) => {
validateInput(input);
const projectArgs = resolveProjectArgs(input);
const cwd = getWorkingDirectory(input);
const args: string[] = [...projectArgs];
if (input.scheme) {
args.push('-scheme', input.scheme);
}
if (input.target) {
args.push('-target', input.target);
}
if (input.configuration) {
args.push('-configuration', input.configuration);
}
const output = xcodebuildShowBuildSettings(args, { cwd });
return {
content: [
{
type: 'text' as const,
text: output,
},
],
};
},
};