@e2edev/e2e 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/README.md +3 -3
  2. package/dist/agent/act.d.ts +30 -2
  3. package/dist/agent/act.d.ts.map +1 -1
  4. package/dist/agent/act.js +4 -4
  5. package/dist/agent/act.js.map +1 -1
  6. package/dist/agent/default-agent.d.ts +16 -7
  7. package/dist/agent/default-agent.d.ts.map +1 -1
  8. package/dist/agent/default-agent.js +35 -34
  9. package/dist/agent/default-agent.js.map +1 -1
  10. package/dist/agent/interactive-step.d.ts +38 -0
  11. package/dist/agent/interactive-step.d.ts.map +1 -0
  12. package/dist/agent/interactive-step.js +131 -0
  13. package/dist/agent/interactive-step.js.map +1 -0
  14. package/dist/agent/model/tool-choice.d.ts +21 -0
  15. package/dist/agent/model/tool-choice.d.ts.map +1 -0
  16. package/dist/agent/model/tool-choice.js +49 -0
  17. package/dist/agent/model/tool-choice.js.map +1 -0
  18. package/dist/agent/tool-loop.d.ts +4 -4
  19. package/dist/agent/tool-loop.d.ts.map +1 -1
  20. package/dist/agent/tool-loop.js +100 -23
  21. package/dist/agent/tool-loop.js.map +1 -1
  22. package/dist/cli/docs-url.d.ts +1 -1
  23. package/dist/cli/docs-url.d.ts.map +1 -1
  24. package/dist/cli/docs-url.js +1 -1
  25. package/dist/cli/docs-url.js.map +1 -1
  26. package/dist/cli/index.d.ts.map +1 -1
  27. package/dist/cli/index.js +22 -3
  28. package/dist/cli/index.js.map +1 -1
  29. package/dist/cli/init/engine-versions.json +1 -1
  30. package/dist/cli/init/engines.d.ts +16 -15
  31. package/dist/cli/init/engines.d.ts.map +1 -1
  32. package/dist/cli/init/engines.js +23 -23
  33. package/dist/cli/init/engines.js.map +1 -1
  34. package/dist/cli/init/mcp-config.d.ts +31 -0
  35. package/dist/cli/init/mcp-config.d.ts.map +1 -0
  36. package/dist/cli/init/mcp-config.js +72 -0
  37. package/dist/cli/init/mcp-config.js.map +1 -0
  38. package/dist/cli/init/scaffold.d.ts +1 -1
  39. package/dist/cli/init/scaffold.js +1 -1
  40. package/dist/cli/init/scaffold.js.map +1 -1
  41. package/dist/cli/init.d.ts.map +1 -1
  42. package/dist/cli/init.js +64 -28
  43. package/dist/cli/init.js.map +1 -1
  44. package/dist/cli/mcp.d.ts +15 -0
  45. package/dist/cli/mcp.d.ts.map +1 -0
  46. package/dist/cli/mcp.js +63 -0
  47. package/dist/cli/mcp.js.map +1 -0
  48. package/dist/collect/registry.d.ts.map +1 -1
  49. package/dist/collect/registry.js +23 -2
  50. package/dist/collect/registry.js.map +1 -1
  51. package/dist/collect/select.d.ts +9 -2
  52. package/dist/collect/select.d.ts.map +1 -1
  53. package/dist/collect/select.js +57 -11
  54. package/dist/collect/select.js.map +1 -1
  55. package/dist/config/resolve.d.ts +8 -5
  56. package/dist/config/resolve.d.ts.map +1 -1
  57. package/dist/config/resolve.js +11 -9
  58. package/dist/config/resolve.js.map +1 -1
  59. package/dist/credentials.d.ts +6 -0
  60. package/dist/credentials.d.ts.map +1 -1
  61. package/dist/credentials.js +9 -0
  62. package/dist/credentials.js.map +1 -1
  63. package/dist/explore/index.d.ts.map +1 -1
  64. package/dist/explore/index.js +6 -4
  65. package/dist/explore/index.js.map +1 -1
  66. package/dist/internal/ai-trace.d.ts +2 -0
  67. package/dist/internal/ai-trace.d.ts.map +1 -1
  68. package/dist/internal/ai-trace.js +3 -0
  69. package/dist/internal/ai-trace.js.map +1 -1
  70. package/dist/internal/ids.d.ts +2 -2
  71. package/dist/internal/ids.d.ts.map +1 -1
  72. package/dist/internal/ids.js +3 -3
  73. package/dist/internal/ids.js.map +1 -1
  74. package/dist/internal/package-manager.d.ts +4 -0
  75. package/dist/internal/package-manager.d.ts.map +1 -1
  76. package/dist/internal/package-manager.js +26 -0
  77. package/dist/internal/package-manager.js.map +1 -1
  78. package/dist/mcp/catalog.d.ts +50 -0
  79. package/dist/mcp/catalog.d.ts.map +1 -0
  80. package/dist/mcp/catalog.js +172 -0
  81. package/dist/mcp/catalog.js.map +1 -0
  82. package/dist/mcp/config.d.ts +11 -0
  83. package/dist/mcp/config.d.ts.map +1 -0
  84. package/dist/mcp/config.js +16 -0
  85. package/dist/mcp/config.js.map +1 -0
  86. package/dist/mcp/server.d.ts +29 -0
  87. package/dist/mcp/server.d.ts.map +1 -0
  88. package/dist/mcp/server.js +86 -0
  89. package/dist/mcp/server.js.map +1 -0
  90. package/dist/mcp/session.d.ts +68 -0
  91. package/dist/mcp/session.d.ts.map +1 -0
  92. package/dist/mcp/session.js +317 -0
  93. package/dist/mcp/session.js.map +1 -0
  94. package/dist/mcp/tools.d.ts +77 -0
  95. package/dist/mcp/tools.d.ts.map +1 -0
  96. package/dist/mcp/tools.js +179 -0
  97. package/dist/mcp/tools.js.map +1 -0
  98. package/dist/report/build.d.ts +8 -0
  99. package/dist/report/build.d.ts.map +1 -1
  100. package/dist/report/build.js +3 -1
  101. package/dist/report/build.js.map +1 -1
  102. package/dist/report/format.d.ts +19 -0
  103. package/dist/report/format.d.ts.map +1 -1
  104. package/dist/report/format.js +42 -0
  105. package/dist/report/format.js.map +1 -1
  106. package/dist/report/junit.d.ts.map +1 -1
  107. package/dist/report/junit.js +4 -1
  108. package/dist/report/junit.js.map +1 -1
  109. package/dist/report/list.d.ts +10 -1
  110. package/dist/report/list.d.ts.map +1 -1
  111. package/dist/report/list.js +35 -13
  112. package/dist/report/list.js.map +1 -1
  113. package/dist/run/events.d.ts +12 -3
  114. package/dist/run/events.d.ts.map +1 -1
  115. package/dist/run/events.js.map +1 -1
  116. package/dist/run/execute.d.ts +2 -2
  117. package/dist/run/execute.d.ts.map +1 -1
  118. package/dist/run/execute.js +19 -14
  119. package/dist/run/execute.js.map +1 -1
  120. package/dist/run/fixtures.d.ts +10 -4
  121. package/dist/run/fixtures.d.ts.map +1 -1
  122. package/dist/run/fixtures.js +23 -23
  123. package/dist/run/fixtures.js.map +1 -1
  124. package/dist/run/in-process.d.ts.map +1 -1
  125. package/dist/run/in-process.js +4 -3
  126. package/dist/run/in-process.js.map +1 -1
  127. package/dist/run/provision.d.ts +51 -0
  128. package/dist/run/provision.d.ts.map +1 -0
  129. package/dist/run/provision.js +94 -0
  130. package/dist/run/provision.js.map +1 -0
  131. package/dist/run/records.d.ts +4 -0
  132. package/dist/run/records.d.ts.map +1 -1
  133. package/dist/run/runner.d.ts +5 -2
  134. package/dist/run/runner.d.ts.map +1 -1
  135. package/dist/run/runner.js +21 -69
  136. package/dist/run/runner.js.map +1 -1
  137. package/dist/run/scheduler.d.ts +5 -2
  138. package/dist/run/scheduler.d.ts.map +1 -1
  139. package/dist/run/scheduler.js +13 -10
  140. package/dist/run/scheduler.js.map +1 -1
  141. package/dist/run/serial.d.ts +1 -1
  142. package/dist/run/serial.d.ts.map +1 -1
  143. package/dist/run/serial.js +7 -2
  144. package/dist/run/serial.js.map +1 -1
  145. package/dist/run/standalone.d.ts +63 -0
  146. package/dist/run/standalone.d.ts.map +1 -0
  147. package/dist/run/standalone.js +152 -0
  148. package/dist/run/standalone.js.map +1 -0
  149. package/dist/run/units.d.ts +6 -3
  150. package/dist/run/units.d.ts.map +1 -1
  151. package/dist/run/units.js +0 -0
  152. package/dist/run/units.js.map +1 -1
  153. package/dist/run/worker/entry.js +2 -2
  154. package/dist/run/worker/entry.js.map +1 -1
  155. package/dist/run/worker/protocol.d.ts +5 -0
  156. package/dist/run/worker/protocol.d.ts.map +1 -1
  157. package/dist/run/worker/protocol.js.map +1 -1
  158. package/dist/run/worker/session.d.ts +3 -4
  159. package/dist/run/worker/session.d.ts.map +1 -1
  160. package/dist/run/worker/session.js +5 -4
  161. package/dist/run/worker/session.js.map +1 -1
  162. package/dist/types.d.ts +8 -4
  163. package/dist/types.d.ts.map +1 -1
  164. package/package.json +7 -6
  165. package/skills/e2e/SKILL.md +5 -2
  166. package/skills/e2e/references/agent.md +2 -2
  167. package/skills/e2e/references/explore.md +3 -3
  168. package/skills/e2e/references/mcp.md +88 -0
  169. package/skills/e2e/references/running.md +4 -3
  170. package/skills/e2e/references/setup.md +7 -6
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@e2edev/e2e",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "description": "SDK, runner, and CLI for agentic end-to-end testing",
5
5
  "keywords": [
6
6
  "e2e",
@@ -51,12 +51,13 @@
51
51
  "skills"
52
52
  ],
