Skip to content

Conversation

@Masked-Kunsiquat
Copy link
Owner

@Masked-Kunsiquat Masked-Kunsiquat commented Dec 28, 2025

Set up comprehensive end-to-end testing and demo generation system using Maestro for automated UI testing and creating marketing materials.

Infrastructure:

  • Add .maestro/demo-flow.yaml - 30-second feature showcase flow
  • Add E2E build profile to eas.json for Android/iOS test builds
  • Add npm scripts for E2E workflow (e2e:build, e2e:test, e2e:demo)

Documentation:

  • Add .maestro/README.md - Complete guide (setup, usage, optimization)
  • Add .maestro/QUICKSTART.md - 3-step quick start guide
  • Update CLAUDE.md with E2E commands

Helper Scripts:

  • Add .maestro/convert-to-gif.sh - Bash script for video→GIF conversion (macOS/Linux)
  • Add .maestro/convert-to-gif.bat - Windows batch script for conversion
  • Add .maestro/.gitignore - Exclude recordings, keep configs

Demo Flow Features:

  • Quick trip creation demo ("Coffee Run")
  • Weekend Ski Trip sample data showcase
  • Expense browsing with scroll
  • Settlement recommendations display
  • Statistics with pie charts & participant breakdown
  • Participant detail view with toggle interaction
  • All element selectors based on actual UI code (no guessing!)

🎬 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added end-to-end testing and demo-generation workflows (cloud and local) with an automated demo scenario and CI workflow to build and run E2E runs.
  • Documentation

    • Added comprehensive guides for E2E testing, local setup, demo recording, converting recordings to optimized GIFs, troubleshooting, tips, and quick-reference commands.
  • Chores

    • Added helper scripts and npm/build config entries to support running and converting demos locally and in CI.
  • Other

    • Updated ignore rules to exclude common media/temp recording files.

✏️ Tip: You can customize this high-level summary in your review settings.

Set up comprehensive end-to-end testing and demo generation system using Maestro for automated UI testing and creating marketing materials.

**Infrastructure:**
- Add `.maestro/demo-flow.yaml` - 30-second feature showcase flow
- Add E2E build profile to `eas.json` for Android/iOS test builds
- Add npm scripts for E2E workflow (`e2e:build`, `e2e:test`, `e2e:demo`)

**Documentation:**
- Add `.maestro/README.md` - Complete guide (setup, usage, optimization)
- Add `.maestro/QUICKSTART.md` - 3-step quick start guide
- Update `CLAUDE.md` with E2E commands

**Helper Scripts:**
- Add `.maestro/convert-to-gif.sh` - Bash script for video→GIF conversion (macOS/Linux)
- Add `.maestro/convert-to-gif.bat` - Windows batch script for conversion
- Add `.maestro/.gitignore` - Exclude recordings, keep configs

**Demo Flow Features:**
- Quick trip creation demo ("Coffee Run")
- Weekend Ski Trip sample data showcase
- Expense browsing with scroll
- Settlement recommendations display
- Statistics with pie charts & participant breakdown
- Participant detail view with toggle interaction
- All element selectors based on actual UI code (no guessing!)

🎬 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 28, 2025

📝 Walkthrough

Walkthrough

Adds Maestro E2E demo infrastructure: demo flow, conversion scripts, docs, CI workflow, an EAS e2e build profile, npm scripts, and .maestro/.gitignore updates to exclude media while preserving flow/docs files.

Changes

