Swipium
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| CI | No | When set, reports label the run environment as CI. | |
| JAVA_HOME | No | JDK used by Gradle builds; qa_doctor flags a missing JDK under Codex. | |
| CODEX_HOME | No | Where swipium init codex finds config.toml (default ~/.codex). | |
| GITHUB_SHA | No | Source revision commit recorded in reports and the issue ledger. | |
| APPIUM_HOME | No | Extra location searched for an Appium-installed WDA (besides ~/.appium and global npm). | |
| ANDROID_HOME | No | Android SDK location, searched for adb, emulator, and aapt2. | |
| CI_COMMIT_SHA | No | Source revision commit recorded in reports and the issue ledger. | |
| GITHUB_RUN_ID | No | Source run ID recorded in reports and the issue ledger. | |
| SWIPIUM_TOOLS | No | core lists only the core tools (the swipium init codex set); all (default) lists every tool. Tool counts then count the listed tools. | all |
| BUNDLETOOL_JAR | No | Path to bundletool.jar for converting .aab files. A bundletool launcher on PATH also works. | |
| SWIPIUM_DEVICE | No | Pins 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_URL | No | Source pipeline URL recorded in reports and the issue ledger. | |
| GITHUB_REF_NAME | No | Source revision branch recorded in reports and the issue ledger. | |
| SWIPIUM_OCR_CMD | No | OCR 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_ROOT | No | Android SDK location, searched for adb, emulator, and aapt2. | |
| BITBUCKET_BRANCH | No | Source revision branch recorded in reports and the issue ledger. | |
| BITBUCKET_COMMIT | No | Source revision commit recorded in reports and the issue ledger. | |
| DEVELOPMENT_TEAM | No | Apple team ID for signing WDA (ios.wda.developmentTeam in .swipium/config.json takes precedence). | |
| SWIPIUM_TEST_OTP | No | Test-account OTP value. | |
| SWIPIUM_TEST_PIN | No | Test-account PIN value. | |
| WDA_PROJECT_PATH | No | Extra WebDriverAgent.xcodeproj candidate reported by qa_doctor and qa_wda status (to build one, pass wdaProjectPath). | |
| CLAUDE_CONFIG_DIR | No | Where swipium init claude --scope user installs the skill (<dir>/skills/, default ~/.claude). | |
| GITHUB_REPOSITORY | No | Source repository recorded in reports and the issue ledger. | |
| GITHUB_SERVER_URL | No | Source revision server URL recorded in reports and the issue ledger. | |
| SWIPIUM_LOG_LEVEL | No | Minimum 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_NAME | No | Source revision branch recorded in reports and the issue ledger. | |
| CLAUDE_PROJECT_DIR | No | Set by Claude Code; used as the project root after SWIPIUM_PROJECT_ROOT. | |
| SWIPIUM_TEST_EMAIL | No | Test-account email value. Flows and qa_act can use ${SWIPIUM_TEST_EMAIL}. | |
| SWIPIUM_TEST_TOKEN | No | Test-account token value. | |
| SWIPIUM_MAX_WAIT_MS | No | How 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_GPU | No | -gpu mode for emulators Swipium boots (default auto). Use swiftshader_indirect on hosts without a usable GPU. | auto |
| SWIPIUM_PROJECT_ROOT | No | Absolute path of the app repository when the client provides no MCP roots. | |
| SWIPIUM_TEST_PASSWORD | No | Test-account password value. | |
| SWIPIUM_TEST_USERNAME | No | Test-account username value. | |
| SWIPIUM_ANDROID_DUMPER | No | agent 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_DAYS | No | Age limit in days for ~/.swipium/runs session directories (default 30). 0 or off disables the automatic prune; swipium gc still works. | 30 |
| SWIPIUM_RETENTION_KEEP | No | Number of newest sessions per project kept regardless of age (default 20), while the project's root still exists. | 20 |
| SWIPIUM_TEST_DEEP_LINK | No | Test-account deep link value for the starter flows. | |
| WEBDRIVERAGENT_PROJECT | No | Extra WebDriverAgent.xcodeproj candidate reported by qa_doctor and qa_wda status (to build one, pass wdaProjectPath). | |
| XCODE_DEVELOPMENT_TEAM | No | Apple team ID for signing WDA (ios.wda.developmentTeam in .swipium/config.json takes precedence). | |
| SWIPIUM_VISUAL_MASK_CMD | No | Masks screenshots before OCR and visual providers see them (visualMaskCommand in config wins). | |
| SWIPIUM_ALLOW_REMOTE_WDA | No | Comma-separated exact non-loopback WDA base URLs you pre-approve. Set it in your client config, never in the repository. | |
| SWIPIUM_CONSENT_PREAPPROVE | No | Comma-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_BOOT | No | Set to 1 to boot emulators cold (-no-snapshot-load) instead of quick-booting from the AVD snapshot. | |
| SWIPIUM_REQUIRE_ELICITATION | No | Set 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_DISCOVERY | No | Test-suite isolation only: disables device auto-discovery. Not for normal use. | |
| SWIPIUM_CONSENT_PREAPPROVE_RUN_CODE | No | Set 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
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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
| Name | Description |
|---|---|
| swipium_setup_check | Verify Swipium can test a project and report what (if anything) is blocking. No side effects. |
| swipium_guardrail_validation | Confirm Swipium refuses an unsafe destructive action (bundle-loss) on a debug RN/Expo build (Android or iOS). |
| swipium_full_smoke | Run the autopilot smoke (build or find the app, prepare a device, test, report) and summarize it. |
| swipium_bug_repro | Drive to a described bug, capture deterministic evidence, and file it as a structured outcome. |
| swipium_test_feature | Test a named feature end to end: scope, cases, a focused run, and a pass/fail/blocked report per case. |
| swipium_generate_suite | Run the app, then turn the run into a durable test suite (.swipium/test-suite.json + POM suite) and lint it. |
| swipium_convert_run_to_flow | Draft a repeatable .swipium/flows/*.yaml from the steps you just performed, then validate it. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| swipium-qa-skill | Agent skill: the canonical Swipium QA loop. |
TDQS
Scored across 55 tools
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.
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.
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.
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.