diff --git a/.changeset/agent-device-0-21-21.md b/.changeset/agent-device-0-21-21.md deleted file mode 100644 index 8cf4f9c31..000000000 --- a/.changeset/agent-device-0-21-21.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@e2e-dev/mobile": patch ---- - -Update agent-device to 0.21.21 for iOS keyboard focus reporting, unconfirmed fills into non-echoing fields, and Android snapshot helper timeout backoff. diff --git a/.changeset/agent-device-0-21-22.md b/.changeset/agent-device-0-21-22.md deleted file mode 100644 index b63318969..000000000 --- a/.changeset/agent-device-0-21-22.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@e2e-dev/mobile": patch ---- - -Update agent-device to 0.21.22, so a Limrun iOS settings refusal names the session's device instead of `booted`. diff --git a/.changeset/browser-install-verdict.md b/.changeset/browser-install-verdict.md deleted file mode 100644 index 7f29699fd..000000000 --- a/.changeset/browser-install-verdict.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@e2e-dev/web": patch ---- - -A headless run no longer downloads the full Chromium when the headless shell is installed, and the install no longer removes other browsers in the cache. Set `PLAYWRIGHT_SKIP_BROWSER_GC=0` to restore cleanup. diff --git a/.changeset/cache-empty-typed-value.md b/.changeset/cache-empty-typed-value.md deleted file mode 100644 index a71198858..000000000 --- a/.changeset/cache-empty-typed-value.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"e2e": patch ---- - -A recorded step that types an empty value, which clears a field, replays instead of failing with `REPLAY_STALE` (`invalid-entry`). The cache wrote the entry but its reader rejected the empty `type` or `typeText` value, so such a step could never replay from a recording. diff --git a/.changeset/decision-executor.md b/.changeset/decision-executor.md deleted file mode 100644 index ee24acf2d..000000000 --- a/.changeset/decision-executor.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -"@e2e-dev/decision": minor ---- - -Add `@e2e-dev/decision`, an executor that runs `agent.act` and `agent.assert` -through a decision model instead of an LLM. It takes any AI SDK decision -model with choice distributions (`evaluationModel()` instances too) and -decides through `experimental_decide`, so it needs `ai` 7.0.128 or later. One -call per action fans out the operation and target questions; a small -language model writes field values when the choice is `type`. Tests stay -plain natural language with no params. Probability and confidence gates are -off by default. A model id string or a language model fails config load with -`INVALID_CONFIG`. diff --git a/.changeset/download-full-ledger-pass.md b/.changeset/download-full-ledger-pass.md deleted file mode 100644 index 7e27a9243..000000000 --- a/.changeset/download-full-ledger-pass.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"e2e": patch ---- - -A text download is rewritten with the full ledger pass — fragments and base64-encoded forms of a secret included — the way trace text entries already are. The download path only matched whole values while still labeling the file `redaction: "complete"`, so a cut or base64 copy of a secret could sit in a download the report vouched for as clean. diff --git a/.changeset/engine-prepare-headed.md b/.changeset/engine-prepare-headed.md deleted file mode 100644 index f8baab3a4..000000000 --- a/.changeset/engine-prepare-headed.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"e2e": patch ---- - -`EnginePrepareInfo.headed` is now required, alongside the `headed` an engine already receives on `init`. A host that builds a `prepare` call now passes the run's mode, so an engine provisions for the browser that run launches. diff --git a/.changeset/error-default-redactor.md b/.changeset/error-default-redactor.md deleted file mode 100644 index 0a5672b5c..000000000 --- a/.changeset/error-default-redactor.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"e2e": patch ---- - -Run-level errors in reports (hook, collection, provisioning, and worker failures) are now redacted with the config's secrets. diff --git a/.changeset/evaluate-string-expression.md b/.changeset/evaluate-string-expression.md deleted file mode 100644 index f1207b24a..000000000 --- a/.changeset/evaluate-string-expression.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2e-dev/web': patch ---- - -`browser.evaluate` evaluates a string as an expression: `browser.evaluate('document.title')` and `browser.evaluate('(() => document.title)()')` return the title instead of failing with `EVALUATE_FAILED: ... is not a function`. A string that evaluates to a function, such as `'() => document.title'`, is still called with the argument. diff --git a/.changeset/failure-evidence-budget.md b/.changeset/failure-evidence-budget.md deleted file mode 100644 index 7e2d44bad..000000000 --- a/.changeset/failure-evidence-budget.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'e2e': patch ---- - -A failed attempt on an app that stops answering no longer waits 5 s for failure evidence at every capture point, or forever when the engine ignores cancellation. The runner captures the screen and screenshot once per attempt, stops waiting after 5 s, and keeps the original error. diff --git a/.changeset/forced-conclusion-wrong-tool.md b/.changeset/forced-conclusion-wrong-tool.md deleted file mode 100644 index 81a774a7a..000000000 --- a/.changeset/forced-conclusion-wrong-tool.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'e2e': patch ---- - -An agent step whose model answers a forced `complete_step` turn with another tool no longer fails as `MODEL_PROVIDER_FAILED`. The call goes back to the model as an error and the turn is asked again within the step's turn budget; a model that never concludes fails the step with `STEP_NO_CONCLUSION`. diff --git a/.changeset/foreign-engine-errors.md b/.changeset/foreign-engine-errors.md deleted file mode 100644 index 4bdb24c64..000000000 --- a/.changeset/foreign-engine-errors.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"e2e": patch ---- - -An error an engine throws with a runner code, such as `INVALID_LOCATOR` for an unsupported selector, keeps its code and category when the engine is loaded from `e2e.config.ts`. It was reported as an infrastructure `ENGINE_FAILURE`. diff --git a/.changeset/in-process-stray-rejections.md b/.changeset/in-process-stray-rejections.md deleted file mode 100644 index db9aca57f..000000000 --- a/.changeset/in-process-stray-rejections.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"e2e": patch ---- - -A run that executes in the host process, such as `e2e explore`, no longer crashes that process when a test leaves a promise rejection or an exception uncaught. It handles them as a worker process does: a rejection fails the test running when it surfaces, or is recorded as `UNHANDLED_REJECTION` between tests. An uncaught exception, or a rejection that surfaces with no test running before any test has finished, is a run error that fails the test on its way with `WORKER_CRASH` and skips the rest of its file. The handlers are removed when the run ends. diff --git a/.changeset/judge-conflicting-values.md b/.changeset/judge-conflicting-values.md deleted file mode 100644 index b945fd897..000000000 --- a/.changeset/judge-conflicting-values.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"e2e": patch ---- - -`agent.assert` and `agent.waitFor` fail when the value they check is shown more than once and one place contradicts it, such as a correct order summary total next to a wrong pay button total. A claim about some item among several, such as `a todo is marked done`, still holds when one item matches. diff --git a/.changeset/mcp-error-redaction.md b/.changeset/mcp-error-redaction.md deleted file mode 100644 index 53f8ed958..000000000 --- a/.changeset/mcp-error-redaction.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'e2e': patch ---- - -`e2e mcp` now redacts secret values from everything `open_session` and `close_session` return and from its log lines. Before, an engine or app error that carried a configured secret, in a failed open or in a `close_session` "Cleanup:" line, reached the client and stderr verbatim. diff --git a/.changeset/mcp-headless-default.md b/.changeset/mcp-headless-default.md deleted file mode 100644 index fcb8d361e..000000000 --- a/.changeset/mcp-headless-default.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"e2e": minor ---- - -`e2e mcp` sessions are now headless by default, the same as `e2e run` and `e2e explore`, and the agent decides per session: `open_session {headed: true}` shows the browser or simulator, `headed: false` hides it. `--headed` makes headed the default for sessions that do not say. Before, sessions were headed outside CI and only the server's `--headless` could hide them; `--headless` is still accepted, since it now asks for the default, but it is no longer documented. diff --git a/.changeset/mcp-model-output.md b/.changeset/mcp-model-output.md deleted file mode 100644 index b85eb44dd..000000000 --- a/.changeset/mcp-model-output.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -e2e: patch ---- - -Honor project tools' toModelOutput renderers for string results and preserve rendered error outputs as MCP error results. diff --git a/.changeset/mcp-user-output-redaction.md b/.changeset/mcp-user-output-redaction.md deleted file mode 100644 index 861fede6d..000000000 --- a/.changeset/mcp-user-output-redaction.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'e2e': patch ---- - -`e2e mcp` now redacts secret values from what your code prints through `console`, `process.stdout`, or `process.stderr`, such as a `console.log` in a project tool or in the config's top-level code. Before, it reached stderr verbatim. Output printed while a config loads appears once the config has loaded; if the load fails, that output is withheld, since the config's secrets are unknown. An uncaught error or unhandled rejection is logged redacted and the server shuts down its sessions and exits with code 1, instead of crashing with the raw error. diff --git a/.changeset/npm-exec-cli-hint.md b/.changeset/npm-exec-cli-hint.md deleted file mode 100644 index a98ba22e1..000000000 --- a/.changeset/npm-exec-cli-hint.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"e2e": patch ---- - -Include npm's argument separator in CLI hints so flags such as `--headed` reach the installed `e2e` binary. diff --git a/.changeset/oxc-typescript-loader.md b/.changeset/oxc-typescript-loader.md deleted file mode 100644 index 72284a592..000000000 --- a/.changeset/oxc-typescript-loader.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -'e2e': minor -'@e2e-dev/web': minor -'@e2e-dev/mobile': minor -'@e2e-dev/kernel': minor -'@e2e-dev/eas': minor -'@e2e-dev/github': minor ---- - -**Breaking: e2e and every `@e2e-dev` package now need Node.js 22.22.3 or newer on Node.js 22, or 24.8.0 or newer** (`engines.node` is `^22.22.3 || >=24.8.0`). Node.js 22.12 through 22.22.2, 23, and 24.0 through 24.7 are no longer supported, and the CLI refuses to start on them, naming the versions to upgrade to. Those releases fail when a CommonJS file a test imports requires TypeScript through the new loader's `module.registerHooks` (nodejs/node#59679 fixed it in 22.22.3 and 24.8.0). - -e2e now loads TypeScript with its own loader, built on oxc, instead of tsx. tsx brought in esbuild, whose postinstall script made every `pnpm install` on pnpm 11 and later fail with `ERR_PNPM_IGNORED_BUILDS` until the project approved the build; nothing e2e installs runs an install script now. Config and tests load as before: ESM whatever `package.json` says, `./x.js` and `./x` resolve to `x.ts` and `./x.jsx` to `x.tsx`, directory index imports, tsconfig `paths` and `baseUrl`, workspace packages exporting `.ts` source, JSX in `.tsx` and `.jsx`, enums, namespaces, `experimentalDecorators`, and source-mapped stack traces. JSON imported without `with { type: 'json' }` still loads. A test file whose name holds `%`, `#`, or a space now collects with its source location instead of failing with "URI malformed" or losing the location. Each file reads its nearest `tsconfig.json` rather than the one in the working directory. What changes: `import` statements in a `.cts` file are no longer compiled into `require` calls (write `import x = require()`); standard decorators without `experimentalDecorators`, auto-accessors, and ES module `import` and value `export` declarations in `.cts` are refused with their line (`import type`, `export type`, `import x = require()`, and `export =` work); the CLI refuses the Bun (`bun --bun`) and Deno runtimes (install with any package manager, run on Node.js); a type imported without `import type` that stays in the output (a decorated member's type under `emitDecoratorMetadata`) fails to load, with an error naming the import; a `.ts` file a CommonJS file requires runs as an ES module like every other `.ts`, so one written with `module.exports` needs the `.cts` extension; and an import written in a JavaScript file resolves as Node.js resolves it, without TypeScript's extension rules or tsconfig `paths`. TypeScript inside an installed package compiles without the project's `tsconfig.json`. diff --git a/.changeset/plain-string-secret-trace.md b/.changeset/plain-string-secret-trace.md deleted file mode 100644 index 754bb39b2..000000000 --- a/.changeset/plain-string-secret-trace.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'e2e': patch ---- - -A secret value a test passes as a plain string (spelled into an `app.open` URL, typed with `fill`) no longer stays in the Playwright trace. Traces and text downloads are now rewritten whenever the session knows a secret value (every static one, and a provider's once resolved), not only after a secret fill or an engine-held secret, so they are labeled `redaction: "complete"` instead of `not-required` or `incomplete`. Screencast frames are still dropped only after a secret fill. Like any secret trace, a rewritten one masks unrelated text that shares 8 characters with a value. diff --git a/.changeset/preserve-mcp-registration-settings.md b/.changeset/preserve-mcp-registration-settings.md deleted file mode 100644 index 1db7d22df..000000000 --- a/.changeset/preserve-mcp-registration-settings.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"e2e": patch ---- - -Preserve environment and client settings on existing e2e MCP registrations when rerunning init. diff --git a/.changeset/replay-lost-list-once.md b/.changeset/replay-lost-list-once.md deleted file mode 100644 index cca3d4911..000000000 --- a/.changeset/replay-lost-list-once.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"e2e": patch ---- - -Replaying a repeated scroll on a list that filled the screen, when the list can no longer be found, waits for it once and then scrolls the screen for every remaining repeat. It used to wait out the full relocation backoff (about 14 seconds) before each repeat, so a recorded 4x scroll took about a minute to replay. diff --git a/.changeset/retry-crash-attempts.md b/.changeset/retry-crash-attempts.md deleted file mode 100644 index 8757ed80a..000000000 --- a/.changeset/retry-crash-attempts.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"e2e": patch ---- - -A worker that crashes during a retry no longer drops the attempts before it. Before, a test whose first attempt failed and whose retry crashed the worker showed a single attempt 0 with `WORKER_CRASH`, and the first attempt's error was lost. The report now keeps every finished attempt and adds the crash as the next one. A crash after the last attempt (in an `afterAll`) is recorded on that attempt instead of as a retry. For a serial group, the finished group attempts and the members that finished in the crashed attempt stay in the report, the member that was running fails with `WORKER_CRASH`, and a crash after a member finished fails the group attempt without blaming that member. A forced interrupt keeps the attempts that finished and the verdict they reach, `flaky` included. diff --git a/.changeset/run-user-output-redaction.md b/.changeset/run-user-output-redaction.md deleted file mode 100644 index a156abcab..000000000 --- a/.changeset/run-user-output-redaction.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'e2e': patch ---- - -`e2e run` redacts secret values from what the config's top-level code, a test file's top level, and reporters print, as it already did for tests, including what a timer or a reporter the run stopped waiting for prints after the run. Output printed while the config loads appears once it has loaded, and is withheld if the load fails. With the `list` reporter, output printed during the run prints under `stdout | runner` or `stderr | runner`, on stdout like a test's output, so the live view no longer paints over it. diff --git a/.changeset/serial-group-verdicts.md b/.changeset/serial-group-verdicts.md deleted file mode 100644 index 36ee965e0..000000000 --- a/.changeset/serial-group-verdicts.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"e2e": patch ---- - -A serial group whose session fails to launch, or whose file fails to load, now fails the run. Before, every member was skipped and the run passed with exit code 0. The first member now fails with the launch error and the rest skip with cause `serial-predecessor-failed`, so the `list` reporter, `summary.md`, and `junit.xml` show the failure. A retry that fails to launch keeps the members' verdicts from the attempt before it, so a member that failed there still fails. An infrastructure error in a serial group, at launch or in a member, now exits 3 and sets the run status to `error`, as it does for any other test, instead of exiting 1. When a worker crashes during a serial group, the member that was running fails with `WORKER_CRASH` instead of being skipped as if it never started. diff --git a/.changeset/strict-mode-reresolve.md b/.changeset/strict-mode-reresolve.md deleted file mode 100644 index 69907e501..000000000 --- a/.changeset/strict-mode-reresolve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2e-dev/web': patch ---- - -An action whose locator gains a second match just before it runs, such as a screen transition that briefly shows the old and new page together, no longer fails with `ENGINE_FAILURE` and a Playwright strict mode violation. The locator resolves again: two matches still fail with `LOCATOR_AMBIGUOUS`, and a duplicate that went away lets the action run. A drag whose drop target gains a second match after the press fails with `ACTION_FAILED` and is not repeated. diff --git a/.changeset/swipe-path-duration.md b/.changeset/swipe-path-duration.md deleted file mode 100644 index df8c58dbe..000000000 --- a/.changeset/swipe-path-duration.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"e2e": minor -"@e2e-dev/mobile": minor -"@e2e-dev/web": minor ---- - -`screen.swipe({ from, to, duration })` adds an optional `duration` for path swipes, controlling how long the gesture takes in milliseconds. diff --git a/.changeset/table-row-headers.md b/.changeset/table-row-headers.md deleted file mode 100644 index 0596e2cf2..000000000 --- a/.changeset/table-row-headers.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@e2e-dev/web": patch ---- - -Infer scope-less table headers from neighboring data cells, matching native row headers in semantic observations. diff --git a/.changeset/tainted-fallback-policy-denied.md b/.changeset/tainted-fallback-policy-denied.md deleted file mode 100644 index 45f2269e0..000000000 --- a/.changeset/tainted-fallback-policy-denied.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"e2e": patch ---- - -After a secret fill, an agent step whose screen can only be read from a fallback screenshot (`act`, or a judgment with `vision: true`) now fails with `POLICY_DENIED` naming the secret fill, instead of the engine's timeout. diff --git a/.changeset/telemetry-identity.md b/.changeset/telemetry-identity.md deleted file mode 100644 index b3a538709..000000000 --- a/.changeset/telemetry-identity.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"e2e": patch ---- - -Telemetry no longer sends a project id outside git or in a shallow clone, and a coding agent that sets `CI` outside a CI vendor counts as the machine it runs on. EAS Build, Bitrise, Codemagic, and Xcode Cloud are recognized as CI vendors. diff --git a/.changeset/web-hung-page-timeouts.md b/.changeset/web-hung-page-timeouts.md deleted file mode 100644 index 41bbc6154..000000000 --- a/.changeset/web-hung-page-timeouts.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@e2e-dev/web': patch -'e2e': patch ---- - -A page whose script never yields no longer holds a web test until its test timeout: a tap, a locate, or a navigation on it now fails with `ACTION_FAILED` at its action or navigation timeout, also while a trace records. A tap or keystroke cut off that way may have reached the page and is never repeated by a replay. `expect(browser)` matchers on such a page end at their own timeout instead of the action timeout. diff --git a/.changeset/web-peer-floor.md b/.changeset/web-peer-floor.md deleted file mode 100644 index 831e822d4..000000000 --- a/.changeset/web-peer-floor.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@e2e-dev/web': patch ---- - -Requires `e2e` 0.18.0 or later. With an older runner the engine failed to load, or a headed run failed to launch the browser. diff --git a/.changeset/worker-hang-watchdog.md b/.changeset/worker-hang-watchdog.md deleted file mode 100644 index 07a7b271a..000000000 --- a/.changeset/worker-hang-watchdog.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'e2e': patch ---- - -A test that blocks its worker's event loop (`while (true) {}`) no longer hangs the run until Ctrl-C. When the worker has not responded `cleanupTimeout` (at least 5 s) after the test timeout, the runner kills it, reports the test `timed-out` with `TEST_TIMEOUT`, and runs the rest of the file on a new worker. A worker with a debugger attached when the test starts (an editor's auto-attach, or `NODE_OPTIONS=--inspect=0`) is never killed this way. Runs with an inline config or in-memory tests run in the runner's own process and still hang. diff --git a/packages/decision/CHANGELOG.md b/packages/decision/CHANGELOG.md new file mode 100644 index 000000000..7a9a29927 --- /dev/null +++ b/packages/decision/CHANGELOG.md @@ -0,0 +1,15 @@ +# @e2e-dev/decision + +## 0.1.0 + +### Minor Changes + +- [#775](https://github.com/tester-army/e2e/pull/775) [`d1f2089`](https://github.com/tester-army/e2e/commit/d1f2089081219ab0a8a07d49adb0195623738b40) Thanks [@guhcostan](https://github.com/guhcostan)! - Add `@e2e-dev/decision`, an executor that runs `agent.act` and `agent.assert` + through a decision model instead of an LLM. It takes any AI SDK decision + model with choice distributions (`evaluationModel()` instances too) and + decides through `experimental_decide`, so it needs `ai` 7.0.128 or later. One + call per action fans out the operation and target questions; a small + language model writes field values when the choice is `type`. Tests stay + plain natural language with no params. Probability and confidence gates are + off by default. A model id string or a language model fails config load with + `INVALID_CONFIG`. diff --git a/packages/decision/package.json b/packages/decision/package.json index a21370724..0f2faa586 100644 --- a/packages/decision/package.json +++ b/packages/decision/package.json @@ -1,6 +1,6 @@ { "name": "@e2e-dev/decision", - "version": "0.0.0", + "version": "0.1.0", "description": "Decision-model executors for e2e", "license": "Apache-2.0", "repository": { diff --git a/packages/e2e/CHANGELOG.md b/packages/e2e/CHANGELOG.md index 071768c94..1fe33de10 100644 --- a/packages/e2e/CHANGELOG.md +++ b/packages/e2e/CHANGELOG.md @@ -1,5 +1,65 @@ # e2e +## 0.18.0 + +### Minor Changes + +- [#851](https://github.com/tester-army/e2e/pull/851) [`dc2afca`](https://github.com/tester-army/e2e/commit/dc2afca0c02a882e2631a18f9d49768c4e4d84f2) Thanks [@KrzysztofMoch](https://github.com/KrzysztofMoch)! - `e2e mcp` sessions are now headless by default, the same as `e2e run` and `e2e explore`, and the agent decides per session: `open_session {headed: true}` shows the browser or simulator, `headed: false` hides it. `--headed` makes headed the default for sessions that do not say. Before, sessions were headed outside CI and only the server's `--headless` could hide them; `--headless` is still accepted, since it now asks for the default, but it is no longer documented. + +- [#790](https://github.com/tester-army/e2e/pull/790) [`0d1ed15`](https://github.com/tester-army/e2e/commit/0d1ed15871674aafd0ee3eff92c17eb39f6012bd) Thanks [@okwasniewski](https://github.com/okwasniewski)! - **Breaking: e2e and every `@e2e-dev` package now need Node.js 22.22.3 or newer on Node.js 22, or 24.8.0 or newer** (`engines.node` is `^22.22.3 || >=24.8.0`). Node.js 22.12 through 22.22.2, 23, and 24.0 through 24.7 are no longer supported, and the CLI refuses to start on them, naming the versions to upgrade to. Those releases fail when a CommonJS file a test imports requires TypeScript through the new loader's `module.registerHooks` (nodejs/node#59679 fixed it in 22.22.3 and 24.8.0). + + e2e now loads TypeScript with its own loader, built on oxc, instead of tsx. tsx brought in esbuild, whose postinstall script made every `pnpm install` on pnpm 11 and later fail with `ERR_PNPM_IGNORED_BUILDS` until the project approved the build; nothing e2e installs runs an install script now. Config and tests load as before: ESM whatever `package.json` says, `./x.js` and `./x` resolve to `x.ts` and `./x.jsx` to `x.tsx`, directory index imports, tsconfig `paths` and `baseUrl`, workspace packages exporting `.ts` source, JSX in `.tsx` and `.jsx`, enums, namespaces, `experimentalDecorators`, and source-mapped stack traces. JSON imported without `with { type: 'json' }` still loads. A test file whose name holds `%`, `#`, or a space now collects with its source location instead of failing with "URI malformed" or losing the location. Each file reads its nearest `tsconfig.json` rather than the one in the working directory. What changes: `import` statements in a `.cts` file are no longer compiled into `require` calls (write `import x = require()`); standard decorators without `experimentalDecorators`, auto-accessors, and ES module `import` and value `export` declarations in `.cts` are refused with their line (`import type`, `export type`, `import x = require()`, and `export =` work); the CLI refuses the Bun (`bun --bun`) and Deno runtimes (install with any package manager, run on Node.js); a type imported without `import type` that stays in the output (a decorated member's type under `emitDecoratorMetadata`) fails to load, with an error naming the import; a `.ts` file a CommonJS file requires runs as an ES module like every other `.ts`, so one written with `module.exports` needs the `.cts` extension; and an import written in a JavaScript file resolves as Node.js resolves it, without TypeScript's extension rules or tsconfig `paths`. TypeScript inside an installed package compiles without the project's `tsconfig.json`. + +- [#840](https://github.com/tester-army/e2e/pull/840) [`b33398f`](https://github.com/tester-army/e2e/commit/b33398fc380a1ecd8a0784d1c5c2fcbdeefaf841) Thanks [@Mohit20057](https://github.com/Mohit20057)! - `screen.swipe({ from, to, duration })` adds an optional `duration` for path swipes, controlling how long the gesture takes in milliseconds. + +### Patch Changes + +- [#834](https://github.com/tester-army/e2e/pull/834) [`8bc7d85`](https://github.com/tester-army/e2e/commit/8bc7d850cb0082122100a20bb710f7f0c9691f25) Thanks [@Ray0907](https://github.com/Ray0907)! - A recorded step that types an empty value, which clears a field, replays instead of failing with `REPLAY_STALE` (`invalid-entry`). The cache wrote the entry but its reader rejected the empty `type` or `typeText` value, so such a step could never replay from a recording. + +- [#806](https://github.com/tester-army/e2e/pull/806) [`f7f60ba`](https://github.com/tester-army/e2e/commit/f7f60bae469b2febb984c27a97d9ad6920f02979) Thanks [@DeryFerd](https://github.com/DeryFerd)! - A text download is rewritten with the full ledger pass — fragments and base64-encoded forms of a secret included — the way trace text entries already are. The download path only matched whole values while still labeling the file `redaction: "complete"`, so a cut or base64 copy of a secret could sit in a download the report vouched for as clean. + +- [#803](https://github.com/tester-army/e2e/pull/803) [`f2f9a53`](https://github.com/tester-army/e2e/commit/f2f9a5373d520c35514da713c3f0c18a343b96ff) Thanks [@fecolinhares](https://github.com/fecolinhares)! - `EnginePrepareInfo.headed` is now required, alongside the `headed` an engine already receives on `init`. A host that builds a `prepare` call now passes the run's mode, so an engine provisions for the browser that run launches. + +- [#836](https://github.com/tester-army/e2e/pull/836) [`5603af1`](https://github.com/tester-army/e2e/commit/5603af1bee11c55a6463769934b37a8f9d32e060) Thanks [@DeryFerd](https://github.com/DeryFerd)! - Run-level errors in reports (hook, collection, provisioning, and worker failures) are now redacted with the config's secrets. + +- [#819](https://github.com/tester-army/e2e/pull/819) [`aeaca4f`](https://github.com/tester-army/e2e/commit/aeaca4fa4626c224cb3e84cfab10fd5bf87b889d) Thanks [@okwasniewski](https://github.com/okwasniewski)! - A failed attempt on an app that stops answering no longer waits 5 s for failure evidence at every capture point, or forever when the engine ignores cancellation. The runner captures the screen and screenshot once per attempt, stops waiting after 5 s, and keeps the original error. + +- [#810](https://github.com/tester-army/e2e/pull/810) [`366766d`](https://github.com/tester-army/e2e/commit/366766df501cb75d817c2cc150092306883ee6eb) Thanks [@okwasniewski](https://github.com/okwasniewski)! - An agent step whose model answers a forced `complete_step` turn with another tool no longer fails as `MODEL_PROVIDER_FAILED`. The call goes back to the model as an error and the turn is asked again within the step's turn budget; a model that never concludes fails the step with `STEP_NO_CONCLUSION`. + +- [#811](https://github.com/tester-army/e2e/pull/811) [`8b552c2`](https://github.com/tester-army/e2e/commit/8b552c2f4cc6816ae1704e18ebe85187cd11b0e5) Thanks [@okwasniewski](https://github.com/okwasniewski)! - An error an engine throws with a runner code, such as `INVALID_LOCATOR` for an unsupported selector, keeps its code and category when the engine is loaded from `e2e.config.ts`. It was reported as an infrastructure `ENGINE_FAILURE`. + +- [#809](https://github.com/tester-army/e2e/pull/809) [`9995932`](https://github.com/tester-army/e2e/commit/99959329cd00cc905f4fc2838d7ace3f698ad8bc) Thanks [@okwasniewski](https://github.com/okwasniewski)! - A run that executes in the host process, such as `e2e explore`, no longer crashes that process when a test leaves a promise rejection or an exception uncaught. It handles them as a worker process does: a rejection fails the test running when it surfaces, or is recorded as `UNHANDLED_REJECTION` between tests. An uncaught exception, or a rejection that surfaces with no test running before any test has finished, is a run error that fails the test on its way with `WORKER_CRASH` and skips the rest of its file. The handlers are removed when the run ends. + +- [#911](https://github.com/tester-army/e2e/pull/911) [`7aafa00`](https://github.com/tester-army/e2e/commit/7aafa007e61a7a0d5e5460f219a3ec275e1f9c75) Thanks [@okwasniewski](https://github.com/okwasniewski)! - `agent.assert` and `agent.waitFor` fail when the value they check is shown more than once and one place contradicts it, such as a correct order summary total next to a wrong pay button total. A claim about some item among several, such as `a todo is marked done`, still holds when one item matches. + +- [#815](https://github.com/tester-army/e2e/pull/815) [`79497a7`](https://github.com/tester-army/e2e/commit/79497a7efe0ee7d0f40b3888fc091e62da84aaf6) Thanks [@okwasniewski](https://github.com/okwasniewski)! - `e2e mcp` now redacts secret values from everything `open_session` and `close_session` return and from its log lines. Before, an engine or app error that carried a configured secret, in a failed open or in a `close_session` "Cleanup:" line, reached the client and stderr verbatim. + +- [#894](https://github.com/tester-army/e2e/pull/894) [`9ae674e`](https://github.com/tester-army/e2e/commit/9ae674e61603dbbeddce958552e64ee81f69675c) Thanks [@rudycelekli](https://github.com/rudycelekli)! - Honor project tools' toModelOutput renderers for string results and preserve rendered error outputs as MCP error results. + +- [#826](https://github.com/tester-army/e2e/pull/826) [`ac1c610`](https://github.com/tester-army/e2e/commit/ac1c61075d4d75ac48ac9a8506e29947a4cf304d) Thanks [@okwasniewski](https://github.com/okwasniewski)! - `e2e mcp` now redacts secret values from what your code prints through `console`, `process.stdout`, or `process.stderr`, such as a `console.log` in a project tool or in the config's top-level code. Before, it reached stderr verbatim. Output printed while a config loads appears once the config has loaded; if the load fails, that output is withheld, since the config's secrets are unknown. An uncaught error or unhandled rejection is logged redacted and the server shuts down its sessions and exits with code 1, instead of crashing with the raw error. + +- [#847](https://github.com/tester-army/e2e/pull/847) [`2e26ec6`](https://github.com/tester-army/e2e/commit/2e26ec65510356508f680d70e85624d86a8c4c25) Thanks [@agammann](https://github.com/agammann)! - Include npm's argument separator in CLI hints so flags such as `--headed` reach the installed `e2e` binary. + +- [#814](https://github.com/tester-army/e2e/pull/814) [`78e135a`](https://github.com/tester-army/e2e/commit/78e135a37227eb1ea6d6a93abb99ad4419e29ece) Thanks [@okwasniewski](https://github.com/okwasniewski)! - A secret value a test passes as a plain string (spelled into an `app.open` URL, typed with `fill`) no longer stays in the Playwright trace. Traces and text downloads are now rewritten whenever the session knows a secret value (every static one, and a provider's once resolved), not only after a secret fill or an engine-held secret, so they are labeled `redaction: "complete"` instead of `not-required` or `incomplete`. Screencast frames are still dropped only after a secret fill. Like any secret trace, a rewritten one masks unrelated text that shares 8 characters with a value. + +- [#902](https://github.com/tester-army/e2e/pull/902) [`032825f`](https://github.com/tester-army/e2e/commit/032825ffe11921c08555df19256c8e466377fd7e) Thanks [@rudycelekli](https://github.com/rudycelekli)! - Preserve environment and client settings on existing e2e MCP registrations when rerunning init. + +- [#820](https://github.com/tester-army/e2e/pull/820) [`a561f06`](https://github.com/tester-army/e2e/commit/a561f06eb31e735a3d6e245f335806e9ddd4b469) Thanks [@okwasniewski](https://github.com/okwasniewski)! - Replaying a repeated scroll on a list that filled the screen, when the list can no longer be found, waits for it once and then scrolls the screen for every remaining repeat. It used to wait out the full relocation backoff (about 14 seconds) before each repeat, so a recorded 4x scroll took about a minute to replay. + +- [#837](https://github.com/tester-army/e2e/pull/837) [`338378e`](https://github.com/tester-army/e2e/commit/338378ed484794de3617ae3621d54b91ec7ed93d) Thanks [@okwasniewski](https://github.com/okwasniewski)! - A worker that crashes during a retry no longer drops the attempts before it. Before, a test whose first attempt failed and whose retry crashed the worker showed a single attempt 0 with `WORKER_CRASH`, and the first attempt's error was lost. The report now keeps every finished attempt and adds the crash as the next one. A crash after the last attempt (in an `afterAll`) is recorded on that attempt instead of as a retry. For a serial group, the finished group attempts and the members that finished in the crashed attempt stay in the report, the member that was running fails with `WORKER_CRASH`, and a crash after a member finished fails the group attempt without blaming that member. A forced interrupt keeps the attempts that finished and the verdict they reach, `flaky` included. + +- [#829](https://github.com/tester-army/e2e/pull/829) [`01b88d3`](https://github.com/tester-army/e2e/commit/01b88d3afd691d2bf2a3260966c48194e626a5ff) Thanks [@okwasniewski](https://github.com/okwasniewski)! - `e2e run` redacts secret values from what the config's top-level code, a test file's top level, and reporters print, as it already did for tests, including what a timer or a reporter the run stopped waiting for prints after the run. Output printed while the config loads appears once it has loaded, and is withheld if the load fails. With the `list` reporter, output printed during the run prints under `stdout | runner` or `stderr | runner`, on stdout like a test's output, so the live view no longer paints over it. + +- [#813](https://github.com/tester-army/e2e/pull/813) [`87e75ae`](https://github.com/tester-army/e2e/commit/87e75ae808d76fa07b66fba9e5c5f3a48be3c31c) Thanks [@okwasniewski](https://github.com/okwasniewski)! - A serial group whose session fails to launch, or whose file fails to load, now fails the run. Before, every member was skipped and the run passed with exit code 0. The first member now fails with the launch error and the rest skip with cause `serial-predecessor-failed`, so the `list` reporter, `summary.md`, and `junit.xml` show the failure. A retry that fails to launch keeps the members' verdicts from the attempt before it, so a member that failed there still fails. An infrastructure error in a serial group, at launch or in a member, now exits 3 and sets the run status to `error`, as it does for any other test, instead of exiting 1. When a worker crashes during a serial group, the member that was running fails with `WORKER_CRASH` instead of being skipped as if it never started. + +- [#827](https://github.com/tester-army/e2e/pull/827) [`6f528be`](https://github.com/tester-army/e2e/commit/6f528be1a8681945b4002dd9c2e967f6fe3f8b1f) Thanks [@okwasniewski](https://github.com/okwasniewski)! - After a secret fill, an agent step whose screen can only be read from a fallback screenshot (`act`, or a judgment with `vision: true`) now fails with `POLICY_DENIED` naming the secret fill, instead of the engine's timeout. + +- [#888](https://github.com/tester-army/e2e/pull/888) [`5e032d9`](https://github.com/tester-army/e2e/commit/5e032d95a903fe2fd190166bbe9aa78f81fb7d91) Thanks [@okwasniewski](https://github.com/okwasniewski)! - Telemetry no longer sends a project id outside git or in a shallow clone, and a coding agent that sets `CI` outside a CI vendor counts as the machine it runs on. EAS Build, Bitrise, Codemagic, and Xcode Cloud are recognized as CI vendors. + +- [#828](https://github.com/tester-army/e2e/pull/828) [`c83b86f`](https://github.com/tester-army/e2e/commit/c83b86f4917d41cf5cf5941d909fb5f087916b88) Thanks [@okwasniewski](https://github.com/okwasniewski)! - A page whose script never yields no longer holds a web test until its test timeout: a tap, a locate, or a navigation on it now fails with `ACTION_FAILED` at its action or navigation timeout, also while a trace records. A tap or keystroke cut off that way may have reached the page and is never repeated by a replay. `expect(browser)` matchers on such a page end at their own timeout instead of the action timeout. + +- [#824](https://github.com/tester-army/e2e/pull/824) [`37806d7`](https://github.com/tester-army/e2e/commit/37806d7fc34b1c2532344a554d96bfcdb8ec2f7a) Thanks [@okwasniewski](https://github.com/okwasniewski)! - A test that blocks its worker's event loop (`while (true) {}`) no longer hangs the run until Ctrl-C. When the worker has not responded `cleanupTimeout` (at least 5 s) after the test timeout, the runner kills it, reports the test `timed-out` with `TEST_TIMEOUT`, and runs the rest of the file on a new worker. A worker with a debugger attached when the test starts (an editor's auto-attach, or `NODE_OPTIONS=--inspect=0`) is never killed this way. Runs with an inline config or in-memory tests run in the runner's own process and still hang. + ## 0.17.0 ### Minor Changes diff --git a/packages/e2e/package.json b/packages/e2e/package.json index ba238f001..9494e4817 100644 --- a/packages/e2e/package.json +++ b/packages/e2e/package.json @@ -1,6 +1,6 @@ { "name": "e2e", - "version": "0.17.0", + "version": "0.18.0", "description": "SDK, runner, and CLI for agentic end-to-end testing", "keywords": [ "e2e", diff --git a/packages/eas/CHANGELOG.md b/packages/eas/CHANGELOG.md index 6e7f27e2c..03b1784fc 100644 --- a/packages/eas/CHANGELOG.md +++ b/packages/eas/CHANGELOG.md @@ -1,5 +1,13 @@ # @e2e-dev/eas +## 0.3.0 + +### Minor Changes + +- [#790](https://github.com/tester-army/e2e/pull/790) [`0d1ed15`](https://github.com/tester-army/e2e/commit/0d1ed15871674aafd0ee3eff92c17eb39f6012bd) Thanks [@okwasniewski](https://github.com/okwasniewski)! - **Breaking: e2e and every `@e2e-dev` package now need Node.js 22.22.3 or newer on Node.js 22, or 24.8.0 or newer** (`engines.node` is `^22.22.3 || >=24.8.0`). Node.js 22.12 through 22.22.2, 23, and 24.0 through 24.7 are no longer supported, and the CLI refuses to start on them, naming the versions to upgrade to. Those releases fail when a CommonJS file a test imports requires TypeScript through the new loader's `module.registerHooks` (nodejs/node#59679 fixed it in 22.22.3 and 24.8.0). + + e2e now loads TypeScript with its own loader, built on oxc, instead of tsx. tsx brought in esbuild, whose postinstall script made every `pnpm install` on pnpm 11 and later fail with `ERR_PNPM_IGNORED_BUILDS` until the project approved the build; nothing e2e installs runs an install script now. Config and tests load as before: ESM whatever `package.json` says, `./x.js` and `./x` resolve to `x.ts` and `./x.jsx` to `x.tsx`, directory index imports, tsconfig `paths` and `baseUrl`, workspace packages exporting `.ts` source, JSX in `.tsx` and `.jsx`, enums, namespaces, `experimentalDecorators`, and source-mapped stack traces. JSON imported without `with { type: 'json' }` still loads. A test file whose name holds `%`, `#`, or a space now collects with its source location instead of failing with "URI malformed" or losing the location. Each file reads its nearest `tsconfig.json` rather than the one in the working directory. What changes: `import` statements in a `.cts` file are no longer compiled into `require` calls (write `import x = require()`); standard decorators without `experimentalDecorators`, auto-accessors, and ES module `import` and value `export` declarations in `.cts` are refused with their line (`import type`, `export type`, `import x = require()`, and `export =` work); the CLI refuses the Bun (`bun --bun`) and Deno runtimes (install with any package manager, run on Node.js); a type imported without `import type` that stays in the output (a decorated member's type under `emitDecoratorMetadata`) fails to load, with an error naming the import; a `.ts` file a CommonJS file requires runs as an ES module like every other `.ts`, so one written with `module.exports` needs the `.cts` extension; and an import written in a JavaScript file resolves as Node.js resolves it, without TypeScript's extension rules or tsconfig `paths`. TypeScript inside an installed package compiles without the project's `tsconfig.json`. + ## 0.2.1 ### Patch Changes diff --git a/packages/eas/package.json b/packages/eas/package.json index 0e7a4a2d9..65795e911 100644 --- a/packages/eas/package.json +++ b/packages/eas/package.json @@ -1,6 +1,6 @@ { "name": "@e2e-dev/eas", - "version": "0.2.1", + "version": "0.3.0", "description": "EAS Simulators for e2e: run mobile targets on Expo's hosted iOS simulators and Android emulators", "keywords": [ "e2e", diff --git a/packages/github/CHANGELOG.md b/packages/github/CHANGELOG.md index df55a8431..391a388d6 100644 --- a/packages/github/CHANGELOG.md +++ b/packages/github/CHANGELOG.md @@ -1,5 +1,13 @@ # @e2e-dev/github +## 0.4.0 + +### Minor Changes + +- [#790](https://github.com/tester-army/e2e/pull/790) [`0d1ed15`](https://github.com/tester-army/e2e/commit/0d1ed15871674aafd0ee3eff92c17eb39f6012bd) Thanks [@okwasniewski](https://github.com/okwasniewski)! - **Breaking: e2e and every `@e2e-dev` package now need Node.js 22.22.3 or newer on Node.js 22, or 24.8.0 or newer** (`engines.node` is `^22.22.3 || >=24.8.0`). Node.js 22.12 through 22.22.2, 23, and 24.0 through 24.7 are no longer supported, and the CLI refuses to start on them, naming the versions to upgrade to. Those releases fail when a CommonJS file a test imports requires TypeScript through the new loader's `module.registerHooks` (nodejs/node#59679 fixed it in 22.22.3 and 24.8.0). + + e2e now loads TypeScript with its own loader, built on oxc, instead of tsx. tsx brought in esbuild, whose postinstall script made every `pnpm install` on pnpm 11 and later fail with `ERR_PNPM_IGNORED_BUILDS` until the project approved the build; nothing e2e installs runs an install script now. Config and tests load as before: ESM whatever `package.json` says, `./x.js` and `./x` resolve to `x.ts` and `./x.jsx` to `x.tsx`, directory index imports, tsconfig `paths` and `baseUrl`, workspace packages exporting `.ts` source, JSX in `.tsx` and `.jsx`, enums, namespaces, `experimentalDecorators`, and source-mapped stack traces. JSON imported without `with { type: 'json' }` still loads. A test file whose name holds `%`, `#`, or a space now collects with its source location instead of failing with "URI malformed" or losing the location. Each file reads its nearest `tsconfig.json` rather than the one in the working directory. What changes: `import` statements in a `.cts` file are no longer compiled into `require` calls (write `import x = require()`); standard decorators without `experimentalDecorators`, auto-accessors, and ES module `import` and value `export` declarations in `.cts` are refused with their line (`import type`, `export type`, `import x = require()`, and `export =` work); the CLI refuses the Bun (`bun --bun`) and Deno runtimes (install with any package manager, run on Node.js); a type imported without `import type` that stays in the output (a decorated member's type under `emitDecoratorMetadata`) fails to load, with an error naming the import; a `.ts` file a CommonJS file requires runs as an ES module like every other `.ts`, so one written with `module.exports` needs the `.cts` extension; and an import written in a JavaScript file resolves as Node.js resolves it, without TypeScript's extension rules or tsconfig `paths`. TypeScript inside an installed package compiles without the project's `tsconfig.json`. + ## 0.3.3 ### Patch Changes diff --git a/packages/github/package.json b/packages/github/package.json index b81f0b788..db9cdb8ea 100644 --- a/packages/github/package.json +++ b/packages/github/package.json @@ -1,6 +1,6 @@ { "name": "@e2e-dev/github", - "version": "0.3.3", + "version": "0.4.0", "description": "GitHub reporter for e2e: one pull request comment per run, from GitHub Actions", "keywords": [ "e2e", diff --git a/packages/kernel/CHANGELOG.md b/packages/kernel/CHANGELOG.md index d2e174566..2cb8b6d9c 100644 --- a/packages/kernel/CHANGELOG.md +++ b/packages/kernel/CHANGELOG.md @@ -1,5 +1,13 @@ # @e2e-dev/integrations +## 0.2.0 + +### Minor Changes + +- [#790](https://github.com/tester-army/e2e/pull/790) [`0d1ed15`](https://github.com/tester-army/e2e/commit/0d1ed15871674aafd0ee3eff92c17eb39f6012bd) Thanks [@okwasniewski](https://github.com/okwasniewski)! - **Breaking: e2e and every `@e2e-dev` package now need Node.js 22.22.3 or newer on Node.js 22, or 24.8.0 or newer** (`engines.node` is `^22.22.3 || >=24.8.0`). Node.js 22.12 through 22.22.2, 23, and 24.0 through 24.7 are no longer supported, and the CLI refuses to start on them, naming the versions to upgrade to. Those releases fail when a CommonJS file a test imports requires TypeScript through the new loader's `module.registerHooks` (nodejs/node#59679 fixed it in 22.22.3 and 24.8.0). + + e2e now loads TypeScript with its own loader, built on oxc, instead of tsx. tsx brought in esbuild, whose postinstall script made every `pnpm install` on pnpm 11 and later fail with `ERR_PNPM_IGNORED_BUILDS` until the project approved the build; nothing e2e installs runs an install script now. Config and tests load as before: ESM whatever `package.json` says, `./x.js` and `./x` resolve to `x.ts` and `./x.jsx` to `x.tsx`, directory index imports, tsconfig `paths` and `baseUrl`, workspace packages exporting `.ts` source, JSX in `.tsx` and `.jsx`, enums, namespaces, `experimentalDecorators`, and source-mapped stack traces. JSON imported without `with { type: 'json' }` still loads. A test file whose name holds `%`, `#`, or a space now collects with its source location instead of failing with "URI malformed" or losing the location. Each file reads its nearest `tsconfig.json` rather than the one in the working directory. What changes: `import` statements in a `.cts` file are no longer compiled into `require` calls (write `import x = require()`); standard decorators without `experimentalDecorators`, auto-accessors, and ES module `import` and value `export` declarations in `.cts` are refused with their line (`import type`, `export type`, `import x = require()`, and `export =` work); the CLI refuses the Bun (`bun --bun`) and Deno runtimes (install with any package manager, run on Node.js); a type imported without `import type` that stays in the output (a decorated member's type under `emitDecoratorMetadata`) fails to load, with an error naming the import; a `.ts` file a CommonJS file requires runs as an ES module like every other `.ts`, so one written with `module.exports` needs the `.cts` extension; and an import written in a JavaScript file resolves as Node.js resolves it, without TypeScript's extension rules or tsconfig `paths`. TypeScript inside an installed package compiles without the project's `tsconfig.json`. + ## 0.1.2 ### Patch Changes diff --git a/packages/kernel/package.json b/packages/kernel/package.json index 3ba6da9a7..4546973a9 100644 --- a/packages/kernel/package.json +++ b/packages/kernel/package.json @@ -1,6 +1,6 @@ { "name": "@e2e-dev/kernel", - "version": "0.1.2", + "version": "0.2.0", "description": "Kernel hosted browsers for e2e: run web targets in Kernel's hosted Chromium", "keywords": [ "e2e", diff --git a/packages/mobile/CHANGELOG.md b/packages/mobile/CHANGELOG.md index bb8c8c898..7f04a9f63 100644 --- a/packages/mobile/CHANGELOG.md +++ b/packages/mobile/CHANGELOG.md @@ -1,5 +1,21 @@ # @e2e-dev/mobile +## 0.10.0 + +### Minor Changes + +- [#790](https://github.com/tester-army/e2e/pull/790) [`0d1ed15`](https://github.com/tester-army/e2e/commit/0d1ed15871674aafd0ee3eff92c17eb39f6012bd) Thanks [@okwasniewski](https://github.com/okwasniewski)! - **Breaking: e2e and every `@e2e-dev` package now need Node.js 22.22.3 or newer on Node.js 22, or 24.8.0 or newer** (`engines.node` is `^22.22.3 || >=24.8.0`). Node.js 22.12 through 22.22.2, 23, and 24.0 through 24.7 are no longer supported, and the CLI refuses to start on them, naming the versions to upgrade to. Those releases fail when a CommonJS file a test imports requires TypeScript through the new loader's `module.registerHooks` (nodejs/node#59679 fixed it in 22.22.3 and 24.8.0). + + e2e now loads TypeScript with its own loader, built on oxc, instead of tsx. tsx brought in esbuild, whose postinstall script made every `pnpm install` on pnpm 11 and later fail with `ERR_PNPM_IGNORED_BUILDS` until the project approved the build; nothing e2e installs runs an install script now. Config and tests load as before: ESM whatever `package.json` says, `./x.js` and `./x` resolve to `x.ts` and `./x.jsx` to `x.tsx`, directory index imports, tsconfig `paths` and `baseUrl`, workspace packages exporting `.ts` source, JSX in `.tsx` and `.jsx`, enums, namespaces, `experimentalDecorators`, and source-mapped stack traces. JSON imported without `with { type: 'json' }` still loads. A test file whose name holds `%`, `#`, or a space now collects with its source location instead of failing with "URI malformed" or losing the location. Each file reads its nearest `tsconfig.json` rather than the one in the working directory. What changes: `import` statements in a `.cts` file are no longer compiled into `require` calls (write `import x = require()`); standard decorators without `experimentalDecorators`, auto-accessors, and ES module `import` and value `export` declarations in `.cts` are refused with their line (`import type`, `export type`, `import x = require()`, and `export =` work); the CLI refuses the Bun (`bun --bun`) and Deno runtimes (install with any package manager, run on Node.js); a type imported without `import type` that stays in the output (a decorated member's type under `emitDecoratorMetadata`) fails to load, with an error naming the import; a `.ts` file a CommonJS file requires runs as an ES module like every other `.ts`, so one written with `module.exports` needs the `.cts` extension; and an import written in a JavaScript file resolves as Node.js resolves it, without TypeScript's extension rules or tsconfig `paths`. TypeScript inside an installed package compiles without the project's `tsconfig.json`. + +- [#840](https://github.com/tester-army/e2e/pull/840) [`b33398f`](https://github.com/tester-army/e2e/commit/b33398fc380a1ecd8a0784d1c5c2fcbdeefaf841) Thanks [@Mohit20057](https://github.com/Mohit20057)! - `screen.swipe({ from, to, duration })` adds an optional `duration` for path swipes, controlling how long the gesture takes in milliseconds. + +### Patch Changes + +- [#912](https://github.com/tester-army/e2e/pull/912) [`39cfe83`](https://github.com/tester-army/e2e/commit/39cfe83ac80d0a479436bcb41dad14a3ebbfe143) Thanks [@okwasniewski](https://github.com/okwasniewski)! - Update agent-device to 0.21.21 for iOS keyboard focus reporting, unconfirmed fills into non-echoing fields, and Android snapshot helper timeout backoff. + +- [#917](https://github.com/tester-army/e2e/pull/917) [`89b783d`](https://github.com/tester-army/e2e/commit/89b783d3b4913fef496c51c24453879b05d8f316) Thanks [@jbroma](https://github.com/jbroma)! - Update agent-device to 0.21.22, so a Limrun iOS settings refusal names the session's device instead of `booted`. + ## 0.9.2 ### Patch Changes diff --git a/packages/mobile/package.json b/packages/mobile/package.json index 1264d415b..c8c5e20aa 100644 --- a/packages/mobile/package.json +++ b/packages/mobile/package.json @@ -1,6 +1,6 @@ { "name": "@e2e-dev/mobile", - "version": "0.9.2", + "version": "0.10.0", "description": "Mobile engine (iOS and Android) for e2e agentic end-to-end testing, built on agent-device", "keywords": [ "e2e", diff --git a/packages/web/CHANGELOG.md b/packages/web/CHANGELOG.md index 394a9b016..a1c7e7d1e 100644 --- a/packages/web/CHANGELOG.md +++ b/packages/web/CHANGELOG.md @@ -1,5 +1,29 @@ # @e2e-dev/web +## 0.13.0 + +### Minor Changes + +- [#790](https://github.com/tester-army/e2e/pull/790) [`0d1ed15`](https://github.com/tester-army/e2e/commit/0d1ed15871674aafd0ee3eff92c17eb39f6012bd) Thanks [@okwasniewski](https://github.com/okwasniewski)! - **Breaking: e2e and every `@e2e-dev` package now need Node.js 22.22.3 or newer on Node.js 22, or 24.8.0 or newer** (`engines.node` is `^22.22.3 || >=24.8.0`). Node.js 22.12 through 22.22.2, 23, and 24.0 through 24.7 are no longer supported, and the CLI refuses to start on them, naming the versions to upgrade to. Those releases fail when a CommonJS file a test imports requires TypeScript through the new loader's `module.registerHooks` (nodejs/node#59679 fixed it in 22.22.3 and 24.8.0). + + e2e now loads TypeScript with its own loader, built on oxc, instead of tsx. tsx brought in esbuild, whose postinstall script made every `pnpm install` on pnpm 11 and later fail with `ERR_PNPM_IGNORED_BUILDS` until the project approved the build; nothing e2e installs runs an install script now. Config and tests load as before: ESM whatever `package.json` says, `./x.js` and `./x` resolve to `x.ts` and `./x.jsx` to `x.tsx`, directory index imports, tsconfig `paths` and `baseUrl`, workspace packages exporting `.ts` source, JSX in `.tsx` and `.jsx`, enums, namespaces, `experimentalDecorators`, and source-mapped stack traces. JSON imported without `with { type: 'json' }` still loads. A test file whose name holds `%`, `#`, or a space now collects with its source location instead of failing with "URI malformed" or losing the location. Each file reads its nearest `tsconfig.json` rather than the one in the working directory. What changes: `import` statements in a `.cts` file are no longer compiled into `require` calls (write `import x = require()`); standard decorators without `experimentalDecorators`, auto-accessors, and ES module `import` and value `export` declarations in `.cts` are refused with their line (`import type`, `export type`, `import x = require()`, and `export =` work); the CLI refuses the Bun (`bun --bun`) and Deno runtimes (install with any package manager, run on Node.js); a type imported without `import type` that stays in the output (a decorated member's type under `emitDecoratorMetadata`) fails to load, with an error naming the import; a `.ts` file a CommonJS file requires runs as an ES module like every other `.ts`, so one written with `module.exports` needs the `.cts` extension; and an import written in a JavaScript file resolves as Node.js resolves it, without TypeScript's extension rules or tsconfig `paths`. TypeScript inside an installed package compiles without the project's `tsconfig.json`. + +- [#840](https://github.com/tester-army/e2e/pull/840) [`b33398f`](https://github.com/tester-army/e2e/commit/b33398fc380a1ecd8a0784d1c5c2fcbdeefaf841) Thanks [@Mohit20057](https://github.com/Mohit20057)! - `screen.swipe({ from, to, duration })` adds an optional `duration` for path swipes, controlling how long the gesture takes in milliseconds. + +### Patch Changes + +- [#803](https://github.com/tester-army/e2e/pull/803) [`f2f9a53`](https://github.com/tester-army/e2e/commit/f2f9a5373d520c35514da713c3f0c18a343b96ff) Thanks [@fecolinhares](https://github.com/fecolinhares)! - A headless run no longer downloads the full Chromium when the headless shell is installed, and the install no longer removes other browsers in the cache. Set `PLAYWRIGHT_SKIP_BROWSER_GC=0` to restore cleanup. + +- [#860](https://github.com/tester-army/e2e/pull/860) [`60bf04d`](https://github.com/tester-army/e2e/commit/60bf04d576df1619854a91fd424f22f52e5d8441) Thanks [@okwasniewski](https://github.com/okwasniewski)! - `browser.evaluate` evaluates a string as an expression: `browser.evaluate('document.title')` and `browser.evaluate('(() => document.title)()')` return the title instead of failing with `EVALUATE_FAILED: ... is not a function`. A string that evaluates to a function, such as `'() => document.title'`, is still called with the argument. + +- [#859](https://github.com/tester-army/e2e/pull/859) [`432e9bf`](https://github.com/tester-army/e2e/commit/432e9bff7c7d6f97b37412e1f4d1f3053057fb15) Thanks [@okwasniewski](https://github.com/okwasniewski)! - An action whose locator gains a second match just before it runs, such as a screen transition that briefly shows the old and new page together, no longer fails with `ENGINE_FAILURE` and a Playwright strict mode violation. The locator resolves again: two matches still fail with `LOCATOR_AMBIGUOUS`, and a duplicate that went away lets the action run. A drag whose drop target gains a second match after the press fails with `ACTION_FAILED` and is not repeated. + +- [#891](https://github.com/tester-army/e2e/pull/891) [`a0e5142`](https://github.com/tester-army/e2e/commit/a0e5142f619916a3d9648653f295600ab2f8b5dc) Thanks [@rudycelekli](https://github.com/rudycelekli)! - Infer scope-less table headers from neighboring data cells, matching native row headers in semantic observations. + +- [#828](https://github.com/tester-army/e2e/pull/828) [`c83b86f`](https://github.com/tester-army/e2e/commit/c83b86f4917d41cf5cf5941d909fb5f087916b88) Thanks [@okwasniewski](https://github.com/okwasniewski)! - A page whose script never yields no longer holds a web test until its test timeout: a tap, a locate, or a navigation on it now fails with `ACTION_FAILED` at its action or navigation timeout, also while a trace records. A tap or keystroke cut off that way may have reached the page and is never repeated by a replay. `expect(browser)` matchers on such a page end at their own timeout instead of the action timeout. + +- [#913](https://github.com/tester-army/e2e/pull/913) [`7c158ee`](https://github.com/tester-army/e2e/commit/7c158ee63761248180e2a97a00d2e6d5583ba374) Thanks [@okwasniewski](https://github.com/okwasniewski)! - Requires `e2e` 0.18.0 or later. With an older runner the engine failed to load, or a headed run failed to launch the browser. + ## 0.12.0 ### Minor Changes diff --git a/packages/web/package.json b/packages/web/package.json index 5fbea6429..fe04e5af2 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@e2e-dev/web", - "version": "0.12.0", + "version": "0.13.0", "description": "Web engine for e2e agentic end-to-end testing, built on Playwright", "keywords": [ "e2e",