Download Latest Version e2e@0.21.3 source code.zip (34.9 MB) Google Add to Preferred Sources
Home / e2e@0.21.3
Name Modified Size InfoDownloads / Week
Parent folder
e2e@0.21.3 source code.tar.gz 2026-10-23 33.8 MB
e2e@0.21.3 source code.zip 2026-10-23 34.9 MB
README.md 2026-10-23 18.9 kB
Totals: 3 Items   68.7 MB 0

Patch Changes

  • #1219 f589a32 Thanks @okwasniewski! - Add onAction to agent.act: a hook that runs after each action once the screen settles, for replayed actions too. Use it to take a screenshot per action.

  • #1326 04acca1 Thanks @okwasniewski! - app.screenshot() returns the absolute path of the file it wrote, not a path relative to the attempt directory.

  • #1218 58a5cec Thanks @okwasniewski! - Keep screenshots after a secret fill. app.screenshot(), toHaveScreenshot(), and assertion and failure screenshots no longer stop once a test fills a secret. They mask secure fields only, and toHaveScreenshot() still fails when the engine can't prove they are masked. The model still gets no pixels after a fill.

  • #1072 689620d Thanks @rudycelekli! - Do not report a cache entry as evicted when a custom store rejects its deletion.

  • #1310 329e03f Thanks @kacperkapusciak! - Add --action-timeout <ms> and --assertion-timeout <ms> to e2e run. They replace the config's actionTimeout and assertionTimeout for one run, so a wrong locator can fail in 5 s instead of 30 s while you write a test. A call's own timeout still wins, and a value that is not an integer from 1 through 2147483647 is a usage error, exit 2. Watch mode keeps them for every rerun.

  • #1240 332b934 Thanks @kacperkapusciak! - Add e2e upgrade (alias e2e update): upgrades e2e to the latest release, a dist-tag such as nightly, or one version, and moves each @e2e-dev/* package the project lists from the registry to the newest release whose peer ranges accept it. Linked packages and ones the registry doesn't have stay as they are. The project's package manager installs them; --dry-run prints the plan. Each upgrade sends an e2e_upgrade_completed telemetry event with the result and the e2e versions before and after. The update notice now suggests e2e upgrade instead of an install command for e2e alone.

  • #1321 72abddd Thanks @KrzysztofMoch! - The e2e plugin now installs in Cursor, from a copy in ~/.cursor/plugins/local/, with the same three skills as the Claude Code and Codex plugin. Grok Build reads the Claude Code files, so the repository works there as a marketplace too.

  • #1345 47127f7 Thanks @okwasniewski! - decisionFilter leaves nothing out when the config file the run loaded changed, whatever its name, such as e2e list --config e2e.ci.config.ts --changed-since origin/main after an edit to e2e.ci.config.ts. A test filter reads that file as context.configFile.

  • #1275 6a59d1a Thanks @kacperkapusciak! - Update dependencies: the web engine drives Playwright 1.64.1 (and the Chromium it installs), and smol machines boot the matching mcr.microsoft.com/playwright:v1.64.1-noble image. The runner moves to oxc-parser, oxc-transform, and @oxc-project/runtime 0.154.0, @vitest/expect 5.0.5, and @ai-sdk/provider 4.0.28.

  • #1286 a39c1c3 Thanks @KrzysztofMoch! - expect(await response.json()).toMatchSchema(schema) type-checks: expect no longer hands the engine's json<T>() a locator type to infer, so the value matchers apply.

  • #1252 3bd32ef Thanks @KrzysztofMoch! - e2e explore and the MCP open_session now launch a device target's pinned app before their first observation, as a test's app.open() does. They no longer depend on the engine's warm-up having opened it, which it skips for a target with an app.appPath, and used to fail with APP_NOT_OPEN.

  • #1306 3df649c Thanks @knowbody! - Let retiring workers use the configured cleanup timeout for engine disposal so cleanup can finish and report errors before the worker exits.

  • #1318 bbb13bf Thanks @kacperkapusciak! - e2e init --example <name> starts a new project from one of the repository's example apps (with-vite, with-next, with-astro, with-expo, with-swiftui, with-compose, with-kotlin-multiplatform, with-flutter, with-maui). It downloads the example from the GitHub tag of the running CLI into an empty directory, points its e2e and engine ranges at this release, and then runs the usual skill, MCP, and install steps in the example's e2e project.

  • #1280 1071933 Thanks @kacperkapusciak! - Find e2e.config.js and e2e.config.mjs as well as e2e.config.ts and e2e.config.mts, so a project written in plain JavaScript needs no --config flag. A TypeScript config still wins in its directory, so the e2e.config.js that tsc emits beside it is ignored. e2e init leaves an existing JavaScript config alone and writes its example test as tests/example.e2e.js, and a run that finds only *.e2e.js files names the tests glob to set. The quickstart shows the JavaScript setup, and the config reference the details.

  • #1317 9ceb071 Thanks @kacperkapusciak! - Every action in an e2e mcp session now answers with the test line that repeats it, such as Test line: await screen.getByRole("button", "Save").tap();, so a coding agent can write the test while it walks the flow. The locator comes from the node as the agent saw it and is checked against the live screen first: it must match that node and nothing else, and twins are narrowed with { visible: true }, a container, or .nth(). When no locator works, the result says why and prints no line. Fills name credentials.user(name) or secrets.get(name), never a value. The new read-only test_lines catalog tool returns the session's lines in order as a draft test body. A project tool can no longer be named test_lines, and the e2e_mcp_session telemetry event counts its calls under its own name.

  • #973 93f77d8 Thanks @A220man! - A model that refuses a request (finish reason content-filter) now fails the step as MODEL_REFUSED instead of MODEL_PROVIDER_FAILED with "No output generated". Rephrase the instruction or use another model.

  • #1284 90e6fb8 Thanks @KrzysztofMoch! - tap_at and hover_at, in agent.act and e2e mcp, now act on the bare point the model aimed at whenever the engine takes one, instead of snapping to the listed control under it and acting on that control's center. Before, a point outside an iOS popover snapped to the full-screen dismiss region and tapped its center, inside the popover, so the popover never closed. An engine that taps listed nodes only still gets the control by id.

  • #1049 137b50f Thanks @rudycelekli! - Add locator.or(other), which matches either locator in document order and stays strict when both match. Third-party engines must handle the new union kind of LocatorExpression.

  • #1151 84bd64a Thanks @TheTuso! - Agent steps on Claude Opus 5.5, Sonnet 5.5, and Fable 5.1 no longer fail with Invalid signature in thinking block. The block is bound to a different conversation on a worker's first step or after an earlier screen or screenshot was elided.

  • #1301 82039ad Thanks @nguyenvanhieu1710! - Record observationTruncated: true on an agent step when any semantic observation in the step was incomplete.

  • #1239 d7ec0ec Thanks @okwasniewski! - Add screen.tree() and screen.debug(). tree() returns the whole screen as the agent reads it, one node per line with secrets redacted. debug() prints the same text to the test's output.

  • #1314 b8cb0b3 Thanks @kacperkapusciak! - The bundled agent skill now gives a coding agent a fast loop for fixing a test: rerun only that test by file:line with --action-timeout 5000, keep the replay cache on so goals that passed replay without model calls, add --retries 0 when the config sets retries, don't rename the test or reword a passing goal mid-loop, and, when the test passes, run it one time with --no-cache. The coding agents guide no longer tells agents to add --no-cache after every change, and the caching guide has a section on rerunning a test while you fix it.

  • #1309 c5e3248 Thanks @kacperkapusciak! - The e2e skill now tells a coding agent how to fix a failed test. It fixes from the terminal's failure block and the trace page, every line that evidence covers at once, and checks the lines after the failure before the next run. To see a screen the evidence leaves out, it goes straight there in an MCP session instead of walking the flow again from the start.

  • #1313 f7a34c1 Thanks @kacperkapusciak! - The bundled agent skill now keeps an e2e mcp session open between test runs while the agent writes or fixes a test on the web, so a live look after a failed run goes straight to the screen in that session instead of opening a new one. It says when a run can go beside the session: with no app.command, with a port-0 URL (unless the dev server allows one copy per directory, as next dev does), or with reuseExisting: true on a fixed port. A fixed port without reuseExisting makes the run fail with APP_ALREADY_RUNNING, so the agent offers reuseExisting: true to the user instead of adding it, and closes the session before each run until then. With reuseExisting and CI set, it unsets CI for the run or closes the session. On mobile it closes the session before each run. The MCP server page shows the same cases as a table.

  • #1333 4982d8d Thanks @KrzysztofMoch! - The e2e skill now explains what a frame from another site, such as a hosted card field, means for agent steps. The browser engine's semantic tree leaves out that frame's content, so the skill scripts steps there with browser.frameLocator and judges the frame with vision. An agent.act whose only change is inside that frame records no replay and runs live every run.

  • #1311 74c2b73 Thanks @kacperkapusciak! - The bundled agent skill now tells a coding agent to start each test near the screen it checks, so every rerun skips the steps that lead there: in a browser a saved session instead of the sign-in form and app.open on the screen's path, on a device device.openLink, and data created through the app's API in a test.extend fixture. A test across several screens grows one screen at a time, with the goals already verified replaying from the cache. Core concepts says the same in one bullet.

  • #1343 1ed4de1 Thanks @kacperkapusciak! - The bundled agent skill now tells a coding agent to replace a fixed-time sleep with agent.waitFor on the state it was waiting for, or a matcher with a longer timeout when a locator names that state.

  • #1216 19f3ca2 Thanks @okwasniewski! - The run telemetry event now sorts executed tests by how the replay cache carried them (tests_code_only, tests_replayed, tests_assisted, tests_live), counts agent.act steps that ran with the cache off (agent_steps_uncached), why steps missed the cache or handed off (agent_miss_reasons, agent_handoff_reasons), and the model calls by agent entry point (model_calls_act, model_calls_assert, model_calls_extract, model_calls_waitfor).

  • #1206 da13624 Thanks @okwasniewski! - Add test filters: filters: [decisionFilter({ model })] from @e2e-dev/decision leaves out the tests a change can't affect. They run with --changed-since <ref>, such as origin/main on a pull request; without the flag every test runs. e2e list --changed-since origin/main previews the decision, and left-out tests show in the pull request comment, junit.xml, and the report. A run with nothing to run starts no engine or app, and after Ctrl-C, or a reporter that runs past its deadline, the CLI exits as soon as the output is written.

  • #1239 d7ec0ec Thanks @okwasniewski! - Print console.log and other test output when the list reporter is off. With --reporter json, all user output goes to stderr, so stdout holds only the report.

  • #1323 0f6c3ef Thanks @kacperkapusciak! - Put the test's title path in agent prompts. Under e2e run, every step of the built-in agent and every judgment behind agent.assert, agent.waitFor, and agent.extract now opens with a Test: <describe> > <test> line, and a custom executor reads the title path as ctx.attempt.titlePath. The line goes in the step's prompt, not the system prompt, so provider prompt caching still serves every test of a run, and existing recordings keep replaying.

  • #1238 7b6ac53 Thanks @okwasniewski! - Print a notice after a command when a newer e2e is on npm, with the install command for the project's package manager. The registry is checked once a day. Nothing prints in CI or when piped. Set E2E_UPDATE_CHECK_DISABLED=1 or NO_UPDATE_NOTIFIER=1 to turn it off. E2E_TELEMETRY_DISABLED=1 and DO_NOT_TRACK=1 turn it off too.

  • #996 7e72ea2 Thanks @rudycelekli! - Reject an invalid shard passed to run() or list() with INVALID_CONFIG, enforcing the same numeric bounds as the --shard flag. Both shard fields are required.

  • #1209 ef977f4 Thanks @knowbody! - Engine disposal receives optional revocable permission to preserve run-owned resources for a replacement worker. Final shutdown, forced termination, and parent disconnect revoke that permission while disposal is pending. Each worker still invokes an engine's disposal hook one time. Missing permission requests final cleanup, including direct and standalone calls.

Source: README.md, updated 2026-10-23