- admin-web-docker.yml: add 'test' job (Node 22, npm ci, tsc --noEmit,
vitest run) gated by the anti-[skip ci] guard, wire needs: [test] on
build-validation and semantic-release, and needs: [semantic-release, test]
on build-and-push. Tests now run as a gate before Docker build validation
on PRs and before semantic-release on main.
- ci.yml: drop the redundant admin-web-test job (now covered by the test
job in admin-web-docker.yml on PRs), remove the admin-web path filter
and output from the changes job, simplify deploy-functions.needs.
- scripts/verify-admin-web-docker.sh: update check_workflow_jobs to expect
4 jobs (test + build-validation + semantic-release + build-and-push) and
check_workflow_needs to expect build-and-push needs [semantic-release, test]
so the verify script stays green with the new job topology.
- vitest.config.ts: add explicit exclude (e2e/**, playwright-report/**,
test-results/**) spread with configDefaults.exclude to keep
node_modules/dist filtering intact
- app/page.test.tsx: waitFor for async stats resolution, replace
getAllByRole('article') with 'a [data-slot=card]' scoped queries
(Getting Started card has no icon so we scope to the 3 stat cards inside
<Link>), drop console.error assertion (production fetchStats destructures
{ count } from the resolved payload without throwing on
{ count: null, error }, so console.error is never called on that path)
- components/workout-form.test.tsx: mock sonner (toast.error/success with
all methods stubbed) to replace obsolete window.alert assertions, wait for
the custom Select trainer dropdown to mount before clicking, fill the
exercise-name-0 input (default exercises state is [{name:""}] which fails
validation), make insert/update mocks resolve on a macrotask so React can
render the transient 'Saving...' loading state
- app/login/page.test.tsx: replace getByRole('heading') with getByText
(shadcn CardTitle renders a <div>, not a semantic heading), extend sonner
mock with toast.error, fix invalid-credentials mock to return a real
Error instance (production supabase-js returns AuthError extends Error,
so the err instanceof Error branch surfaces the real message)
- components/ui/dialog.test.tsx: skip jsdom-incompatible click-outside test
(Radix Dialog closes via pointerDown on overlay, not reproducible in jsdom;
covered by the Escape test + Playwright E2E), replace aria-modal assertion
with role=dialog + aria-labelledby (modern Radix no longer emits aria-modal)
Scope: tests + config only. No production code change.
Update AGENTS.md and docs/ci-cd-setup.md from .gitea/workflows to .github/workflows
Add *.xcuserstate to .gitignore
Remove tracked UserInterfaceState.xcuserstate from git (preserve on disk)
STOPGAP: CODE_SIGN_IDENTITY="-" CODE_SIGNING_REQUIRED=NO to bypass
signing on the Mac CI runner which has no Apple account signed into Xcode.
REAL FIX: Sign into Xcode → Settings → Accounts with the Apple Developer
account on the Mac runner machine. Then -allowProvisioningUpdates +
DEVELOPMENT_TEAM will auto-provision profiles for any bundle IDs.
- Supprime TOUT DerivedData (pas seulement TabataGo-*) car le changement
de bundle ID (com.tabatago.app → fr.millianlmx.tabatago) a rendu les
anciens caches SPM incohérents
- Ajoute la suppression de ~/Library/org.swift.swiftpm, ~/.swiftpm,
~/Library/Caches/com.apple.dt.Xcode et du ModuleCache
- Supprime les build/ locaux et .build avant xcodegen generate
- Supprime les Package.resolved stale
- Utilise -derivedDataPath et -clonedSourcePackagesDirPath cohérents
entre la résolution SPM et le build
- Change PostHog from exactVersion to revision (tag 3.62.0) in project.yml
- Add deep cache clean step before xcodegen in CI workflow
- Add ONLY_ACTIVE_ARCH=NO to xcodebuild command
- Wrap PostHog usage in #if canImport(PostHog) for graceful degradation
- Add Package.resolved, .build/, DerivedData/ to .gitignore
- Remove stale SPM caches between CI runs (DerivedData, swiftpm caches, act cache)
Xcode demands -scheme when using -derivedDataPath or -clonedSourcePackagesDirPath.
Since we use -target TabataGo, these flags must be removed.
Changes:
- Removed -derivedDataPath and -clonedSourcePackagesDirPath from build command
- Moved SWIFT_ENABLE_EXPLICIT_MODULES=NO to its own line for clarity
- Updated Package IPA step to search from repo root (find ..) with explicit
TabataGo.app name instead of relying on the old derived data path
xcodegen 2.45.4 does not generate a "TabataGo" scheme (only
RevenueCatUI, RevenueCatUITests, TabataGoUITests). The -scheme flag
therefore fails. Reverting to -target TabataGo as was previously used.
Verified: all .accessoryCorner usages in TabataGoComplication.swift are
properly guarded with #if canImport(WatchKit), so the watch target
transitive dependency build will not surface accessoryCorner issues.
- Remove destructive clean step that causes corruption when dirs are in use
- Add -derivedDataPath to isolate CI build from user Xcode cache
- Add -clonedSourcePackagesDirPath to isolate SPM clones
- Fix Package IPA step to use new isolated derived data path
- Replace #if os(watchOS) with #if canImport(WatchKit) for all .accessoryCorner
usages. When the CI builds with forced iphoneos SDK, os(watchOS) evaluates
to true (target platform is watchOS) but the SDK doesn't have WatchKit, so
accessoryCorner is unavailable. canImport(WatchKit) correctly checks SDK
availability rather than target platform.
- Wrap CornerComplicationView struct and its preview in #if canImport(WatchKit)
with @available(watchOS 10.0, *) annotation.
- Change CI build from -target TabataGo -sdk iphoneos to -scheme TabataGo
(without -sdk). This lets xcodebuild pick the correct SDK per target:
iphoneos for iOS, watchos for watchOS. The scheme already exists in
project.yml.