name: NotchBuddy options: bundleIdPrefix: fr.louisraille deploymentTarget: macOS: "15.0" xcodeVersion: "27.0" createIntermediateGroups: true # DebugCloud = Debug, but signed with iCloud (CloudKit) and push entitlements # and compiled with PHONE_LINK, for the iPhone link spike. ReleaseCloud = the # same for a Developer ID build with its provisioning profile # (scripts/cloud-test-build.sh); a Developer ID profile only allows the # Production CloudKit environment, so the iPhone joins it with the # CoucouPhoneProduction scheme. Release also compiles PHONE_LINK (the sync # stays off until turned on in Settings); Debug stays unsigned without it. configs: Debug: debug DebugCloud: debug Release: release ReleaseCloud: release settings: base: SWIFT_VERSION: "6.0" ENABLE_HARDENED_RUNTIME: YES CODE_SIGN_STYLE: Manual OTHER_SWIFT_FLAGS: "-strict-concurrency=complete" configs: Debug: CODE_SIGNING_REQUIRED: NO CODE_SIGNING_ALLOWED: NO DebugCloud: CODE_SIGNING_REQUIRED: YES CODE_SIGNING_ALLOWED: YES CODE_SIGN_STYLE: Automatic CODE_SIGN_IDENTITY: "Apple Development" DEVELOPMENT_TEAM: 256AUJ9555 Release: CODE_SIGNING_REQUIRED: YES CODE_SIGNING_ALLOWED: YES CODE_SIGN_IDENTITY: "Developer ID Application" DEVELOPMENT_TEAM: 256AUJ9555 OTHER_CODE_SIGN_FLAGS: "--timestamp" CODE_SIGN_INJECT_BASE_ENTITLEMENTS: NO CODE_SIGN_ENTITLEMENTS: Resources/Coucou.entitlements ReleaseCloud: CODE_SIGNING_REQUIRED: YES CODE_SIGNING_ALLOWED: YES CODE_SIGN_IDENTITY: "Developer ID Application" DEVELOPMENT_TEAM: 256AUJ9555 OTHER_CODE_SIGN_FLAGS: "--timestamp" CODE_SIGN_INJECT_BASE_ENTITLEMENTS: NO schemes: NotchBuddy: build: targets: NotchBuddy: all run: config: Debug archive: config: Release CoucouAppStore: build: targets: CoucouAppStore: all run: config: Debug archive: config: Release NotchBuddyCloud: build: targets: NotchBuddy: all run: config: DebugCloud archive: config: Release CoucouAppStoreCloud: build: targets: CoucouAppStore: all run: config: DebugCloud archive: config: Release CoucouPhone: build: targets: CoucouPhone: all run: config: Debug archive: config: Release # Same iPhone app on the Production CloudKit environment, to talk to the # Developer ID build (scripts/cloud-test-build.sh), which can only use Production. CoucouPhoneProduction: build: targets: CoucouPhone: all run: config: DebugCloud archive: config: Release targets: NotchBuddy: type: application platform: macOS sources: - path: Sources type: group excludes: - "Phone/**" - "Widgets/**" - "NotificationContent/**" - path: Assets.xcassets buildPhase: resources - path: Resources/sounds buildPhase: resources type: folder info: path: Resources/Info.plist properties: CFBundleName: Coucou CFBundleDisplayName: Coucou CFBundleIdentifier: fr.louisraille.NotchBuddy CFBundleVersion: "10" CFBundleShortVersionString: "0.1.9" CFBundlePackageType: APPL LSUIElement: YES NSHighResolutionCapable: YES NSSupportsAutomaticGraphicsSwitching: YES NSAppleEventsUsageDescription: "Pour sauter au terminal, envoyer des mails et piloter Musique." NSAccessibilityUsageDescription: "Pour lire le titre de la fenĂȘtre active et l'attacher comme contexte." NSAppTransportSecurity: NSAllowsLocalNetworking: true settings: base: PRODUCT_BUNDLE_IDENTIFIER: fr.louisraille.NotchBuddy PRODUCT_NAME: Coucou INFOPLIST_FILE: Resources/Info.plist ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon MACOSX_DEPLOYMENT_TARGET: "15.0" ENABLE_SANDBOX: NO configs: DebugCloud: CODE_SIGN_ENTITLEMENTS: Resources/CoucouCloud.entitlements SWIFT_ACTIVE_COMPILATION_CONDITIONS: "DEBUG PHONE_LINK" # The distributed build carries the iPhone sync (off until the user # turns it on in Settings), so it needs iCloud and its Developer ID profile. Release: CODE_SIGN_ENTITLEMENTS: Resources/CoucouReleaseCloud.entitlements SWIFT_ACTIVE_COMPILATION_CONDITIONS: PHONE_LINK PROVISIONING_PROFILE_SPECIFIER: "Coucou Developer ID" ReleaseCloud: CODE_SIGN_ENTITLEMENTS: Resources/CoucouReleaseCloud.entitlements SWIFT_ACTIVE_COMPILATION_CONDITIONS: PHONE_LINK PROVISIONING_PROFILE_SPECIFIER: "Coucou Developer ID" CoucouAppStore: type: application platform: macOS sources: - path: Sources type: group excludes: - "Phone/**" - "Widgets/**" - "NotificationContent/**" - path: Assets.xcassets buildPhase: resources - path: Resources/sounds buildPhase: resources type: folder info: path: Resources/InfoAppStore.plist properties: CFBundleName: Coucou CFBundleDisplayName: Coucou CFBundleIdentifier: fr.louisraille.Coucou CFBundleVersion: "5" CFBundleShortVersionString: "1.1" CFBundlePackageType: APPL LSUIElement: YES NSHighResolutionCapable: YES NSSupportsAutomaticGraphicsSwitching: YES LSApplicationCategoryType: public.app-category.developer-tools ITSAppUsesNonExemptEncryption: NO NSAppTransportSecurity: NSAllowsLocalNetworking: true settings: base: PRODUCT_BUNDLE_IDENTIFIER: fr.louisraille.Coucou PRODUCT_NAME: Coucou INFOPLIST_FILE: Resources/InfoAppStore.plist ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon MACOSX_DEPLOYMENT_TARGET: "15.0" CODE_SIGN_STYLE: Automatic CODE_SIGN_IDENTITY: "Apple Development" CODE_SIGN_ENTITLEMENTS: Resources/CoucouAppStore.entitlements DEVELOPMENT_TEAM: 256AUJ9555 SWIFT_ACTIVE_COMPILATION_CONDITIONS: APPSTORE CODE_SIGNING_ALLOWED: YES configs: DebugCloud: CODE_SIGN_ENTITLEMENTS: Resources/CoucouAppStoreCloud.entitlements SWIFT_ACTIVE_COMPILATION_CONDITIONS: "APPSTORE PHONE_LINK" # App Store archive: same iCloud entitlements; Xcode switches push to # production when exporting for the App Store. Release: CODE_SIGN_ENTITLEMENTS: Resources/CoucouAppStoreCloud.entitlements SWIFT_ACTIVE_COMPILATION_CONDITIONS: "APPSTORE PHONE_LINK" # iPhone app. Same bundle ID as the Mac App Store build, for universal purchase. CoucouPhone: type: application platform: iOS deploymentTarget: "18.0" dependencies: - target: CoucouWidgets - target: CoucouNotificationContent sources: - path: Sources/Phone type: group # Shared with the Mac targets (they get it through Sources/). - path: Sources/CoucouKit type: group - path: PhoneAssets.xcassets buildPhase: resources # Mochi's sounds for the iPhone's notifications. - path: Resources/sounds/approval.wav buildPhase: resources - path: Resources/sounds/finish.wav buildPhase: resources - path: Resources/sounds/question.wav buildPhase: resources - path: Resources/sounds/error.wav buildPhase: resources info: path: Resources/InfoPhone.plist properties: CFBundleName: Coucou CFBundleDisplayName: Coucou CFBundleIdentifier: fr.louisraille.Coucou CFBundleVersion: "3" CFBundleShortVersionString: "1.0" CFBundlePackageType: APPL LSRequiresIPhoneOS: YES UILaunchScreen: {} UIApplicationSupportsIndirectInputEvents: YES UIBackgroundModes: - remote-notification # Portrait, except a diff opened full screen (PhoneAppDelegate decides). UISupportedInterfaceOrientations: - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight ITSAppUsesNonExemptEncryption: NO NSFaceIDUsageDescription: "Coucou asks for Face ID before allowing a command from your iPhone." NSMicrophoneUsageDescription: "Coucou uses the microphone when you dictate an instruction for Claude Code." NSSpeechRecognitionUsageDescription: "Coucou turns your voice into the text of an instruction for Claude Code." NSSupportsLiveActivities: YES # Lets Mochi move at 120 Hz on ProMotion screens, like the Mac's notch. CADisableMinimumFrameDurationOnPhone: YES # Steps change often while an agent works: without this, iOS holds back # updates once its budget is spent, and "waiting for your OK" came late. NSSupportsLiveActivitiesFrequentUpdates: YES # coucou://session/: the widgets open a session in the app. CFBundleURLTypes: - CFBundleURLName: fr.louisraille.Coucou CFBundleURLSchemes: - coucou # Which APNs environment the Live Activity tokens belong to (read by the Mac). CoucouAPNsEnvironment: $(COUCOU_APNS_ENV) settings: base: PRODUCT_BUNDLE_IDENTIFIER: fr.louisraille.Coucou PRODUCT_NAME: Coucou INFOPLIST_FILE: Resources/InfoPhone.plist ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon # Mochi in other colors, picked in Settings (UIApplication.setAlternateIconName). ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES: "AppIcon-Blue AppIcon-Green AppIcon-Purple AppIcon-Pink AppIcon-Graphite" ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS: NO COUCOU_APNS_ENV: production IPHONEOS_DEPLOYMENT_TARGET: "18.0" TARGETED_DEVICE_FAMILY: "1" SUPPORTS_MACCATALYST: NO CODE_SIGN_STYLE: Automatic CODE_SIGN_IDENTITY: "Apple Development" CODE_SIGN_ENTITLEMENTS: Resources/CoucouPhone.entitlements DEVELOPMENT_TEAM: 256AUJ9555 CODE_SIGNING_REQUIRED: YES CODE_SIGNING_ALLOWED: YES ENABLE_HARDENED_RUNTIME: NO OTHER_CODE_SIGN_FLAGS: "" configs: Debug: COUCOU_APNS_ENV: development DebugCloud: CODE_SIGN_ENTITLEMENTS: Resources/CoucouPhoneProduction.entitlements COUCOU_APNS_ENV: development # Home Screen and Lock Screen widgets (Solo, Team, List, accessories). They # read the sessions the iPhone app saves to the shared App Group. CoucouWidgets: type: app-extension platform: iOS deploymentTarget: "18.0" sources: - path: Sources/Widgets type: group - path: Sources/CoucouKit type: group - path: Sources/Phone/SharedSessions.swift - path: Sources/Phone/MacStubs.swift - path: Sources/Phone/MochiActivityAttributes.swift - path: Sources/Phone/OpenLeadMochiIntent.swift - path: Sources/Phone/DenyApprovalIntent.swift info: path: Resources/InfoWidgets.plist properties: CFBundleName: CoucouWidgets CFBundleDisplayName: Coucou CFBundleIdentifier: fr.louisraille.Coucou.Widgets CFBundleVersion: "3" CFBundleShortVersionString: "1.0" CFBundlePackageType: XPC! NSExtension: NSExtensionPointIdentifier: com.apple.widgetkit-extension settings: base: PRODUCT_BUNDLE_IDENTIFIER: fr.louisraille.Coucou.Widgets SWIFT_ACTIVE_COMPILATION_CONDITIONS: "$(inherited) WIDGET_EXTENSION" PRODUCT_NAME: CoucouWidgets INFOPLIST_FILE: Resources/InfoWidgets.plist IPHONEOS_DEPLOYMENT_TARGET: "18.0" TARGETED_DEVICE_FAMILY: "1" SUPPORTS_MACCATALYST: NO CODE_SIGN_STYLE: Automatic CODE_SIGN_IDENTITY: "Apple Development" CODE_SIGN_ENTITLEMENTS: Resources/CoucouWidgets.entitlements DEVELOPMENT_TEAM: 256AUJ9555 CODE_SIGNING_REQUIRED: YES CODE_SIGNING_ALLOWED: YES ENABLE_HARDENED_RUNTIME: NO OTHER_CODE_SIGN_FLAGS: "" SKIP_INSTALL: YES APPLICATION_EXTENSION_API_ONLY: YES # The expanded approval notification: Mochi alive, with the command. CoucouNotificationContent: type: app-extension platform: iOS deploymentTarget: "18.0" sources: - path: Sources/NotificationContent type: group - path: Sources/CoucouKit type: group - path: Sources/Phone/MochiLive.swift - path: Sources/Phone/MacStubs.swift info: path: Resources/InfoNotificationContent.plist properties: CFBundleName: CoucouNotificationContent CFBundleDisplayName: Coucou CFBundleIdentifier: fr.louisraille.Coucou.NotificationContent CFBundleVersion: "3" CFBundleShortVersionString: "1.0" CFBundlePackageType: XPC! NSExtension: NSExtensionPointIdentifier: com.apple.usernotifications.content-extension NSExtensionPrincipalClass: $(PRODUCT_MODULE_NAME).NotificationViewController NSExtensionAttributes: UNNotificationExtensionCategory: COUCOU_APPROVAL UNNotificationExtensionInitialContentSizeRatio: 0.45 UNNotificationExtensionDefaultContentHidden: true settings: base: PRODUCT_BUNDLE_IDENTIFIER: fr.louisraille.Coucou.NotificationContent PRODUCT_NAME: CoucouNotificationContent INFOPLIST_FILE: Resources/InfoNotificationContent.plist IPHONEOS_DEPLOYMENT_TARGET: "18.0" TARGETED_DEVICE_FAMILY: "1" SUPPORTS_MACCATALYST: NO CODE_SIGN_STYLE: Automatic CODE_SIGN_IDENTITY: "Apple Development" DEVELOPMENT_TEAM: 256AUJ9555 CODE_SIGNING_REQUIRED: YES CODE_SIGNING_ALLOWED: YES ENABLE_HARDENED_RUNTIME: NO OTHER_CODE_SIGN_FLAGS: "" SKIP_INSTALL: YES APPLICATION_EXTENSION_API_ONLY: YES