agentsclimarketplace

Maestro flutter

Skill aleksandr-chaika/flutter-clean-arch-skills/skills/maestro-flutter

Maestro E2E testing knowledge for Flutter apps. YAML-based flows, TestKeys, visual regression, Maestro MCP integration. Background knowledge for QE E2E testing phase.From its SKILL.md

Install
npx -y skills add aleksandr-chaika/flutter-clean-arch-skills --skill maestro-flutter

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

3 things to look at

  • reads credentialsReads from 2 credential sources: `TEST_EMAIL` and 1 more.
  • 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
  • runs commandsInstructs the agent to run 2 commands, including `flutter build apk --debug` and 1 more.

SKILL.md

3.4 KB, 762 tokens by cl100k_base, as published. Nobody here has run it

Maestro Flutter E2E Testing Guide

Reference Guide

TopicReferenceUse When
Flow Patternsreferences/flow-patterns.mdWriting YAML flows, Flutter-specific tips
CI & Visual Regressionreferences/ci-visual-regression.mdCI/CD setup, visual comparison, troubleshooting

Core Principles

  1. ADD semantic labelsKey() / Semantics on all interactive widgets
  2. WRITE flows in YAML — simple, readable, no code
  3. RUN on emulator first, then real devices
  4. CAPTURE screenshots at key assertion points
  5. USE visual regression for Pixel Perfect validation

TestKeys Pattern (MANDATORY)

// lib/core/constants/test_keys.dart
abstract class TestKeys {
  static const emailField = Key('email_field');
  static const passwordField = Key('password_field');
  static const loginButton = Key('login_button');
  static const registerButton = Key('register_button');
  static const homeTab = Key('home_tab');
  static const profileTab = Key('profile_tab');
  static const loadingIndicator = Key('loading_indicator');
  static const errorMessage = Key('error_message');
}

Project Structure

.maestro/
├── config.yaml
└── flows/
    ├── auth/
    │   ├── login.yaml
    │   └── register.yaml
    ├── {feature}/
    │   └── {action}.yaml
    └── smoke_test.yaml

Flow YAML Syntax

appId: com.example.myapp
name: User Login
---
- launchApp:
    clearState: true
- extendedWaitUntil:
    visible: "Welcome"
    timeout: 10000
- tapOn:
    id: "email_field"
- inputText: ${TEST_EMAIL}
- tapOn:
    id: "password_field"
- inputText: ${TEST_PASSWORD}
- tapOn:
    id: "login_button"
- waitForAnimationToEnd
- assertVisible:
    id: "home_tab"
- takeScreenshot: "login_success"

Key Commands

CommandDescription
tapOn: { id: "key" }Tap by widget Key
inputText: "value"Type text
assertVisible: "text"Assert visible
assertNotVisible: "text"Assert gone
extendedWaitUntilWait for element
waitForAnimationToEndWait animations
takeScreenshot: "name"Screenshot
runFlow: path.yamlReuse flow
launchApp: { clearState: true }Fresh start

Running Tests

flutter build apk --debug
maestro test .maestro/flows/

Testing Pyramid

              ┌─────────────────┐
              │    Maestro      │  10% — Full user journeys
              └────────┬────────┘
            ┌──────────┴──────────┐
            │   Widget Tests      │  20% — UI components
            └──────────┬──────────┘
  ┌────────────────────┴────────────────────┐
  │              Unit Tests                  │  70% — Business logic
  │  (BLoC, UseCases, Repositories)          │  mocktail, bloc_test
  └──────────────────────────────────────────┘

What ships with it: 2 files

7.9 KB alongside SKILL.md

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.