Replace hardcoded "Failed to fetch usage" in the Dashboard tab with the
ErrorMessage component so errors like TOKEN_EXPIRED, HTTP 429, and network
failures display human-readable text consistent with the detail tabs.
Also improve HTTP error copy and add network-level error detection.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
expo-router's radix-ui deps require react-dom as a peer. The lock file
was previously generated with --legacy-peer-deps which omitted peer dep
entries, causing `npm ci` on CI to fail with "Missing from lock file".
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sdkmanager closes stdin once done; yes keeps writing and gets SIGPIPE
(exit 141), failing the step even though the NDK installed successfully.
Add || true to treat SIGPIPE as success.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Gradle's auto-download of the NDK was failing on the runner with
"Archive is not a ZIP archive" — the download was corrupted/unavailable.
Fix by explicitly installing the NDK via sdkmanager after setup-android
so it is present in $ANDROID_HOME before gradlew runs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
SDK 53+ removed push notification support from Expo Go, causing the
module to throw at require-time. The static import in notifications.ts
propagated the error to _layout.tsx and both tab screens, making expo-
router report missing default exports and crash the app.
Switch to a try/catch require() so the module initialises safely in
Expo Go (Notifications stays null, all functions become no-ops) while
still working correctly in EAS / development builds.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
react-dom@19.2.7 requires react@^19.2.7; the project had 19.2.3 which
caused an ERESOLVE conflict on npm install.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Onboarding flow (welcome -> Codex setup -> Claude setup -> done) with
dark-themed screens and step indicators; completion stored in SecureStore
- Smart root redirect checks onboarding state on launch
- Dashboard tab shows both services at a glance via ServiceStatusCard;
useFocusEffect + reload() keeps it fresh when credentials change in tabs
- Settings tab manages credentials and exposes re-run setup wizard
- Polished Codex and Claude detail screens with service headers and empty states
- 4-tab layout (Home, Codex, Claude, Settings) with dark-mode tab bar
- Both hooks gain reload() for cross-tab credential refresh
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>