Cohort / File(s) Summary
Maestro ignore & flow
.maestro/.gitignore, .maestro/demo-flow.yaml
Update ignore rules to exclude common media/temp files while whitelisting README/QUICKSTART and flow files; add demo-flow.yaml defining four demo scenes and scripted UI interactions for recording.
Maestro docs & quickstart
.maestro/README.md, .maestro/QUICKSTART.md, .maestro/local-setup.md, CLAUDE.md
Add comprehensive docs covering E2E testing and demo generation, prerequisites, local vs EAS Cloud workflows, conversion commands, tips, troubleshooting, and quick reference commands.
Conversion utilities
.maestro/convert-to-gif.sh, .maestro/convert-to-gif.bat
Add Bash and Windows scripts to convert MP4 recordings to optimized GIFs using ffmpeg (palette generation + paletteuse) with optional gifsicle optimization, size reporting, and GitHub-size warnings.
Build profile & CI workflow
eas.json, .eas/workflows/e2e-test-android.yml
Add new e2e-test EAS build profile (android apk, ios simulator, E2E_ENABLED=true) and a GitHub Actions workflow that builds the APK and runs Maestro tests, passing build outputs between jobs.
NPM scripts
package.json
Add npm scripts for E2E/demo tasks (e.g., e2e:cloud, e2e:local, e2e:demo) to orchestrate build/test/demo flows.

Sequence Diagram(s)

sequenceDiagram
    autonumber
    actor Developer
    participant CI as GitHub Actions
    participant EAS as EAS Build Service
    participant Maestro as Maestro Runner
    participant Device as Device/Simulator
    participant FS as Filesystem
    participant FFmpeg as ffmpeg

    Developer->>CI: push / workflow_dispatch
    CI->>EAS: build using "e2e-test" profile
    EAS-->>CI: build_id + APK artifact
    CI->>Maestro: run demo-flow.yaml (provide APK/artifact)
    Maestro->>Device: install APK & execute scripted interactions
    Device->>Maestro: UI events / responses
    Maestro->>FS: save recording.mp4
    Developer->>FS: fetch recording.mp4
    Developer->>FFmpeg: run .maestro/convert-to-gif(.sh/.bat)
    FFmpeg-->>FS: write demo.gif (optionally gifsicle optimize)
    FS-->>Developer: demo.gif (size report / warnings)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Pre-merge checks

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat: add E2E testing infrastructure with Maestro' accurately and concisely summarizes the main change—adding end-to-end testing infrastructure using Maestro. It is specific, clear, and directly reflects the core objective of the changeset.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (4)
CLAUDE.md (1)

55-72: Consider mentioning Docker requirement.

The E2E build commands (e2e:build:android and e2e:build:ios) require Docker Desktop to be installed and running due to the --local flag in EAS builds. This prerequisite is not documented here or in QUICKSTART.md.

Consider adding a brief note:

### E2E Testing & Demo Generation

The project uses Maestro for end-to-end testing and creating demo videos/GIFs:

**Prerequisites**: Docker Desktop must be running for local builds.

```bash
npm run e2e:build:android   # Build E2E test APK (requires Docker)
...

</blockquote></details>
<details>
<summary>.maestro/demo-flow.yaml (2)</summary><blockquote>

`10-11`: **Consider testing flow without `clearState` for existing data scenarios.**

`clearState: true` ensures consistent demo runs but doesn't test the real-world scenario where users already have data. Consider creating a separate flow without `clearState` to verify the app handles existing data gracefully.



You could add a variant flow:
```yaml
# demo-flow-with-data.yaml
appId: com.crewsplit.app
---
# Test with existing user data
- launchApp:
    clearState: false

64-66: Consider adding optional: true to index-based taps.

Index-based element selection (index: 0) can fail if the list is empty or reordered. Adding optional: true would make the flow more resilient:

- tapOn:
    index: 0
    optional: true

This prevents the entire flow from failing if specific items aren't present, which is especially useful for demo recordings.

Based on .maestro/QUICKSTART.md line 150, which already mentions this pattern.

Also applies to: 107-109, 138-140

.maestro/README.md (1)

129-129: Wrap bare URLs in markdown link syntax.

Lines 129, 134, 302, and 365–369 contain bare URLs that should be wrapped in markdown link format for proper rendering and accessibility:

[text](url)

For example, line 129 should be:

