The half-and-half split (paged timer over the looping form-guide figure) is now iPhone-only. On the watch the ExerciseProgressView TabView fills the whole screen — the figure slot is gone from both the active flow and the Completed state, and the ExerciseFigure sources and ExerciseMotions resources are dropped from the watch target since nothing there uses them. Claude-Session: https://claude.ai/code/session_01HJDQQDA9QdP8zByg43H5v3
186 lines
6.1 KiB
YAML
186 lines
6.1 KiB
YAML
name: Workouts
|
|
options:
|
|
bundleIdPrefix: dev.rzen.indie
|
|
deploymentTarget:
|
|
iOS: "26.0"
|
|
watchOS: "26.0"
|
|
xcodeVersion: "26.0"
|
|
defaultConfig: Debug
|
|
|
|
settings:
|
|
base:
|
|
SWIFT_VERSION: "6.0"
|
|
DEVELOPMENT_TEAM: ${APPLE_TEAM_ID}
|
|
MARKETING_VERSION: "2.3"
|
|
CURRENT_PROJECT_VERSION: "1"
|
|
ENABLE_USER_SCRIPT_SANDBOXING: "NO"
|
|
|
|
packages:
|
|
IndieAbout:
|
|
url: https://git.rzen.dev/rzen/indie-about.git
|
|
from: "0.2.2"
|
|
IndieSync:
|
|
url: https://git.rzen.dev/rzen/indie-sync.git
|
|
from: "0.3.0"
|
|
IndieBackup:
|
|
url: https://git.rzen.dev/rzen/indie-backup.git
|
|
from: "2.0.0"
|
|
|
|
# Shared post-build phase — stamps CFBundleVersion (git commit count), BuildDate, and
|
|
# BuildHash into each target's (and dSYM's) Info.plist. Aliased into every code-bearing
|
|
# target below so the app, watch app, and both widget extensions stamp identical metadata.
|
|
scriptAnchors:
|
|
updateBuildInfo: &updateBuildInfo
|
|
- script: '"${SRCROOT}/../indie-skills/skills/app-versioning/scripts/update_build_info.sh"'
|
|
name: Update Build Info
|
|
shell: /bin/sh
|
|
basedOnDependencyAnalysis: false
|
|
inputFiles:
|
|
- $(TARGET_BUILD_DIR)/$(INFOPLIST_PATH)
|
|
- $(DWARF_DSYM_FOLDER_PATH)/$(DWARF_DSYM_FILE_NAME)/Contents/Info.plist
|
|
|
|
targets:
|
|
# ---- iOS app (owns iCloud Drive sync; embeds the watch app) ----------------
|
|
Workouts:
|
|
type: application
|
|
platform: iOS
|
|
sources:
|
|
- path: Shared
|
|
- path: Workouts
|
|
excludes:
|
|
- "Resources/Info-*.plist"
|
|
- "Resources/*.entitlements"
|
|
- path: CHANGELOG.md
|
|
buildPhase: resources
|
|
type: file
|
|
- path: README.md
|
|
buildPhase: resources
|
|
type: file
|
|
- path: LICENSE.md
|
|
buildPhase: resources
|
|
type: file
|
|
# The Live Activity attributes are shared with the widget extension (which owns the
|
|
# folder); the app compiles just this one file so it can start / update / end the activity.
|
|
- path: "Workouts Widget/WorkoutActivityAttributes.swift"
|
|
dependencies:
|
|
- package: IndieAbout
|
|
- package: IndieSync
|
|
- package: IndieBackup
|
|
- target: Workouts Watch App
|
|
- target: Workouts Widget
|
|
embed: true
|
|
postBuildScripts: *updateBuildInfo
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: dev.rzen.indie.Workouts
|
|
INFOPLIST_FILE: Workouts/Resources/Info-iOS.plist
|
|
CODE_SIGN_ENTITLEMENTS: Workouts/Resources/Workouts-iOS.entitlements
|
|
GENERATE_INFOPLIST_FILE: false
|
|
SWIFT_STRICT_CONCURRENCY: complete
|
|
IPHONEOS_DEPLOYMENT_TARGET: "26.0"
|
|
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
|
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME: AccentColor
|
|
TARGETED_DEVICE_FAMILY: "1"
|
|
DEVELOPMENT_ASSET_PATHS: "\"Workouts/Preview Content\""
|
|
scheme:
|
|
testTargets:
|
|
- WorkoutsTests
|
|
|
|
# ---- unit tests (domain model / codec, against the iOS app target) --------
|
|
WorkoutsTests:
|
|
type: bundle.unit-test
|
|
platform: iOS
|
|
sources:
|
|
- WorkoutsTests
|
|
dependencies:
|
|
- target: Workouts
|
|
- package: IndieSync
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: dev.rzen.indie.WorkoutsTests
|
|
GENERATE_INFOPLIST_FILE: true
|
|
SWIFT_STRICT_CONCURRENCY: complete
|
|
|
|
# ---- watchOS app (no iCloud; syncs through the phone via WatchConnectivity) -
|
|
Workouts Watch App:
|
|
type: application
|
|
platform: watchOS
|
|
sources:
|
|
- path: Shared
|
|
- path: Workouts Watch App
|
|
excludes:
|
|
- "Resources/Info-*.plist"
|
|
- "Resources/*.entitlements"
|
|
dependencies:
|
|
- package: IndieSync
|
|
- target: Workouts Watch Widget
|
|
embed: true
|
|
postBuildScripts: *updateBuildInfo
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: dev.rzen.indie.Workouts.watchkitapp
|
|
INFOPLIST_FILE: "Workouts Watch App/Resources/Info-watchOS.plist"
|
|
CODE_SIGN_ENTITLEMENTS: "Workouts Watch App/Resources/Workouts-watchOS.entitlements"
|
|
GENERATE_INFOPLIST_FILE: false
|
|
SWIFT_STRICT_CONCURRENCY: complete
|
|
WATCHOS_DEPLOYMENT_TARGET: "26.0"
|
|
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
|
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME: AccentColor
|
|
TARGETED_DEVICE_FAMILY: "4"
|
|
DEVELOPMENT_ASSET_PATHS: "\"Workouts Watch App/Preview Content\""
|
|
scheme:
|
|
testTargets:
|
|
- Workouts Watch AppTests
|
|
|
|
# ---- watchOS unit tests (bridge apply/prune seam + watch-side helpers) ------
|
|
Workouts Watch AppTests:
|
|
type: bundle.unit-test
|
|
platform: watchOS
|
|
sources:
|
|
- Workouts Watch AppTests
|
|
dependencies:
|
|
- target: Workouts Watch App
|
|
- package: IndieSync
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: dev.rzen.indie.Workouts.watchkitapp.tests
|
|
GENERATE_INFOPLIST_FILE: true
|
|
SWIFT_STRICT_CONCURRENCY: complete
|
|
WATCHOS_DEPLOYMENT_TARGET: "26.0"
|
|
|
|
# ---- watchOS widget extension (a launcher complication for the watch face) --
|
|
Workouts Watch Widget:
|
|
type: app-extension
|
|
platform: watchOS
|
|
sources:
|
|
- path: Workouts Watch Widget
|
|
excludes:
|
|
- "Resources/Info-*.plist"
|
|
postBuildScripts: *updateBuildInfo
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: dev.rzen.indie.Workouts.watchkitapp.widget
|
|
INFOPLIST_FILE: "Workouts Watch Widget/Resources/Info-WatchWidget.plist"
|
|
GENERATE_INFOPLIST_FILE: false
|
|
SWIFT_STRICT_CONCURRENCY: complete
|
|
WATCHOS_DEPLOYMENT_TARGET: "26.0"
|
|
TARGETED_DEVICE_FAMILY: "4"
|
|
|
|
# ---- iOS widget extension (the active-workout Live Activity: lock screen + Dynamic Island) --
|
|
Workouts Widget:
|
|
type: app-extension
|
|
platform: iOS
|
|
sources:
|
|
- path: Workouts Widget
|
|
excludes:
|
|
- "Resources/Info-*.plist"
|
|
postBuildScripts: *updateBuildInfo
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: dev.rzen.indie.Workouts.widget
|
|
INFOPLIST_FILE: "Workouts Widget/Resources/Info-Widget.plist"
|
|
GENERATE_INFOPLIST_FILE: false
|
|
SWIFT_STRICT_CONCURRENCY: complete
|
|
IPHONEOS_DEPLOYMENT_TARGET: "26.0"
|
|
TARGETED_DEVICE_FAMILY: "1"
|