Skip to content

Feat/deep UI parity#54

Open
vriesdemichael wants to merge 25 commits intomainfrom
feat/deep-ui-parity
Open

Feat/deep UI parity#54
vriesdemichael wants to merge 25 commits intomainfrom
feat/deep-ui-parity

Conversation

@vriesdemichael
Copy link
Owner

Partial for #53

- 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.
Copilot AI review requested due to automatic review settings March 2, 2026 19:46
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

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

  • renderBackdrop uses props: any without 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 targeted biome-ignore comment 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 constant message-error breaks existing Jest tests that assert the per-message ID (e.g. components/__tests__/MessageItem-test.tsx expects message-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-commenter
Copy link

codecov-commenter commented Mar 2, 2026

Codecov Report

❌ Patch coverage is 88.34951% with 12 lines in your changes missing coverage. Please review.
✅ Project coverage is 89.71%. Comparing base (9fd3c39) to head (43bcc99).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
app/api/client.ts 86.20% 1 Missing and 3 partials ⚠️
app/store/connection.ts 93.33% 1 Missing and 2 partials ⚠️
app/store/storage.ts 81.81% 0 Missing and 2 partials ⚠️
app/store/theme.ts 80.00% 1 Missing and 1 partial ⚠️
app/store/config.ts 75.00% 1 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@            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     
Files with missing lines Coverage Δ
app/store/session.ts 95.53% <100.00%> (+0.04%) ⬆️
hooks/use-sse.ts 79.03% <100.00%> (+0.90%) ⬆️
app/store/config.ts 75.00% <75.00%> (ø)
app/store/storage.ts 81.81% <81.81%> (ø)
app/store/theme.ts 73.33% <80.00%> (-3.59%) ⬇️
app/store/connection.ts 93.75% <93.33%> (-2.33%) ⬇️
app/api/client.ts 91.66% <86.20%> (-3.08%) ⬇️
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

…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.
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.

3 participants