codeceptjs 4.0.0-rc.17 → 4.0.0-rc.19

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 (240) hide show
  1. package/bin/codecept.js +15 -2
  2. package/bin/codeceptq.js +49 -0
  3. package/bin/mcp-server.js +733 -196
  4. package/docs/advanced.md +201 -0
  5. package/docs/agents.md +159 -0
  6. package/docs/ai.md +537 -0
  7. package/docs/aitrace.md +266 -0
  8. package/docs/api.md +332 -0
  9. package/docs/assertions.md +415 -0
  10. package/docs/auth.md +318 -0
  11. package/docs/basics.md +424 -0
  12. package/docs/bdd.md +539 -0
  13. package/docs/best.md +240 -0
  14. package/docs/bootstrap.md +132 -0
  15. package/docs/commands.md +352 -0
  16. package/docs/community-helpers.md +63 -0
  17. package/docs/configuration.md +230 -0
  18. package/docs/continuous-integration.md +497 -0
  19. package/docs/custom-helpers.md +297 -0
  20. package/docs/data.md +448 -0
  21. package/docs/debugging.md +332 -0
  22. package/docs/detox.md +235 -0
  23. package/docs/docker.md +136 -0
  24. package/docs/effects.md +179 -0
  25. package/docs/element-based-testing.md +295 -0
  26. package/docs/element-selection.md +125 -0
  27. package/docs/els.md +328 -0
  28. package/docs/examples.md +161 -0
  29. package/docs/heal.md +213 -0
  30. package/docs/helpers/ApiDataFactory.md +267 -0
  31. package/docs/helpers/Appium.md +1405 -0
  32. package/docs/helpers/Detox.md +665 -0
  33. package/docs/helpers/ExpectHelper.md +275 -0
  34. package/docs/helpers/FileSystem.md +152 -0
  35. package/docs/helpers/GraphQL.md +152 -0
  36. package/docs/helpers/GraphQLDataFactory.md +226 -0
  37. package/docs/helpers/JSONResponse.md +255 -0
  38. package/docs/helpers/Mochawesome.md +8 -0
  39. package/docs/helpers/MockRequest.md +377 -0
  40. package/docs/helpers/MockServer.md +212 -0
  41. package/docs/helpers/Playwright.md +2969 -0
  42. package/docs/helpers/Polly.md +44 -0
  43. package/docs/helpers/Protractor.md +1769 -0
  44. package/docs/helpers/Puppeteer-firefox.md +86 -0
  45. package/docs/helpers/Puppeteer.md +2690 -0
  46. package/docs/helpers/REST.md +289 -0
  47. package/docs/helpers/SoftExpectHelper.md +352 -0
  48. package/docs/helpers/WebDriver.md +2682 -0
  49. package/docs/hooks.md +339 -0
  50. package/docs/index.md +111 -0
  51. package/docs/installation.md +83 -0
  52. package/docs/internal-api.md +265 -0
  53. package/docs/internal-test-server.md +89 -0
  54. package/docs/locators.md +355 -0
  55. package/docs/mcp.md +485 -0
  56. package/docs/migration-4.md +556 -0
  57. package/docs/mobile.md +338 -0
  58. package/docs/pageobjects.md +399 -0
  59. package/docs/parallel.md +585 -0
  60. package/docs/playwright.md +714 -0
  61. package/docs/plugins.md +866 -0
  62. package/docs/puppeteer.md +314 -0
  63. package/docs/quickstart.md +120 -0
  64. package/docs/react.md +70 -0
  65. package/docs/reports.md +483 -0
  66. package/docs/retry.md +274 -0
  67. package/docs/secrets.md +150 -0
  68. package/docs/sessions.md +80 -0
  69. package/docs/shadow.md +68 -0
  70. package/docs/test-structure.md +275 -0
  71. package/docs/timeouts.md +183 -0
  72. package/docs/translation.md +247 -0
  73. package/docs/tutorial.md +271 -0
  74. package/docs/typescript.md +374 -0
  75. package/docs/web-element.md +251 -0
  76. package/docs/webdriver.md +708 -0
  77. package/docs/within.md +55 -0
  78. package/lib/aria.js +260 -0
  79. package/lib/command/dryRun.js +23 -3
  80. package/lib/command/init.js +247 -266
  81. package/lib/command/list.js +150 -10
  82. package/lib/command/query.js +218 -0
  83. package/lib/config.js +77 -4
  84. package/lib/container.js +34 -2
  85. package/lib/element/WebElement.js +37 -0
  86. package/lib/globals.js +11 -10
  87. package/lib/helper/Playwright.js +5 -6
  88. package/lib/helper/extras/PlaywrightReactVueLocator.js +45 -36
  89. package/lib/html.js +90 -16
  90. package/lib/index.js +9 -1
  91. package/lib/locator.js +2 -2
  92. package/lib/mocha/factory.js +5 -1
  93. package/lib/mocha/inject.js +1 -1
  94. package/lib/parser.js +2 -2
  95. package/lib/pause.js +38 -4
  96. package/lib/plugin/aiTrace.js +72 -84
  97. package/lib/plugin/browser.js +77 -0
  98. package/lib/plugin/expose.js +159 -0
  99. package/lib/plugin/heal.js +44 -1
  100. package/lib/plugin/pageInfo.js +51 -48
  101. package/lib/plugin/pause.js +131 -0
  102. package/lib/plugin/pauseOnFail.js +10 -34
  103. package/lib/plugin/screencast.js +287 -0
  104. package/lib/plugin/screenshot.js +563 -0
  105. package/lib/plugin/screenshotOnFail.js +8 -170
  106. package/lib/utils/pluginParser.js +151 -0
  107. package/lib/utils/trace.js +297 -0
  108. package/lib/utils.js +25 -0
  109. package/lib/workers.js +1 -15
  110. package/package.json +12 -10
  111. package/typings/index.d.ts +0 -5
  112. package/docs/webapi/amOnPage.mustache +0 -11
  113. package/docs/webapi/appendField.mustache +0 -16
  114. package/docs/webapi/attachFile.mustache +0 -24
  115. package/docs/webapi/blur.mustache +0 -18
  116. package/docs/webapi/checkOption.mustache +0 -13
  117. package/docs/webapi/clearCookie.mustache +0 -9
  118. package/docs/webapi/clearField.mustache +0 -14
  119. package/docs/webapi/click.mustache +0 -29
  120. package/docs/webapi/clickLink.mustache +0 -8
  121. package/docs/webapi/closeCurrentTab.mustache +0 -7
  122. package/docs/webapi/closeOtherTabs.mustache +0 -8
  123. package/docs/webapi/dontSee.mustache +0 -11
  124. package/docs/webapi/dontSeeCheckboxIsChecked.mustache +0 -10
  125. package/docs/webapi/dontSeeCookie.mustache +0 -8
  126. package/docs/webapi/dontSeeCurrentPathEquals.mustache +0 -10
  127. package/docs/webapi/dontSeeCurrentUrlEquals.mustache +0 -10
  128. package/docs/webapi/dontSeeElement.mustache +0 -12
  129. package/docs/webapi/dontSeeElementInDOM.mustache +0 -8
  130. package/docs/webapi/dontSeeInCurrentUrl.mustache +0 -4
  131. package/docs/webapi/dontSeeInField.mustache +0 -16
  132. package/docs/webapi/dontSeeInSource.mustache +0 -8
  133. package/docs/webapi/dontSeeInTitle.mustache +0 -8
  134. package/docs/webapi/dontSeeTraffic.mustache +0 -13
  135. package/docs/webapi/doubleClick.mustache +0 -13
  136. package/docs/webapi/downloadFile.mustache +0 -12
  137. package/docs/webapi/dragAndDrop.mustache +0 -9
  138. package/docs/webapi/dragSlider.mustache +0 -11
  139. package/docs/webapi/executeAsyncScript.mustache +0 -24
  140. package/docs/webapi/executeScript.mustache +0 -26
  141. package/docs/webapi/fillField.mustache +0 -21
  142. package/docs/webapi/flushNetworkTraffics.mustache +0 -5
  143. package/docs/webapi/focus.mustache +0 -13
  144. package/docs/webapi/forceClick.mustache +0 -28
  145. package/docs/webapi/forceRightClick.mustache +0 -18
  146. package/docs/webapi/grabAllWindowHandles.mustache +0 -7
  147. package/docs/webapi/grabAttributeFrom.mustache +0 -10
  148. package/docs/webapi/grabAttributeFromAll.mustache +0 -9
  149. package/docs/webapi/grabBrowserLogs.mustache +0 -9
  150. package/docs/webapi/grabCookie.mustache +0 -11
  151. package/docs/webapi/grabCssPropertyFrom.mustache +0 -11
  152. package/docs/webapi/grabCssPropertyFromAll.mustache +0 -10
  153. package/docs/webapi/grabCurrentUrl.mustache +0 -9
  154. package/docs/webapi/grabCurrentWindowHandle.mustache +0 -6
  155. package/docs/webapi/grabDataFromPerformanceTiming.mustache +0 -20
  156. package/docs/webapi/grabElementBoundingRect.mustache +0 -20
  157. package/docs/webapi/grabGeoLocation.mustache +0 -8
  158. package/docs/webapi/grabHTMLFrom.mustache +0 -10
  159. package/docs/webapi/grabHTMLFromAll.mustache +0 -9
  160. package/docs/webapi/grabNumberOfOpenTabs.mustache +0 -8
  161. package/docs/webapi/grabNumberOfVisibleElements.mustache +0 -9
  162. package/docs/webapi/grabPageScrollPosition.mustache +0 -8
  163. package/docs/webapi/grabPopupText.mustache +0 -5
  164. package/docs/webapi/grabRecordedNetworkTraffics.mustache +0 -10
  165. package/docs/webapi/grabSource.mustache +0 -8
  166. package/docs/webapi/grabTextFrom.mustache +0 -10
  167. package/docs/webapi/grabTextFromAll.mustache +0 -9
  168. package/docs/webapi/grabTitle.mustache +0 -8
  169. package/docs/webapi/grabValueFrom.mustache +0 -9
  170. package/docs/webapi/grabValueFromAll.mustache +0 -8
  171. package/docs/webapi/grabWebElement.mustache +0 -9
  172. package/docs/webapi/grabWebElements.mustache +0 -9
  173. package/docs/webapi/moveCursorTo.mustache +0 -16
  174. package/docs/webapi/openNewTab.mustache +0 -7
  175. package/docs/webapi/pressKey.mustache +0 -12
  176. package/docs/webapi/pressKeyDown.mustache +0 -12
  177. package/docs/webapi/pressKeyUp.mustache +0 -12
  178. package/docs/webapi/pressKeyWithKeyNormalization.mustache +0 -60
  179. package/docs/webapi/refreshPage.mustache +0 -6
  180. package/docs/webapi/resizeWindow.mustache +0 -6
  181. package/docs/webapi/rightClick.mustache +0 -14
  182. package/docs/webapi/saveElementScreenshot.mustache +0 -10
  183. package/docs/webapi/saveScreenshot.mustache +0 -12
  184. package/docs/webapi/say.mustache +0 -10
  185. package/docs/webapi/scrollIntoView.mustache +0 -11
  186. package/docs/webapi/scrollPageToBottom.mustache +0 -6
  187. package/docs/webapi/scrollPageToTop.mustache +0 -6
  188. package/docs/webapi/scrollTo.mustache +0 -12
  189. package/docs/webapi/see.mustache +0 -11
  190. package/docs/webapi/seeAttributesOnElements.mustache +0 -9
  191. package/docs/webapi/seeCheckboxIsChecked.mustache +0 -10
  192. package/docs/webapi/seeCookie.mustache +0 -8
  193. package/docs/webapi/seeCssPropertiesOnElements.mustache +0 -9
  194. package/docs/webapi/seeCurrentPathEquals.mustache +0 -10
  195. package/docs/webapi/seeCurrentUrlEquals.mustache +0 -11
  196. package/docs/webapi/seeElement.mustache +0 -12
  197. package/docs/webapi/seeElementInDOM.mustache +0 -8
  198. package/docs/webapi/seeInCurrentUrl.mustache +0 -8
  199. package/docs/webapi/seeInField.mustache +0 -17
  200. package/docs/webapi/seeInPopup.mustache +0 -8
  201. package/docs/webapi/seeInSource.mustache +0 -7
  202. package/docs/webapi/seeInTitle.mustache +0 -8
  203. package/docs/webapi/seeNumberOfElements.mustache +0 -11
  204. package/docs/webapi/seeNumberOfVisibleElements.mustache +0 -10
  205. package/docs/webapi/seeTextEquals.mustache +0 -9
  206. package/docs/webapi/seeTitleEquals.mustache +0 -8
  207. package/docs/webapi/seeTraffic.mustache +0 -36
  208. package/docs/webapi/selectOption.mustache +0 -26
  209. package/docs/webapi/setCookie.mustache +0 -16
  210. package/docs/webapi/setGeoLocation.mustache +0 -12
  211. package/docs/webapi/startRecordingTraffic.mustache +0 -8
  212. package/docs/webapi/startRecordingWebSocketMessages.mustache +0 -8
  213. package/docs/webapi/stopRecordingTraffic.mustache +0 -5
  214. package/docs/webapi/stopRecordingWebSocketMessages.mustache +0 -7
  215. package/docs/webapi/switchTo.mustache +0 -9
  216. package/docs/webapi/switchToNextTab.mustache +0 -10
  217. package/docs/webapi/switchToPreviousTab.mustache +0 -10
  218. package/docs/webapi/type.mustache +0 -21
  219. package/docs/webapi/uncheckOption.mustache +0 -13
  220. package/docs/webapi/wait.mustache +0 -8
  221. package/docs/webapi/waitForClickable.mustache +0 -11
  222. package/docs/webapi/waitForCookie.mustache +0 -9
  223. package/docs/webapi/waitForDetached.mustache +0 -10
  224. package/docs/webapi/waitForDisabled.mustache +0 -6
  225. package/docs/webapi/waitForElement.mustache +0 -11
  226. package/docs/webapi/waitForEnabled.mustache +0 -6
  227. package/docs/webapi/waitForFunction.mustache +0 -17
  228. package/docs/webapi/waitForInvisible.mustache +0 -10
  229. package/docs/webapi/waitForNumberOfTabs.mustache +0 -9
  230. package/docs/webapi/waitForText.mustache +0 -13
  231. package/docs/webapi/waitForValue.mustache +0 -10
  232. package/docs/webapi/waitForVisible.mustache +0 -10
  233. package/docs/webapi/waitInUrl.mustache +0 -9
  234. package/docs/webapi/waitNumberOfVisibleElements.mustache +0 -10
  235. package/docs/webapi/waitToHide.mustache +0 -10
  236. package/docs/webapi/waitUrlEquals.mustache +0 -10
  237. package/lib/helper/AI.js +0 -214
  238. package/lib/plugin/pauseOn.js +0 -167
  239. package/lib/plugin/stepByStepReport.js +0 -432
  240. package/lib/plugin/subtitles.js +0 -89
