Files
self/app/AGENTS.md
Justin Hernandez c50db06eee dev fixes for release 2.9.1 (#1428)
* update lock

* fix types

* bump version

* fix nested react requires

* fix heavy tests

* address fake mocks

* fix test

* remove last borked react test
2025-11-18 21:01:02 -03:00

7.3 KiB

AGENTS Instructions

Prerequisites

  • Node.js 22.x (nvm use), Yarn via Corepack (corepack enable && corepack prepare yarn@stable --activate)
  • macOS/iOS:
    • Xcode and Command Line Tools, CocoaPods (Ruby installed)
    • From app/ios: bundle install && bundle exec pod install or from app: npx pod-install
  • Android:
    • Android SDK + Emulator, ANDROID_HOME configured, JDK 17 (set JAVA_HOME)
  • Helpful: Watchman (macOS), yarn install at repo root

Pre-PR Checklist

Before creating a PR for the mobile app:

Code Quality

  • yarn nice passes (fixes linting and formatting)
  • yarn types passes (TypeScript validation)
  • yarn test passes (unit tests)
  • No nested require('react-native') calls in tests (causes OOM in CI) - check with grep -r "require('react-native')" app/tests/ and verify no nested patterns
  • App builds successfully on target platforms

Mobile-Specific Validation

  • iOS build succeeds: yarn ios (simulator)
  • Android build succeeds: yarn android (emulator/device)
  • Web build succeeds: yarn web
  • No sensitive data in logs (PII, credentials, tokens)
  • Environment variables properly configured (check .env setup)
  • E2E tests run in CI (not required locally - CI will run E2E tests automatically)

AI Review Preparation

  • Complex native module changes documented
  • Platform-specific code paths explained
  • Security-sensitive operations flagged
  • Performance implications noted (including test memory patterns if tests were modified)

Post-PR Validation

After PR creation:

Automated Checks

  • CI pipeline passes all stages
  • No new linting/formatting issues
  • Type checking passes
  • Build artifacts generated successfully

Mobile-Specific Checks

  • App launches without crashes
  • Core functionality works on target platforms
  • No memory leaks introduced (including test memory patterns - see Test Memory Optimization section)
  • Bundle size within acceptable limits
  • No nested require('react-native') calls in tests (causes OOM in CI)
  • Native modules work correctly (if native code was modified)
  • Platform-specific code paths tested (iOS/Android/Web)

Review Integration

  • Address CodeRabbitAI feedback
  • Resolve any security warnings
  • Confirm no sensitive data exposed
# Fix formatting and linting issues
yarn nice

# Lint source files
yarn lint

# Check types
yarn types

# Run tests
yarn test

Workflow Commands

Pre-PR Validation

# Run all checks before PR
yarn nice
yarn lint
yarn types
yarn test
yarn ios  # Test iOS build
yarn android  # Test Android build

Post-PR Cleanup

# After addressing review feedback
yarn nice  # Fix any formatting issues
yarn test  # Ensure tests still pass
yarn types # Verify type checking

Running the App

  • yarn ios - Run on iOS simulator (builds dependencies automatically)
  • yarn android - Run on Android emulator/device (builds dependencies automatically)
  • yarn web - Run web version

Development Tips

  • Use yarn build:deps to build all workspace dependencies before running the app
  • For iOS: Ensure Xcode scheme is set to "OpenPassport" (see memory)
  • For Android: Ensure emulator is running or device is connected before yarn android
  • Metro bundler starts automatically; use yarn start to run it separately

E2E Testing

The app uses Maestro for end-to-end testing. E2E tests run automatically in CI/CD pipelines - they are not required to run locally.

CI/CD E2E Testing

  • E2E tests run automatically in GitHub Actions workflows
  • iOS and Android E2E tests run on PRs and main branch
  • No local setup required - CI handles all E2E test execution

Local E2E Testing (Optional)

If you need to run E2E tests locally for debugging:

Prerequisites:

  • Maestro CLI installed: curl -Ls "https://get.maestro.mobile.dev" | bash
  • iOS: Simulator running or device connected
  • Android: Emulator running or device connected
  • App built and installed on target device/simulator

Running Locally:

# iOS E2E tests
yarn test:e2e:ios

# Android E2E tests
yarn test:e2e:android

# Or use the local test script (handles setup automatically)
./scripts/test-e2e-local.sh ios
./scripts/test-e2e-local.sh android

E2E Test Files:

  • iOS: tests/e2e/launch.ios.flow.yaml
  • Android: tests/e2e/launch.android.flow.yaml

Environment Variables

The app uses react-native-dotenv for environment configuration.

Setup

  • Create .env file in app/ directory (see .env.example if available)
  • Environment variables are loaded via @env import
  • For secrets: Use .env.secrets (gitignored) for local development
  • In CI: Environment variables are set in workflow files

Common Environment Variables

  • GOOGLE_SIGNIN_ANDROID_CLIENT_ID - Google Sign-In configuration
  • Various API endpoints and keys (check app/env.ts for full list)

Testing with Environment Variables

  • Tests use mocked environment variables (see jest.setup.js)
  • E2E tests use actual environment configuration
  • Never commit .env.secrets or sensitive values

Deployment

Mobile Deployment

The app uses Fastlane for iOS and Android deployment.

Deployment Commands

# Deploy both platforms (requires confirmation)
yarn mobile-deploy

# Deploy iOS only
yarn mobile-deploy:ios

# Deploy Android only
yarn mobile-deploy:android

# Force local deployment (for testing deployment scripts)
yarn mobile-local-deploy

Deployment Prerequisites

  • See app/docs/MOBILE_DEPLOYMENT.md for detailed deployment guide
  • Required secrets configured in CI/CD or .env.secrets for local
  • iOS: App Store Connect API keys, certificates, provisioning profiles
  • Android: Play Store service account, keystore

Deployment Checklist

  • Version bumped in package.json and app.json
  • Changelog updated
  • All unit tests pass (yarn test)
  • Build succeeds for target platform
  • Required secrets/environment variables configured
  • Fastlane configuration verified
  • CI E2E tests pass (automatically run in CI, no local action needed)

Test Memory Optimization

CRITICAL: Never create nested require('react') or require('react-native') calls in tests. This causes out-of-memory (OOM) errors in CI/CD pipelines that hide actual test failures.

Automated Enforcement

The project has multiple layers of protection:

  1. ESLint Rule: Blocks require('react') and require('react-native') in test files
  2. Pre-commit Script: Run node scripts/check-test-requires.cjs to validate
  3. CI Fast-Fail: GitHub Actions checks for nested requires before running tests

Quick Check

Before committing, verify no nested requires:

# Automated check (recommended)
node scripts/check-test-requires.cjs

# Manual check
grep -r "require('react')" app/tests/
grep -r "require('react-native')" app/tests/

Best Practices

  • Always use ES6 import statements - Never use require('react') or require('react-native') in test files
  • Put all imports at the top of the file - No dynamic imports in hooks
  • Avoid require() calls in beforeEach/afterEach hooks
  • React and React Native are already mocked in jest.setup.js - use imports in test files

Detailed Guidelines

See .cursor/rules/test-memory-optimization.mdc for comprehensive guidelines, examples, and anti-patterns.