# xcodegen project definition — run `xcodegen generate` to (re)create # UsageMenubar.xcodeproj. The .xcodeproj is not committed; this file is # the source of truth for project structure and build settings. name: UsageMenubar options: # Reverse-DNS prefix xcodegen uses when it needs to synthesize a bundle id. # The app target pins its own id explicitly below, so this is just a default. bundleIdPrefix: soy.iko # Oldest macOS we support. SMAppService (launch at login) requires 13.0+; # we target 14.0 (Sonoma). Keep in sync with MACOSX_DEPLOYMENT_TARGET below. deploymentTarget: macOS: "14.0" createIntermediateGroups: true generateEmptyDirectories: true settings: base: SWIFT_VERSION: "5.9" # Local/CI builds are unsigned at compile time. Release builds get an # ad-hoc signature applied after archiving (see .github/workflows/release.yml). DEVELOPMENT_TEAM: "" CODE_SIGN_IDENTITY: "" CODE_SIGNING_REQUIRED: "NO" CODE_SIGNING_ALLOWED: "NO" # Version defaults for local builds only. The release workflow overwrites # these (and the CFBundle* keys below) with a version derived from the # commit timestamp, formatted YYYY.MM.DD.HHHH — so editing them by hand # has no effect on what ships. MARKETING_VERSION: "1.0.0" CURRENT_PROJECT_VERSION: "1" targets: # ── The menu bar app ─────────────────────────────────────────────────── UsageMenubar: type: application platform: macOS sources: - path: UsageMenubar excludes: # Referenced explicitly via INFOPLIST_FILE / CODE_SIGN_ENTITLEMENTS, # so they must not also be compiled in as resources. - "Info.plist" - "*.entitlements" info: path: UsageMenubar/Info.plist properties: CFBundleName: UsageMenubar CFBundleDisplayName: Usage Menubar CFBundleIdentifier: soy.iko.usage-menubar # Overwritten by CI — see the note on MARKETING_VERSION above. CFBundleVersion: "1" CFBundleShortVersionString: "1.0.0" # Agent app: no dock icon and no main window; it lives in the menu bar. LSUIElement: true LSApplicationCategoryType: public.app-category.utilities NSHighResolutionCapable: true settings: base: PRODUCT_BUNDLE_IDENTIFIER: soy.iko.usage-menubar PRODUCT_NAME: UsageMenubar INFOPLIST_FILE: UsageMenubar/Info.plist # Grants the outgoing-network-connection entitlement needed to reach # the Hyper and Claude APIs, and deliberately does not sandbox the app — # see the comment in the entitlements file. Stripped in CI's archive step # (unsigned builds can't carry entitlements). CODE_SIGN_ENTITLEMENTS: UsageMenubar/UsageMenubar.entitlements ENABLE_HARDENED_RUNTIME: YES ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon MACOSX_DEPLOYMENT_TARGET: "14.0" LD_RUNPATH_SEARCH_PATHS: - "$(inherited)" - "@executable_path/../Frameworks" # ── Unit tests ───────────────────────────────────────────────────────── # Hosted by the app target (BUNDLE_LOADER/TEST_HOST) so tests can reach the # app's internal types without re-declaring them. UsageMenubarTests: type: bundle.unit-test platform: macOS sources: - path: UsageMenubarTests dependencies: - target: UsageMenubar settings: base: PRODUCT_BUNDLE_IDENTIFIER: soy.iko.usage-menubar.tests PRODUCT_NAME: UsageMenubarTests BUNDLE_LOADER: "$(TEST_HOST)" TEST_HOST: "$(BUILT_PRODUCTS_DIR)/UsageMenubar.app/Contents/MacOS/UsageMenubar" MACOSX_DEPLOYMENT_TARGET: "14.0" schemes: UsageMenubar: build: targets: UsageMenubar: all UsageMenubarTests: [test] run: config: Debug test: config: Debug targets: - UsageMenubarTests archive: config: Release