Skip to main content

Using Claude Code, Cursor, or another coding agent? Paste this into your prompt to run cross-browser and real-device tests, debug sessions, and wire up CI on the TestMu AI cloud:
testmd lets you write browser tests as Markdown files (_test.md) and commit them to your repo. On the first run, the AI agent authors each step and saves a recording. On every subsequent run, each step replays from cache with no LLM cost and much faster execution. Commit the test file and its recordings to git so teammates and CI can re-run the same tests without re-authoring.

Quick Start

Step 1: Create a test file. The filename must end in _test.md:
Step 2: Run the test:
On the first run, the agent authors each step and caches the recording. On every later run, the steps replay from cache instantly.
Always combine --agent with --headless in CI/CD environments to avoid display server errors.

When to Use testmd vs run

kane-cli run is one-shot. It runs an objective, uploads results, and exits. It is ideal for quick, one-off verifications like checking if a page loads correctly or extracting a value from a live site. kane-cli testmd run is for tests you want to persist. Use it when you are building a login flow smoke test, a regression suite, or any test you plan to re-run across builds. The test file lives in your repo, recordings are cached and committed alongside it, and every subsequent run replays from cache without consuming LLM credits. Teammates and CI pick up the same recordings and replay them identically. If you run an ad-hoc objective with kane-cli run and later decide you want to keep it, use the --name flag to save it as a _test.md file (see Recording a Test from a Live Session below).

File Format

A _test.md file has four parts in order:

YAML Frontmatter

Configuration between --- markers at the top of the file:
Supported keys:

Mobile Target

On macOS Apple Silicon, target: also accepts the two mobile values, emulator for a virtual Android device and simulator for a virtual iOS device, with the app under test as its own root key:
  • target: emulator runs on an Android emulator, simulator on an iOS simulator. The platform never appears separately, the target implies it.
  • app: the app under test, required with a mobile target and rejected with a browser one. A build path (emulator .apk, simulator .zip) or an uploaded app id, APP followed by six or more digits. On-device package ids are not accepted.
  • no_reset: optional. Keep the app’s existing state between runs instead of resetting it.
The nested form, target: {platform, app}, is not accepted. The parser refuses it and spells out the flat shape above.
Mobile tests run with kane-cli testmd run. A batch run does not support mobile members: a _test.md with a mobile target is rejected up front, before the suite runs. Setup is covered in Mobile Testing.

Title and Steps

After the frontmatter, add a # H1 title for the test. This is purely decorative. Kane CLI ignores everything before the first ## heading. Each ## H2 heading marks a test step. The heading text is a label for your reference; the agent reads the step body underneath it. Write the body as either plain English prose describing what the agent should do, or a single @import <path> line to pull in a reusable helper file. Do not mix prose and @import in the same step.

Per-Step Config Overrides

You can override frontmatter settings for individual steps by adding a yaml fenced block immediately under the step heading:
Setting optional: true tells Kane CLI that a failure on this step should not fail the overall test. The run continues to the next step.

Replay and Cascade Rule

This is the most important concept in testmd.

Replay

After the first run, each step replays from its cached recording with no AI agent, no LLM cost, and much faster execution. A step replays only if all of these hold:
  • A recording for that step exists
  • The step’s prose is unchanged since the recording
  • The step’s yaml block is unchanged
  • No earlier step invalidated it

Cascade

Editing step N re-authors step N and every step after it. Each step starts where the previous step left off (URL, login state, open tabs). When step 3 changes, step 4 cannot safely replay against state that no longer exists.
A one-line tweak at the top of a 20-step test re-authors all 20 steps on the next run. To minimize re-authoring, edit only the steps you need to change.
Useful commands:

Reusing Flows with @import

Extract repeating flows (login, setup, cookie banner dismissal) into helper files:
Rules:
  • Helper filename must not end in _test.md. Only _test.md files are valid entry points
  • Path resolves relative to the importing file, not the shell’s working directory
  • The step body must be exactly @import <path> with no mixed prose or extra lines
  • The step’s yaml block may contain only optional
  • optional: true on @import is allowed only at the root file level, not on nested imports
  • Variables and context propagate into helpers automatically
Editing a helper re-authors that step in every test that imports it, plus everything after the import in those tests. The same cascade rule applies.

Recording a Test from a Live Session

Run an ad-hoc objective with the --name flag to save it as a replayable test file:
On exit, Kane CLI writes the test file to .testmuai/tests/amazon-search_test.md. Move that file into your repo and re-run it with testmd run.
Without --name, ad-hoc runs are ephemeral and nothing is written to disk.

Commands


Flags for testmd run

All kane-cli run flags apply (--agent, --headless, --max-steps, --timeout, --variables, etc.), plus these additional flags:
Flag values win over frontmatter for all settings except variables. The file owns variables. You can add new keys via flags but cannot override file-defined ones.

Output Directory

After a run, Kane CLI creates an output directory next to the test file:
output-<stem>/ is commit-safe. Commit it to git so teammates and CI replay the same recordings. For tests using @import, helper recordings land next to the helper file in helper-output-<helper>-<root>-<step>/ directories. These are also commit-safe.

Result.md

After each run, Result.md is generated with:
To check whether a test passed or where it failed, read Result.md instead of re-running the test.

CI/CD Usage

Exit Codes


Common Parse Errors

Parse errors abort before any browser launch with exit code 2:

Example: Full Test with Imports

tests/checkout_test.md:
tests/helpers/login.md:
Run:

Next Steps