Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
CINoWhen set, reports label the run environment as CI.
JAVA_HOMENoJDK used by Gradle builds; qa_doctor flags a missing JDK under Codex.
CODEX_HOMENoWhere swipium init codex finds config.toml (default ~/.codex).
GITHUB_SHANoSource revision commit recorded in reports and the issue ledger.
APPIUM_HOMENoExtra location searched for an Appium-installed WDA (besides ~/.appium and global npm).
ANDROID_HOMENoAndroid SDK location, searched for adb, emulator, and aapt2.
CI_COMMIT_SHANoSource revision commit recorded in reports and the issue ledger.
GITHUB_RUN_IDNoSource run ID recorded in reports and the issue ledger.
SWIPIUM_TOOLSNocore lists only the core tools (the swipium init codex set); all (default) lists every tool. Tool counts then count the listed tools.all
BUNDLETOOL_JARNoPath to bundletool.jar for converting .aab files. A bundletool launcher on PATH also works.
SWIPIUM_DEVICENoPins the server to one device: an adb serial, AVD name, or simulator UDID or exact name (case-insensitive in every tool; a simulator name several simulators share is refused with MULTIPLE_DEVICES, so pin by UDID). Runs and auto-binding use only that device, a call naming another device is refused with DEVICE_PINNED, and SWIPIUM_CONSENT_PREAPPROVE therefore only applies to it. Set it on shared CI runners.
CI_PIPELINE_URLNoSource pipeline URL recorded in reports and the issue ledger.
GITHUB_REF_NAMENoSource revision branch recorded in reports and the issue ledger.
SWIPIUM_OCR_CMDNoOCR command for qa_visual find_text (none bundled; consent-gated). {image} becomes a PNG path; it prints [{"text","confidence","bbox"}] JSON. ocrCommand in config.json wins.
ANDROID_SDK_ROOTNoAndroid SDK location, searched for adb, emulator, and aapt2.
BITBUCKET_BRANCHNoSource revision branch recorded in reports and the issue ledger.
BITBUCKET_COMMITNoSource revision commit recorded in reports and the issue ledger.
DEVELOPMENT_TEAMNoApple team ID for signing WDA (ios.wda.developmentTeam in .swipium/config.json takes precedence).
SWIPIUM_TEST_OTPNoTest-account OTP value.
SWIPIUM_TEST_PINNoTest-account PIN value.
WDA_PROJECT_PATHNoExtra WebDriverAgent.xcodeproj candidate reported by qa_doctor and qa_wda status (to build one, pass wdaProjectPath).
CLAUDE_CONFIG_DIRNoWhere swipium init claude --scope user installs the skill (<dir>/skills/, default ~/.claude).
GITHUB_REPOSITORYNoSource repository recorded in reports and the issue ledger.
GITHUB_SERVER_URLNoSource revision server URL recorded in reports and the issue ledger.
SWIPIUM_LOG_LEVELNoMinimum stderr log level: debug, info (default), warn, or error. debug adds one line per tool call (tool, session, duration, error code; never argument values).info
CI_COMMIT_REF_NAMENoSource revision branch recorded in reports and the issue ledger.
CLAUDE_PROJECT_DIRNoSet by Claude Code; used as the project root after SWIPIUM_PROJECT_ROOT.
SWIPIUM_TEST_EMAILNoTest-account email value. Flows and qa_act can use ${SWIPIUM_TEST_EMAIL}.
SWIPIUM_TEST_TOKENNoTest-account token value.
SWIPIUM_MAX_WAIT_MSNoHow long one qa_job_status long-poll, qa_wait, or qa_test_this {waitForCompletion:true} may block, in ms (default 50000, clamped to 1000 to 230000). Set it just under your client's tool timeout; swipium init claude writes 110000.50000
SWIPIUM_EMULATOR_GPUNo-gpu mode for emulators Swipium boots (default auto). Use swiftshader_indirect on hosts without a usable GPU.auto
SWIPIUM_PROJECT_ROOTNoAbsolute path of the app repository when the client provides no MCP roots.
SWIPIUM_TEST_PASSWORDNoTest-account password value.
SWIPIUM_TEST_USERNAMENoTest-account username value.
SWIPIUM_ANDROID_DUMPERNoagent turns on the opt-in persistent Android UI dumper (about 2x to 7x faster snapshots, depending on host load; pushes a small jar to the emulator; blocks other UiAutomation clients while it runs).
SWIPIUM_RETENTION_DAYSNoAge limit in days for ~/.swipium/runs session directories (default 30). 0 or off disables the automatic prune; swipium gc still works.30
SWIPIUM_RETENTION_KEEPNoNumber of newest sessions per project kept regardless of age (default 20), while the project's root still exists.20
SWIPIUM_TEST_DEEP_LINKNoTest-account deep link value for the starter flows.
WEBDRIVERAGENT_PROJECTNoExtra WebDriverAgent.xcodeproj candidate reported by qa_doctor and qa_wda status (to build one, pass wdaProjectPath).
XCODE_DEVELOPMENT_TEAMNoApple team ID for signing WDA (ios.wda.developmentTeam in .swipium/config.json takes precedence).
SWIPIUM_VISUAL_MASK_CMDNoMasks screenshots before OCR and visual providers see them (visualMaskCommand in config wins).
SWIPIUM_ALLOW_REMOTE_WDANoComma-separated exact non-loopback WDA base URLs you pre-approve. Set it in your client config, never in the repository.
SWIPIUM_CONSENT_PREAPPROVENoComma-separated exact consent action names approved without a prompt (for example prepare_plan,test_this_plan), for headless clients such as codex exec or claude -p that answer prompts automatically. No wildcards; unknown names are ignored with a warning. Actions that run code also need SWIPIUM_CONSENT_PREAPPROVE_RUN_CODE=1, and wda_non_loopback is never accepted (use SWIPIUM_ALLOW_REMOTE_WDA). Read only from the server process env, never the repository.
SWIPIUM_EMULATOR_COLD_BOOTNoSet to 1 to boot emulators cold (-no-snapshot-load) instead of quick-booting from the AVD snapshot.
SWIPIUM_REQUIRE_ELICITATIONNoSet to 1 to refuse every consent-gated action (CONSENT_REFUSED) when the client can't show a real consent prompt. Operator pre-approval still applies.
SWIPIUM_DISABLE_DEVICE_DISCOVERYNoTest-suite isolation only: disables device auto-discovery. Not for normal use.
SWIPIUM_CONSENT_PREAPPROVE_RUN_CODENoSet to 1 to let SWIPIUM_CONSENT_PREAPPROVE cover actions that run repository- or model-chosen code (build_from_source, flow_mutation_run, ocr_run, start_metro, suite_fresh_state_replay, wda_build, wda_start, and a test_this_plan that includes a build). Trusted repositories only.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

