Open
Conversation
- Added GitHub Actions YAML for Maestro Cloud/Emulator tests. - Added ADR 020 to document native headless Linux setup instructions. - Updated test suite applicationId configurations for maestro UI test targets.
There was a problem hiding this comment.
Pull request overview
This PR advances “deep UI parity” work (partial for #53) by aligning the app with newer server response shapes, adding AI model selection UI/state, and maturing Maestro E2E flows + execution tooling/CI.
Changes:
- Replace legacy MMKV usage with a cross-platform Zustand persist storage adapter (SecureStore on native, localStorage on web) and migrate connection/theme/config persistence.
- Add provider/model fetching + selection UI (BottomSheet) and thread selected model into message sending; update API client + SSE handling to map “server” message/session/project shapes.
- Expand Maestro E2E flows + add runner scripts and a GitHub Actions workflow for Android emulator execution.
Reviewed changes
Copilot reviewed 47 out of 49 changed files in this pull request and generated 13 comments.
Show a summary per file
| File | Description |
|---|---|
| test_error.log | Removes committed test failure output artifact. |
| scripts/start-test-server.sh | Adds Docker-based test server launcher for local E2E runs. |
| scripts/run-e2e-tests.sh | Adds scripted Maestro flow runner with per-flow isolation + ADB state clearing. |
| scripts/mock-server.js | Adds a lightweight Node HTTP mock server (not currently wired into CI). |
| scripts/docker/Dockerfile.test | Adds Docker image for running opencode serve on port 3000. |
| pnpm-lock.yaml | Removes react-native-mmkv and related dependencies. |
| package.json | Removes react-native-mmkv dependency. |
| maestro/session-list.yaml | Updates flow to use shared setup and new selectors. |
| maestro/send-message.yaml | Updates flow to use shared setup and robust message assertions. |
| maestro/connection.yaml | Updates flow to use tab testIDs + connection save flow. |
| maestro/chat.yaml | Updates flow to validate chat screen elements and navigation. |
| maestro/_setup.yaml | Adds common setup flow (launch, connect, create session, choose model). |
| jest_out.txt | Removes committed test output artifact. |
| jest.txt | Removes committed test output artifact. |
| jest.setup.js | Removes MMKV mock now that MMKV dependency is removed. |
| hooks/use-sse.ts | Maps server message payloads into app Message shape for store handlers. |
| hooks/tests/use-sse-test.ts | Updates SSE hook tests for server-message mapping. |
| docs/decisions/022-agent-discipline-for-e2e-test-development.yaml | Adds ADR for structured E2E test iteration discipline. |
| docs/decisions/021-maestro-e2e-test-execution-practices.yaml | Adds ADR for Maestro execution practices and flakiness mitigations. |
| docs/decisions/020-linux-environment-for-android-compilation.yaml | Adds ADR recommending Linux/macOS for Android compilation and Maestro runs. |
| coverage_failure.txt | Removes committed coverage failure output artifact. |
| components/ui/icon-symbol.tsx | Adds icon mapping needed by new UI (chevron.left). |
| components/provider-settings-sheet.tsx | Implements provider/model list, selection persistence, and model limiting/sorting. |
| components/message-item.tsx | Adds stable testIDs for Maestro assertions and adjusts error testID. |
| components/tests/ProviderSettingsSheet-test.tsx | Updates bottom-sheet mock structure (but tests still need alignment with new UI/deps). |
| app/store/theme.ts | Migrates theme preference persistence to Zustand persist + custom storage; syncs Appearance on set. |
| app/store/storage.ts | Adds custom Zustand storage adapter (SecureStore native / localStorage web). |
| app/store/session.ts | Extends createSession to accept directory; threads model choice through sendMessage. |
| app/store/connection.ts | Migrates connection persistence to Zustand persist + custom storage; partializes persisted keys. |
| app/store/config.ts | Adds persisted config store for selected model. |
| app/store/tests/storage-test.ts | Adds tests for custom storage adapter behavior on web vs native. |
| app/store/tests/connection-test.ts | Updates connection store tests after persistence refactor. |
| app/session/tests/chat-screen-test.tsx | Updates mock component to satisfy forwardRef requirements. |
| app/session/[id].tsx | Wires selected model into message sending; improves back button accessibility and KAV behavior. |
| app/project/[id]/index.tsx | Adds create-session button and creates session in the project’s directory. |
| app/api/types.ts | Introduces server-facing types and provider/model types. |
| app/api/client.ts | Maps server response shapes to app types; adds providers endpoint; updates sendMessage body shape. |
| app/api/tests/client-test.ts | Updates API client tests for new mapping and createSession payload. |
| app/_layout.tsx | Adjusts Stack screen name for project route. |
| app/tests/layout-test.tsx | Updates layout test to match new screen name. |
| app/(tabs)/settings.tsx | Dismisses keyboard before testing connection. |
| app/(tabs)/_layout.tsx | Adds tab button testIDs/accessibility labels for Maestro selectors. |
| app.json | Sets explicit iOS bundle identifier and Android package name. |
| AGENTS.md | Adds requirement to produce a visual walkthrough artifact for UI/Maestro tasks. |
| .tally-config.toml | Adds tallyman config. |
| .npmrc | Sets pnpm node-linker to hoisted. |
| .github/workflows/e2e-maestro.yml | Adds GitHub Actions workflow to run Maestro tests on an Android emulator. |
Files not reviewed (1)
- pnpm-lock.yaml: Language not supported
Comments suppressed due to low confidence (2)
components/provider-settings-sheet.tsx:46
renderBackdropusesprops: anywithout a Biome suppression or a safer type. With Biome recommended rules enabled, this will likely fail lint (noExplicitAny). Consider typing this to the BottomSheet backdrop props type (from @gorhom/bottom-sheet) or adding a targetedbiome-ignorecomment here.
const renderBackdrop = useCallback(
(props: any) => (
<BottomSheetBackdrop
{...props}
disappearsOnIndex={-1}
components/message-item.tsx:137
- Changing the error container testID from
message-error-${message.info.id}to a constantmessage-errorbreaks existing Jest tests that assert the per-message ID (e.g.components/__tests__/MessageItem-test.tsxexpectsmessage-error-6). If Maestro needs a stable selector, consider keeping the original unique testID and adding an additional stable identifier (or update the Jest tests accordingly).
{message.info.error && (
<View
testID={`message-error-${message.info.id}`}
style={styles.errorContainer}
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #54 +/- ##
==========================================
- Coverage 90.90% 89.71% -1.19%
==========================================
Files 7 9 +2
Lines 286 321 +35
Branches 60 71 +11
==========================================
+ Hits 260 288 +28
- Misses 11 14 +3
- Partials 15 19 +4
🚀 New features to boost your workflow:
|
…or, and maintain coverage
…ection failure Also fixes testConnection error closure variable to properly alert network failure details.
This prevents 'Network request failed' inside the qemu emulator. GitHub Actions docker proxy drops slirp loopback connections.
Avoids Maestro Android keyboard typing issues. Prevents 'Network request failed' from malformed URIs.
Use model-option-.* to match mock provider instead of zenmux. Add CONNECTED wait and Sessions page wait for robustness.
Dialog covered Connection Settings heading causing assertion failures.
The point 92%,91% was hitting the Test & Save Connection button. This caused the Success dialog to block the Connection Settings assertion.
Remove behavior='height' on Android to allow native adjustResize to handle window resizing.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Partial for #53