53
53
  "dependencies": {
54
- "@clack/prompts": "1.7.0",
54
+ "@clack/prompts": "1.8.0",
55
+ "@modelcontextprotocol/sdk": "1.30.0",
55
56
  "@vitest/expect": "5.0.0",
56
57
  "commander": "15.0.0",
57
58
  "picocolors": "1.1.1",
58
59
  "tsx": "4.23.13",
59
- "zod": "4.5.4"
60
+ "zod": "4.6.1"
60
61
  },
61
62
  "peerDependencies": {
62
63
  "ai": "^7.0.0"
@@ -68,14 +69,14 @@
68
69
  },
69
70
  "devDependencies": {
70
71
  "@ai-sdk/openai-compatible": "3.0.47",
72
+ "@e2edev/playwright": "0.9.0",
71
73
  "@openrouter/ai-sdk-provider": "3.0.0",
72
74
  "@types/node": "26.4.1",
73
- "ai": "7.0.93",
75
+ "ai": "7.0.97",
74
76
  "ajv": "8.20.0",
75
77
  "ajv-formats": "3.0.1",
76
78
  "typescript": "7.0.2",
77
- "vitest": "5.0.0",
78
- "@e2edev/playwright": "0.8.0"
79
+ "vitest": "5.0.0"
79
80
  },
