Repository navigation
Add a Kane CLI skill for natural-language browser checks with evidence #762
Description
Request
Add skills/kane-cli/ so an OpenHands agent can verify a web flow in real Chrome from a natural-language objective, using Kane CLI by TestMu AI.
Disclosure: I work at TestMu AI (formerly LambdaTest), which builds Kane CLI. Related: #758 and #760, the TestMu AI MCP catalog entry.
The gap
qa-changes validates a change by running it, and the built-in browser tools let an agent drive a page step by step. What is missing is a one-command check an agent can run and gate on: describe the flow, get a pass or fail with a typed exit code, and keep an evidence pack (screenshots, network log, console log) that a reviewer can replay.
What Kane CLI does
kane-cli run "<objective>" --url <start url> --agent --headlessdrives Chrome to verify the objective and prints NDJSON events.- Exit codes: 0 pass, 1 fail, 2 auth or setup error, 3 timeout or cancelled.
- Each run leaves a replayable .evidence pack.
- By default it launches Chrome with a fresh temporary profile for every run, not the user's signed-in profile.
- Runs on Linux, macOS and Windows. Needs Google Chrome, or
KANE_CLI_CHROME_PATHpointing at a Chrome binary. - The CLI ships on npm as
@testmuai/kane-cli(latest 0.8.21). Its docs and skills are Apache-2.0 at https://github.com/LambdaTest/kane-cli. Needs a TestMu AI account.
Proposed change
skills/kane-cli/SKILL.md,skills/kane-cli/references/andskills/kane-cli/README.md, written for OpenHands from the upstream skill at the0.8.21tag. Two changes from upstream:- It offers Kane CLI as an option alongside the built-in browser tools, instead of telling the agent not to use Playwright, Puppeteer or Selenium.
- Valid YAML frontmatter, plain hyphens and no links to
main.
- An entry in
marketplaces/openhands-extensions.json, plus the filesscripts/sync_extensions.pygenerates.
The skill will follow the points raised on #477:
- Pinned install:
npm install -g @testmuai/kane-cli@0.8.21, never--forceor@latest. - The user signs in. Headless runs use
kane-cli login --username "$LT_USERNAME" --access-key "$LT_ACCESS_KEY"with both values from OpenHands secrets. - No guidance on stealth or getting past bot protection.
How it will be tested
In an OpenHands sandbox with the released package and Google Chrome installed: install @testmuai/kane-cli@0.8.21, sign in, run one objective against a public page with --agent --headless, and attach the exit code and NDJSON summary to the PR, with no credentials or account data.
OpenHands AI triage
The following comments and acceptance criteria were added by the OpenHands AI agent.
Triage
This is an additive, opt-in skill that packages the upstream Kane CLI skill (Apache-2.0, tag 0.8.21) for OpenHands, following the pattern already merged for other CLI/service skills (see the adjacent skills/datadog and skills/qa-changes, and the approach discussed on #477). Scope is one new skills/kane-cli/ directory plus its marketplace registration and the artifacts the repo's sync/build commands derive from it.
Non-goals:
- Do not change, deprecate, or remove the built-in browser tools; Kane CLI is offered as one alternative, not a replacement.
- Do not make Kane CLI a
defaultEnabledskill; it is vendor- and account-specific and must be opted into. - Do not add stealth or bot-protection-bypass guidance.
- Do not add the TestMu AI MCP catalog entry (that is Add TestMu AI hosted test-cloud MCP to the integrations catalog #758 / feat(integrations): add TestMu AI hosted MCP catalog entry #760).
- Do not add SDK-specific documentation to this repo.
- Do not modify or patch the upstream package.
A repository mechanism, not an open design choice, fixes two details: every marketplace skill entry must ship .plugin/plugin.json with vendor manifests (.claude-plugin, .codex-plugin) or the load tests fail, and the marketplace category for a ./skills/ entry must be one of the taxonomy values enforced by scripts/build-skills-catalog.mjs. The issue's "files scripts/sync_extensions.py generates" wording does not cover plugin.json, which is hand-authored. These are treated as requirements below.
Acceptance Criteria
-
skills/kane-cli/SKILL.mdexists with valid YAML frontmatter that parses via the repo's PyYAML-based tooling, withname: kane-cliand a non-emptydescription, plus a keyword trigger (for examplekane-cli). - The skill documents the one-command check:
kane-cli run "<objective>" --url <start url> --agent --headless, the exit-code contract (0 pass, 1 fail, 2 auth or setup error, 3 timeout or cancelled), and that each run leaves a replayable.evidencepack (screenshots, network log, console log). - The skill states that runs default to a fresh temporary Chrome profile, not the user's signed-in profile, and documents the Chrome prerequisite: Google Chrome installed, or
KANE_CLI_CHROME_PATHpointing at a Chrome binary; it notes Linux, macOS and Windows support. - Kane CLI is presented as an option alongside the built-in browser tools, and the skill does not instruct the agent to avoid Playwright, Puppeteer or Selenium; it contains no stealth or bot-protection guidance.
- Install is pinned to
npm install -g @testmuai/kane-cli@0.8.21, with no--forceand no@latest. - Authentication is user-driven: headless runs use
kane-cli login --username "$LT_USERNAME" --access-key "$LT_ACCESS_KEY"with both values taken from OpenHands secrets. The skill contains no credentials, tokens, or account data. -
skills/kane-cli/.plugin/plugin.jsonexists withnamematching the directory and the required fields (name,description,authoras an object with aname,version);.claude-pluginand.codex-pluginare present as symlinks to.pluginor as real directories mirroringplugin.json. -
skills/kane-cli/README.mdexists and matches the skill's behavior and scope. -
marketplaces/openhands-extensions.jsonhas one entry withsource: "./skills/kane-cli"and acategorydrawn from the skill taxonomy accepted byscripts/build-skills-catalog.mjs; the new skill isdefaultEnabled: falseby omission. - Skill content uses plain hyphens (no em dashes), references the upstream project at the
0.8.21tag or release, and contains no links to the upstreammainbranch. - Generated artifacts are in sync:
python scripts/sync_extensions.py --checkpasses, andnode scripts/build-skills-catalog.mjsregeneratesskills/index.jswith thekane-clientry and produces no further diff on a second run (npm run build:skills). -
uv sync --group test && uv run pytest -qpasses, includingtests/test_skills_catalog.py,tests/test_skill_plugin_loading.py,tests/test_plugin_manifest.py, andtests/test_sdk_loading.py::test_marketplace_includes_all_skills. - Validation evidence on the PR: in an OpenHands sandbox with Google Chrome and
@testmuai/kane-cli@0.8.21installed, one objective is run against a public page with--agent --headless, and the exit code and NDJSON summary are attached to the PR with no credentials or account data.
Activity