kane-cli 0.8.11
Highlights
kane-cli 0.8.11 reworks --author so a test is re-authored in place on its own identity instead of being forked into a new test, adds *_module.md import units that carry a cloud module's identity, and introduces replay-only heading markers (@db, @api, @js, @smartui, @network_query, @network_assertion) that keep cloud-generated steps on their recorded tape through adaptive heal. Variable references through a path ({{api_var.status}}, {{rows[0].id}}) now resolve end to end, inline and TUI runs sync their testmd bundle to the cloud, and the runner speaks UTF-8 on every platform.
[0.8.11] - 2026-09-09
--author re-authors in place
--authorkeeps the test's identity — every step is re-authored on the existing test and the run commits a new version on the same test case, instead of minting a brand-new test on each--authorrun. To fork a test on purpose, delete itsoutput-<stem>/directory and run again.testrun run --authorreaches every member — the flag is forwarded to members locally and on--remote, where the grid now installs the same kane-cli version you dispatched from.--no-adaptive-healis forwarded on--remotetoo; it was silently dropped before.- A mid-run lock conflict no longer abandons a heal — under the readonly policy the heal keeps shrinking and re-authoring locally, the result is not committed, and stderr points at
--push. The readonly state sticks for the rest of the run instead of re-entering the lock API on every shrink. - Locks are released on every early exit — a bad
--name, a tenant mismatch, a Chrome or device launch failure, or a missing runner used to leave the test's lock held for up to 15 minutes, degrading every later run on that test to readonly. An imported unit whose commit fails after the root committed releases its lock as well. - Evolve commits report correctly — the
test_md_summaryevent and the TTY box now agree on whether a commit landed (the event saidnot_committedfor a commit that had landed), the box says "commit did not land" when a scheduled commit fails, and the evidence pack keeps the known test case id so cloud ingest of a--authorrun no longer fails. result.yamldescribes the heal — theadaptive_healblock gainsshrink_count,complete_reauthor,author_boundary,total_steps,reauthored_stepsandcredits_consumed, is emitted for a forced--authorrun too, andexternal_idcarries the HyperExecute test-instance, job and task ids.
Cloud modules as import units
*_module.mdis a third import kind — it runs like a helper (import-only, never committed, no lock) but carries the cloud module's identity from itsmeta.json, and the bundle ships that identity beside the module's tape so a grid rebuild keeps it. Step events and the summary's imports rollup reportunit_kind: "module".- Each
@importof a module becomes a module block in the uploaded execution — importing a module twice yields two occurrences, a module inside a module nests, and an occurrence is flagged dirty only when its tape existed before the run and a step inside it was authored this run. A test with no modules uploads exactly what it did before. - A
*_module.mdwithout a cloud identity never folds — it still runs as a module, warns once on stderr, and is no longer uploaded under an empty shared module id. - Module-importing pure replays keep their skipped tail — a module block is treated as a linear container, so a pure replay of a test that imports a module no longer withholds the skipped tail.
Replay-only steps survive adaptive heal
- Heading markers pin a step to its tape —
## Step 3 @db(also@api,@js,@smartui,@network_query,@network_assertion) marks a cloud-generated step the agent cannot author. It always replays from its recording, even inside a re-authored tail, and adaptive heal never promotes it to author. The marker composes with@verifiesin either order and can be added to an already-recorded step without invalidating its tape. - A marked step that cannot replay refuses the run up front — the run exits 2 naming every such step before anything spawns; a marked step that breaks during replay ends the run with a
🩹 step N … broke on replaynotice instead of spending heal budget or stopping silently. - A heal commit keeps the original instruction — the regenerated execution re-emits the cloud's DB query, API request, script, SmartUI and network instructions verbatim, refreshing only status, timestamps and this run's result, so those steps no longer render as junk in the evidence viewer.
Variables resolve through paths
{{var.path}}and{{rows[0].id}}reach the analyzer with their value — a variable consumed only through a dotted or bracketed path (in{{x}}or${x}form) was dropped before the agent saw it and reported as unknown;assert {{api_var.status}} equals 200after a replayed API step now passes. A longer name that merely shares the prefix is not treated as a reference.- JS snippets see API and DB results as objects —
return api_var.statusafter a replayed@apistep returned null because the runner re-seeded the value as a JSON string; it now keeps the typed object, and parses a string-only value on grid retries and--remote. - One row per variable in Test Manager's Variables panel — a re-assignment (
set X = a, thenX = b) updates the persisted row in place instead of adding a row per store; the instructions, the tape and the code export still carry every store.
Cloud sync for inline and TUI runs
kane-cli run … --name xand TUI sessions push their testmd bundle — a persisted test now syncs its{commit_id}-testmd.zipafter upload (exit and/newincluded), the same astestmd runalready did; a skipped sync logs its reason in the session log.- The bundle is pushed before every commit — a committed version whose bundle never uploaded could not be rebuilt on the grid; a failed root push now stops the commit and releases the lock, and a failed unit push skips only that unit's commit.
Reliability on Windows, macOS and the grid
- The runner is UTF-8 on every platform — stdin, stdout and stderr are forced to UTF-8 and the frozen binary is built in UTF-8 mode, so a macOS grid host without a UTF-8 locale no longer fails every step with
'utf-8' codec can't encode characters … surrogates not allowedonce a prior flow's summary carries a non-ASCII character. - A passing heal no longer keeps the failed attempt in
execution.json— Windows refused to archive a failed attempt'slogs/while the runner still held the tape open, and the error was swallowed. The runner now releases its tape and run-log handles when an author run ends, and a refused rename is logged and falls back to copy-and-truncate, so the archived attempt and the canonical pack are both complete. - Healed selectors on repeated rows are unique — a heal on a list whose rows share one
data-testidnow yields a locator that resolves to a single element instead of failing Playwright's strict mode on the very element the heal found (testmuai-playwright-bindings 0.1.37).
Install
# npm
npm install -g @testmuai/kane-cli@0.8.11
# Homebrew
brew install lambdatest/kane/kane-cli
# Shell installer (latest release)
curl -fsSL https://raw.githubusercontent.com/LambdaTest/kane-cli/main/install.sh | bashCompare: 0.8.10...0.8.11