-
Notifications
You must be signed in to change notification settings - Fork 0
feat: add E2E testing infrastructure with Maestro #96
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
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>
📝 WalkthroughWalkthroughAdds Maestro E2E demo infrastructure: demo flow, conversion scripts, docs, CI workflow, an EAS e2e build profile, npm scripts, and Changes
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)
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Pre-merge checks✅ Passed checks (3 passed)
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. Comment |
There was a problem hiding this 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:androidande2e:build:ios) require Docker Desktop to be installed and running due to the--localflag 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 addingoptional: trueto index-based taps.Index-based element selection (
index: 0) can fail if the list is empty or reordered. Addingoptional: truewould make the flow more resilient:- tapOn: index: 0 optional: trueThis prevents the entire flow from failing if specific items aren't present, which is especially useful for demo recordings.
Based on
.maestro/QUICKSTART.mdline 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.
📒 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.yamlCLAUDE.mdeas.jsonpackage.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:
wherecommand 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.
.maestro/QUICKSTART.md
Outdated
| ## 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 | ||
| ``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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
| "e2e:build:android": "eas build --profile e2e-test --platform android --local", | ||
| "e2e:build:ios": "eas build --profile e2e-test --platform ios --local", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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>
There was a problem hiding this 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.
📒 Files selected for processing (6)
.eas/workflows/e2e-test-android.yml.maestro/QUICKSTART.md.maestro/README.mdCLAUDE.mdeas.jsonpackage.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_e2eproduces the APK using thee2e-testprofilemaestro_testconsumes 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` | |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| | 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.
| // Only for E2E/demo builds | ||
| if (process.env.DETOX_ENABLED === 'true') { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| // 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.
| ## 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! 🎉 | ||
| ``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
There was a problem hiding this 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.
📒 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: buildsyntax withplatform: androidandprofile: e2e-testparameters is correct per EAS documentation. The build job properly produces thebuild_idoutput, which is correctly referenced downstream by the maestro_test job.
Set up comprehensive end-to-end testing and demo generation system using Maestro for automated UI testing and creating marketing materials.
Infrastructure:
.maestro/demo-flow.yaml- 30-second feature showcase floweas.jsonfor Android/iOS test buildse2e:build,e2e:test,e2e:demo)Documentation:
.maestro/README.md- Complete guide (setup, usage, optimization).maestro/QUICKSTART.md- 3-step quick start guideCLAUDE.mdwith E2E commandsHelper Scripts:
.maestro/convert-to-gif.sh- Bash script for video→GIF conversion (macOS/Linux).maestro/convert-to-gif.bat- Windows batch script for conversion.maestro/.gitignore- Exclude recordings, keep configsDemo Flow Features:
🎬 Generated with Claude Code
Summary by CodeRabbit
New Features
Documentation
Chores
Other
✏️ Tip: You can customize this high-level summary in your review settings.