80
81
  "engines": {
81
82
  "node": ">=22.12.0"
@@ -66,6 +66,7 @@ one. Without them, the installed CLI prints the same text:
66
66
  | `running` | [references/running.md](references/running.md) | CLI flags, reporters, `.e2e/report.json`, exit codes, CI |
67
67
  | `explore` | [references/explore.md](references/explore.md) | Exploring an app toward a goal without a test file: `e2e explore`, its budgets, verdict, and `run.explore` |
68
68
  | `debugging` | [references/debugging.md](references/debugging.md) | A run failed: error codes and their fixes, `--headed`, `--debug`, `--ai-trace` |
69
+ | `mcp` | [references/mcp.md](references/mcp.md) | Driving the live app from a coding agent over MCP: `e2e mcp`, its tools, and the explore-then-write loop |
69
70
 
70
71
  ## Workflow
71
72
 
@@ -74,8 +75,10 @@ one. Without them, the installed CLI prints the same text:
74
75
  there: follow `setup`.
75
76
  2. Learn the screens you will drive before writing a test: routes, labels,
76
77
  roles, button text. Semantic locators need the accessible names the app
77
- renders, so read the templates or components, or open the page with
78
- `--headed`.
78
+ renders, so read the templates or components, open the page with
79
+ `--headed`, or drive the live app through the `e2e mcp` server when it is
80
+ registered (topic `mcp`): `open_session`, `observe`, and `locate` show the
81
+ exact names and check a locator before you write it.
79
82
  3. Write `tests/<feature>.e2e.ts`. Deterministic steps first. One `agent.act`
80
83
  per goal where the flow varies, and an `expect` on its outcome right after.
81
84
  4. Run one file: `npx --no-install e2e run tests/<feature>.e2e.ts`. Agent
@@ -6,7 +6,7 @@ transcript between calls. Deterministic tests never load a model.
6
6
 
7
7
  ## Configure a model
8
8
 
9
- Agents live under `agents` by name; `default` is the one tests use, `e2e run --agent <name>` re-points that default, a test or describe pins one with `{ agent: 'name' }`, and any `agent.*` call can name one with `{ agent: 'name' }` (innermost wins). There is no default model. Pick one of three shapes for an entry:
9
+ Agents live under `agents` by name; `default` is the one tests use, `e2e run --agent <name>` re-points that default, a test or describe pins one with `{ agent: 'name' }` or several with `{ agent: ['buyer', 'admin'] }` (the test runs once per agent, one result each, tagged `[admin]` in the terminal and `agent` in the report), and any `agent.*` call can name one with `{ agent: 'name' }` (innermost wins). `--agent buyer,admin` runs every unpinned test once per agent; on a pinned list it narrows to the names both give and never overrides a pin it does not name. A signed-in persona pairs the pin with a `session`, one per describe block, so a loop over describe blocks sweeps signed-in personas. There is no default model. Pick one of three shapes for an entry:
10
10
 
11
11
  ```ts
12
12
  // e2e.config.ts
@@ -222,7 +222,7 @@ arbitrary tool result JSON or other fields are preserved.
222
222
  can be the `agent`; the runner still owns observations, actions, budgets,
223
223
  and the report.
224
224
 
225
- Full reference: https://e2e-docs.vercel.app/agents
225
+ Full reference: https://e2e.mintlify.app/agents
226
226
 
227
227
  ## In CI
228
228
 
@@ -3,14 +3,14 @@
3
3
  `e2e explore` runs the agent against the app with a goal instead of a test
4
4
  file. Use it to see what the agent can do with an app before tests exist, to
5
5
  hunt for regressions on a branch, or to find what is worth turning into a
6
- test. It needs a config with a target and a model (on the agent, or
7
- `E2E_MODEL`), nothing else.
6
+ test. It needs a config with a target and an agent that holds a model,
7
+ nothing else.
8
8
 
9
9
  ```bash
10
10
  npx --no-install e2e explore # goal: "Explore the app and find bugs"
11
11
  npx --no-install e2e explore 'Explore checkout like a first-time buyer and report anything off'
12
12
  npx --no-install e2e explore --target web --max-steps 4 --headed
13
- E2E_MODEL=provider/model-id npx --no-install e2e explore 'Hunt for broken forms' --video
13
+ npx --no-install e2e explore 'Hunt for broken forms' --video
14
14
  ```
15
15
 
16
16
  ## What a run does
@@ -0,0 +1,88 @@
1
+ # Driving the app over MCP
2
+
3
+ `e2e mcp` serves a project's live app to a coding agent over MCP (stdio).
4
+ It gives the agent the same hands the testing agent has on the app: look at
5
+ a screen before writing a test, and check a locator before committing to it.
6
+ Running tests and reading a failed run stay on the CLI (topics `running` and
7
+ `debugging`).
8
+
9
+ ## Setup
10
+
11
+ The server ships with `@e2edev/e2e`. `e2e init` offers to register it; by
12
+ hand:
13
+
14
+ ```bash
15
+ claude mcp add e2e -- npx --no-install e2e mcp # Claude Code
16
+ ```
17
+
18
+ Or declare it in the client's project config (`.mcp.json` for Claude Code,
19
+ `.cursor/mcp.json` for Cursor, `.vscode/mcp.json` for VS Code):
20
+
21
+ ```json
22
+ { "mcpServers": { "e2e": { "command": "npx", "args": ["--no-install", "e2e", "mcp"] } } }
23
+ ```
24
+
25
+ Flags: `--config <path>` names the default config file, `--target <name>`
26
+ fixes the target every session opens on, `--headless` hides the browser or
27
+ simulator (sessions are headed by default outside CI, so the developer can
28
+ watch).
29
+
30
+ ## Tools
31
+
32
+ The server has four tools, and the list never changes. Everything a session
33
+ can do is a catalog behind `call`.
34
+
35
+ | Tool | Does |
36
+ | --- | --- |
37
+ | `open_session` | Loads the config (`config` names another file; default the nearest `e2e.config.ts`), starts the declared app command if any, boots the engine, opens the app URL, and returns the session id, the catalog, and the first observation. `target` is required when the config declares several. One session at a time. |
38
+ | `tools` | The catalog: one line per tool with its argument names (`?` marks optional), the first sentence of its description, and `[read-only]` where it changes nothing. `tools {tool}` shows one tool's full description and the JSON Schema of its arguments. |
39
+ | `call` | Runs one catalog tool: `call {tool: "tap", args: {target: "n42"}}`. Arguments are checked against the tool's schema first; a wrong one fails with `INVALID_ARGUMENT` naming the field. |
40
+ | `close_session` | Ends the attempt, disposes the engine, stops the app processes the session started. |
41
+
42
+ The catalog, per session:
43
+
44
+ | Catalog tool | Does |
45
+ | --- | --- |
46
+ | `observe` | A fresh observation: one node per line as `#id role "name" ...`, plus the current path. |
47
+ | `tap`, `type`, `press`, `select`, `scroll`, `navigate` | The grammar verbs, exactly as the testing agent gets them. Each reports what changed on screen; `observe` shows the whole screen. A verb the engine cannot honor is not listed and fails with `UNSUPPORTED_CAPABILITY`. |
48
+ | `type_secret` | Fills a configured credential's password into a secure field by credential name; the plaintext never reaches the agent. Listed when the config declares `credentials`. |
49
+ | `locate` | Tries a semantic locator (`role` + `name`, `text`, `label`, `placeholder`, `testId`, `exact`) and returns how many nodes match, which, and the `screen.*` call to write. |
50
+ | `screenshot` | The masked pixels as an image, withheld once a secret was filled in the session. |
51
+ | Project tools | Every `defineTool` passed to `createAgent({ tools })` that applies to the target's platform, under its own name; an engine pack such as `agentDeviceTools` adds `open_app`, `swipe`, `type_text`, `alert`. |
52
+
53
+ Resources: `e2e://guide` and `e2e://guide/<topic>` hold this skill.
54
+
55
+ ## Workflow
56
+
57
+ 1. `open_session`, then `call {tool: "observe"}` and act until the screen you
58
+ want to test is in front of you. Node ids are valid only for the newest
59
+ observation; an action reports what changed, so observe again before
60
+ using new ids. The opening text lists every tool with its arguments;
61
+ `tools {tool}` when you need the full contract.
62
+ 2. `call {tool: "locate", args: {...}}` for each locator you intend to write.
63
+ One match: use the printed `screen.getByRole(...)` call. Zero or several:
64
+ adjust before writing the test, the same failure would hit the test as
65
+ `LOCATOR_NOT_FOUND` or `LOCATOR_AMBIGUOUS`.
66
+ 3. Write `tests/<feature>.e2e.ts` (topic `writing-tests`). Deterministic steps
67
+ where you saw exact names; `agent.act` where the flow varies.
68
+ 4. Run it from the shell: `npx --no-install e2e run tests/<feature>.e2e.ts`,
69
+ read the failure (topic `debugging`), fix, repeat.
70
+ 5. `close_session` when you are done exploring; an idle session closes on its
71
+ own after 30 minutes and never outlives 4 hours. To look at another
72
+ project or config, `open_session {config: "path/to/e2e.config.ts"}`; no
73
+ restart needed.
74
+
75
+ ## Rules
76
+
77
+ - Sessions enforce the same policy as tests: navigation stays inside the
78
+ engine's allowed origins, secrets fill only through `type_secret`, and
79
+ pixels are withheld once a secret is on screen.
80
+ - Nothing a session does is recorded as a test or into the trace cache. A
81
+ session is for looking and trying; the test is what you write afterwards.
82
+ - A run from the shell and a live session can share the app only if the
83
+ engine's `command` uses `reuseExisting`; otherwise close the session before
84
+ running.
85
+ - `TARGET_REQUIRED`: pass `target` to `open_session` or start with `--target`.
86
+ `NO_SESSION`: call `open_session` first. `SESSION_OPEN`: one is already
87
+ open; use it or `close_session`. `UNKNOWN_TOOL`: the name is not in this
88
+ session's catalog; the message lists what is.
@@ -7,8 +7,9 @@ npx --no-install e2e run [files...] [options] # run tests
7
7
  npx --no-install e2e explore [goal] [options] # explore the app toward a goal, no test file (see the explore topic)
8
8
  npx --no-install e2e list [files...] [options] # print what run would select, without running
9
9
  npx --no-install e2e init [--yes] # scaffold a project, refresh the agent skill
10
- npx --no-install e2e guide [topic] # print this skill: setup, writing-tests, agent, running, explore, debugging
10
+ npx --no-install e2e guide [topic] # print this skill: setup, writing-tests, agent, running, explore, debugging, mcp
11
11
  npx --no-install e2e cache ls|clear|stats # read or empty the trace cache
12
+ npx --no-install e2e mcp [--target <name>] # serve the project to a coding agent over MCP (topic mcp)
12
13
  npx --no-install e2e telemetry [disable|enable] # anonymous usage telemetry: status, or the switch
13
14
  ```
14
15
 
@@ -21,7 +22,7 @@ npx --no-install e2e telemetry [disable|enable] # anonymous usage telemetry: sta
21
22
  | `--target <ids>` | Comma-separated target names. Only selected targets start app commands and services; unknown names fail before startup. |
22
23
  | `--tag <tag>` | Repeatable tag filter; `--tag-mode all` requires every tag. |
23
24
  | `--headed` | Visible browser or simulator when the engine supports it. |
24
- | `--agent <name>` | Run with another configured agent (`agents.<name>`); default is `agents.default`. |
25
+ | `--agent <names>` | Run unpinned tests as other configured agents (`agents.<name>`), comma-separated or repeated; several names run each such test once per agent. Default is `agents.default`. |
25
26
  | `--workers <n>`, `--retries <n>` | Override the resolved values. |
26
27
  | `--reporter <ids>` | `list`, `json`, `junit`, comma-separated. `json` cannot combine with `list`. |
27
28
  | `--artifacts <dir>` | Artifact root, default `.e2e/artifacts`. |
@@ -71,7 +72,7 @@ recorded flow is stale — `--no-cache` only skips the cache for one run.
71
72
 
72
73
  - `list` (default): one line per file and target, a `Failed Tests` section
73
74
  with each error, its code, the failing line and a code frame, then a
74
- summary (`Test Files`, `Tests`, `AI`, `Start at`, `Duration`, `Report`); setup steps (a first-run browser download, each service and app command) print above the tests and stay out of `Duration` or are split out of it as `(startup …)`.
75
+ summary (`Test Files`, `Tests`, `AI`, `Cache` when the trace cache was on: agent steps `replayed` whole, `handed off` to the model part-way, or `missed`, `Start at`, `Duration`, `Report`); setup steps (a first-run browser download, each service and app command) print above the tests and stay out of `Duration` or are split out of it as `(startup …)`.
75
76
  - `.e2e/report.json` is written on every run whatever the reporters:
76
77
  `run.status`, `run.exitCode`, `run.errors[]` (run-level failures such as
77
78
  `APP_UNREACHABLE`), and `run.results[]`, one per test and target, with
@@ -21,14 +21,15 @@ pnpm dlx @e2edev/e2e@beta init # pnpm
21
21
  When `@e2edev/e2e` is already installed, run `npx --no-install e2e init`
22
22
  instead, so the installed version scaffolds.
23
23
 
24
- The wizard asks for the engine (Playwright by default; None and agent-device
25
- are the alternatives), whether to enable AI testing (adds `ai@^7.0.0` and
26
- `createAgent` to the config), which agent directories receive this skill
24
+ The wizard asks for the engine (Web with Playwright by default; Mobile with
25
+ agent-device and None are the alternatives), which model gateway agent steps
26
+ use (adds AI SDK v7 and the provider package), which agent directories receive this skill
27
27
  (`.agents/skills/` and `.claude/skills/`), a confirmation of the files it
28
28
  will write, and whether to install. `--yes` skips every prompt (use it from
29
- scripts and from a shell without a TTY): Playwright, AI on, no installation,
30
- skill in both directories. The closing line prints the run command,
31
- `APP_URL=http://localhost:3000 npx --no-install e2e run` for Playwright, and
29
+ scripts and from a shell without a TTY): Playwright, the Vercel AI Gateway,
30
+ no installation, skill in both directories. The closing line prints the run
31
+ command through the project's package manager,
32
+ `APP_URL=http://localhost:3000 npm run test:e2e` for Playwright under npm, and
32
33
  suggests a `tsconfig.json` when the project has none.
33
34
 
34
35
  Init writes `package.json` (a private ESM package when missing; otherwise