BrowserStack Live Testing
handsontable/handsontable
Opens a live BrowserStack session on a real Android, iOS or desktop browser for a local or public URL, tunneling localhost through Cloudflare when needed.
Run local Appium test scripts against Kobiton devices. An agent skill from jeremylongshore/tons-of-skills-marketplace.
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill run-automation-suite -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install jeremylongshore/tons-of-skills-marketplace run-automation-suite --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/testing/kobiton-automate/skills/run-automation-suite .claude/skills/run-automation-suite && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "run-automation-suite" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/plugins/testing/kobiton-automate/skills/run-automation-suite into .claude/skills/run-automation-suite/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "run-automation-suite", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/plugins/testing/kobiton-automate/skills/run-automation-suiteType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill run-automation-suite -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install jeremylongshore/tons-of-skills-marketplace run-automation-suite --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/testing/kobiton-automate/skills/run-automation-suite .agents/skills/run-automation-suite && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "run-automation-suite" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/plugins/testing/kobiton-automate/skills/run-automation-suite into .agents/skills/run-automation-suite/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "run-automation-suite", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill run-automation-suite -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install jeremylongshore/tons-of-skills-marketplace run-automation-suite --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/testing/kobiton-automate/skills/run-automation-suite .cursor/skills/run-automation-suite && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "run-automation-suite" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/plugins/testing/kobiton-automate/skills/run-automation-suite into .cursor/skills/run-automation-suite/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "run-automation-suite", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/jeremylongshore/tons-of-skills-marketplace.git --path plugins/testing/kobiton-automate/skills/run-automation-suite--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill run-automation-suite -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install jeremylongshore/tons-of-skills-marketplace run-automation-suite --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/testing/kobiton-automate/skills/run-automation-suite .gemini/skills/run-automation-suite && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "run-automation-suite" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/plugins/testing/kobiton-automate/skills/run-automation-suite into .gemini/skills/run-automation-suite/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "run-automation-suite", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install jeremylongshore/tons-of-skills-marketplace run-automation-suiteInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill run-automation-suite -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/testing/kobiton-automate/skills/run-automation-suite .github/skills/run-automation-suite && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "run-automation-suite" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/plugins/testing/kobiton-automate/skills/run-automation-suite into .github/skills/run-automation-suite/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "run-automation-suite", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill run-automation-suite -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install jeremylongshore/tons-of-skills-marketplace run-automation-suite --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/testing/kobiton-automate/skills/run-automation-suite .opencode/skills/run-automation-suite && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "run-automation-suite" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/plugins/testing/kobiton-automate/skills/run-automation-suite into .opencode/skills/run-automation-suite/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "run-automation-suite", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
run-automation-suiteRun local Appium test scripts against Kobiton devices. An agent skill from jeremylongshore/tons-of-skills-marketplace.
Run Automation Suite is an agent skill from jeremylongshore/tons-of-skills-marketplace. Run local Appium test scripts against Kobiton devices. Guides through app upload, device selection, capability parsing, and local execution. Use when the user asks to run mobile tests, validate an APK or IPA on Kobiton devices, or kick off an Appium suite from a local script directory. Trigger with "run kobiton tests" or "execute appium on kobiton".
Its SKILL.md is about 6.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 12 other files, including scripts and reference files (for example `references/capabilities.md`, `scripts/chromeless-launcher-linux.sh` and `scripts/chromeless-launcher-mac.sh`). Compatibility notes: Any OS, but requires a persistent local filesystem — it runs the user's own Appium script from a local directory, so it cannot work where the host offers only…
It sits in Mobile, covering Mobile testing and debugging. It works with Model Context Protocol. The repository describes itself as: Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit cfae287. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadEditBash(node:*)Bash(npm:*)Bash(npx:*)Bash(yarn:*)Bash(pnpm:*)Bash(python:*)Bash(python3:*)Bash(pytest:*)…and 14 more on the same allowed-tools line.
From allowed-tools in the SKILL.md frontmatter.
Ships 7 files in scripts/ (Shell, JavaScript and PowerShell), which the agent can run.
Shell commands in SKILL.md call:
nodebashpwshFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
portal.kobiton.comapi.kobiton.comAlso links to:
docs.kobiton.comappium.iogithub.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Any OS, but requires a persistent local filesystem — it runs the user's own Appium script from a local directory, so it cannot work where the host offers only an MCP connection. Requires Node.js >= 18, Appium 2.x, and whichever language runtime the test script uses. Test scripts must use the Appium WebDriver protocol.
From compatibility in the SKILL.md frontmatter.
Run Automation Suite loads about 6.1k tokens when it runs, and up to ~7.5k if it reads all its reference files. Until then it costs about 93 tokens; SKILL.md has 3,193 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from jeremylongshore/tons-of-skills-marketplace at commit cfae287, republished under its MIT licence (© jeremylongshore). 3,193 words, ~6,098 tokens.
.claude/skills/run-automation-suite/SKILL.md (or your agent's skills folder). This skill also uses 9 other files; get the full folder from GitHub.Execute Appium-based mobile test automation suites on Kobiton's device cloud. Given a local Appium test script, this skill identifies the target app, selects an available device, parses and reconciles capabilities, runs the script in the background, and surfaces the resulting session URL plus artifacts (video, logs, screenshots, reports).
Use this skill when the user asks to run mobile tests, validate an APK or IPA across real devices, or trigger a Kobiton-hosted automation run from a local script directory.
Runs on any OS, but needs a persistent local filesystem — its whole job is running the user's local Appium script, plus that script's own language runtime. Where the host can't provide those, route to create-test-run to execute a test case already saved in Kobiton instead. See the Skill compatibility matrix in CLAUDE.md.
Before invoking this skill, ensure:
api.kobiton.com/mcp; check .mcp.json for the configured endpoint)..js, .ts, .py, .java, .kt, .cs, .rb) referencing desired capabilities for the target platform..apk / .ipa / .zip build artifact for upload, or a kobiton-store:vXXXXX reference for an existing upload.This skill calls tools served by the Kobiton MCP server at api.kobiton.com/mcp. Two authentication configurations ship with the plugin; one of them must be active before any MCP tool will respond:
| Config file | Auth mechanism | When to use |
|---|---|---|
.mcp.json (default) | OAuth 2.1 browser flow | Interactive AI-CLI session for an end user |
.mcp.apikey-example.json | Basic auth header — Authorization: Basic base64(username:apikey) from the KOBITON_AUTH env var | CI / headless / scripted invocations; copy this file over .mcp.json |
If the skill is invoked and no MCP connection is established, abort step 1 and surface a clear error: the user needs to authenticate the Kobiton MCP server in their AI CLI before any device or session call can succeed. The exact invocation depends on the host (e.g. /mcp in Claude Code, /mcp auth kobiton in GitHub Copilot CLI and Gemini CLI, automatic browser flow on first tool call in Codex CLI, /mcp list then Login in Cursor CLI — see the plugin README for current per-CLI commands). Do NOT attempt to recover by retrying — the auth context is fixed at session start.
IMPORTANT: Always ask the user this question, even if they already provided an app file path. Do NOT skip ahead or start uploading automatically.
Ask the user:
"Would you like to:"
- Upload a new app build
- Use an existing app from Kobiton Store or a provided URL
Wait for their response before proceeding. Do not call any upload or app-related tools until the user responds.
If uploading a new app: Look for .apk, .ipa, .zip files in the project context, or ask the user for the file path. Upload via uploadAppToStore (permanent, visible in app repository). This is a four-step process: call the tool to get a pre-signed URL, upload the file via PUT, confirm the upload via confirmAppUpload, then poll getAppParsingStatus with the returned versionId until the state is terminal - OK means ready to use; a FAILURE_* state means parsing failed. confirmAppUpload may return appId: null for a brand-new upload - getAppParsingStatus resolves the real appId.
If reusing an existing app: Check appium:app field of capabilities in the test script. Call listApps with that app version as keywork to check uploaded or not. Let the user pick the version to use (e.g., kobiton-store:v72107) if needed
Ask the user which device or platform to target.
Call listDevices with the relevant platform filter to show available options.
If the user has a specific device in mind, confirm its availability with getDeviceStatus.
Reserve the device with reserveDevice if needed.
In the same exchange, ask how they want to observe the run — don't wait until the script is already running to raise it:
"Open the device live view in a browser window to watch the run, or run it in the background?"
Remember the choice; act on it in Step 5 (which happens right after the script launches in Step 4). Do NOT auto-open a window without asking — some users prefer silent runs, especially on shared screens. If the user's request already made the preference clear (e.g. "just run it in the background", "open it so I can watch"), skip the question and honor what they said.
Ask the user for the path to their local Appium test script.
Detect the language and runtime from the file extension. See references/capabilities.md for the full extension -> runtime -> common commands lookup and the manifest-based runner selection guidance.
Read the script file and extract the key capability fields used by Appium and Kobiton (platformName, udid, app, automation/browser names, vendor kobiton:* extensions, etc.).
Identify how the UDID is passed into the script (CLI argument, environment variable, or hardcoded) so it can be overridden with the selected device.
Appium runtime: Check if the script contains 'kobiton:runtime': 'appium' or equivalent. If it does NOT, do not inject it - the default Kobiton runtime will be used. Only if the user explicitly asks to use the Appium runtime should you suggest adding 'kobiton:runtime': 'appium' to the script's capabilities.
Validate capabilities: After parsing the script, run the render script to generate the correct capabilities for the selected device and app:
node skills/run-automation-suite/scripts/render-capabilities.js \
--platformName <platform> \
--udid <udid> \
--deviceName "<deviceName>" \
--platformVersion <version> \
--automationName <automationName> \
--app <app> \
--testingType appFor web testing, replace --app <app> with --browserName <browser> --testingType web.
Compare the JSON output against the parsed script capabilities using the reconciliation rules: must-match fields are autocorrected to the rendered values, suggested defaults require user confirmation before changing, and user-controlled capabilities are left untouched.
The rendered output also includes kobiton:aiToolName: "<host>" so Kobiton can attribute sessions started by this skill to the calling AI workspace in adoption analytics. Resolution order:
--aiToolName <name> CLI flag (always wins; "" opts out entirely)KOBITON_AI_TOOL_NAME env var (also accepts "" to opt out)CLAUDECODE -> ClaudeCOPILOT_CLI -> CopilotGEMINI_CLI -> GeminiCODEX_THREAD_ID (or CODEX_CLI) -> Codex — Codex CLI sets the thread ID, not a generic CODEX_CLI flag; the latter is accepted for manual override onlykobiton:aiToolName capability is emitted.This capability is treated as must-match during reconciliation (see references/capabilities.md): if the rendered output includes kobiton:aiToolName, always overwrite any existing value in the user's script with it. A stale value from a prior session run under a different CLI would mis-attribute adoption analytics. If the rendered output omits the capability (no runtime marker matched), leave the user's value untouched.
The injection is non-interactive. Edit the script silently using your Edit tool — mention the one-line change inline in your reply for transparency (e.g., "Added kobiton:aiToolName: 'Gemini' to your capabilities for adoption analytics."), but do NOT ask the user to confirm before editing. The value is deterministic (it matches the runtime env from auto-detect), there is nothing to negotiate. If the user objects, they can revert the edit themselves.
Required: verify the injection landed before Step 4. The kobiton:aiToolName capability must be present in the script's source code (e.g., the capabilities object/dict/map). If your reconciliation pass didn't write it to the script, Kobiton will never see it — there is no sidecar config that injects it at runtime. Confirm with a literal-string grep against the user's script:
grep -F 'kobiton:aiToolName' <path-to-user-script>Edit tool to add the capability to the script's capabilities block now (use the language-appropriate syntax for the script — JS/TS object literal, Python dict, Java Map.of(...) / DesiredCapabilities, .NET AppiumOptions.AddAdditionalCapability(...), Ruby hash), then re-run the grep. Do NOT proceed to Step 4 until the grep succeeds.--aiToolName "" or KOBITON_AI_TOOL_NAME=""). Skip injection, proceed.Present a summary to the user before running:
Language: Node.js
Script: /path/to/test.js
Platform: Android
Device: Pixel 4 (9B211FFAZ0017F)
App: kobiton-store:v72107
Session Name: Verify Appium session
Command: node /path/to/test.js 9B211FFAZ0017FWait for user confirmation, then execute the command in the background using your shell execution tool.
Act on the observation choice the user already made in Step 2 — do not re-ask here.
If they chose to run in the background, skip to Step 6.
If they chose to open the live view, wait 2 seconds after the script was launched in Step 4 (to allow the session to initialize on Kobiton), then open the session in the user's browser.
Determine the portal URL: Read .mcp.json to get the MCP server URL, then derive the portal base URL by replacing the api host with the portal equivalent (drop any trailing /mcp):
| MCP Server | Portal Base URL |
|---|---|
https://api.kobiton.com/mcp | https://portal.kobiton.com |
https://api-*.kobiton.com/mcp | https://portal-*.kobiton.com (same * suffix) |
For example, an api-*.kobiton.com host maps to its matching portal-*.kobiton.com host. If the mapping doesn't resolve, fall back to https://portal.kobiton.com.
Build the launch URL. Default to the device-only view — it shows just the device screen, no surrounding Kobiton UI, ideal for watching an automation run, sharing, or embedding:
<portal-base-url>/devices/launch?id=<deviceId>&view=device-onlyWhere <deviceId> is the ID of the selected device from Step 2 (returned by listDevices, getDeviceStatus, or reserveDevice).
The device-only view is also interactive for redirection: when the user taps or swipes on the device canvas, those gestures BOTH (a) reach the device in real time (just like a normal click-to-device tap) AND (b) are captured and made available to you via getUserInputEvents (see Step 6) so you can see what the user just did and adapt your plan.
Fall back to the default view (without &view=device-only) only when the user explicitly asks to interact with the device — e.g. "let me drive it manually", "open the full session view", "I want to tap on the screen", or similar interaction-implying language. The default view shows the full Kobiton UI around the device (sidebars, controls, action panels):
<portal-base-url>/devices/launch?id=<deviceId>Launch via the chromeless helper (default — gated on saved browser preference). For the device-only URL branch above, check auto memory for a saved browser preference:
When the chromeless launcher is invoked, it opens Chrome in --app mode (no tab strip, no URL bar, no bookmarks bar) and resizes the window to a device-shaped frame. Pick width and height based on the reserved device's form factor (the device name from Step 2 — listDevices / getDeviceStatus / reserveDevice):
| Device class | Detect by name (case-insensitive) | Portrait width × height | Landscape width × height |
|---|---|---|---|
| Tablet | iPad, Galaxy Tab, Pixel Tablet, Surface, MatePad, or any model with "Tab" or "Pad" in the name | 780 × 920 | 920 × 780 |
| Fold (unfolded) | Fold, Z Fold, Pixel Fold | 880 × 920 | 920 × 880 |
| Phone (default — Galaxy, Pixel, iPhone, OnePlus, Xiaomi, …) | none of the above patterns match | 540 × 920 | 920 × 540 |
All three presets share the same 920 px height — only the width grows by device class — so the chromeless window's vertical footprint stays consistent.
If getSession / the rendered capabilities report orientation=LANDSCAPE, swap width and height (use the Landscape column above). Default is portrait.
Pick the right command for the host OS. Run it in the background (Claude Code: Bash tool with run_in_background: true; other hosts: append & and disown) so the launcher's resize-polling loop doesn't block Step 6's result collection. The launcher's stdout/stderr and exit code surface later when it completes; the session URL printed above is the user's fallback if the launcher silently fails.
| OS | Command |
|---|---|
| macOS | bash skills/run-automation-suite/scripts/chromeless-launcher.sh --url "<url>" --width <W> --height <H> |
| Windows | pwsh skills/run-automation-suite/scripts/chromeless-launcher-windows.ps1 -Url "<url>" -Width <W> -Height <H> |
| Linux | bash skills/run-automation-suite/scripts/chromeless-launcher.sh --url "<url>" --width <W> --height <H> (launch-only — no auto-resize on Linux) |
<W> and <H> are the dimensions from the table above — substitute literally.
On macOS, the very first run triggers a system prompt: "X wants to control Google Chrome.app" — click OK. The grant lives under System Settings → Privacy & Security → Automation (NOT Accessibility) and persists per host process. Tell the user this once if you can see it's their first invocation.
Launcher exit codes drive the fallback (they arrive in the background-task completion event, not synchronously):
0 — Chrome was launched (resize may have logged a warning, but the session is fine). Continue to Step 6.2 — Chrome / Chromium is not installed on the host. Fall through to the default-browser fallback table below.64 — usage error (missing --url or unknown flag) — surface to the user; the launcher is buggy.Manual-interaction fallback URL. When the URL branch above was the manual-interaction form (the user explicitly asked to drive the device, so the URL has no ?view=device-only), skip the chromeless helper entirely and go straight to the default-browser fallback below — the user wants the full Kobiton UI around the device, so a chromeless --app window would defeat the point.
Default-browser fallback (used when (a) the saved browser preference is Safari/Firefox/Default, OR (b) chromeless exited 2 because Chrome is absent, OR (c) the URL branch is the manual-interaction form):
Check auto memory for a saved browser preference. If none exists, ask the user which browser to use:
"Which browser should I open the session in?"
- Google Chrome
- Safari
- Firefox
- Default browser
Save their choice to auto memory so they are not asked again in future sessions.
| Choice | Command |
|---|---|
| Google Chrome | open -na "Google Chrome" --args --new-window <url> |
| Safari | open -a "Safari" <url> |
| Firefox | open -a "Firefox" <url> |
| Default browser | open <url> |
On Linux, use xdg-open <url> (browser selection is not supported — always opens the default).
While the background script is running, call listSessions with deviceId=<deviceId> (from Step 2) and state='START' to find the session that just triggered. Use the most recent session (first result) as the match.
Call getSession with the matched session ID to get detailed results.
Call getSessionArtifacts with the session ID to retrieve:
Watch for user redirection (when the device-only view is open). While the background script runs, poll getUserInputEvents with the matched sessionId between your scripted commands — no faster than once per second. Track the timestamp of the newest event you have seen and pass it as sinceTimestamp on the next call so you only get new gestures:
sinceTimestamp to drain everything buffered. Each response is capped (default 50 events, max 200) — if you see exactly that many events in a single response there may be more behind them; re-poll immediately with sinceTimestamp set to the newest event's timestamp to page forward.(0.42, 0.78) near the bottom-right means "the user tapped there; they may want me to focus on whatever is at that position (looks like Settings)." A swipe (xNorm/yNorm → xNorm2/yNorm2) means they want you to scroll or navigate in that direction.sinceTimestamp to the largest timestamp you received, so the next poll returns only newer gestures.Present a summary to the user:
On successful completion, the skill returns:
https://portal.kobiton.com/devices/launch?id=<deviceId> — opened in a browser window once the session starts only if the user chose to watch the run at Step 2; background runs skip the window and just surface the URL as text.getSession).getSessionArtifacts).On failure, the skill surfaces error output from the test runner, the session URL if the session reached Kobiton (useful for portal-side debugging), and suggested next steps drawn from the categories in ## Error Handling.
listDevices returns empty: suggest broadening filters (remove platform/group constraints) or trying again later when devices free up.getAppParsingStatus returns a FAILURE_* state): surface the state to the user and stop - do not reserve devices or start a session with that build.getSession with a reasonable timeout. If still running, offer to call terminateSession and retry.reserveDevice fails (device already taken): call listDevices again to find another available device.wd, appium), incorrect UDID, or network issues. Suggest fixes."Run
./tests/checkout.json a Pixel 7 - upload the latest APK from./build/app.apkfirst."
The skill detects the .apk build, uploads it via uploadAppToStore, queries listDevices filtered to Pixel 7, reserves the device with reserveDevice, parses the script's capabilities, confirms the launch summary with the user (asking at device selection whether to watch the run or run it in the background), runs node ./tests/checkout.js <udid> in the background, opens the live session URL in the user's browser if they chose to watch, and returns the session ID plus artifacts when the run completes.
"Test this app @TestApp.ipa by this script @automation.js on Kobiton iOS iPhone 15 Pro"
The skill resolves the two @-referenced files from the chat context, uploads TestApp.ipa via uploadAppToStore, queries listDevices filtered to iOS iPhone 15 Pro, reserves the matching device, parses automation.js for capabilities, reconciles them against the rendered defaults for the selected device, confirms the launch summary with the user (asking at device selection whether to watch the run or run it in the background), runs node automation.js <udid> in the background, opens the live session URL in the user's browser if they chose to watch, and surfaces the session ID plus artifacts when the run completes.
kobiton:* and supported appium:* capabilities the skill's render-capabilities step compares against.kobiton/automate plugin source - issue tracker, contribution guide, and the tool YAML schemas this skill orchestrates.© jeremylongshore, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 9 other files (scripts, references) in plugins/testing/kobiton-automate/skills/run-automation-suite of jeremylongshore/tons-of-skills-marketplace.
Open the folder on GitHubat commit cfae287
Run Automation Suite next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Run Automation Suite this skilljeremylongshore/tons-of-skills-marketplace | 2.8k | — | ~6.1k | Automated safety check: Pass | MIT | |
| BrowserStack Live Testinghandsontable/handsontable | 22k | — | ~950 | Automated safety check: Pass | Custom licence | |
| Magicnet Device DebuggingLIghtJUNction/MagicNet | 186 | — | ~2.9k | Automated safety check: Notes | MIT | |
| Scrcpy GotchasJuanCF/scrcpy-mcp | 116 | — | ~5.8k | Automated safety check: Pass | MIT | |
| iOS Accessibility Testingconorluddy/xclaude-plugin | 183 | — | ~5k | Automated safety check: Pass | MIT | |
| Generate Appclaw Flowappclawhq/AppClaw | 117 | — | ~3.4k | Automated safety check: Notes | Apache-2.0 |
handsontable/handsontable
Opens a live BrowserStack session on a real Android, iOS or desktop browser for a local or public URL, tunneling localhost through Cloudflare when needed.
LIghtJUNction/MagicNet
Debug and verify MagicNet on a real Android root device. An agent skill from LIghtJUNction/MagicNet.
JuanCF/scrcpy-mcp
A skill your agent uses when interacting with Android devices via scrcpy-mcp tools (tap, swipe, inputtext, keyevent, uidump, uifindelement, appstart, etc.).
conorluddy/xclaude-plugin
Guides WCAG 2.1 and VoiceOver accessibility testing for iOS apps, working from the accessibility tree and not from screenshots.
appclawhq/AppClaw
Generate YAML flow files for AppClaw mobile automation. An agent skill from appclawhq/AppClaw.
WahdanZ/SpockAdb
Debug Android apps on a connected device or emulator through the Spock ADB MCP server (tools named android).
jeremylongshore/tons-of-skills-marketplace
Execute this skill enables AI assistant to conduct a security-focused code review using the security-agent plugin.
jeremylongshore/tons-of-skills-marketplace
Build this skill automates the adaptation of pre-trained machine learning models using transfer learning techniques.
jeremylongshore/tons-of-skills-marketplace
Execute proactive auto-loading: automatically detects and loads agents.md files.
jeremylongshore/tons-of-skills-marketplace
Aggregate and centralize performance metrics from applications, systems, databases, caches, and services.
jeremylongshore/tons-of-skills-marketplace
Execute this skill enables AI assistant to analyze capacity requirements and plan for future growth.
jeremylongshore/tons-of-skills-marketplace
Process use when you need to work with database indexing. An agent skill from jeremylongshore/tons-of-skills-marketplace.
Works with
Categories
Run local Appium test scripts against Kobiton devices. An agent skill from jeremylongshore/tons-of-skills-marketplace. Run Automation Suite is an agent skill from jeremylongshore/tons-of-skills-marketplace. Run local Appium test scripts against Kobiton devices.
Run Automation Suite fits situations like: the user asks to run mobile tests; validate an APK; IPA on Kobiton devices; kick off an Appium suite from a local script directory.
Run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill run-automation-suite -a claude-code`. Or copy the skill folder (plugins/testing/kobiton-automate/skills/run-automation-suite in jeremylongshore/tons-of-skills-marketplace) into .claude/skills/run-automation-suite in your project. Claude Code loads it when a task matches its description.
Run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill run-automation-suite -a codex`. Or copy the skill folder (plugins/testing/kobiton-automate/skills/run-automation-suite in jeremylongshore/tons-of-skills-marketplace) into .agents/skills/run-automation-suite in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill run-automation-suite -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/run-automation-suite, .gemini/skills/run-automation-suite, .github/skills/run-automation-suite and .opencode/skills/run-automation-suite in your project.
Going by SKILL.md and its folder, Run Automation Suite needs a shell, JavaScript and PowerShell for the scripts in its folder and the command-line tools its instructions call (node, bash and pwsh). Our summary lists: Python 3; Node.js; A Bash shell; PowerShell. Its frontmatter pre-approves these tools: Read, Edit, Bash(node:*), Bash(npm:*), Bash(npx:*), Bash(yarn:*), Bash(pnpm:*), Bash(python:*), Bash(python3:*), Bash(pytest:*), Bash(java:*), Bash(mvn:*), Bash(gradle:*), Bash(./gradlew:*), Bash(dotnet:*), Bash(ruby:*), Bash(bundle:*), Bash(rspec:*), Bash(open:*), Bash(xdg-open:*), Bash(sleep:*), Bash(bash:*), Bash(pwsh:*), Bash(osascript:*). Compatibility (from SKILL.md): Any OS, but requires a persistent local filesystem — it runs the user's own Appium script from a local directory, so it cannot work where the host offers only an MCP connection. Requires Node.js >= 18, Appium 2.x, and whichever language runtime the test script uses. Test scripts must use the Appium WebDriver protocol..
SKILL.md names 5 domains. In commands or code: portal.kobiton.com and api.kobiton.com; the agent is likely to contact these when it follows the instructions. As links in the text: docs.kobiton.com, appium.io and github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Run Automation Suite is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.1k tokens (SKILL.md is roughly 24k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.4k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Run Automation Suite: BrowserStack Live Testing (handsontable/handsontable, 22k stars), Magicnet Device Debugging (LIghtJUNction/MagicNet, 186 stars), Scrcpy Gotchas (JuanCF/scrcpy-mcp, 116 stars) and iOS Accessibility Testing (conorluddy/xclaude-plugin, 183 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
jeremylongshore (a GitHub user) maintains it in jeremylongshore/tons-of-skills-marketplace, which has 2,827 GitHub stars. The repository holds 3,342 skills in this directory. The repository was last updated on October 10, 2026.
Source: jeremylongshore/tons-of-skills-marketplace on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.