Swipium runs mobile QA on local Android Emulators and iOS Simulators (no physical devices). First call: qa_test_this {waitForCompletion:true} (mode defaults to "execute"; optional goal e.g. "release_gate"): builds/finds the app, prepares a device, tests and reports; returns {sessionId, jobId} (often after requiresConsent). If state is "running", poll qa_job_status {sessionId, jobId, waitMs:45000} until status is not "running". result.state: completed | blocked | unsafe | needs_input.

completed: read report.md (qa_get_artifact, URI in nextRecommendedAction), share reportHtmlPath, then stop unless asked. needs_input: relay exactly the one returned question, then make the returned resume call (qa_continue_from_blocker). Never invent questions. blocked / unsafe: relay failureCode, owner and the fix (nextRecommendedAction). A build failure is not a test failure. Consent: with MCP elicitation the user is prompted; otherwise show requiresConsent, re-call with consentId + approve:true only after they agree. CONSENT_DECLINED/_CANCELLED/_REFUSED: nothing ran, do not retry unasked. Ask the user only on needs_input or consent. Logins: SWIPIUM_TEST_EMAIL / SWIPIUM_TEST_PASSWORD in server env.

Project root: projectRoot arg > MCP roots > SWIPIUM_PROJECT_ROOT > CLAUDE_PROJECT_DIR > cwd; PROJECT_ROOT_UNRESOLVED: pass an absolute projectRoot. iOS Simulator without WDA is visual-only (BACKEND_UNSUPPORTED): qa_screenshot + qa_visual, or qa_wda setup. INVALID_ARGUMENT: bad args, nothing ran. STALE_CLIENT: restart client. By hand: batch 3+ known steps in one qa_flow_run {sessionId, flowYaml}. Reset/jump: qa_app_control (restart, clear_data), qa_act open_url (deep links); no raw adb. More: qa_status (state + nextBestAction). One feature: qa_test_feature. Low level: qa_snapshot, qa_act, qa_visual. Element lines omit empty names; trailing " -" = not clickable. Refs (@eN) are stable on screen; stale ref: STALE_REF + candidates. qa_snapshot diff:true: same-screen changes only.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": true
}
resources
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
qa_doctorA

