From 7bb74654c5f592b6af0ea044028bcada69b334c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20F=C3=B6rtsch?= Date: Tue, 10 Mar 2026 12:12:52 +0100 Subject: [PATCH] add macos swiftui app project, xcodegen config, initial views Co-Authored-By: Claude Opus 4.6 --- clients/macos/.gitignore | 9 + .../MagnumOpus.xcodeproj/project.pbxproj | 395 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + clients/macos/MagnumOpus/ContentView.swift | 8 + clients/macos/MagnumOpus/MagnumOpusApp.swift | 10 + .../MagnumOpusTests/MagnumOpusTests.swift | 9 + clients/macos/project.yml | 30 ++ 7 files changed, 468 insertions(+) create mode 100644 clients/macos/.gitignore create mode 100644 clients/macos/MagnumOpus.xcodeproj/project.pbxproj create mode 100644 clients/macos/MagnumOpus.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 clients/macos/MagnumOpus/ContentView.swift create mode 100644 clients/macos/MagnumOpus/MagnumOpusApp.swift create mode 100644 clients/macos/MagnumOpusTests/MagnumOpusTests.swift create mode 100644 clients/macos/project.yml diff --git a/clients/macos/.gitignore b/clients/macos/.gitignore new file mode 100644 index 0000000..186baa7 --- /dev/null +++ b/clients/macos/.gitignore @@ -0,0 +1,9 @@ +## Xcode +xcuserdata/ +*.xcscmblueprint +*.xccheckout +DerivedData/ +build/ + +## macOS +.DS_Store diff --git a/clients/macos/MagnumOpus.xcodeproj/project.pbxproj b/clients/macos/MagnumOpus.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d53cad4 --- /dev/null +++ b/clients/macos/MagnumOpus.xcodeproj/project.pbxproj @@ -0,0 +1,395 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 75B7350A363635D7F29C26B6 /* MagnumOpusTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9717C9F6A44D10CDBAFD0343 /* MagnumOpusTests.swift */; }; + 9E2B5C0BF3FA0377F767813F /* MagnumOpusApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = F80C77DBAD1B198729927655 /* MagnumOpusApp.swift */; }; + CB1BE6051E090D633F78D10D /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EF5862C4F99EB1E50F30B69 /* ContentView.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + E15B5C533FA77F3F85082DC6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 865FD067648BA747233B80D7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 12D0D5898C5DE3626FDE3D43; + remoteInfo = MagnumOpus; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 06522A9E61E177D2A7E87404 /* MagnumOpusTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MagnumOpusTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 7EF5862C4F99EB1E50F30B69 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 9717C9F6A44D10CDBAFD0343 /* MagnumOpusTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagnumOpusTests.swift; sourceTree = ""; }; + D05FC027ECFEB1947556987F /* MagnumOpus.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MagnumOpus.app; sourceTree = BUILT_PRODUCTS_DIR; }; + F80C77DBAD1B198729927655 /* MagnumOpusApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagnumOpusApp.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXGroup section */ + AA8CD05750356CC309E2B378 /* MagnumOpusTests */ = { + isa = PBXGroup; + children = ( + 9717C9F6A44D10CDBAFD0343 /* MagnumOpusTests.swift */, + ); + path = MagnumOpusTests; + sourceTree = ""; + }; + C72812AB47ECA1FDB966DD2F = { + isa = PBXGroup; + children = ( + CCF6A684D9C0486E4C1827F2 /* MagnumOpus */, + AA8CD05750356CC309E2B378 /* MagnumOpusTests */, + EDF7A92B36251B42925BA4DC /* Products */, + ); + sourceTree = ""; + }; + CCF6A684D9C0486E4C1827F2 /* MagnumOpus */ = { + isa = PBXGroup; + children = ( + 7EF5862C4F99EB1E50F30B69 /* ContentView.swift */, + F80C77DBAD1B198729927655 /* MagnumOpusApp.swift */, + ); + path = MagnumOpus; + sourceTree = ""; + }; + EDF7A92B36251B42925BA4DC /* Products */ = { + isa = PBXGroup; + children = ( + D05FC027ECFEB1947556987F /* MagnumOpus.app */, + 06522A9E61E177D2A7E87404 /* MagnumOpusTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 12D0D5898C5DE3626FDE3D43 /* MagnumOpus */ = { + isa = PBXNativeTarget; + buildConfigurationList = 915C4EA72900D17694CEC1D7 /* Build configuration list for PBXNativeTarget "MagnumOpus" */; + buildPhases = ( + E33D7358E591F3FFDC59F8C8 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MagnumOpus; + packageProductDependencies = ( + ); + productName = MagnumOpus; + productReference = D05FC027ECFEB1947556987F /* MagnumOpus.app */; + productType = "com.apple.product-type.application"; + }; + 1CEBB797CAF02055EAEA120A /* MagnumOpusTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = E0FC93CAC704C86C08B2D0E3 /* Build configuration list for PBXNativeTarget "MagnumOpusTests" */; + buildPhases = ( + D6922BFF56369B0392F167C8 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + AE43B292EA60118BBB1EA6C8 /* PBXTargetDependency */, + ); + name = MagnumOpusTests; + packageProductDependencies = ( + ); + productName = MagnumOpusTests; + productReference = 06522A9E61E177D2A7E87404 /* MagnumOpusTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 865FD067648BA747233B80D7 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1600; + TargetAttributes = { + 12D0D5898C5DE3626FDE3D43 = { + DevelopmentTeam = NG5W75WE8U; + }; + 1CEBB797CAF02055EAEA120A = { + DevelopmentTeam = NG5W75WE8U; + }; + }; + }; + buildConfigurationList = 486698A6C11A27CB53843925 /* Build configuration list for PBXProject "MagnumOpus" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + Base, + en, + ); + mainGroup = C72812AB47ECA1FDB966DD2F; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = EDF7A92B36251B42925BA4DC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 12D0D5898C5DE3626FDE3D43 /* MagnumOpus */, + 1CEBB797CAF02055EAEA120A /* MagnumOpusTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + D6922BFF56369B0392F167C8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 75B7350A363635D7F29C26B6 /* MagnumOpusTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E33D7358E591F3FFDC59F8C8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CB1BE6051E090D633F78D10D /* ContentView.swift in Sources */, + 9E2B5C0BF3FA0377F767813F /* MagnumOpusApp.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + AE43B292EA60118BBB1EA6C8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 12D0D5898C5DE3626FDE3D43 /* MagnumOpus */; + targetProxy = E15B5C533FA77F3F85082DC6 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 0EAFCCE30FDE3C297C1373BB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = NG5W75WE8U; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 1948729ACD79C5578B791D2A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = de.felixfoertsch.MagnumOpusTests; + SDKROOT = macosx; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MagnumOpus.app/Contents/MacOS/MagnumOpus"; + }; + name = Release; + }; + 3063DB4BFB0593E81DAAD0C4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 15.0; + PRODUCT_BUNDLE_IDENTIFIER = de.felixfoertsch.MagnumOpus; + SDKROOT = macosx; + }; + name = Debug; + }; + 5EAD77D772F6B932113AD266 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = de.felixfoertsch.MagnumOpusTests; + SDKROOT = macosx; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MagnumOpus.app/Contents/MacOS/MagnumOpus"; + }; + name = Debug; + }; + 6FB8CB1A4C625BE359225C87 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = NG5W75WE8U; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "DEBUG=1", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + A0F9833F0E3C87048CCEF296 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 15.0; + PRODUCT_BUNDLE_IDENTIFIER = de.felixfoertsch.MagnumOpus; + SDKROOT = macosx; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 486698A6C11A27CB53843925 /* Build configuration list for PBXProject "MagnumOpus" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6FB8CB1A4C625BE359225C87 /* Debug */, + 0EAFCCE30FDE3C297C1373BB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 915C4EA72900D17694CEC1D7 /* Build configuration list for PBXNativeTarget "MagnumOpus" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3063DB4BFB0593E81DAAD0C4 /* Debug */, + A0F9833F0E3C87048CCEF296 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + E0FC93CAC704C86C08B2D0E3 /* Build configuration list for PBXNativeTarget "MagnumOpusTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5EAD77D772F6B932113AD266 /* Debug */, + 1948729ACD79C5578B791D2A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + }; + rootObject = 865FD067648BA747233B80D7 /* Project object */; +} diff --git a/clients/macos/MagnumOpus.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/clients/macos/MagnumOpus.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/clients/macos/MagnumOpus.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/clients/macos/MagnumOpus/ContentView.swift b/clients/macos/MagnumOpus/ContentView.swift new file mode 100644 index 0000000..e65f586 --- /dev/null +++ b/clients/macos/MagnumOpus/ContentView.swift @@ -0,0 +1,8 @@ +import SwiftUI + +struct ContentView: View { + var body: some View { + Text("Hello, Magnum Opus!") + .frame(maxWidth: .infinity, maxHeight: .infinity) + } +} diff --git a/clients/macos/MagnumOpus/MagnumOpusApp.swift b/clients/macos/MagnumOpus/MagnumOpusApp.swift new file mode 100644 index 0000000..4f6daf1 --- /dev/null +++ b/clients/macos/MagnumOpus/MagnumOpusApp.swift @@ -0,0 +1,10 @@ +import SwiftUI + +@main +struct MagnumOpusApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/clients/macos/MagnumOpusTests/MagnumOpusTests.swift b/clients/macos/MagnumOpusTests/MagnumOpusTests.swift new file mode 100644 index 0000000..aa8692b --- /dev/null +++ b/clients/macos/MagnumOpusTests/MagnumOpusTests.swift @@ -0,0 +1,9 @@ +import Testing + +@Suite("MagnumOpus") +struct MagnumOpusTests { + @Test("app launches") + func appLaunches() { + #expect(true) + } +} diff --git a/clients/macos/project.yml b/clients/macos/project.yml new file mode 100644 index 0000000..b95f618 --- /dev/null +++ b/clients/macos/project.yml @@ -0,0 +1,30 @@ +name: MagnumOpus +options: + bundleIdPrefix: de.felixfoertsch + deploymentTarget: + macOS: "15.0" + xcodeVersion: "16.0" + createIntermediateGroups: true + defaultConfig: Debug +settings: + DEVELOPMENT_TEAM: NG5W75WE8U +targets: + MagnumOpus: + type: application + platform: macOS + sources: + - path: MagnumOpus + settings: + PRODUCT_BUNDLE_IDENTIFIER: de.felixfoertsch.MagnumOpus + INFOPLIST_KEY_LSApplicationCategoryType: "public.app-category.productivity" + GENERATE_INFOPLIST_FILE: YES + MACOSX_DEPLOYMENT_TARGET: "15.0" + MagnumOpusTests: + type: bundle.unit-test + platform: macOS + sources: + - path: MagnumOpusTests + dependencies: + - target: MagnumOpus + settings: + GENERATE_INFOPLIST_FILE: YES