From claude-team-toolkit
Maestro mobile E2E (YAML) for RN/iOS/Android. Use to run flows, record, inspect hierarchy, detect flaky tests. Multi-environment via MAESTRO_PROFILE.
npx claudepluginhub tuannv14/claude-team-toolkit --plugin claude-team-toolkitThis skill is limited to using the following tools:
Wraps `maestro test`. Profiles = device + app build per environment.
Prevents silent decimal mismatch bugs in EVM ERC-20 tokens via runtime decimals lookup, chain-aware caching, bridged-token handling, and normalization. For DeFi bots, dashboards using Python/Web3, TypeScript/ethers, Solidity.
Share bugs, ideas, or general feedback.
Wraps maestro test. Profiles = device + app build per environment.
Profile resolution: --profile → MAESTRO_PROFILE → ~/.maestro/active_profile → [default].
curl -Ls "https://get.maestro.mobile.dev" | bash # macOS / Linux
# Windows: scoop install maestro (or use WSL)
maestro --version
iOS: Xcode + simulator. Android: Android Studio + emulator.
~/.maestro/profiles.ini (mode 600 — may contain Cloud key):
[default]
platform = ios # ios | android
device = iPhone 15
app_id = com.example.app
flows_dir = .maestro
[android-emu]
platform = android
device = Pixel_7_API_34 # AVD name
app_id = com.example.app
flows_dir = .maestro
[staging-cloud]
platform = android
device = R5XY... # serial of physical device
app_id = com.example.app.staging
flows_dir = .maestro
cloud_api_key = xxxxxxxxxxxxxxxxxxxxxxxx # Maestro Cloud
source "$HOME/.claude-team-toolkit/lib/credentials.sh"
ctt_load_creds maestro "$PROFILE"
# Verify device reachable
case "$CTT_PLATFORM" in
ios) xcrun simctl list devices "$CTT_DEVICE" | grep -q Booted || xcrun simctl boot "$CTT_DEVICE" ;;
android) adb devices | grep -q "$CTT_DEVICE" || { echo "Device not connected" >&2; return 1; } ;;
esac
run <flow.yaml> [--continuous]ARGS=()
[ "$CONTINUOUS" = "true" ] && ARGS+=(--continuous)
maestro test "${ARGS[@]}" "$FLOW"
--continuous re-runs on file changes — great for authoring.
run-all [--tags smoke,critical]maestro test "$CTT_FLOWS_DIR/" \
${TAGS:+--include-tags "$TAGS"} \
--format junit --output /tmp/maestro-results/
record <flow.yaml> — interactive flow recordermaestro record "$FLOW"
Point/tap to record actions → save as YAML. Tester-friendly (no coding).
studio — visual flow editor (browser-based)maestro studio
inspect [--app <bundle-id>] — view hierarchymaestro hierarchy --app "${APP_ID:-$CTT_APP_ID}"
Find element selectors / accessibility IDs.
tags — list all tags used in flowsgrep -h "^tags:" -A 20 "$CTT_FLOWS_DIR"/*.yaml | grep "^- " | sort -u
flaky-report [--last N] — detect flaky tests from JUnit resultsLAST="${LAST:-10}"
ls -t /tmp/maestro-results/*.xml | head -n "$LAST" | xargs python3 -c '
import sys, xml.etree.ElementTree as ET
from collections import defaultdict
results = defaultdict(list)
for f in sys.argv[1:]:
for tc in ET.parse(f).iter("testcase"):
failed = tc.find("failure") is not None or tc.find("error") is not None
results[tc.get("name")].append(failed)
print("Flaky tests (passed AND failed across runs):")
for n, runs in results.items():
if any(runs) and not all(runs):
print(f" {n}: {sum(runs)}/{len(runs)} fail rate")
'
cloud upload <flow-or-folder> [--name <run-name>] — Maestro Cloud[ -z "$CTT_CLOUD_API_KEY" ] && { echo "Set cloud_api_key in profile" >&2; return 1; }
maestro cloud --apiKey "$CTT_CLOUD_API_KEY" \
${NAME:+--name "$NAME"} \
"$APP" "$FLOW_OR_FOLDER"
<app> for cloud is the build artifact (.app/.ipa/.apk), not bundle ID.
from-xlsx <xlsx-path> — scaffold from xlsx test casesDelegates to xlsx-testcases gen maestro — see that skill.
# Common actions
- launchApp
- tapOn: "Submit" # by text
- tapOn:
id: "submit-btn" # by accessibility id
- inputText: "${EMAIL}"
- assertVisible: "Welcome"
- assertNotVisible: "Login"
- waitForAnimationToEnd
- extendedWaitUntil: { visible: "Loaded", timeout: 30000 }
- scrollUntilVisible: { element: "Footer", direction: DOWN }
- runFlow: { file: ../subflows/login.yaml }
Variables via env: EMAIL=test@example.com maestro test flow.yaml. Inside YAML: ${EMAIL}.
${ENV_VAR} + document required vars in flow comment..maestro/
├── config.yaml # global config
├── subflows/{login,grant-perms}.yaml
├── smoke/{launch,home-tabs}.yaml
├── regression/...
└── iap/...