Diagnose the local QA toolchain (Node, Android SDK/emulator, Xcode/simctl, WDA) and stale-client symptoms; run it first when setup fails.

qa_start_sessionA

Open a QA session for the low-level tools (qa_snapshot, qa_act, flows); qa_test_this opens its own. projectRoot defaults to MCP roots > SWIPIUM_PROJECT_ROOT > CLAUDE_PROJECT_DIR > a project-like cwd. Default budget: 30 min / 60 actions / 40 screenshots. fixtures declare preconditions; unmet ones report blocked, not failed.

qa_prepare_targetA

Prepare an Android Emulator and the app under test: bind or boot the device, Metro + adb reverse for RN/Expo, install, launch, verify. One combined consent covers boot/install; long steps return a jobId. bindOnly stops after bind/boot.

qa_iosA

Control an iOS Simulator (macOS): list, boot (binds it to the session), install (.app), launch, terminate, openurl, logs, privacy_reset, erase (wipes it). install, privacy_reset and erase are consent-gated. A slow cold boot returns status:"booting" (poll qa_wait for:"simulator_booted"). Structured iOS automation: qa_wda.

qa_wdaA

Set up and manage iOS WebDriverAgent (WDA), needed for structured iOS tap/type/snapshot; start with action:"setup": it reuses a running WDA, else builds (if no build exists) and starts it as one consent-gated job (poll qa_job_status, then qa_wda attach). build/start are consent-gated; attach takes an external webDriverAgentUrl; status/doctor/diagnose/logs/tune inspect.

qa_device_infoA

Read-only device info. Android: model, SDK, ABIs, locale, screen, orientation (listPackages:true adds third-party packages; logs:{…} captures filtered logcat). iOS Simulator: name, runtime, state, screen.

qa_orientationB

Set orientation (Android Emulator only): portrait, landscape, or auto. Logged as an environment change.

qa_geolocationB

Spoof the GPS location (Android Emulator only; consent-gated, logged as an environment change).

qa_networkA

Test offline/online behavior via airplane mode (Android 11+). action: status, offline/online (consent-gated), restore. The original state is restored on qa_report, on restore, and on server shutdown.

qa_metroA

Manage the Metro bundler for debug RN/Expo builds: status, diagnose (adds RedBox/logcat evidence and fixes), start (consent-gated: adb reverse + Metro), stop. After start, relaunch with qa_prepare_target.

qa_app_controlA

Control the app under test: launch, foreground, background, force_stop, restart (force_stop + launch, for persistence checks), clear_data and fresh_start (wipe data: destructive, consent-gated; RN/Expo also need acknowledgeBundleRisk).

qa_screen_recordA

Record the screen to an mp4 artifact: start (consent-gated; avoid password/OTP screens), status, stop. save:"on_failure" keeps only failing runs. One recording per session; Android stops after ~3 min.

qa_screenshotA

Save a screenshot as a session artifact and return its swipium:// URI. Withheld on password/OTP screens unless force:true. Counts against the screenshot budget. inline:true also returns the image (JPEG, long edge 1568 px, scale in the text) for clients that can see images.

qa_snapshotA

Read the current screen as addressable elements (@e1, @e2...) for qa_act, with a snapshotQuality verdict; call it before acting and after navigation. Interactive elements only, capped on busy screens (filter finds the rest). A trailing " -" marks a non-clickable element. Refs stay stable while the element stays.

qa_inspectA

Inspect one element: full attributes (class, ids, text, bounds, flags) of an @eN ref from the last qa_snapshot.

qa_actA

Tap, type, clear, swipe, scroll, press a key, open a URL or wait: one UI step, then it waits for the screen to settle and reports changed/settled, snapshot quality, health, new elements. Target: an @eN ref from qa_snapshot, text, id, a native selector (WDA iOS), or x/y. For 3+ known steps, batch them in one qa_flow_run {flowYaml}. Details: docs/tools.md#qa_act.

