Files
paseo/packages/app/maestro
Mohamed Boudra e9c3753466 sidebar history: design revamp, branch names in filter, splash timeout
Rolls up three follow-ups on the sidebar Workspaces/Sessions toggle:

Design revamp (Notion-style toggle, History at top):
- Toggle pills both carry icons (Folders/MessagesSquare); only the
  active pill shows its label, with LinearTransition + FadeIn/FadeOut.
- Filter trigger now uses lucide ListFilter; History row uses lucide
  History (clock); History row moved to the top of the sidebar.
- Session row content trimmed to icon + name + timestamp (no cwd
  path); padding/spacing/type ramp matches the existing Workspaces
  tree rows so the icon and text columns align across History row,
  toggle pills, and list rows at the canonical 16px column.
- Filter dropdown uses sentence-case section labels (Workspace/
  Project) and renders project icons (no text-letter fallbacks).
- testID rename: sidebar-sessions -> sidebar-history (the navigation
  row); new toggle pills get sidebar-toggle-workspaces /
  sidebar-toggle-sessions. Updated callers in helpers and maestro.
- No bold or font-weight changes; no uppercase anywhere.

Branch names in workspace filter:
- The dropdown's Workspaces section was rendering the unhydrated
  structural workspace.name (often a path-like id) because the
  selector chain skipped the rehydration step the main sidebar row
  uses. The hook now reuses createSidebarWorkspaceEntry so the label
  comes from the same descriptor path WorkspaceRow uses, matching
  what the user sees in the main sidebar.

Splash screen timeout for env-var local daemon:
- The 5s give-up timer in _layout.tsx had an explicit early-return
  exempting waitForConfiguredLocalDaemon, leaving the splash hung
  forever when EXPO_PUBLIC_LOCAL_DAEMON pointed at an offline
  daemon. Removed the exemption so the timer applies; the runtime
  override loop continues retrying in the background and welcome
  auto-redirects when any host comes online.
2026-05-08 17:58:50 +07:00
..
2026-04-23 21:44:48 +07:00

Maestro Flows

This directory contains local mobile UI flows. Keep flows small enough that a failure screenshot proves the intended behavior, not just that the app launched.

New Workspace Android Flow

Use these files when debugging or extending workspace creation on Android:

  • test-workspace-create-android-crash.sh runs the full regression harness.
  • workspace-create-android-crash.yaml is the full Maestro flow used by the harness.
  • record-workspace-create-android-focus.sh records only the focused repro window after setup.
  • workspace-create-android-ready-sidebar.yaml stages the app with the Android sidebar open and a prepared project visible.
  • workspace-create-android-create-focused.yaml starts from that staged sidebar and performs the actual workspace creation.

The reusable pieces live in flows/:

  • flows/android-dev-client.yaml handles Expo dev launcher/dev menu screens.
  • flows/connect-direct-if-welcome.yaml connects to the local daemon only when the welcome screen is visible.
  • flows/open-prepared-project-sidebar.yaml waits for the home screen, opens the compact Android sidebar, and waits for the prepared project.
  • flows/new-workspace-open-from-sidebar.yaml taps the project row's new-workspace action and waits for /new.
  • flows/new-workspace-select-codex-gpt54.yaml selects a real provider/model.
  • flows/new-workspace-submit-and-assert-created.yaml taps Create and proves the app landed on the created workspace.

Compose new workspace scenarios out of these primitives instead of copying the old full flow. The shell scripts render the top-level flows and every flows/*.yaml file into the same temp directory, so nested runFlow: flows/... paths keep working with ${PASEO_MAESTRO_*} placeholders.

The flow is intentionally strict. It must:

  1. Open a prepared project from the daemon.
  2. Tap the project row's new-workspace action.
  3. Select an actual provider/model before tapping Create.
  4. Tap Create.
  5. Assert the app lands on a workspace header and the draft composer.
  6. Assert New workspace, Select a model, and the Android redbox text are not visible.
  7. For the shell harness, grep logcat for failed to insert view and specified child already has a parent.

Do not weaken this flow to only wait for message-input-root. That can pass on the wrong route. The header assertion and the New workspace negative assertion are what prove the redirect actually completed.

The scripts assume a development build with package id sh.paseo.debug, an already-running local daemon on 127.0.0.1:6767, and a connected Android device or emulator. They call adb reverse tcp:6767 tcp:6767; they do not restart the daemon.

bash packages/app/maestro/test-workspace-create-android-crash.sh
bash packages/app/maestro/record-workspace-create-android-focus.sh

Optional environment:

PASEO_MAESTRO_APP_ID=sh.paseo.debug
PASEO_MAESTRO_DIRECT_ENDPOINT=127.0.0.1:6767
PASEO_MAESTRO_DAEMON_WS_URL=ws://127.0.0.1:6767/ws
PASEO_MAESTRO_PROJECT_PATH=/path/to/git/repo