1. **Ezgif.com** - [https://ezgif.com/video-to-gif](https://ezgif.com/video-to-gif)
🔎 Proposed fixes for bare URLs
# Line 129
-1. **Ezgif.com** - https://ezgif.com/video-to-gif
+1. **Ezgif.com** - [https://ezgif.com/video-to-gif](https://ezgif.com/video-to-gif)

# Line 134
-2. **CloudConvert** - https://cloudconvert.com/mp4-to-gif
+2. **CloudConvert** - [https://cloudconvert.com/mp4-to-gif](https://cloudconvert.com/mp4-to-gif)

# Line 302
-**Full docs**: https://maestro.dev/reference/commands
+**Full docs**: [https://maestro.dev/reference/commands](https://maestro.dev/reference/commands)

# Lines 365-369 (Resources section)
-**Maestro Docs**: https://maestro.dev/
-**Maestro CLI Reference**: https://maestro.dev/reference/cli
-**FFmpeg Docs**: https://ffmpeg.org/documentation.html
-**Gifski**: https://gif.ski/
-**EAS Workflows**: https://docs.expo.dev/eas/workflows/
+**Maestro Docs**: [https://maestro.dev/](https://maestro.dev/)
+**Maestro CLI Reference**: [https://maestro.dev/reference/cli](https://maestro.dev/reference/cli)
+**FFmpeg Docs**: [https://ffmpeg.org/documentation.html](https://ffmpeg.org/documentation.html)
+**Gifski**: [https://gif.ski/](https://gif.ski/)
+**EAS Workflows**: [https://docs.expo.dev/eas/workflows/](https://docs.expo.dev/eas/workflows/)

Also applies to: 134-134, 302-302, 365-369

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between d8301f5 and ab483c3.

📒 Files selected for processing (9)
  • .maestro/.gitignore
  • .maestro/QUICKSTART.md
  • .maestro/README.md
  • .maestro/convert-to-gif.bat
  • .maestro/convert-to-gif.sh
  • .maestro/demo-flow.yaml
  • CLAUDE.md
  • eas.json
  • package.json
🧰 Additional context used
🧠 Learnings (3)
📚 Learning: 2025-12-22T00:54:41.130Z
Learnt from: CR
Repo: Masked-Kunsiquat/CrewSplit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-22T00:54:41.130Z
Learning: Update `version` in both `package.json` and `app.json` to trigger automated GitHub workflows for versioning, auto-tagging, EAS builds, and releases

Applied to files:

  • package.json
📚 Learning: 2025-12-22T00:54:41.130Z
Learnt from: CR
Repo: Masked-Kunsiquat/CrewSplit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-22T00:54:41.130Z
Learning: Use Expo development commands: `npm start` for dev server, `npm run android` for Android, `npm run ios` for iOS, and use `npm run type-check` for TypeScript verification and `npm run lint` for ESLint

Applied to files:

  • package.json
📚 Learning: 2025-12-22T00:54:41.130Z
Learnt from: CR
Repo: Masked-Kunsiquat/CrewSplit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-22T00:54:41.130Z
Learning: Applies to src/**/*.{ts,tsx,js,jsx} : Label files/functions with the responsible agent role (SYSTEM ARCHITECT, MODELER, UI/UX ENGINEER, LOCAL DATA ENGINEER, SETTLEMENT INTEGRATION ENGINEER, DISPLAY INTEGRATION ENGINEER, QA + TESTING ENGINEER, DOCUMENTATION ENGINEER) in header comments

Applied to files:

  • CLAUDE.md
🪛 LanguageTool
.maestro/README.md

[grammar] ~122-~122: Ensure spelling is correct
Context: ...s explained**: - fps=15 - Frame rate (15fps = smooth, smaller than 30fps) - `scale=...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~123-~123: Ensure spelling is correct
Context: ...er than 30fps) - scale=720:-1 - Width 720px, height auto-scaled - loop=0 - Infini...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~163-~163: Ensure spelling is correct
Context: ...educing File Size 1. Lower FPS: 10-15fps instead of 20+ ```bash ffmpeg -i record...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

.maestro/QUICKSTART.md

[style] ~188-~188: Using many exclamation marks might seem excessive (in this case: 3 exclamation marks for a text that’s 1869 characters long)
Context: ...o-flow.yaml` | --- 🎬 Happy Demo-ing!

(EN_EXCESSIVE_EXCLAMATION)

🪛 markdownlint-cli2 (0.18.1)
.maestro/README.md

129-129: Bare URL used

(MD034, no-bare-urls)


134-134: Bare URL used

(MD034, no-bare-urls)


302-302: Bare URL used

(MD034, no-bare-urls)


365-365: Bare URL used

(MD034, no-bare-urls)


366-366: Bare URL used

(MD034, no-bare-urls)


367-367: Bare URL used

(MD034, no-bare-urls)


368-368: Bare URL used

(MD034, no-bare-urls)


369-369: Bare URL used

(MD034, no-bare-urls)

🔇 Additional comments (4)
.maestro/.gitignore (1)

1-12: LGTM! Clean gitignore rules.

The ignore patterns correctly exclude generated media files while preserving documentation and configuration. The negation patterns ensure essential files remain tracked.

.maestro/convert-to-gif.sh (1)

1-103: LGTM! Well-structured conversion script.

The script handles multiple scenarios gracefully:

  • Cross-platform stat command fallback (BSD/GNU)
  • Auto-discovery of latest Maestro recording
  • Optional gifsicle optimization
  • GitHub size limit warnings with helpful suggestions

The ffmpeg command uses best practices (palette generation, lanczos scaling) for high-quality GIF output.

.maestro/convert-to-gif.bat (1)

1-82: LGTM! Windows equivalent works correctly.

The batch script provides equivalent functionality to the Bash version with proper Windows-specific handling:

  • where command for ffmpeg detection
  • Delayed expansion for variables
  • Proper error level checking
  • GitHub size limit warnings

Good cross-platform coverage.

.maestro/README.md (1)

1-392: Excellent comprehensive E2E testing documentation.

This README effectively documents the Maestro infrastructure with clear structure, step-by-step instructions, multiple alternatives (online tools, ffmpeg, gifski), detailed optimization guidance, troubleshooting, and a quick reference. The sections on video conversion, GIF optimization, demo speed adjustment, and EAS Cloud integration are particularly thorough and valuable for developers.

Code examples are well-formatted, command syntax is correct, and the progression from quick start through advanced topics (CI/CD, customization) is logical and helpful.

Comment on lines 5 to 28
## Prerequisites

1. **Install Maestro CLI**
```bash
curl -Ls "https://get.maestro.mobile.dev" | bash
```

2. **Install ffmpeg** (for GIF conversion)
```bash
# macOS
brew install ffmpeg

# Ubuntu/Debian
sudo apt install ffmpeg

# Windows
choco install ffmpeg
```

3. **Optional: Install gifsicle** (for optimization)
```bash
brew install gifsicle # macOS
sudo apt install gifsicle # Ubuntu
```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add Docker Desktop to prerequisites.

Step 1 of the quick start runs npm run e2e:build:android, which uses eas build --local. This requires Docker Desktop to be installed and running, but Docker is not listed in the prerequisites.

🔎 Suggested addition
 ## Prerequisites
 
+0. **Install Docker Desktop** (for local EAS builds)
+   ```bash
+   # Download from: https://www.docker.com/products/docker-desktop
+   # Must be running before building
+   ```
+
 1. **Install Maestro CLI**
    ```bash
    curl -Ls "https://get.maestro.mobile.dev" | bash
    ```
🤖 Prompt for AI Agents
.maestro/QUICKSTART.md around lines 5 to 28: Docker Desktop is missing from the
prerequisites but is required because the quick start runs npm run
e2e:build:android which uses eas build --local and requires Docker to be
installed and running. Update the Prerequisites section to add Docker Desktop
installation and a note that it must be running before building; include a link
to https://www.docker.com/products/docker-desktop and platform hints (download
link and “must be running before building”) so users know to install and start
Docker prior to running the build.

package.json Outdated
Comment on lines 17 to 18
"e2e:build:android": "eas build --profile e2e-test --platform android --local",
"e2e:build:ios": "eas build --profile e2e-test --platform ios --local",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Document Docker requirement for local EAS builds.

The --local flag requires Docker to be installed and running. This prerequisite is not mentioned in .maestro/QUICKSTART.md or other documentation, which could lead to confusing errors for users attempting to run these commands.

Consider adding a note to the documentation:

## Prerequisites

1. **Docker Desktop** (for local EAS builds)
   - Download from https://www.docker.com/products/docker-desktop
   - Must be running before executing build commands
🤖 Prompt for AI Agents
In package.json around lines 17 to 18, the npm scripts use the EAS CLI --local
flag which requires Docker to be installed and running; update the project
documentation (for example .maestro/QUICKSTART.md and any relevant README) to
add a Prerequisites section noting Docker Desktop is required for local EAS
builds, include download link (https://www.docker.com/products/docker-desktop)
and explicit instruction that Docker must be running before executing the
e2e:build:android and e2e:build:ios commands.

Update E2E infrastructure to run Maestro tests on EAS cloud instead of requiring local Docker builds.

**EAS Workflow Configuration:**
- Add `.eas/workflows/e2e-test-android.yml` - Workflow for automated E2E testing
- Tests trigger automatically on PRs to `main` or `expo-e2e` branches
- Can be manually triggered via `npm run e2e:cloud`
- No Docker or local builds required - runs entirely on EAS infrastructure

**Build Profile Updates:**
- Update `eas.json` e2e-test profile with `withoutCredentials: true` for cloud execution
- Simplify profile by removing unnecessary gradle commands and distribution settings
- Change env var from `DETOX_ENABLED` to `E2E_ENABLED` for clarity

**Package Scripts:**
- Replace `e2e:build:android`/`e2e:build:ios` with `e2e:cloud` (cloud execution)
- Rename `e2e:test` to `e2e:local` (local Maestro execution)
- Keep `e2e:demo` for local video recording

**Documentation Updates:**
- Update `.maestro/README.md` with EAS cloud workflow instructions
- Update `.maestro/QUICKSTART.md` to prioritize cloud execution
- Update `CLAUDE.md` with new E2E commands and cloud-first approach
- Emphasize "no Docker required" throughout docs

**Key Benefits:**
- ✅ No Docker Desktop required (addresses resource concerns)
- ✅ No local builds needed
- ✅ Automatic execution on pull requests
- ✅ Integrated with EAS dashboard for results

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between ab483c3 and e82cfe2.

📒 Files selected for processing (6)
  • .eas/workflows/e2e-test-android.yml
  • .maestro/QUICKSTART.md
  • .maestro/README.md
  • CLAUDE.md
  • eas.json
  • package.json
🚧 Files skipped from review as they are similar to previous changes (2)
  • CLAUDE.md
  • eas.json
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-12-22T00:54:41.130Z
Learnt from: CR
Repo: Masked-Kunsiquat/CrewSplit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-22T00:54:41.130Z
Learning: Use Expo development commands: `npm start` for dev server, `npm run android` for Android, `npm run ios` for iOS, and use `npm run type-check` for TypeScript verification and `npm run lint` for ESLint

Applied to files:

  • package.json
🪛 LanguageTool
.maestro/QUICKSTART.md

[style] ~213-~213: Using many exclamation marks might seem excessive (in this case: 4 exclamation marks for a text that’s 2079 characters long)
Context: ...o-flow.yaml` | --- 🎬 Happy Demo-ing!

(EN_EXCESSIVE_EXCLAMATION)

.maestro/README.md

[grammar] ~115-~115: Ensure spelling is correct
Context: ...s explained**: - fps=15 - Frame rate (15fps = smooth, smaller than 30fps) - `scale=...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~116-~116: Ensure spelling is correct
Context: ...er than 30fps) - scale=720:-1 - Width 720px, height auto-scaled - loop=0 - Infini...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~156-~156: Ensure spelling is correct
Context: ...educing File Size 1. Lower FPS: 10-15fps instead of 20+ ```bash ffmpeg -i record...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🪛 markdownlint-cli2 (0.18.1)
.maestro/README.md

30-30: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


43-43: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


53-53: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


122-122: Bare URL used

(MD034, no-bare-urls)


127-127: Bare URL used

(MD034, no-bare-urls)


307-307: Bare URL used

(MD034, no-bare-urls)


370-370: Bare URL used

(MD034, no-bare-urls)


371-371: Bare URL used

(MD034, no-bare-urls)


372-372: Bare URL used

(MD034, no-bare-urls)


373-373: Bare URL used

(MD034, no-bare-urls)


374-374: Bare URL used

(MD034, no-bare-urls)

🔇 Additional comments (2)
package.json (1)

17-19: LGTM! Cloud-first E2E approach is well-structured.

The new npm scripts provide clear separation between cloud execution (e2e:cloud), local testing (e2e:local), and demo recording (e2e:demo). This aligns well with the PR's cloud-first strategy and eliminates the need for Docker in typical workflows.

.eas/workflows/e2e-test-android.yml (1)

1-22: LGTM! Well-structured EAS workflow for automated E2E testing.

The workflow correctly orchestrates the build and test phases:

  • Triggers appropriately on PRs and manual dispatch
  • build_android_for_e2e produces the APK using the e2e-test profile
  • maestro_test consumes the build output and executes the demo flow
  • Job dependency chain ensures proper execution order


| Task | Command |
|------|---------|
| Build E2E app | `npm run e2e:build:android` |
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Update quick reference to use existing npm scripts.

Line 205 references npm run e2e:build:android, but this script no longer exists in package.json. According to the PR objectives, local build scripts were replaced with e2e:cloud for the cloud-first approach.

🔎 Proposed fix
 | Task | Command |
 |------|---------|
-| Build E2E app | `npm run e2e:build:android` |
+| Run E2E on cloud | `npm run e2e:cloud` |
 | Run demo flow | `npm run e2e:demo` |
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
| Build E2E app | `npm run e2e:build:android` |
| Run E2E on cloud | `npm run e2e:cloud` |
🤖 Prompt for AI Agents
In .maestro/QUICKSTART.md around line 205 the quick reference lists a
non-existent npm script `npm run e2e:build:android`; update that table entry to
reference the current script `npm run e2e:cloud` (or the exact existing e2e
cloud script name used in package.json) so the docs match the repo, and ensure
any surrounding explanatory text reflects the cloud-first approach.

Comment on lines +354 to +355
// Only for E2E/demo builds
if (process.env.DETOX_ENABLED === 'true') {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Update environment variable reference to match the renamed constant.

The code snippet references process.env.DETOX_ENABLED, but according to the PR objectives, this environment variable was renamed to E2E_ENABLED in this PR.

🔎 Proposed fix
-// Only for E2E/demo builds
-if (process.env.DETOX_ENABLED === 'true') {
+// Only for E2E/demo builds
+if (process.env.E2E_ENABLED === 'true') {
   const { loadSampleTrip } = useSampleData();
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Only for E2E/demo builds
if (process.env.DETOX_ENABLED === 'true') {
// Only for E2E/demo builds
if (process.env.E2E_ENABLED === 'true') {
const { loadSampleTrip } = useSampleData();
🤖 Prompt for AI Agents
In .maestro/README.md around lines 354 to 355 the README still references
process.env.DETOX_ENABLED; update this to process.env.E2E_ENABLED to match the
renamed environment variable in the PR. Edit the snippet so the conditional uses
process.env.E2E_ENABLED === 'true' and update any adjacent explanatory text to
reference E2E_ENABLED where applicable.

Comment on lines +378 to +397
## Quick Reference: End-to-End Workflow

```bash
# 1. Build E2E app
eas build --profile e2e-test --platform android --local
# 2. Run Maestro flow with recording
maestro test .maestro/demo-flow.yaml --app app.apk
# 3. Convert to GIF
ffmpeg -i ~/.maestro/tests/latest/recording.mp4 \
-vf "fps=15,scale=720:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
-loop 0 \
demo.gif
# 4. Optimize GIF
gifsicle -O3 --lossy=80 -o demo-optimized.gif demo.gif
# Done! 🎉
```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Update quick reference to reflect cloud-first workflow.

The "Quick Reference: End-to-End Workflow" section shows a local build workflow using eas build --local (line 382), which contradicts the PR's cloud-first approach and requires Docker. This conflicts with the documented benefits of "No Docker required" mentioned earlier in the file.

Consider updating this section to demonstrate the cloud-first workflow or clearly label it as "Alternative: Local Workflow (Requires Docker)".

🔎 Proposed fix to align with cloud-first approach
 ## Quick Reference: End-to-End Workflow
 
 ```bash
-# 1. Build E2E app
-eas build --profile e2e-test --platform android --local
+# 1. Run E2E tests on EAS cloud (recommended)
+npx eas-cli@latest workflow:run .eas/workflows/e2e-test-android.yml
 
-# 2. Run Maestro flow with recording
-maestro test .maestro/demo-flow.yaml --app app.apk
+# OR: Run locally for demo recording
+# 1. Start dev server
+npm start
 
-# 3. Convert to GIF
+# 2. Run Maestro with recording
+maestro test .maestro/demo-flow.yaml --format mp4
+
+# 3. Convert recording to GIF
 ffmpeg -i ~/.maestro/tests/latest/recording.mp4 \
   -vf "fps=15,scale=720:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
   -loop 0 \

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
.maestro/README.md around lines 378 to 397: the Quick Reference currently shows
a local EAS build and direct app.apk run which contradicts the repo's
cloud-first guidance; update the steps to show the cloud-first EAS workflow
(e.g., run the e2e workflow on EAS cloud via the appropriate eas workflow
command), then provide an explicit "OR: Local (requires Docker)" subsection that
shows local/demo steps: start the dev server (npm start), run maestro with
--format mp4 to produce a recording, then convert the produced recording to GIF
with ffmpeg and optionally optimize with gifsicle; ensure commands are labeled
so readers know the recommended cloud path vs the alternative local path and
remove the --local build example or move it under the "Local (requires Docker)"
label.

Maestro doesn't support 'wait: <milliseconds>' syntax. Removed all wait commands and rely on waitForAnimationToEnd instead, which is the recommended Maestro approach.
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
.eas/workflows/e2e-test-android.yml (1)

18-24: Consider adding timeout and notification configurations.

The Maestro test job could benefit from optional operational improvements:

  • Timeout configuration to prevent hung tests from blocking resources
  • Failure notifications (Slack, email, etc.) for better visibility
  • Retry logic for transient failures

These additions would improve the reliability and observability of your E2E testing pipeline.

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 229366b and ccce9d9.

📒 Files selected for processing (3)
  • .eas/workflows/e2e-test-android.yml
  • .maestro/demo-flow.yaml
  • .maestro/local-setup.md
✅ Files skipped from review due to trivial changes (1)
  • .maestro/local-setup.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • .maestro/demo-flow.yaml
🔇 Additional comments (2)
.eas/workflows/e2e-test-android.yml (2)

3-8: Verify the manual-only trigger aligns with your E2E testing strategy.

The PR trigger is commented out to save EAS build quota, meaning E2E tests will only run when manually triggered. This may be acceptable for initial rollout, but consider whether critical PRs should automatically run E2E tests before merge.


11-16: Configuration aligns with EAS workflow specification.

The type: build syntax with platform: android and profile: e2e-test parameters is correct per EAS documentation. The build job properly produces the build_id output, which is correctly referenced downstream by the maestro_test job.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants