mirror of
https://github.com/selfxyz/self.git
synced 2026-02-19 02:24:25 -05:00
* update lock * fix types * bump version * fix nested react requires * fix heavy tests * address fake mocks * fix test * remove last borked react test
241 lines
7.3 KiB
Markdown
241 lines
7.3 KiB
Markdown
# 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
|
|
|
|
## Recommended Workflow
|
|
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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:**
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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:
|
|
```bash
|
|
# 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.
|