package/docs/mcp.md ADDED
@@ -0,0 +1,485 @@
1
+ # CodeceptJS MCP Server
2
+
3
+ Model Context Protocol (MCP) server for CodeceptJS. Lets AI agents drive a CodeceptJS browser session — list tests, run arbitrary `I.*` code, pause-and-poke through a scenario, capture artifacts, and read aiTrace markdown — all in-process, sharing one browser and one container.
4
+
5
+ ## Overview
6
+
7
+ The MCP server exposes the following tools:
8
+
9
+ - `list_tests` / `list_actions` — enumerate tests and `I.*` methods
10
+ - `start_browser` / `stop_browser` — open / close the session (only place plugin overrides go)
11
+ - `run_code` — run arbitrary JS with `I` and the full CodeceptJS scope; captures steps, console, return value, and a settled-state snapshot
12
+ - `snapshot` — capture URL/HTML/ARIA/screenshot/console/storage at any moment
13
+ - `run_test` — run a specific scenario; supports `pauseAt` for programmatic breakpoints
14
+ - `run_step_by_step` — pause after every step
15
+ - `continue` — release a paused test (run-to-end, run-to-next-pause, or run-to-finish)
16
+ - `cancel` — abort the in-progress / paused run without closing the browser
17
+
18
+ ## Invocation
19
+
20
+ Two ways to launch the server:
21
+
22
+ - `npx codeceptjs-mcp` — the published bin
23
+ - `node node_modules/codeceptjs/bin/mcp-server.js` — direct path, useful for editor / agent configs
24
+
25
+ > ⚠️ **Run from the project's local `codeceptjs`, never a global install.**
26
+ > The MCP server resolves helpers, plugins, page objects, and custom support from the project's `node_modules`. A globally installed `codeceptjs` won't see project-local helpers (`@codeceptjs/helper`, `@codeceptjs/configure`, custom plugins) or your `include:` support objects, and per-project versions can drift from the global one. Always invoke via `npx codeceptjs-mcp` from inside the project directory, or point your MCP client config at `<project>/node_modules/codeceptjs/bin/mcp-server.js` directly.
27
+
28
+ ## Configuration
29
+
30
+ Set up the MCP server in your client (Claude Desktop, Cursor, Continue, etc.):
31
+
32
+ ### Basic
33
+
34
+ ```json
35
+ {
36
+ "mcpServers": {
37
+ "codeceptjs": {
38
+ "command": "npx",
39
+ "args": ["codeceptjs-mcp"]
40
+ }
41
+ }
42
+ }
43
+ ```
44
+
45
+ The server looks for `codecept.conf.js` (then `.cjs`) in the current working directory.
46
+
47
+ ### With env vars
48
+
49
+ ```json
50
+ {
51
+ "mcpServers": {
52
+ "codeceptjs": {
53
+ "command": "npx",
54
+ "args": ["codeceptjs-mcp"],
55
+ "env": {
56
+ "CODECEPTJS_CONFIG": "/absolute/path/to/codecept.conf.js",
57
+ "CODECEPTJS_PROJECT_DIR": "/absolute/path/to/project"
58
+ }
59
+ }
60
+ }
61
+ }
62
+ ```
63
+
64
+ | Variable | Description |
65
+ |----------|-------------|
66
+ | `CODECEPTJS_CONFIG` | Absolute path to `codecept.conf.js`. Overrides cwd lookup. |
67
+ | `CODECEPTJS_PROJECT_DIR` | Absolute path to the project root. Used as the resolution base for the config file. |
68
+
69
+ ## Session Defaults
70
+
71
+ When the session starts, the MCP server enforces two plugin defaults so the agent gets useful telemetry out of the box:
72
+
73
+ - **`aiTrace: { enabled: true, on: 'step' }`** — every step persists DOM/ARIA/screenshot/console artifacts to `output/trace_<TestName>_<hash>/`. Each scenario's `traceFile` is returned in run results so the agent can `Read` the markdown directly.
74
+ - **`browser: { enabled: true, show: false }`** — headless. Switch to headed via `start_browser` `plugins` arg.
75
+
76
+ Both can be overridden (or disabled) via `start_browser`'s `plugins` argument. The `codecept.conf.js`'s own plugin config still merges in for keys the user explicitly set there.
77
+
78
+ ## Available Tools
79
+
80
+ ### `start_browser`
81
+
82
+ Initializes the session — loads config, builds the container, opens the browser, kicks off the synthetic test scope so `run_code` and `snapshot` work. This is the only tool that customizes initialization; every other tool either uses the active session or auto-inits with project defaults.
83
+
84
+ **Parameters:**
85
+ - `config` (string, optional) — absolute path to `codecept.conf.js`. Defaults to `$CODECEPTJS_CONFIG`, then `./codecept.conf.js` in `$CODECEPTJS_PROJECT_DIR` or cwd.
86
+ - `plugins` (object, optional) — plugin configs keyed by name. Same shape as `plugins` in `codecept.conf.js`; `enabled: true` is added automatically. Most useful entries:
87
+ - `{ browser: { show: true } }` — visible browser
88
+ - `{ browser: { browser: "firefox", windowSize: "1280x720" } }` — switch browser + viewport
89
+ - `{ aiTrace: { enabled: false } }` — disable per-step trace overhead on a re-run
90
+ - `{ pause: { on: "fail" } }` / `{ screenshot: { on: "step" } }` — any other plugin works the same way
91
+
92
+ **Returns:**
93
+ ```json
94
+ {
95
+ "status": "Session started — run_code and snapshot are now available",
96
+ "plugins": { "browser": { "show": false } }
97
+ }
98
+ ```
99
+
100
+ ### `stop_browser`
101
+
102
+ Closes the browser handles, drops the synthetic test scope, but **keeps the container, codecept, and Mocha alive**. Subsequent `start_browser` reopens the browser without rebuilding everything — important because ESM-loaded test files don't re-execute their top-level `Scenario(...)` on reload, so a fresh Mocha would have no suites.
103
+
104
+ **Parameters:** none
105
+
106
+ **Returns:**
107
+ ```json
108
+ { "status": "Browser stopped — Mocha and config preserved; call start_browser to reopen" }
109
+ ```
110
+
111
+ ### `cancel`
112
+
113
+ Aborts the currently paused or in-progress test run **without closing the browser**. Use when you want to bail out of a paused test and start something else. Mocha + container stay alive; the next `run_test` / `run_step_by_step` works immediately.
114
+
115
+ **Parameters:** none
116
+
117
+ **Returns:**
118
+ ```json
119
+ { "status": "Run cancelled — browser kept open" }
120
+ ```
121
+
122
+ ### `list_tests`
123
+
124
+ Lists all tests resolved from the project's `tests:` glob.
125
+
126
+ **Parameters:** none
127
+
128
+ **Returns:**
129
+ ```json
130
+ {
131
+ "count": 5,
132
+ "tests": [
133
+ { "file": "/abs/path/to/work_orders_test.js", "relativePath": "work_orders_test.js" }
134
+ ]
135
+ }
136
+ ```
137
+
138
+ ### `list_actions`
139
+
140
+ Lists every `I.*` method from enabled helpers and support objects.
141
+
142
+ **Parameters:** none
143
+
144
+ **Returns:**
145
+ ```json
146
+ {
147
+ "count": 120,
148
+ "actions": [
149
+ { "helper": "Playwright", "action": "amOnPage", "signature": "I.amOnPage(url)" },
150
+ { "helper": "SupportObject", "action": "loginAsAdmin", "signature": "I.loginAsAdmin()" }
151
+ ]
152
+ }
153
+ ```
154
+
155
+ ### `run_code`
156
+
157
+ Run arbitrary JavaScript inside the live test scope. Captures steps, console output, return value, and a final-state snapshot.
158
+
159
+ **Parameters:**
160
+ - `code` (string, required) — JS source. Use `await` on `I.*` calls.
161
+ - `timeout` (number, optional) — ms (default `60000`).
162
+ - `saveArtifacts` (boolean, optional) — capture final-state artifacts (default `true`).
163
+ - `settleMs` (number, optional) — wait this many ms after the code finishes before capturing artifacts (default `300`). Bump to `1000`+ for slow re-renders, `0` to skip.
164
+
165
+ **Scope (everything reachable as a bare identifier in `code`):**
166
+
167
+ | Symbol | Source |
168
+ |--------|--------|
169
+ | `I` | The actor (with all helper methods) |
170
+ | Custom support objects | `include:` in `codecept.conf.js` (e.g. page objects, `login` from `auth` plugin) |
171
+ | `locate`, `within`, `session`, `secret`, `inject`, `pause`, `share` | from `codeceptjs` |
172
+ | `tryTo`, `retryTo`, `hopeThat` | from `codeceptjs/effects` |
173
+ | `step` | from `codeceptjs/steps` |
174
+ | `element`, `eachElement`, `expectElement`, `expectAnyElement`, `expectAllElements` | from `codeceptjs/els` |
175
+ | `container` | the DI container |
176
+ | `helpers` | live helpers map (e.g. `helpers.Playwright.page` for raw Playwright access) |
177
+
178
+ The full live list is returned in every response under `availableObjects`.
179
+
180
+ **Return-value handling:**
181
+ - An explicit `return X` is JSON-stringified (with circular-ref handling). Capped at 20 KB.
182
+ - If you forget `return`, the last grabbed step value is returned automatically (`await I.grabTitle()` on the last line works).
183
+ - A returned `WebElement` (or array of them, from `I.grabWebElement(s)`) is auto-described to a plain object: `{ text, html, visible, enabled, attrs }`.
184
+
185
+ **Returns:**
186
+ ```json
187
+ {
188
+ "status": "success",
189
+ "output": "Code executed successfully",
190
+ "error": null,
191
+ "commands": ["I am on page \"/\"", "I grab text from \"h1\""],
192
+ "logs": [{ "level": "log", "message": "headline Welcome", "t": 47 }],
193
+ "returnValue": "{\n \"url\": \"http://localhost:8000/\",\n \"text\": \"Welcome\"\n}",
194
+ "availableObjects": ["I", "container", "eachElement", "element", "expectAllElements", "expectAnyElement", "expectElement", "helpers", "hopeThat", "inject", "locate", "login", "pause", "retryTo", "secret", "session", "share", "step", "tryTo", "within"],
195
+ "artifacts": {
196
+ "url": "http://localhost:8000/",
197
+ "html": "file:///output/trace_run_code_.../mcp_page.html",
198
+ "aria": "file:///output/trace_run_code_.../mcp_aria.txt",
199
+ "screenshot": "file:///output/trace_run_code_.../mcp_screenshot.png",
200
+ "console": "file:///output/trace_run_code_.../mcp_console.json",
201
+ "storage": "file:///output/trace_run_code_.../mcp_storage.json",
202
+ "cookieCount": 3,
203
+ "localStorageCount": 5
204
+ },
205
+ "ariaDiff": "...",
206
+ "dir": "/output/trace_run_code_...",
207
+ "traceFile": "file:///output/trace_run_code_.../trace.md"
208
+ }
209
+ ```
210
+
211
+ - `traceFile` — markdown summary of this call. `Read` it for full context.
212
+ - `ariaDiff` — present when the call mutated the page; diff between the previous aiTrace ARIA snapshot and the new one.
213
+ - `aiTraceHint` — appears when aiTrace is disabled, suggesting how to re-enable it.
214
+
215
+ **Example:**
216
+ ```json
217
+ {
218
+ "name": "run_code",
219
+ "arguments": {
220
+ "code": "await I.amOnPage('/'); const t = await I.grabTextFrom('h1'); return { url: await I.grabCurrentUrl(), text: t };"
221
+ }
222
+ }
223
+ ```
224
+
225
+ ### `snapshot`
226
+
227
+ Capture the current browser state without performing any action.
228
+
229
+ **Parameters:**
230
+ - `fullPage` (boolean, optional) — full-page screenshot (default `false`).
231
+ - `settleMs` (number, optional) — wait before capture (default `300`).
232
+
233
+ **Returns:**
234
+ ```json
235
+ {
236
+ "status": "success",
237
+ "dir": "/output/snapshot_1700000000000_abcd1234",
238
+ "traceFile": "file:///output/snapshot_.../trace.md",
239
+ "artifacts": {
240
+ "url": "http://localhost:8000/dashboard",
241
+ "html": "file:///output/snapshot_.../snapshot_page.html",
242
+ "aria": "file:///output/snapshot_.../snapshot_aria.txt",
243
+ "screenshot": "file:///output/snapshot_.../snapshot_screenshot.png",
244
+ "console": "file:///output/snapshot_.../snapshot_console.json",
245
+ "storage": "file:///output/snapshot_.../snapshot_storage.json",
246
+ "cookieCount": 3,
247
+ "localStorageCount": 5
248
+ }
249
+ }
250
+ ```
251
+
252
+ ### `run_test`
253
+
254
+ Run a specific scenario. Returns reporter JSON with one entry per scenario; each entry has a `traceFile` (file:// URL) pointing to the per-scenario aiTrace markdown — `Read` it on failures to see the failing step's DOM/ARIA/screenshot.
255
+
256
+ If the test calls `pause()` — or if `pauseAt` matches a step — returns early with `status: "paused"` so the agent can inspect via `run_code` and release with `continue` (or abort with `cancel`).
257
+
258
+ **Parameters:**
259
+ - `test` (string, required) — file path or partial test name; resolved to a single test file.
260
+ - `timeout` (number, optional) — overall ms (default `60000`).
261
+ - `grep` (string, optional) — filter scenarios by title; passed to `mocha.grep`. Mirrors `--grep` on the CLI.
262
+ - `pauseAt` (number | string, optional) — programmatic breakpoint. Either:
263
+ - `number` — 1-based step index (test pauses after the Nth step completes)
264
+ - `string` — case-insensitive substring match against step name
265
+ - `"/regex/i"` — regex literal (the `/.../i` form is honored verbatim)
266
+
267
+ **Returns (completed normally):**
268
+ ```json
269
+ {
270
+ "status": "completed",
271
+ "file": "/path/to/test.js",
272
+ "reporterJson": {
273
+ "stats": { "tests": 1, "passes": 1, "failures": 0 },
274
+ "tests": [
275
+ {
276
+ "title": "lists materials",
277
+ "file": "/path/to/materials_test.js",
278
+ "status": "passed",
279
+ "duration": 4123,
280
+ "traceFile": "file:///output/trace_materials__lists_materials_xxxx/trace.md"
281
+ }
282
+ ]
283
+ },
284
+ "error": null
285
+ }
286
+ ```
287
+
288
+ **Returns (paused):**
289
+ ```json
290
+ {
291
+ "status": "paused",
292
+ "file": "/path/to/test.js",
293
+ "pausedAfter": { "index": 7, "name": "I select option {\"css\":\"main select\"}, \"Flux\"", "status": "success" },
294
+ "page": { "url": "https://app.example.com/materials", "title": "Materials", "contentSize": 18432 },
295
+ "suggestions": [
296
+ "Call snapshot to capture URL/HTML/ARIA/screenshot/console/storage at this point",
297
+ "Call run_code to inspect or manipulate state (e.g. return await I.grabText(\"h1\"))",
298
+ "Call continue to release the pause and let the test run the next step (or finish)"
299
+ ]
300
+ }
301
+ ```
302
+
303
+ **Examples:**
304
+ ```json
305
+ { "name": "run_test", "arguments": { "test": "checkout_test", "pauseAt": 5 } }
306
+ { "name": "run_test", "arguments": { "test": "checkout_test", "pauseAt": "fill field" } }
307
+ { "name": "run_test", "arguments": { "test": "checkout_test", "pauseAt": "/grab.*url/i" } }
308
+ ```
309
+
310
+ ### `run_step_by_step`
311
+
312
+ Run a test interactively, pausing after every step. The agent advances with `continue` or inspects with `run_code` / `snapshot`.
313
+
314
+ **Parameters:**
315
+ - `test` (string, required)
316
+ - `timeout` (number, optional)
317
+ - `grep` (string, optional)
318
+ - `plugins` (object, optional) — same as `start_browser`. Most useful is `{ browser: { show: true } }` so you can watch the run between pauses.
319
+
320
+ **Returns (after each step):**
321
+ ```json
322
+ {
323
+ "status": "paused",
324
+ "file": "/path/to/test.js",
325
+ "pausedAfter": { "index": 1, "name": "I am on page \"/\"", "status": "success" },
326
+ "page": { "url": "http://localhost:8000/", "title": "Test App", "contentSize": 1832 },
327
+ "suggestions": [...]
328
+ }
329
+ ```
330
+
331
+ **Returns (after the last step):** same shape as `run_test`'s completed response — every scenario carries its `traceFile`.
332
+
333
+ ### `continue`
334
+
335
+ Release a paused test. The test runs until the next pause (`run_step_by_step`), the next `pause()` call, or completion.
336
+
337
+ **Parameters:**
338
+ - `timeout` (number, optional) — ms to wait for the next pause / completion (default `60000`).
339
+
340
+ **Returns (re-paused):** same shape as `run_test`'s paused response, with the new `pausedAfter` index.
341
+
342
+ **Returns (completed):** same shape as `run_test`'s completed response.
343
+
344
+ ## Pause-and-poke flow
345
+
346
+ ```json
347
+ { "name": "run_step_by_step", "arguments": { "test": "checkout_test" } }
348
+ // → { "status": "paused", "pausedAfter": { "index": 1, ... } }
349
+
350
+ { "name": "snapshot", "arguments": {} }
351
+ // → full artifact bundle for step 1
352
+
353
+ { "name": "run_code", "arguments": { "code": "return await I.grabCurrentUrl()" } }
354
+ // → { "status": "success", "returnValue": "http://...", "artifacts": { ... } }
355
+
356
+ { "name": "run_code", "arguments": { "code": "await I.click('Save')" } }
357
+ // → { "status": "success", ... } — actually mutates the live page
358
+
359
+ { "name": "continue", "arguments": {} }
360
+ // → { "status": "paused", "pausedAfter": { "index": 2, ... } }
361
+
362
+ // ... or bail out:
363
+ { "name": "cancel", "arguments": {} }
364
+ // → { "status": "Run cancelled — browser kept open" }
365
+ ```
366
+
367
+ Notes:
368
+ - Pause runs in-process: `run_code` and the test share the same `I` / browser. There's no subprocess, no IPC.
369
+ - `run_test` / `run_step_by_step` / `continue` silence stdout/stderr while running so step output doesn't interleave with the MCP JSON-RPC stream.
370
+ - TTY behaviour is unchanged — `npx codeceptjs run --debug` at a terminal still opens the readline REPL when `process.stdin.isTTY` is true. The MCP server only intercepts pause when its handler is registered.
371
+
372
+ ## Trace files (aiTrace)
373
+
374
+ When `aiTrace` is on (the default for MCP sessions), every step in a scenario produces:
375
+
376
+ ```
377
+ output/
378
+ └── trace_Materials__lists_materials_<hash>/
379
+ ├── 0001_<step>_screenshot.png
380
+ ├── 0001_<step>_page.html # minified → trash classes/scripts/styles stripped → beautified
381
+ ├── 0001_<step>_aria.txt # Playwright only
382
+ ├── 0001_<step>_console.json
383
+ ├── 0002_...
384
+ └── trace.md # AI-friendly markdown index
385
+ ```
386
+
387
+ `run_test` / `run_step_by_step` results expose the `trace.md` URL per scenario (`reporterJson.tests[].traceFile`) — `Read` it on failure to see exactly what the failing step saw.
388
+
389
+ For ad-hoc `run_code` / `snapshot` runs, only a single set of artifacts is produced (`mcp_*` / `snapshot_*` prefix), packaged with their own `trace.md`.
390
+
391
+ ### `trace.md` shape
392
+
393
+ ```markdown
394
+ # Test: Login functionality
395
+
396
+ **Status**: failed
397
+ **File**: tests/login_test.js
398
+
399
+ ## Steps
400
+
401
+ 1. **I.amOnPage("/login")** — passed (150ms)
402
+ 2. **I.fillField("#username", "user")** — passed (80ms)
403
+ 3. **I.click("#login")** — passed (100ms)
404
+ 4. **I.see("Welcome")** — failed (50ms)
405
+
406
+ ## Error
407
+
408
+ Element "Welcome" not found
409
+
410
+ ## Artifacts
411
+
412
+ - Screenshot: 0004_screenshot.png
413
+ - HTML: 0004_page.html
414
+ - ARIA: 0004_aria.txt
415
+ ```
416
+
417
+ ## HTML formatting
418
+
419
+ Every HTML snapshot saved by the MCP server (and the `aiTrace` / `pageInfo` plugins, since they all funnel through `captureSnapshot` in `lib/utils/trace.js`) goes through:
420
+
421
+ 1. **Minify** (`html-minifier-terser`) — strip comments, collapse whitespace, drop redundant attributes.
422
+ 2. **Clean** — drop `<style>`, `<noscript>`, and inline `<script>` (no `src`); keep `<script src="...">`; strip trash class names (Tailwind utilities, framework hashes, `xl:hidden`-style scoped classes); drop `style="..."` attributes. Semantic attributes (`id`, `aria-*`, `data-*`, `role`, `href`, `src`, `alt`, `title`, `name`) are preserved.
423
+ 3. **Beautify** (`js-beautify`) — re-indent at 2 spaces; keep inline elements with their text.
424
+
425
+ Result: a multi-line, low-noise HTML doc that's far cheaper for an LLM to reason about than raw page source.
426
+
427
+ ## Storage state
428
+
429
+ For Playwright, `captureSnapshot` calls `helper.grabStorageState()`. For Puppeteer / WebDriver, it falls back to `helper.grabCookie()` plus an `executeScript` walking `window.localStorage`. Both produce the same shape (`{ cookies: [...], origins: [{ origin, localStorage: [...] }] }`).
430
+
431
+ Storage capture is **enabled** for `run_code`, `snapshot`, `run_step_by_step` fallback, and `pageInfo`. **Disabled per-step in aiTrace** — cookies / localStorage rarely change between actions, and per-step files would just be noise.
432
+
433
+ ## Architecture
434
+
435
+ - **In-process.** No subprocess, no IPC. The MCP tool calls and the running test share one container, one helper, one browser.
436
+ - **Synthetic test scope.** On first init the server emits `suite.before` + `test.before` and calls each helper's `_beforeSuite` + `_before`, so `run_code` / `snapshot` have a live `helper.page` to act on.
437
+ - **Mocha is reused.** `cleanReferencesAfterRun` is forced to `false` (Mocha 11's constructor ignores the option, so the setter is called explicitly). `stop_browser` closes the browser but keeps Mocha alive — re-running `run_test` after `start_browser` works without ESM cache invalidation tricks.
438
+ - **Locking.** `run_test` / `run_step_by_step` use a single-call lock so concurrent runs can't trample each other.
439
+
440
+ ## Troubleshooting
441
+
442
+ ### Server doesn't start
443
+
444
+ - Node 18+ recommended.
445
+ - Verify the path / `npx` resolution in your client config.
446
+
447
+ ### Config not found
448
+
449
+ - Set `CODECEPTJS_CONFIG` to the absolute path of `codecept.conf.js` (or `.cjs`).
450
+ - Set `CODECEPTJS_PROJECT_DIR` if your config lives outside cwd.
451
+
452
+ ### Tests not found
453
+
454
+ - Confirm the project's `tests:` glob in `codecept.conf.js` matches your files.
455
+ - `list_tests` runs from the same project — if it returns `[]`, the config is the issue, not MCP.
456
+
457
+ ### Browser launch issues
458
+
459
+ - Playwright requires its browsers installed (`npx playwright install`).
460
+ - For visible runs use `start_browser` with `plugins={ browser: { show: true } }` — the default is headless.
461
+
462
+ ### Tests stuck or timing out
463
+
464
+ - Bump `timeout` per call.
465
+ - Check that the app under test is actually reachable.
466
+ - For long re-renders that confuse `snapshot` / `run_code`'s artifact capture, raise `settleMs` (default `300`).
467
+
468
+ ## Security
469
+
470
+ - The MCP server runs with the same permissions as the calling process.
471
+ - `run_code` runs arbitrary JavaScript in the project context — only expose to trusted agents / environments.
472
+ - Environment variables may contain absolute project paths; treat them like any other config.
473
+
474
+ ## Contributing
475
+
476
+ When changing the MCP server:
477
+
478
+ 1. Add coverage in `test/mcp/mcp_server_test.js`.
479
+ 2. Update this doc with new tools / parameters.
480
+ 3. Verify against a real project (e.g. the `examples/playwright/` setup) — the in-process recorder + lifecycle integration is sensitive to ordering.
481
+ 4. Test with both Playwright and Puppeteer.
482
+
483
+ ## License
484
+
485
+ MIT