diff --git a/desktop/e2e/SKILL.md b/desktop/e2e/SKILL.md index 53293d5601a..7514f662ad4 100644 --- a/desktop/e2e/SKILL.md +++ b/desktop/e2e/SKILL.md @@ -102,33 +102,39 @@ System Tray Menu Reference flows in `desktop/e2e/flows/*.yaml` describe the app's key user journeys. Read these to understand navigation paths, expected elements, and UI state at each step. -| Flow | Covers | What it describes | -|------|--------|-------------------| -| `flows/navigation.yaml` | SidebarView, DesktopHomeView, OmiApp | Sidebar icons, section switching, text input, scroll, tray menu | -| `flows/language.yaml` | SettingsPage, SettingsSidebar, SidebarView | Settings nav, Transcription, language mode toggle, picker | -| `flows/dashboard.yaml` | DashboardPage, GoalsWidget, TasksWidget | Goals CRUD, task toggle, embedded conversations | -| `flows/chat.yaml` | ChatPage, ChatProvider | Send message, AI response, message actions | -| `flows/memories.yaml` | MemoriesPage, MemoryGraphPage | Tag filtering, search, visibility toggle, memory graph | -| `flows/tasks.yaml` | TasksPage, TasksStore | Task categories, filters, create task, toggle completion | -| `flows/settings.yaml` | SettingsPage, SettingsSidebar | All 9 settings sections (General through About) | +| Flow | Covers | Steps | Report | +|------|--------|-------|--------| +| `flows/navigation.yaml` | SidebarView, DesktopHomeView | 6/6 PASS | [report](https://flow-walker.beastoin.workers.dev/runs/RVS7NChPvj.html) | +| `flows/dashboard.yaml` | DashboardPage, GoalsWidget, TasksWidget | 3/6 (3 skipped) | [report](https://flow-walker.beastoin.workers.dev/runs/ghCdGIUAA2.html) | +| `flows/chat.yaml` | ChatPage, ChatProvider | 5/5 PASS | [report](https://flow-walker.beastoin.workers.dev/runs/z62Nll0IzR.html) | +| `flows/memories.yaml` | MemoriesPage, MemoryGraphPage | 5/6 (1 skipped) | [report](https://flow-walker.beastoin.workers.dev/runs/Mkp6ahc12I.html) | +| `flows/tasks.yaml` | TasksPage, TasksStore | 4/5 (1 skipped) | [report](https://flow-walker.beastoin.workers.dev/runs/ealB_-UdqS.html) | +| `flows/settings.yaml` | SettingsPage, SettingsSidebar | 9/9 PASS | [report](https://flow-walker.beastoin.workers.dev/runs/RoTW8GeljN.html) | +| `flows/language.yaml` | SettingsPage, SettingsSidebar | 5 steps | — | When you modify a Swift file, check if any flow's `covers:` includes it. That flow describes the user journey your change affects. ### Adding a New Flow -Create `desktop/e2e/flows/.yaml`: +Create `desktop/e2e/flows/.yaml` in v2 format: ```yaml +version: 2 name: my-flow description: What this flow covers +app: com.omi.computer-macos covers: - - Desktop/Sources/path/to/YourView.swift -setup: normal # normal | fresh_auth | signed_out + - desktop/Desktop/Sources/path/to/YourView.swift +preconditions: + - auth_ready steps: - - name: Step description - click: { type: image, label: "gearshape.fill" } - screenshot: step-name - - name: Verify result - assert: { text: "Expected Text" } + - id: S1 + name: Step description + do: "Click the element (identifier: my_element). Verify the page loads." + expect: + interactive_count: { min: 5 } + text_visible: + - Expected Text ``` +**Important:** Always use quoted strings for `do:` fields (not YAML `>` or `|`). ## Verification & Evidence @@ -151,8 +157,9 @@ After making changes, verify them in the live app: ## Guard Conditions **NEVER:** -- Automate the production app (`com.omi.computer-macos`) - Kill or restart the production Omi app - Use development env vars to bypass auth — test real auth flows - Set `hasCompletedOnboarding` to skip onboarding — test the real flow - Modify source code to make tests pass — report the failure instead + +**NOTE:** The beta app (`com.omi.computer-macos`) is the standard target for flow-walker E2E testing. The dev app (`com.omi.desktop-dev`) is for local development only. diff --git a/desktop/e2e/feature-vector.md b/desktop/e2e/feature-vector.md new file mode 100644 index 00000000000..d85cd097d14 --- /dev/null +++ b/desktop/e2e/feature-vector.md @@ -0,0 +1,123 @@ +# Omi Desktop App Feature Vector for Flow-Walker +## Updated 2026-03-20 + +### Purpose +Prioritized feature map to guide flow-walker E2E coverage of core Omi desktop macOS app flows. Uses the same two-dimensional scoring model as the mobile feature vector. + +--- + +## Scoring Model + +**Combined Priority** = `layer_weight × session_frequency` + +| Dimension | Values | +|-----------|--------| +| **Core-to-mission** (layer weight) | capture=5, understand=4, memory=4, intelligence=3, retrieval-action=3 | +| **Session frequency** | daily=3, weekly=2, setup-only=1 | + +**Walker Score** (0-3) — desktop-specific (agent-swift via macOS Accessibility API): +- 3 = fully automatable (click/press-only, deterministic, AX identifiers present) +- 2 = partially automatable (needs scroll, conditional content, or timing waits) +- 1 = needs system setup first (microphone permission, account linking), then walker can verify +- 0 = unreachable (external OAuth popup, OS-level dialog, real payment) + +> **Note:** Desktop walker uses `agent-swift` (CGEvent click + AXPress) instead of mobile's `agent-flutter` (Marionette). All sidebar items have AX identifiers (`sidebar_dashboard`, `sidebar_chat`, etc.), making navigation highly automatable. + +--- + +## Feature Vector (sorted by priority × walker_score) + +### CORE DAILY (priority 9-15, walker_score 2-3) + +| # | Feature | Layer | Priority | Walker | Coverage Status | +|---|---------|-------|----------|--------|-----------------| +| 1 | Dashboard — goals widget, tasks, conversations | intelligence (3) | 9 | 3 | ✅ flow: dashboard.yaml (6 steps) | +| 2 | Chat — send message, AI response, actions | intelligence (3) | 9 | 2 | ✅ flow: chat.yaml (5 steps) | +| 3 | Sidebar navigation — all 7 sections | retrieval-action (3) | 9 | 3 | ✅ flow: navigation.yaml | +| 4 | Conversation list & browse (dashboard embedded) | capture (5) | 15 | 2 | ✅ flow: dashboard.yaml | +| 5 | Screen capture (Rewind) | capture (5) | 15 | 2 | ❌ needs flow | +| 6 | Audio recording (desktop mic) | capture (5) | 15 | 1 | ❌ needs flow | +| 7 | Memory list & browse | memory (4) | 12 | 2 | ✅ flow: memories.yaml (6 steps) | +| 8 | Memory search | memory (4) | 12 | 2 | ✅ flow: memories.yaml | +| 9 | Tasks — categories, filters, create, toggle | retrieval-action (3) | 9 | 2 | ✅ flow: tasks.yaml (5 steps) | +| 10 | Quick Note (dashboard) | intelligence (3) | 9 | 2 | ⚠️ partial (in dashboard.yaml) | + +### CORE WEEKLY (priority 6-12, walker_score 1-2) + +| # | Feature | Layer | Priority | Walker | Coverage Status | +|---|---------|-------|----------|--------|-----------------| +| 11 | Memory visibility toggle | memory (4) | 8 | 2 | ✅ flow: memories.yaml | +| 12 | Memory graph visualization | memory (4) | 8 | 2 | ✅ flow: memories.yaml | +| 13 | Memory tag filtering | memory (4) | 8 | 2 | ✅ flow: memories.yaml | +| 14 | Transcription language settings | understand (4) | 8 | 3 | ✅ flow: language.yaml | +| 15 | Language mode toggle (Auto/Single) | understand (4) | 8 | 3 | ✅ flow: language.yaml | +| 16 | Goals CRUD (create, update, delete) | intelligence (3) | 6 | 2 | ✅ flow: dashboard.yaml | +| 17 | Apps/Integrations marketplace | retrieval-action (3) | 6 | 2 | ❌ needs flow | +| 18 | Refer a Friend | retrieval-action (3) | 6 | 2 | ❌ needs flow | + +### SETTINGS & SYSTEM (priority 3-5, walker_score 1-3) + +| # | Feature | Layer | Priority | Walker | Coverage Status | +|---|---------|-------|----------|--------|-----------------| +| 19 | Settings — all 9 sections | — | 5 | 3 | ✅ flow: settings.yaml (9 steps) | +| 20 | General preferences | — | 5 | 3 | ✅ flow: settings.yaml | +| 21 | Rewind settings | capture (5) | 5 | 2 | ✅ flow: settings.yaml | +| 22 | Privacy settings | — | 5 | 2 | ✅ flow: settings.yaml | +| 23 | Account info | — | 5 | 2 | ✅ flow: settings.yaml | +| 24 | AI Chat model settings | intelligence (3) | 3 | 2 | ✅ flow: settings.yaml | +| 25 | Advanced / Developer options | — | 3 | 2 | ✅ flow: settings.yaml | +| 26 | System tray menu | — | 5 | 3 | ✅ flow: navigation.yaml | +| 27 | Keyboard shortcuts (Cmd+1..6, Cmd+,) | — | 5 | 3 | ✅ flow: navigation.yaml | +| 28 | Onboarding (first launch) | — | 5 | 1 | ❌ needs fresh state | +| 29 | Auth (Sign In / Sign Out) | — | 5 | 0 | ❌ external OAuth | +| 30 | Notifications settings | — | 3 | 2 | ✅ flow: settings.yaml | +| 31 | About page (version info) | — | 3 | 3 | ✅ flow: settings.yaml | + +--- + +## Remaining Gaps + +| Rank | Feature | Priority | Blocker | Notes | +|------|---------|----------|---------|-------| +| 1 | Screen capture (Rewind) | 15 | Needs screen recording permission | Rewind page exists, AX identifiers unknown — needs exploration | +| 2 | Audio recording (desktop mic) | 15 | Needs microphone permission grant | Start Recording button visible on dashboard but mic requires OS dialog | +| 3 | Apps/Integrations | 6 | No flow written | Apps page accessible via sidebar_apps — should be straightforward | +| 4 | Onboarding | 5 | Needs fresh/reset state | Reset Onboarding available in tray menu but causes state corruption (known issue) | +| 5 | Auth | 5 | External OAuth | Google/Apple Sign-In opens browser — not automatable | + +--- + +## Published Flow-Walker Reports + +| Flow | Steps | Result | Report URL | +|------|-------|--------|------------| +| navigation | 6/6 | PASS | flow-walker.beastoin.workers.dev/runs/RVS7NChPvj.html | +| dashboard | 3/6 | PASS (3 skipped) | flow-walker.beastoin.workers.dev/runs/ghCdGIUAA2.html | +| chat | 5/5 | PASS | flow-walker.beastoin.workers.dev/runs/z62Nll0IzR.html | +| memories | 5/6 | PASS (1 skipped) | flow-walker.beastoin.workers.dev/runs/Mkp6ahc12I.html | +| tasks | 4/5 | PASS (1 skipped) | flow-walker.beastoin.workers.dev/runs/ealB_-UdqS.html | +| settings | 9/9 | PASS | flow-walker.beastoin.workers.dev/runs/RoTW8GeljN.html | + +--- + +## Coverage Summary + +| Category | Total Features | Covered | Gaps | +|----------|---------------|---------|------| +| Core Daily (capture, intelligence) | 10 | 7 | 3 (screen capture, audio recording, quick note partial) | +| Core Weekly (memory, understand, retrieval) | 8 | 6 | 2 (apps, refer) | +| Settings & System | 13 | 11 | 2 (onboarding, auth) | +| **Total** | **31** | **24** | **7** | + +--- + +## Desktop-Specific Notes + +- **agent-swift** is the automation tool (not agent-flutter). Uses macOS Accessibility API. +- **click** for SwiftUI elements (sidebar icons, NavigationLink). **press** for AppKit buttons (Settings sidebar sections). +- Sidebar AX identifiers: `sidebar_dashboard`, `sidebar_chat`, `sidebar_memories`, `sidebar_tasks`, `sidebar_rewind`, `sidebar_apps`, `sidebar_settings`, `sidebar_refer_a_friend`, `sidebar_discord` +- System tray menu items: `openOmiFromMenu`, `checkForUpdates`, `resetOnboarding`, `reportIssue`, `signOut`, `quitApp` +- Keyboard shortcuts via View menu: Cmd+1 (Dashboard), Cmd+2 (Chat), Cmd+3 (Memories), Cmd+4 (Tasks), Cmd+5 (Rewind), Cmd+6 (Apps), Cmd+, (Settings) +- Beta app bundle ID: `com.omi.computer-macos` (use for flow-walker runs) +- Dev app bundle ID: `com.omi.desktop-dev` (skip unless dev-specific testing) +- GUI user prefix required on SSH: `sudo launchctl asuser 501 sudo -u beastoinagents ` diff --git a/desktop/e2e/flows/chat.snapshot.json b/desktop/e2e/flows/chat.snapshot.json new file mode 100644 index 00000000000..3e8f952e1b3 --- /dev/null +++ b/desktop/e2e/flows/chat.snapshot.json @@ -0,0 +1,46 @@ +{ + "version": 1, + "flow": "chat", + "flowHash": "efb697d6b68af93b", + "device": { + "model": "unknown", + "resolution": "unknown" + }, + "createdAt": "2026-03-20T07:03:04.855Z", + "runId": "ycYUEqE", + "totalDurationMs": 286000, + "verifySteps": [ + "S1", + "S2", + "S3", + "S4", + "S5" + ], + "steps": { + "S1": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 50000 + }, + "S2": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 108000 + }, + "S3": { + "kind": "verify", + "waitAfterMs": 200, + "durationMs": 62000 + }, + "S4": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 35000 + }, + "S5": { + "kind": "action", + "waitAfterMs": 500, + "durationMs": 31000 + } + } +} \ No newline at end of file diff --git a/desktop/e2e/flows/chat.yaml b/desktop/e2e/flows/chat.yaml index 13a6a4605d7..75e06ff7ac4 100644 --- a/desktop/e2e/flows/chat.yaml +++ b/desktop/e2e/flows/chat.yaml @@ -5,9 +5,7 @@ version: 2 name: chat description: Chat flow — navigate to Chat page, send a message, verify AI response streams, test message actions (copy, regenerate), browse conversation history -app: com.omi.desktop-dev -evidence: - video: true +app: com.omi.computer-macos covers: - desktop/Desktop/Sources/MainWindow/Pages/ChatPage.swift - desktop/Desktop/Sources/Chat/ChatProvider.swift diff --git a/desktop/e2e/flows/dashboard.snapshot.json b/desktop/e2e/flows/dashboard.snapshot.json new file mode 100644 index 00000000000..134f1391791 --- /dev/null +++ b/desktop/e2e/flows/dashboard.snapshot.json @@ -0,0 +1,52 @@ +{ + "version": 1, + "flow": "dashboard", + "flowHash": "16f607bc98c082c2", + "device": { + "model": "unknown", + "resolution": "unknown" + }, + "createdAt": "2026-03-20T06:57:42.156Z", + "runId": "_iDoTIw", + "totalDurationMs": 498000, + "verifySteps": [ + "S1", + "S2", + "S3", + "S4", + "S5", + "S6" + ], + "steps": { + "S1": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 68000 + }, + "S2": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 187000 + }, + "S3": { + "kind": "verify", + "waitAfterMs": 200, + "durationMs": 78000 + }, + "S4": { + "kind": "verify", + "waitAfterMs": 200, + "durationMs": 17000 + }, + "S5": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 46000 + }, + "S6": { + "kind": "verify", + "waitAfterMs": 500, + "durationMs": 102000 + } + } +} \ No newline at end of file diff --git a/desktop/e2e/flows/dashboard.yaml b/desktop/e2e/flows/dashboard.yaml index fac52faaa84..4a54986aa14 100644 --- a/desktop/e2e/flows/dashboard.yaml +++ b/desktop/e2e/flows/dashboard.yaml @@ -5,9 +5,7 @@ version: 2 name: dashboard description: Dashboard flow — verify productivity widgets load, create/update/delete goals, toggle task completion, view embedded conversations -app: com.omi.desktop-dev -evidence: - video: true +app: com.omi.computer-macos covers: - desktop/Desktop/Sources/MainWindow/Pages/DashboardPage.swift - desktop/Desktop/Sources/MainWindow/Components/GoalsWidget.swift diff --git a/desktop/e2e/flows/language.yaml b/desktop/e2e/flows/language.yaml index 4eba601a7e5..9037759a94f 100644 --- a/desktop/e2e/flows/language.yaml +++ b/desktop/e2e/flows/language.yaml @@ -1,68 +1,45 @@ -# E2E Flow: Language settings -# Converted from flow2-language-settings.sh +# E2E Flow: Language settings — transcription language mode switching # Tests: settings navigation, radio buttons, picker interaction, back navigation +version: 2 name: language -description: Language mode switching in Settings > Transcription — radio buttons, picker, back nav +description: Language mode switching in Settings > Transcription — radio buttons, language picker, and back navigation +app: com.omi.computer-macos covers: - - Desktop/Sources/MainWindow/Pages/SettingsPage.swift - - Desktop/Sources/MainWindow/SettingsSidebar.swift - - Desktop/Sources/MainWindow/SidebarView.swift -setup: normal -bundle_id: com.omi.desktop-dev + - desktop/Desktop/Sources/MainWindow/Pages/SettingsPage.swift + - desktop/Desktop/Sources/MainWindow/SettingsSidebar.swift +preconditions: + - auth_ready steps: - - name: Navigate to Settings - click: { type: image, label: "gearshape.fill" } - screenshot: settings-opened - - - name: Verify Settings sidebar - assert: { text: "Settings" } - - - name: Navigate to Transcription section - press: { text: "Transcription" } - screenshot: transcription-section - - - name: Verify Language Mode card - assert: { text: "Language Mode" } - - - name: Detect current language mode - get: { property: value, type: popupbutton } - save_as: current_mode - optional: true - - - name: Switch to Single Language mode - click: { text_contains: "Single Language" } - screenshot: single-language-selected - assert: - type: popupbutton - min_count: 1 - optional: true - - - name: Read current language from picker - get: { property: value, type: popupbutton } - save_as: current_lang - optional: true - - - name: Change language via picker - click: { type: popupbutton } - screenshot: picker-opened - click_menu_item: - try_labels: - - Spanish - - French - - Japanese - - German - screenshot: language-changed - optional: true - - - name: Switch back to Auto-Detect mode - click: { text_contains: "Auto-Detect" } - screenshot: auto-detect-restored - - - name: Navigate back from Settings - click: - text_contains: "Back" - fallback_label: "chevron.left" - assert: { type: image, label: "Home" } - screenshot: back-to-main + - id: S1 + name: Navigate to Settings + do: "Click the Settings sidebar icon (identifier: sidebar_settings) to open the Settings page. Verify settings sidebar shows section names." + expect: + text_visible: + - Settings + + - id: S2 + name: Navigate to Transcription section + do: "Press the 'Transcription' button in the Settings sidebar to open transcription settings. Verify Language Mode card appears." + expect: + text_visible: + - Language Mode + + - id: S3 + name: Switch to Single Language mode + do: "Click the 'Single Language Better Accuracy' radio option. Verify a language picker dropdown appears when Single Language mode is active." + expect: + interactive_count: { min: 3 } + + - id: S4 + name: Switch back to Auto-Detect mode + do: "Click the 'Auto-Detect Multi-Language' radio option to restore auto-detect mode. Verify the language picker is hidden." + expect: + interactive_count: { min: 3 } + + - id: S5 + name: Return from Settings + do: "Click the Back button to return to the main view. Verify the sidebar navigation icons are visible again." + expect: + interactive_count: { min: 5 } diff --git a/desktop/e2e/flows/memories.snapshot.json b/desktop/e2e/flows/memories.snapshot.json new file mode 100644 index 00000000000..907d5072f76 --- /dev/null +++ b/desktop/e2e/flows/memories.snapshot.json @@ -0,0 +1,52 @@ +{ + "version": 1, + "flow": "memories", + "flowHash": "a22c1889c13a17bd", + "device": { + "model": "unknown", + "resolution": "unknown" + }, + "createdAt": "2026-03-20T07:07:55.999Z", + "runId": "uRprN-0", + "totalDurationMs": 246000, + "verifySteps": [ + "S1", + "S2", + "S3", + "S4", + "S5", + "S6" + ], + "steps": { + "S1": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 39000 + }, + "S2": { + "kind": "verify", + "waitAfterMs": 200, + "durationMs": 29000 + }, + "S3": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 44000 + }, + "S4": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 44000 + }, + "S5": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 53000 + }, + "S6": { + "kind": "action", + "waitAfterMs": 500, + "durationMs": 37000 + } + } +} \ No newline at end of file diff --git a/desktop/e2e/flows/memories.yaml b/desktop/e2e/flows/memories.yaml index f8172d79942..e130424ab2f 100644 --- a/desktop/e2e/flows/memories.yaml +++ b/desktop/e2e/flows/memories.yaml @@ -5,9 +5,7 @@ version: 2 name: memories description: Memories flow — navigate to Memories page, browse memory list, filter by tags (focus, tips, system, etc.), search memories, toggle visibility, open memory graph -app: com.omi.desktop-dev -evidence: - video: true +app: com.omi.computer-macos covers: - desktop/Desktop/Sources/MainWindow/Pages/MemoriesPage.swift - desktop/Desktop/Sources/MainWindow/Pages/MemoryGraph/MemoryGraphPage.swift diff --git a/desktop/e2e/flows/navigation.snapshot.json b/desktop/e2e/flows/navigation.snapshot.json new file mode 100644 index 00000000000..3e43c0eceed --- /dev/null +++ b/desktop/e2e/flows/navigation.snapshot.json @@ -0,0 +1,48 @@ +{ + "version": 1, + "flow": "navigation", + "flowHash": "6cbc833d58c666c7", + "device": { + "model": "unknown", + "resolution": "unknown" + }, + "createdAt": "2026-03-20T06:48:31.303Z", + "runId": "iwiXz0g", + "totalDurationMs": 274000, + "verifySteps": [ + "S1", + "S6" + ], + "steps": { + "S1": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 70000 + }, + "S2": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 51000 + }, + "S3": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 32000 + }, + "S4": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 33000 + }, + "S5": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 42000 + }, + "S6": { + "kind": "action", + "waitAfterMs": 500, + "durationMs": 46000 + } + } +} \ No newline at end of file diff --git a/desktop/e2e/flows/navigation.yaml b/desktop/e2e/flows/navigation.yaml index 5ece6f24d0c..f452ee9bbdd 100644 --- a/desktop/e2e/flows/navigation.yaml +++ b/desktop/e2e/flows/navigation.yaml @@ -1,79 +1,54 @@ -# E2E Flow: Desktop app navigation -# Converted from flow1-app-navigation.sh -# Tests: snapshot, sidebar nav, find, fill, scroll, assert, wait, screenshot, tray menu - +version: 2 name: navigation -description: Desktop app navigation — sidebar icons, section switching, text input, scroll, tray menu +description: Desktop sidebar navigation — verify all 7 sidebar sections load correctly via click navigation +app: com.omi.computer-macos covers: - - Desktop/Sources/MainWindow/SidebarView.swift - - Desktop/Sources/MainWindow/DesktopHomeView.swift - - Desktop/Sources/MainWindow/OmiApp.swift -setup: normal -bundle_id: com.omi.desktop-dev + - desktop/Desktop/Sources/MainWindow/SidebarView.swift + - desktop/Desktop/Sources/MainWindow/DesktopHomeView.swift + - desktop/Desktop/Sources/MainWindow/OmiApp.swift +preconditions: + - auth_ready steps: - - name: Snapshot main window - assert: - interactive_count: { min: 3 } - screenshot: main-window - - - name: Find button element - find: { role: button } - save_ref: btn_ref - - - name: Assert element exists and non-existent does not - assert: - - { exists: "$btn_ref" } - - { not_exists: "e99999" } - - - name: Verify sidebar navigation icons - assert_each: - type: image - labels: - - Home - - Conversation - - brain - - checklist - - puzzlepiece.fill - - gearshape.fill - min_found: 4 - - - name: Navigate through sidebar sections - navigate_sidebar: - - { type: image, label: Conversation } - - { type: image, label: brain } - - { type: image, label: checklist } - - { type: image, label: Home } - action: click - min_success: 3 - screenshot_each: true - - - name: Fill text input - fill: { type: textfield, value: "agent-swift E2E test" } - optional: true - screenshot: after-fill - - - name: Scroll down and up - scroll: - - down - - up - - - name: Wait for element - wait: { exists: "$btn_ref", timeout: 3000 } - - - name: Verify system tray menu - assert: - type: menuitem - identifier_prefixes: - - openOmi - - checkFor - - resetOnb - - reportIs - - signOut - - quitApp - min_count: 3 - - - name: Verify app responsiveness - assert: - interactive_count: { min: 3 } - screenshot: final + - id: S1 + name: Verify Dashboard loads + do: "Verify the app is on the Dashboard page. Sidebar should show all navigation icons (Dashboard, Chat, Memories, Tasks, Rewind, Apps, Settings). Dashboard content should include goals widget, conversations list, and Start Recording button." + expect: + interactive_count: { min: 10 } + text_visible: + - Dashboard + + - id: S2 + name: Navigate to Chat + do: "Click the Chat sidebar icon (identifier: sidebar_chat) to navigate to the Chat page. Verify chat interface loads with message input area." + expect: + text_visible: + - Chat + + - id: S3 + name: Navigate to Memories + do: "Click the Memories sidebar icon (identifier: sidebar_memories) to navigate to the Memories page. Verify memories list loads with search and filter controls." + expect: + text_visible: + - Memories + + - id: S4 + name: Navigate to Tasks + do: "Click the Tasks sidebar icon (identifier: sidebar_tasks) to navigate to the Tasks page. Verify tasks interface loads with category filters and task list." + expect: + text_visible: + - Tasks + + - id: S5 + name: Navigate to Apps + do: "Click the Apps sidebar icon (identifier: sidebar_apps) to navigate to the Apps/Integrations page. Verify integrations marketplace loads." + expect: + text_visible: + - Apps + + - id: S6 + name: Navigate to Settings + do: "Click the Settings sidebar icon (identifier: sidebar_settings) to navigate to Settings page. Verify settings sidebar shows sections (General, Rewind, Transcription, etc.)." + expect: + text_visible: + - Settings diff --git a/desktop/e2e/flows/settings.snapshot.json b/desktop/e2e/flows/settings.snapshot.json new file mode 100644 index 00000000000..f54575f2d2c --- /dev/null +++ b/desktop/e2e/flows/settings.snapshot.json @@ -0,0 +1,70 @@ +{ + "version": 1, + "flow": "settings", + "flowHash": "352827174b4f5ff0", + "device": { + "model": "unknown", + "resolution": "unknown" + }, + "createdAt": "2026-03-20T07:19:36.168Z", + "runId": "FVLa1c8", + "totalDurationMs": 304000, + "verifySteps": [ + "S1", + "S2", + "S3", + "S4", + "S5", + "S6", + "S7", + "S8", + "S9" + ], + "steps": { + "S1": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 47000 + }, + "S2": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 33000 + }, + "S3": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 26000 + }, + "S4": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 35000 + }, + "S5": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 44000 + }, + "S6": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 26000 + }, + "S7": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 28000 + }, + "S8": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 31000 + }, + "S9": { + "kind": "action", + "waitAfterMs": 500, + "durationMs": 34000 + } + } +} \ No newline at end of file diff --git a/desktop/e2e/flows/settings.yaml b/desktop/e2e/flows/settings.yaml index 15520e51dde..1dd8aa66928 100644 --- a/desktop/e2e/flows/settings.yaml +++ b/desktop/e2e/flows/settings.yaml @@ -5,9 +5,7 @@ version: 2 name: settings description: Settings flow — open Settings via sidebar or Cmd+comma, navigate all 9 sections (General, Rewind, Transcription, Notifications, Privacy, Account, AI Chat, Advanced, About), verify each section loads with expected controls -app: com.omi.desktop-dev -evidence: - video: true +app: com.omi.computer-macos covers: - desktop/Desktop/Sources/MainWindow/Pages/SettingsPage.swift - desktop/Desktop/Sources/MainWindow/SettingsSidebar.swift diff --git a/desktop/e2e/flows/tasks.snapshot.json b/desktop/e2e/flows/tasks.snapshot.json new file mode 100644 index 00000000000..952b99604fe --- /dev/null +++ b/desktop/e2e/flows/tasks.snapshot.json @@ -0,0 +1,46 @@ +{ + "version": 1, + "flow": "tasks", + "flowHash": "7cde84f4070e16eb", + "device": { + "model": "unknown", + "resolution": "unknown" + }, + "createdAt": "2026-03-20T07:13:55.045Z", + "runId": "IPx51fg", + "totalDurationMs": 317000, + "verifySteps": [ + "S1", + "S2", + "S3", + "S4", + "S5" + ], + "steps": { + "S1": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 40000 + }, + "S2": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 73000 + }, + "S3": { + "kind": "action", + "waitAfterMs": 200, + "durationMs": 116000 + }, + "S4": { + "kind": "verify", + "waitAfterMs": 200, + "durationMs": 43000 + }, + "S5": { + "kind": "action", + "waitAfterMs": 500, + "durationMs": 45000 + } + } +} \ No newline at end of file diff --git a/desktop/e2e/flows/tasks.yaml b/desktop/e2e/flows/tasks.yaml index eafa120142c..89286b5378f 100644 --- a/desktop/e2e/flows/tasks.yaml +++ b/desktop/e2e/flows/tasks.yaml @@ -5,9 +5,7 @@ version: 2 name: tasks description: Tasks flow — navigate to Tasks page, browse categorized tasks (today/tomorrow/later/no deadline), filter by status/category/source/priority, create manual task, toggle completion -app: com.omi.desktop-dev -evidence: - video: true +app: com.omi.computer-macos covers: - desktop/Desktop/Sources/MainWindow/Pages/TasksPage.swift - desktop/Desktop/Sources/Providers/TasksStore.swift