Native SwiftUI workout tracker for iPhone with a SwiftData-backed offline workout log.
- Xcode 26+
- iOS Simulator runtime
- XcodeGen
- Generate project:
xcodegen generate - Build simulator app:
xcodebuild build -project Baros.xcodeproj -scheme Baros -destination generic/platform=iOS\ Simulator -derivedDataPath /private/tmp/codex-ios-app-derived-data - Run full XCTest suite:
xcodebuild test -project Baros.xcodeproj -scheme Baros -destination platform=iOS\ Simulator,name=iPhone\ 17,OS=26.0 -derivedDataPath /private/tmp/codex-ios-app-derived-data - Run unit tests only:
xcodebuild test -project Baros.xcodeproj -scheme BarosUnitTests -destination platform=iOS\ Simulator,name=iPhone\ 17,OS=26.0 -derivedDataPath /private/tmp/codex-ios-app-derived-data - Run UI tests only:
xcodebuild test -project Baros.xcodeproj -scheme Baros -destination platform=iOS\ Simulator,name=iPhone\ 17,OS=26.0 -only-testing:BarosUITests -derivedDataPath /private/tmp/codex-ios-app-derived-data
Pull requests and pushes to main run three GitHub Actions checks:
ios-unit-tests: builds theBarosUnitTestsscheme and runsBarosTests.ios-ui-smoke: runs four deterministic UI tests covering completed workout logging, workout/tab navigation, a settings-triggered sync request, and signed-out local-data reset.convex-checks: runs Convex Vitest coverage and Convex typecheck.
The UI smoke job intentionally selects only the four tests below instead of making the full BarosUITests target part of the required PR gate. Each selected test uses the UI suite's deterministic reset and in-memory launch helper. If either iOS job fails, first inspect the GitHub Actions log. The failed workflow run also uploads its .xcresult bundle and test log for local Xcode inspection.
Run the exact UI smoke shard locally with:
rm -rf /private/tmp/BarosUISmoke.xcresult
xcodebuild test \
-project Baros.xcodeproj \
-scheme Baros \
-destination 'platform=iOS Simulator,name=iPhone 17,OS=26.5' \
-only-testing:BarosUITests/BarosUITests/testLogWorkoutSmoke \
-only-testing:BarosUITests/BarosUITests/testTabNavigationAndFinishSheetSmoke \
-only-testing:BarosUITests/BarosUITests/testSettingsEditRequestsSyncInUITestMode \
-only-testing:BarosUITests/BarosUITests/testDeleteLocalDataReturnsToProfileAfterReset \
-derivedDataPath /private/tmp/baros-ui-smoke-derived-data \
-resultBundlePath /private/tmp/BarosUISmoke.xcresultThe command must execute exactly 4 tests with no failures. CI reads the result bundle and fails the smoke gate unless totalTestCount is exactly 4, so a stale selector cannot silently reduce coverage.
The canonical local UI-suite command is the Run UI tests only command above. Xcode 26.5 currently discovers 42 tests in BarosUITests; treat a run with fewer discovered or executed tests as partial coverage, not a clean full-suite result. Keep the full UI target out of the required PR gate until issue #63 establishes repeated full-suite stability.
Local equivalents:
xcodebuild test -project Baros.xcodeproj -scheme BarosUnitTests -destination platform=iOS\ Simulator,name=iPhone\ 17,OS=26.5 -derivedDataPath /private/tmp/codex-ios-app-derived-data
pnpm install --frozen-lockfile
pnpm run convex:test
pnpm run convex:typecheckConvex auth requires the Clerk JWT issuer domain to be configured on each Convex deployment. For the current development Clerk instance, set:
pnpm exec convex env set CLERK_JWT_ISSUER_DOMAIN 'https://glad-krill-22.clerk.accounts.dev'Then push the backend functions to the development deployment:
pnpm exec convex dev --onceDo not rely on a backend fallback for this value. Staging and production deployments should set their own Clerk issuer domain before deploying Convex functions.
Release builds point at the production Convex deployment:
https://sensible-reindeer-16.convex.cloudUse this section when preparing an App Store release candidate or troubleshooting production auth/sync. Routine app changes do not require running the full production smoke every time.
The production Clerk JWT template is configured for Convex:
- JWT issuer:
https://clerk.baros.fit - JWT audience:
convex
Verify the production Convex deployment uses the matching issuer domain:
pnpm exec convex env --prod get CLERK_JWT_ISSUER_DOMAINDeploy the current Convex functions to production:
pnpm exec convex deploy
pnpm exec convex function-spec --prodFor RC validation or production auth/sync troubleshooting, run a focused production smoke:
- Sign in with the production Clerk account flow from a Release or TestFlight build.
- Confirm Settings shows Sync Status: Up to date.
- Exercise the release smoke flow that needs Convex auth, such as account deletion.
- If a direct
authSmoke:mecheck is needed, run it from a Debug build temporarily pointed at the production Clerk and Convex values because Developer Diagnostics is Debug-only.
Record smoke-test evidence on the relevant release issue when the check is part of release validation.
This repo includes .xcodebuildmcp/config.yaml for agents that use XcodeBuildMCP.
Install XcodeBuildMCP locally and install its MCP server skill:
xcodebuildmcp init --client agents --skill mcpThen run project setup as needed:
xcodebuildmcp setupKeep physical device IDs and machine-specific simulator UUIDs in local session defaults. Do not commit them to the repo config.