qa_clear_overlayA

Clear what blocks the screen (keyboard, LogBox, permission dialog, toast); strategy "auto" handles the topmost. targetRef checks whether that element is still obstructed. Returns what was cleared and what remains.

qa_check_healthA

Health check of the current screen: crash, ANR, error boundary, error surface, app still in the foreground. High-severity findings are real bugs. qa_act runs it automatically.

qa_job_statusB

Poll or wait on a background job (qa_test_this, qa_prepare_target, qa_explore, qa_build run, ...): status, progressDetail, and result/error when finished (qa_test_this: state completed/blocked/unsafe/needs_input, reportUri, suite, smoke, health). waitMs long-polls until the job leaves "running" (else waited.timedOut:true).

qa_job_cancelA

Cancel a running background job and abort its child processes (build/boot/install/record). Returns {jobId, cancelled}; cancelled:false means it already finished or is unknown. Side effects already applied are not rolled back.

qa_get_artifactA

Fetch a session artifact (screenshot, report, dump, log, recording) by its swipium://session/// URI when the client lacks MCP resources. Text is inline (over 1 MB: the head, or the tail for logs). Binaries return metadata; mode:"inline" returns the bytes (images as JPEG, long edge 1568 px, scale in the text).

qa_noteA

Record the outcome of one workflow for the report. Use outcome:"blocked" + missingPrecondition rather than a false failure; category says why. A pass/fail note captures a checkpoint screenshot and links the steps since the last note; extra evidence goes in artifactUris (this session's URIs only, others are dropped).

qa_visualA

Screenshot checks where the UI tree fails (maps, canvases, WDA-less iOS). mode: assert, baseline (.swipium/baselines/.png), diff, find_text (OCR, consent-gated), find_image. Finds return device coordinates + coordinateSpace; tap:true taps it (recorded + budgeted). Password/OTP screens need force:true; unverified credential screens: assert/diff not saved. Details: docs/tools.md#qa_visual.

qa_flow_checkA

Validate a flow (flow name/path or flowYaml) without running it: schema errors with the offending step, plus warnings. Per-backend preview: qa_flow_run mode:"plan".

qa_flow_runA

Run a YAML flow (saved, or inline flowYaml to batch known steps) on the prepared app; mode:"plan" previews per-backend support without a device. Server-side, fail-fast, with setup/teardown; mutating and OCR steps are consent-gated; a failure returns the step, screenshot, failureCode, and health. Pass flow (name/path) or flowYaml, plus variables. Steps: docs/flows.md#step-reference.

qa_generateA

Generate reusable test assets from the actions recorded in this session. target: flow (Flow V2 YAML), pom (page objects), suite (POM suite under .swipium/, compiled to flows, replay-gated), testcases (TC catalog), appium (WebdriverIO or Python project; can bootstrap from projectRoot). mode:"plan" previews. Durable repo suite: qa_suite_generate.

qa_smokeA

Run a smoke test server-side: optionally launch, run the baseline (snapshot quality + health + evidence screenshot), then every saved flow in .swipium/flows. Records a qa_note per workflow; call qa_report after. Needs a prepared device.

qa_reportA

Build the session report: returns a short summary + URIs (reportMdUri = report.md to read; reportUri = full JSON, inline with format:"json" minus steps; reportHtmlPath = report.html, give the user that path). format adds an export: markdown, json, junit, sarif, github-summary, flow, playwright (deprecated). CI: docs/ci-reports.md.

qa_test_thisA

Start here to test a mobile app (Android/iOS): finds or builds the app, picks an emulator/simulator, runs prepare > smoke > explore > report > suite as a job (mode:"execute", default; pass waitForCompletion:true or poll qa_job_status). mode:"plan" only plans, no side effects. One consent covers boot/install/build; every terminal state has a report. iOS without WDA: visual-only smoke.

qa_prepare_ios_targetA

Prepare an iOS Simulator: boot, install a simulator .app (consent-gated), launch, verify, and report whether WDA structured automation or visual-only mode is available. .ipa files are refused.

qa_flow_compileA

Compile a POM suite on disk (.swipium/suites/.yaml) into runnable flows under .swipium/flows/ and validate them. No session needed; qa_generate target:"suite" already compiles what it generates.

qa_exploreA

Explore the prepared app automatically as a job (poll qa_job_status): taps ranked safe actions, checks health, builds a screen graph, updates the app map, and records taps for qa_generate. Destructive actions (delete/pay/send/logout) are skipped unless one candidate is approved; an auth wall without credentials returns needs_input.

qa_first_runA

Get past a first-run gate (login, sign-up, OTP, onboarding, permissions, paywall). mode:"plan" (default, read-only) classifies the screen and returns a safe plan. mode:"continue" runs bounded steps: generated data only in test/staging, never purchases, one needs_input question on OTP. Needs a prepared device.

qa_statusA

Session status and the next tool to call; cheap, call between steps. Without sessionId: first-call orientation (how to drive Swipium: first call, polling, stop rules, tool groups). With sessionId: compact state (device, app, budget left, counters, findings, last job, workarounds, readiness) and nextBestAction (tool, args, why); goal biases it.

qa_explain_blockerA

Explain a failureCode in plain language: what it means, who owns the fix (app / environment / Swipium / user), whether it is retry-safe or Swipium can fix it, and the recovery step.

qa_continue_from_blockerA

Answer a needs_input question (credentials, OTP, platform, device, monorepo target) and get the next call. Secrets (passwords/OTP/tokens) are redacted at once and never echoed or logged (flows use ${VAR}). Non-secret choices map onto the re-invocation args. Returns accepted, ignored[], projectRoot, nextAction; with no new consent needed it starts the resumed job (jobId).

qa_app_map_buildA

Build or update .swipium/app-map.json: a static scan of routes and screens (Expo Router, React Navigation, Android, SwiftUI/UIKit, Flutter), plus the latest exploration graph when sessionId is given.

qa_app_map_readA

Read a compact app-map section: summary (default) | screens | features | auth | automation | testSuite | full; featureId or screenId drills into one node. Large sections come back as a resource URI.

qa_app_map_queryA

Search the app map (features, screens, code, tests) with a natural-language query. Returns ranked results with sources and the suggested next tool call.

qa_app_map_feature_scopeA

Resolve a feature (featureId, or a query like "checkout") to a test scope: code, screens, existing tests, coverage gaps, strategy, ranked candidates. Works without a map (code scan). Read-only.

qa_app_map_updateA

Targeted app-map edits without a rebuild: add a note, register test cases, link an automation suite, set the environment, or override a feature's coverage. A matching id/path is overwritten.

qa_issue_logA

Track bugs across runs in the project issue ledger (.swipium/issues-log.jsonl). mode: history (default, filterable), log (record an observation; re-observing a fixed issue reopens it), mark_fixed, verify_fixed (needs current-run evidence), suppress (expires; unsuppress:true lifts it), metrics (trends). Transitions take issueId or fingerprint.

qa_mobile_auditA

Release-readiness audit: plan (default, no device) or execute. profile: smoke, account_cycle (create/logout/login/reset on a disposable account), store_compliance, resilience (offline/relaunch/rotation; airplane mode is consent-gated), release_gate (all). execute needs a prepared session, logs failed/blocked checks to the issue ledger, passes nothing without evidence.

qa_suite_readA

Read the repo suite (.swipium/test-suite.json), filtered by functionality/status, as a summary, json, or markdown, plus a resource URI for the full suite.

qa_suite_updateA

Add or update cases in the repo test suite: a case matching feature + objective + steps is updated, new ones get stable TC ids. mergeMode decides whether generated fields overwrite curated ones.

qa_suite_generateA

Generate cases from this session (recorded actions, outcomes, exploration coverage) and merge them into the durable repo suite .swipium/test-suite.json (re-runs update, no duplicates). Returns cases, skipped features, and coverage gaps. Per-run assets: qa_generate.

qa_suite_exportB

Export the repo test suite as markdown, yaml, json, or junit; save:true writes it under .swipium/test-suite-export/.

qa_suite_lintA

Lint the repo test suite (missing results, stale links, duplicate ids, brittle automation, unsafe adversarial cases) and generated page objects (fragile locators). Returns errors and warnings.

qa_flow_repairA

Repair a failed flow step: suggest a stronger locator and app changes (testID/accessibilityIdentifier); apply:true patches simple selector steps at high/medium confidence (low confidence: refused, applied:false + a note).

qa_test_featureA

Test one named feature (e.g. login, checkout). mode:"execute" (default): a job that explores toward it, records pass/fail/blocked per case, and writes a report (poll qa_job_status). mode:"plan" (read-only): scope, cases, fixtures, plan. Without sessionId it bootstraps from projectRoot (consent-gated). Auth, paywall, or missing-fixture gates report blocked, not failed.

qa_resolve_artifactA

Find the best installable build (.apk/.aab/.ipa/.app) in Gradle/Flutter/Xcode outputs. Returns ranked candidates (build type, installability, app id, warnings) and the paths searched. Side-effect free.

qa_resolve_targetA

Pick the emulator/simulator to test on, deterministically (honors platform, device, artifact; prefers an online one, else plans a boot). Returns selected, reason, alternatives, willBoot. include: context (framework, artifacts, devices, toolchain) and/or plan (READY/BLOCKED/UNSAFE workflows). Boots nothing; physical phones are unsupported.

qa_buildA

Build the app from source. mode:"plan" (default, no side effects): commands, cwd, expected artifacts, toolchain status. mode:"run" (consent-gated job, needs sessionId): runs them, stores the build log, re-resolves the artifact. Failures are typed (GRADLE_FAILED, XCODEBUILD_FAILED, ...) and are not test failures.

qa_bundletoolA

Convert an .aab into an installable APK with bundletool (cached in .swipium/artifacts/) before qa_prepare_target. Default: a universal APK; connectedDevice:true builds a device APK set, install:true installs it (consent-gated). Runs as a job.

qa_waitA

Wait for a setup condition instead of shell sleep: device_online (adb), metro_ready, wda_ready (after qa_wda start returned status:"starting"), or simulator_booted (the bound iOS Simulator, after qa_ios boot returned status:"booting"). Returns satisfied, or timedOut:true (call again). Jobs: qa_job_status waitMs.

Prompts

Interactive templates invoked by user choice

NameDescription
swipium_setup_checkVerify Swipium can test a project and report what (if anything) is blocking. No side effects.
swipium_guardrail_validationConfirm Swipium refuses an unsafe destructive action (bundle-loss) on a debug RN/Expo build (Android or iOS).
swipium_full_smokeRun the autopilot smoke (build or find the app, prepare a device, test, report) and summarize it.
swipium_bug_reproDrive to a described bug, capture deterministic evidence, and file it as a structured outcome.
swipium_test_featureTest a named feature end to end: scope, cases, a focused run, and a pass/fail/blocked report per case.
swipium_generate_suiteRun the app, then turn the run into a durable test suite (.swipium/test-suite.json + POM suite) and lint it.
swipium_convert_run_to_flowDraft a repeatable .swipium/flows/*.yaml from the steps you just performed, then validate it.

Resources

Contextual data attached and managed by the client

NameDescription
swipium-qa-skillAgent skill: the canonical Swipium QA loop.

TDQS

A3.6/5.0

Scored across 55 tools

Disambiguation3/5

Many tools overlap in the high-level orchestration space: qa_test_this, qa_test_feature, qa_mobile_audit, qa_smoke, qa_explore, and qa_prepare_target all 'prepare/run tests on a device.' Descriptions add clarifying notes (e.g. qa_test_this 'start here', qa_start_session for low-level), but an agent must read carefully to choose. Lower-level tools (qa_act, qa_snapshot, qa_inspect, qa_visual) are distinct.

Naming Consistency4/5

Consistent qa_ prefix and snake_case throughout. Most are verb_noun (qa_start_session, qa_get_artifact, qa_clean_overlay) but several are noun-first (qa_app_map_read, qa_suite_read, qa_job_status, qa_device_info, qa_screen_record), a minor deviation.

Tool Count2/5

55 tools is heavy for a mobile QA server; groups like app-map (5), suite (5), flow (4), and the many orchestrators suggest feature sprawl. Each earns some purpose but the surface is bloated and would benefit from consolidation.

Completeness5/5

Covers the full lifecycle: device/emulator management, WDA, build/bundletool, prepare, session, snapshot/act, flows, suites, app maps, visual checks, health, reports, job control, blocker recovery. No obvious dead ends in the stated domain.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues