From automate
Creates Kobiton test runs from test cases or suites using sensible defaults, then offers monitoring with optional live remediation.
How this skill is triggered — by the user, by Claude, or both
Slash command
/automate:create-test-runThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Turn a "run this" request into a created test run with as little friction as the
Turn a "run this" request into a created test run with as little friction as the user wants, then offer to watch it. Two phases:
monitor-test-run if the user wants it.Tool naming. Kobiton MCP tools are referenced by bare name (
createTestRun,getOrgSettings,listDevices,getTestCase,getTestSuite). The host resolves the prefix (mcp__plugin_automate_kobiton__createTestRun,mcp__kobiton__createTestRun, etc.).
| Input | Required | Notes |
|---|---|---|
| test case id or test suite id | one of | A test case id → TEST_CASE selection; a suite id → TEST_SUITE. If the user named neither, ask for it (it's the one thing with no sensible default). |
| device count / specific devices | no | Default: 1 device matching the test case/suite platform. The user may say "3 devices", name models, or give UDIDs. |
| run name / app version / allocation | no | All defaulted (see Step 2). |
getTestCase) to learn its platform and the app under test. Selection
will be TEST_CASE with testCaseSelections: [{ testCaseId, version }] (default to the latest version
if the user didn't pin one).getTestSuite) for platform + member test cases. Selection will be
TEST_SUITE with testSuiteId.Apply these defaults so a bare request ("run test case X") becomes a complete, valid createTestRun
payload. Use the exact enum values below — they are upper-case and case-sensitive; the API rejects
lower-case variants (test_case, specific_devices, …).
| Field | Default | Notes |
|---|---|---|
testSelection.type | TEST_CASE (case) / TEST_SUITE (suite) | per Step 1 |
| test case version | latest version of the case | from getTestCase |
deviceSelection.type | INDIVIDUAL_DEVICES | prefer explicit devices over a bundle (avoids stale-bundle surprises) |
| devices | 1 available device matching the target's platform | call listDevices(platform=<platform>, available=true) and pick online, unbooked, non-cloud devices; if the user asked for N, pick N distinct ones. Pass each as { udid, isCloud }. |
appSelections | the test case's app under test, latest version | derive appPackage + appVersionId from getTestCase (the case records its app); omit only if the target carries no app. |
deviceAllocationStrategy | CROSS_DEVICE | "All Permutations" — run each test case on each device (see label map below) |
name | "<test case/suite name> — <N> device(s) — <YYYY-MM-DD HH:mm>" | human-readable; the user can override |
description | omit | optional |
Enum reference (exact API values — upper-case, case-sensitive):
testSelection.type: TEST_CASE | TEST_SUITEdeviceSelection.type: INDIVIDUAL_DEVICES | DEVICE_BUNDLEdeviceAllocationStrategy: CROSS_DEVICE | SINGLE_DEVICEAllocation-strategy labels (show the human label to the user, send the enum to the API). Mirror the Portal's "Device Allocation Strategy" dropdown wording:
| API enum | Show to the user |
|---|---|
CROSS_DEVICE | All Permutations — run each test case on each device |
SINGLE_DEVICE | Random Allocation — run each test case once, randomly chosen from the selected devices |
Never surface the bare enum (CROSS_DEVICE) in the summary or prompts — it's meaningless to the user.
Post a compact summary of exactly what will be created, e.g.:
About to create this test run:
Test case : API Demos (id 019ef40b…, version 2, Android)
Devices : 3 × Android (Pixel 8 · Galaxy S24 Ultra · Pixel 4)
App : io.appium.android.apis (version 73202)
Allocation: All Permutations — run each test case on each device
Name : "API Demos — 3 devices — 2026-06-24 11:20"
(Allocation shows the human label, not the CROSS_DEVICE enum.)
Then ask to proceed or customize in one prompt — offer "Proceed", "Change devices", "Change allocation", "Change name", and let the user free-type any other tweak. When the user wants to change allocation, present the two human-labeled choices (All Permutations / Random Allocation) and map their pick back to the enum. Re-summarize and re-ask only if they change something. If the user's original request was already fully explicit (every field named), you may create directly and just state what you created.
Call createTestRun with the assembled payload (camelCase keys as in the tool schema; the exact enum
values from Step 2). On success it returns the test run id + queued sessions. Report the id and a
one-line confirmation.
If createTestRun returns a validation error, fix it from the error text and the Step-2 enum reference
rather than guessing — do not retry the same body.
Read the live-remediation flag first: call getOrgSettings once and note live_remediation_enabled
(flagOn). This decides whether the auto-open option is meaningful.
Then offer monitoring in a single message (don't fire multiple separate questions — that's the annoying part). Present the choices inline and let the user pick one:
flagOn = true. Watches the
run and, when an execution blocks, automatically opens the live-remediation window for the device.Phrase it as one prompt, e.g. (flag ON):
Run created (
<testRunId>). Want me to monitor it? (a) monitor + auto-open the live-remediation window when a blocker hits, (b) monitor only (I'll surface blockers + the URL), or (c) don't monitor. Reply a / b / c.
(flag OFF — drop option a, since there's no live window to open):
Run created (
<testRunId>). Want me to monitor it? (b) monitor only (I'll surface blockers + the portal URL), or (c) don't monitor. Reply b / c.
On the user's answer:
monitor-test-run skill for <testRunId>. Pass along the auto-open
intent: for (a), the user has already opted into auto-open, so tell monitor-test-run to skip its own
up-front auto-open question and treat autoOpen = yes; for (b), autoOpen = no. monitor-test-run
owns the watch loop (the bundled poller, blocker surfacing, post-mortem) from here.monitor-test-run <testRunId>), then
stop.| Condition | Handling |
|---|---|
| No test case/suite id given | Ask for one — it's the only field with no default. |
createTestRun validation error (bad enum, missing pair) | Correct from the error + the Step-2 enum reference; don't blind-retry. |
| No available devices for the platform | Tell the user; offer to widen (cloud devices) or wait. Don't create a run that can't dispatch. |
getOrgSettings fails before the monitor offer | Assume flagOn = false (drop the auto-open option); still offer monitor-only / don't-monitor. |
monitor-test-run (same plugin), which runs the bundled emit-on-change poller.INDIVIDUAL_DEVICES with explicit { udid, isCloud } over a device bundle, so the exact devices
are known and a stale/oversized bundle can't surprise the run.npx claudepluginhub kobiton/automate --plugin automateUploads a mobile app build, selects a Kobiton device, parses Appium capabilities, and executes a local test script against a real device. Works with Appium WebDriver scripts in JS, Python, Java, C#, or Ruby.
Creates, runs, and maintains mobile E2E tests for Android and iOS using Momentic. Manages cache, timing, and settings for reliable execution on emulators and simulators.
Execute mobile app testing on iOS and Android emulators/simulators. Handles UI interactions, gestures, and platform-specific behaviors using Appium, Detox, XCUITest, Espresso, or Maestro.