waygraph 0.15.50 → 0.15.52

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 (559) hide show
  1. package/dist/analysis/graph.d.ts +1 -1
  2. package/dist/analysis/graph.js +10 -15
  3. package/dist/analysis/map-check.js +5 -2
  4. package/dist/analysis/practices-check.d.ts +0 -1
  5. package/dist/analysis/practices-check.js +17 -17
  6. package/dist/auto-session/session.d.ts +1 -1
  7. package/dist/auto-session/session.js +14 -8
  8. package/dist/blocks-select.d.ts +7 -4
  9. package/dist/blocks-select.js +0 -14
  10. package/dist/browser.d.ts +27 -0
  11. package/dist/browser.js +62 -0
  12. package/dist/cli/run-chain.js +5 -0
  13. package/dist/cli/usage.js +14 -1
  14. package/dist/cli.js +10 -1
  15. package/dist/commands/agent-dive-scaffold.d.ts +5 -0
  16. package/dist/commands/agent-dive-scaffold.js +7 -0
  17. package/dist/commands/extensions.d.ts +1 -0
  18. package/dist/commands/extensions.js +22 -0
  19. package/dist/commands/init.js +45 -2
  20. package/dist/commands/test.js +16 -2
  21. package/dist/commands/try.js +2 -1
  22. package/dist/commands/upgrade.d.ts +6 -0
  23. package/dist/commands/upgrade.js +107 -0
  24. package/dist/config.d.ts +47 -3
  25. package/dist/config.js +45 -12
  26. package/dist/core/block.d.ts +12 -0
  27. package/dist/core/block.js +36 -0
  28. package/dist/core/blocks/effect.d.ts +0 -3
  29. package/dist/core/blocks/method.d.ts +0 -6
  30. package/dist/core/blocks/nav.d.ts +11 -3
  31. package/dist/core/blocks/nav.js +8 -0
  32. package/dist/core/blocks/page.d.ts +0 -3
  33. package/dist/core/config.d.ts +5 -0
  34. package/dist/core/engine.d.ts +17 -16
  35. package/dist/core/engine.js +3 -3
  36. package/dist/core/flow.d.ts +17 -0
  37. package/dist/core/flow.js +44 -24
  38. package/dist/core/map-builder.d.ts +3 -3
  39. package/dist/core/map-builder.js +3 -3
  40. package/dist/env-file.d.ts +7 -7
  41. package/dist/env-file.js +29 -16
  42. package/dist/extensions.d.ts +21 -0
  43. package/dist/extensions.js +178 -0
  44. package/dist/highlights/types.d.ts +3 -2
  45. package/dist/index.d.ts +8 -3
  46. package/dist/index.js +4 -1
  47. package/dist/pilot-overlay/overlay-fixtures.d.ts +0 -7
  48. package/dist/pilot-overlay/overlay-fixtures.js +0 -45
  49. package/dist/playwright-config.d.ts +4 -0
  50. package/dist/playwright-config.js +15 -0
  51. package/dist/playwright.config.d.ts +2 -0
  52. package/dist/playwright.config.js +6 -0
  53. package/dist/runner/demo-log.js +1 -7
  54. package/dist/runner/inpage/banner.js +10 -2
  55. package/dist/runner/inpage/core.d.ts +1 -1
  56. package/dist/runner/inpage/core.js +8 -7
  57. package/dist/runner/main.js +27 -15
  58. package/dist/runner/rings.js +0 -49
  59. package/dist/session/auto-explore-run.js +21 -6
  60. package/dist/session/auto-explore.js +6 -4
  61. package/dist/session/step-overlay.js +3 -1
  62. package/dist/traverse/run.js +4 -1
  63. package/dist/types.d.ts +0 -3
  64. package/dist/ui/components/ring.js +1 -0
  65. package/dist/ui/overlay.css +1 -0
  66. package/dist/ui/shadow.d.ts +1 -3
  67. package/dist/ui/shadow.js +0 -4
  68. package/dist/ui/tokens.d.ts +0 -11
  69. package/dist/ui/tokens.js +0 -5
  70. package/dist/video-dir.d.ts +8 -0
  71. package/dist/video-dir.js +60 -0
  72. package/dist/webserver.d.ts +14 -0
  73. package/dist/webserver.js +95 -0
  74. package/examples/routed-demo/package.json +3 -3
  75. package/examples/routed-demo/playwright.config.ts +8 -8
  76. package/examples/routed-demo/scripts/fixture-server.mjs +12 -31
  77. package/examples/routed-demo/src/map/(app_base)/dashboard/_sel.ts +1 -3
  78. package/examples/routed-demo/src/map/(external)/docs/_sel.ts +1 -3
  79. package/examples/routed-demo/src/pages/dashboard.html +1 -1
  80. package/examples/routed-demo/src/pages/docs.html +1 -1
  81. package/examples/saucedemo/playwright.config.ts +2 -3
  82. package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +2 -1
  83. package/examples/saucedemo/scripts/prove-auto-graph.mjs +2 -1
  84. package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +2 -1
  85. package/examples/saucedemo/tests/flow-block-verify.spec.ts +2 -7
  86. package/package.json +10 -2
  87. package/templates/quickstart/playwright.config.ts +0 -6
  88. package/templates/scaffold/README.md +7 -3
  89. package/templates/scaffold/STRUCTURE.md +8 -6
  90. package/templates/scaffold/config/waygraph.config.ts +26 -0
  91. package/templates/scaffold/package.json +9 -13
  92. package/templates/scaffold/src/flows/README.md +5 -5
  93. package/templates/scaffold/src/flows/example.flow.ts +31 -17
  94. package/templates/scaffold/src/flows/hoppscotch-auth.flow.ts +35 -0
  95. package/templates/scaffold/src/flows/hoppscotch-get.flow.ts +23 -0
  96. package/templates/scaffold/src/flows/hoppscotch-post.flow.ts +33 -0
  97. package/templates/scaffold/src/flows/mail-verify.flow.ts +36 -75
  98. package/templates/scaffold/src/flows/shop.flow.ts +41 -65
  99. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +0 -9
  100. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +0 -5
  101. package/templates/scaffold/src/map/(app_base)/docs/_sel.ts +2 -3
  102. package/templates/scaffold/src/map/(app_base)/docs/{docs.html → index.html} +1 -1
  103. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -21
  104. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +4 -30
  105. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +2 -19
  106. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +0 -17
  107. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +3 -16
  108. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -14
  109. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +0 -9
  110. package/templates/scaffold/src/map/(app_base)/home/_sel.ts +4 -4
  111. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +1 -23
  112. package/templates/scaffold/src/map/(app_base)/index.html +17 -0
  113. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +21 -0
  114. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +19 -0
  115. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +20 -0
  116. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +18 -0
  117. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +21 -0
  118. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +21 -0
  119. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +15 -0
  120. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +20 -0
  121. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +23 -0
  122. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +36 -0
  123. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +17 -0
  124. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +22 -0
  125. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +18 -0
  126. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +11 -0
  127. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +36 -0
  128. package/templates/scaffold/src/map/(external)/hoppscotch/_sel.ts +27 -0
  129. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +10 -0
  130. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +2 -27
  131. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +2 -21
  132. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +1 -19
  133. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +1 -11
  134. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +1 -9
  135. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +0 -11
  136. package/templates/scaffold/src/states/demo.mem-keys.ts +20 -19
  137. package/templates/scaffold/src/states/demo.mem-stubs.ts +4 -0
  138. package/templates/scaffold/src/states/demo.states.ts +7 -1
  139. package/templates/scaffold/tests/README.md +3 -2
  140. package/templates/scaffold/tests/example.spec.ts +2 -3
  141. package/templates/scaffold/tests/hoppscotch.spec.ts +97 -0
  142. package/templates/scaffold/tests/mail-verify.spec.ts +2 -11
  143. package/templates/scaffold/tsconfig.json +1 -1
  144. package/templates/skills/waygraph-convention.skill.md +37 -6
  145. package/templates/skills/waygraph-pilot.skill.md +5 -6
  146. package/dist/runner/overlay-present.d.ts +0 -8
  147. package/dist/runner/overlay-present.js +0 -57
  148. package/dist/ui/components/banner.d.ts +0 -2
  149. package/dist/ui/components/banner.js +0 -10
  150. package/dist/ui/components/cursor.d.ts +0 -2
  151. package/dist/ui/components/cursor.js +0 -19
  152. package/examples/routed-demo/.waygraph-auto/4d4902b7.log +0 -0
  153. package/examples/routed-demo/.waygraph-auto/51ef462e.log +0 -0
  154. package/examples/routed-demo/.waygraph-auto/71527ad9.log +0 -0
  155. package/examples/routed-demo/.waygraph-auto/ca16778e.log +0 -0
  156. package/examples/routed-demo/scripts/with-fixture.mjs +0 -70
  157. package/examples/saucedemo/.waygraph-auto/00b0c55c.log +0 -22
  158. package/examples/saucedemo/.waygraph-auto/00d147d1.log +0 -21
  159. package/examples/saucedemo/.waygraph-auto/00e5d037.log +0 -5
  160. package/examples/saucedemo/.waygraph-auto/015be8f6.log +0 -6
  161. package/examples/saucedemo/.waygraph-auto/026e188e.log +0 -0
  162. package/examples/saucedemo/.waygraph-auto/02f7dd22.log +0 -20
  163. package/examples/saucedemo/.waygraph-auto/03df352d.log +0 -0
  164. package/examples/saucedemo/.waygraph-auto/0402cfcf.log +0 -6
  165. package/examples/saucedemo/.waygraph-auto/050e5b55.log +0 -0
  166. package/examples/saucedemo/.waygraph-auto/05d76fc3.log +0 -0
  167. package/examples/saucedemo/.waygraph-auto/062b581f.log +0 -20
  168. package/examples/saucedemo/.waygraph-auto/0681582b.log +0 -6
  169. package/examples/saucedemo/.waygraph-auto/07845ed1.log +0 -0
  170. package/examples/saucedemo/.waygraph-auto/07f3e964.log +0 -6
  171. package/examples/saucedemo/.waygraph-auto/0868ae4d.log +0 -0
  172. package/examples/saucedemo/.waygraph-auto/0924ddaa.log +0 -22
  173. package/examples/saucedemo/.waygraph-auto/092d6173.log +0 -5
  174. package/examples/saucedemo/.waygraph-auto/096fea05.log +0 -20
  175. package/examples/saucedemo/.waygraph-auto/09924510.log +0 -0
  176. package/examples/saucedemo/.waygraph-auto/0998c941.log +0 -21
  177. package/examples/saucedemo/.waygraph-auto/0a8c3719.log +0 -0
  178. package/examples/saucedemo/.waygraph-auto/0bf74300.log +0 -21
  179. package/examples/saucedemo/.waygraph-auto/0c01fd29.log +0 -4
  180. package/examples/saucedemo/.waygraph-auto/0c19e232.log +0 -5
  181. package/examples/saucedemo/.waygraph-auto/0c302590.log +0 -0
  182. package/examples/saucedemo/.waygraph-auto/0dee62d6.log +0 -5
  183. package/examples/saucedemo/.waygraph-auto/0eb4c081.log +0 -5
  184. package/examples/saucedemo/.waygraph-auto/0f0cb120.log +0 -0
  185. package/examples/saucedemo/.waygraph-auto/102c38ca.log +0 -0
  186. package/examples/saucedemo/.waygraph-auto/10fd431c.log +0 -0
  187. package/examples/saucedemo/.waygraph-auto/1122c13c.log +0 -0
  188. package/examples/saucedemo/.waygraph-auto/123d1cad.log +0 -5
  189. package/examples/saucedemo/.waygraph-auto/12ed8e28.log +0 -0
  190. package/examples/saucedemo/.waygraph-auto/13c6fe3c.log +0 -0
  191. package/examples/saucedemo/.waygraph-auto/1581b677.log +0 -0
  192. package/examples/saucedemo/.waygraph-auto/161cc8dd.log +0 -22
  193. package/examples/saucedemo/.waygraph-auto/164761a5.log +0 -6
  194. package/examples/saucedemo/.waygraph-auto/1905ceb2.log +0 -0
  195. package/examples/saucedemo/.waygraph-auto/1b1d55c6.log +0 -0
  196. package/examples/saucedemo/.waygraph-auto/1b80fd24.log +0 -6
  197. package/examples/saucedemo/.waygraph-auto/1bd7b7bf.log +0 -0
  198. package/examples/saucedemo/.waygraph-auto/1c30a3c2.log +0 -0
  199. package/examples/saucedemo/.waygraph-auto/1c58a174.log +0 -0
  200. package/examples/saucedemo/.waygraph-auto/1cb6f44c.log +0 -5
  201. package/examples/saucedemo/.waygraph-auto/1d90aa9a.log +0 -0
  202. package/examples/saucedemo/.waygraph-auto/1de7d889.log +0 -0
  203. package/examples/saucedemo/.waygraph-auto/1f233a4c.log +0 -6
  204. package/examples/saucedemo/.waygraph-auto/1fdb2100.log +0 -0
  205. package/examples/saucedemo/.waygraph-auto/20e66801.log +0 -0
  206. package/examples/saucedemo/.waygraph-auto/20e91af6.log +0 -5
  207. package/examples/saucedemo/.waygraph-auto/20ffdb77.log +0 -0
  208. package/examples/saucedemo/.waygraph-auto/22048fff.log +0 -4
  209. package/examples/saucedemo/.waygraph-auto/222d1d09.log +0 -0
  210. package/examples/saucedemo/.waygraph-auto/22f1a704.log +0 -5
  211. package/examples/saucedemo/.waygraph-auto/2324269a.log +0 -0
  212. package/examples/saucedemo/.waygraph-auto/232a1d81.log +0 -0
  213. package/examples/saucedemo/.waygraph-auto/239cced3.log +0 -20
  214. package/examples/saucedemo/.waygraph-auto/25204b46.log +0 -4
  215. package/examples/saucedemo/.waygraph-auto/2553d107.log +0 -0
  216. package/examples/saucedemo/.waygraph-auto/25e2e90f.log +0 -0
  217. package/examples/saucedemo/.waygraph-auto/2708455e.log +0 -22
  218. package/examples/saucedemo/.waygraph-auto/272a96fd.log +0 -20
  219. package/examples/saucedemo/.waygraph-auto/28d7be5d.log +0 -0
  220. package/examples/saucedemo/.waygraph-auto/2a577961.log +0 -0
  221. package/examples/saucedemo/.waygraph-auto/2a6a8266.log +0 -6
  222. package/examples/saucedemo/.waygraph-auto/2b3401cf.log +0 -20
  223. package/examples/saucedemo/.waygraph-auto/2b831907.log +0 -6
  224. package/examples/saucedemo/.waygraph-auto/2b9b56fc.log +0 -20
  225. package/examples/saucedemo/.waygraph-auto/2c79c73a.log +0 -0
  226. package/examples/saucedemo/.waygraph-auto/2c94a05b.log +0 -0
  227. package/examples/saucedemo/.waygraph-auto/2ceccd6d.log +0 -0
  228. package/examples/saucedemo/.waygraph-auto/2e2069e7.log +0 -0
  229. package/examples/saucedemo/.waygraph-auto/2e6bc35e.log +0 -6
  230. package/examples/saucedemo/.waygraph-auto/2efd1983.log +0 -0
  231. package/examples/saucedemo/.waygraph-auto/2f1b0c13.log +0 -6
  232. package/examples/saucedemo/.waygraph-auto/2f4f531e.log +0 -0
  233. package/examples/saucedemo/.waygraph-auto/2f8d4073.log +0 -6
  234. package/examples/saucedemo/.waygraph-auto/2fdbd916.log +0 -0
  235. package/examples/saucedemo/.waygraph-auto/30739278.log +0 -6
  236. package/examples/saucedemo/.waygraph-auto/30a5c848.log +0 -20
  237. package/examples/saucedemo/.waygraph-auto/31cb2e80.log +0 -0
  238. package/examples/saucedemo/.waygraph-auto/322d63cd.log +0 -0
  239. package/examples/saucedemo/.waygraph-auto/3239aa8a.log +0 -6
  240. package/examples/saucedemo/.waygraph-auto/326d87b7.log +0 -6
  241. package/examples/saucedemo/.waygraph-auto/331c6e8e.log +0 -0
  242. package/examples/saucedemo/.waygraph-auto/3351c0b6.log +0 -0
  243. package/examples/saucedemo/.waygraph-auto/33a50dc0.log +0 -0
  244. package/examples/saucedemo/.waygraph-auto/33df0770.log +0 -0
  245. package/examples/saucedemo/.waygraph-auto/340d624d.log +0 -0
  246. package/examples/saucedemo/.waygraph-auto/36367ccf.log +0 -0
  247. package/examples/saucedemo/.waygraph-auto/372536a5.log +0 -6
  248. package/examples/saucedemo/.waygraph-auto/37b56184.log +0 -0
  249. package/examples/saucedemo/.waygraph-auto/38f6799d.log +0 -0
  250. package/examples/saucedemo/.waygraph-auto/3a208bb8.log +0 -20
  251. package/examples/saucedemo/.waygraph-auto/3a412f3c.log +0 -0
  252. package/examples/saucedemo/.waygraph-auto/3a859bd7.log +0 -0
  253. package/examples/saucedemo/.waygraph-auto/3a8674d5.log +0 -6
  254. package/examples/saucedemo/.waygraph-auto/3bdb2f5a.log +0 -0
  255. package/examples/saucedemo/.waygraph-auto/3c1e5fe0.log +0 -22
  256. package/examples/saucedemo/.waygraph-auto/3cb0add7.log +0 -0
  257. package/examples/saucedemo/.waygraph-auto/3e3c0f3b.log +0 -0
  258. package/examples/saucedemo/.waygraph-auto/3e42f0d8.log +0 -0
  259. package/examples/saucedemo/.waygraph-auto/3f088138.log +0 -0
  260. package/examples/saucedemo/.waygraph-auto/401177a3.log +0 -0
  261. package/examples/saucedemo/.waygraph-auto/413d934d.log +0 -0
  262. package/examples/saucedemo/.waygraph-auto/4144071d.log +0 -0
  263. package/examples/saucedemo/.waygraph-auto/4176a3c6.log +0 -0
  264. package/examples/saucedemo/.waygraph-auto/41d0793d.log +0 -4
  265. package/examples/saucedemo/.waygraph-auto/41e6feae.log +0 -0
  266. package/examples/saucedemo/.waygraph-auto/424b4d5d.log +0 -0
  267. package/examples/saucedemo/.waygraph-auto/42e014d1.log +0 -0
  268. package/examples/saucedemo/.waygraph-auto/43253aba.log +0 -0
  269. package/examples/saucedemo/.waygraph-auto/432d09e3.log +0 -22
  270. package/examples/saucedemo/.waygraph-auto/438c6c53.log +0 -22
  271. package/examples/saucedemo/.waygraph-auto/4477db12.log +0 -0
  272. package/examples/saucedemo/.waygraph-auto/47247959.log +0 -0
  273. package/examples/saucedemo/.waygraph-auto/476cff76.log +0 -0
  274. package/examples/saucedemo/.waygraph-auto/4a1258b7.log +0 -0
  275. package/examples/saucedemo/.waygraph-auto/4ad09ece.log +0 -0
  276. package/examples/saucedemo/.waygraph-auto/4adcd179.log +0 -20
  277. package/examples/saucedemo/.waygraph-auto/4c9d9b16.log +0 -21
  278. package/examples/saucedemo/.waygraph-auto/4cebc228.log +0 -20
  279. package/examples/saucedemo/.waygraph-auto/4da39c36.log +0 -6
  280. package/examples/saucedemo/.waygraph-auto/4dbefa7e.log +0 -5
  281. package/examples/saucedemo/.waygraph-auto/4efa7035.log +0 -6
  282. package/examples/saucedemo/.waygraph-auto/505affdc.log +0 -4
  283. package/examples/saucedemo/.waygraph-auto/51bcb60a.log +0 -0
  284. package/examples/saucedemo/.waygraph-auto/527b6d76.log +0 -0
  285. package/examples/saucedemo/.waygraph-auto/5291bc78.log +0 -22
  286. package/examples/saucedemo/.waygraph-auto/535e8922.log +0 -0
  287. package/examples/saucedemo/.waygraph-auto/54274c39.log +0 -5
  288. package/examples/saucedemo/.waygraph-auto/5440ce7e.log +0 -0
  289. package/examples/saucedemo/.waygraph-auto/5738175f.log +0 -22
  290. package/examples/saucedemo/.waygraph-auto/573abedd.log +0 -0
  291. package/examples/saucedemo/.waygraph-auto/57ce5643.log +0 -22
  292. package/examples/saucedemo/.waygraph-auto/5984426b.log +0 -6
  293. package/examples/saucedemo/.waygraph-auto/5a682e7c.log +0 -22
  294. package/examples/saucedemo/.waygraph-auto/5b79320c.log +0 -21
  295. package/examples/saucedemo/.waygraph-auto/5b838485.log +0 -0
  296. package/examples/saucedemo/.waygraph-auto/5c55aaac.log +0 -21
  297. package/examples/saucedemo/.waygraph-auto/5d13bdde.log +0 -0
  298. package/examples/saucedemo/.waygraph-auto/5d285cd3.log +0 -0
  299. package/examples/saucedemo/.waygraph-auto/5ed00b16.log +0 -4
  300. package/examples/saucedemo/.waygraph-auto/60b9c066.log +0 -6
  301. package/examples/saucedemo/.waygraph-auto/610dd127.log +0 -0
  302. package/examples/saucedemo/.waygraph-auto/61105500.log +0 -5
  303. package/examples/saucedemo/.waygraph-auto/61333142.log +0 -5
  304. package/examples/saucedemo/.waygraph-auto/6134afe8.log +0 -20
  305. package/examples/saucedemo/.waygraph-auto/61937e83.log +0 -22
  306. package/examples/saucedemo/.waygraph-auto/625e7f65.log +0 -5
  307. package/examples/saucedemo/.waygraph-auto/62a0bdc9.log +0 -22
  308. package/examples/saucedemo/.waygraph-auto/6376fc15.log +0 -0
  309. package/examples/saucedemo/.waygraph-auto/63b0f4cd.log +0 -0
  310. package/examples/saucedemo/.waygraph-auto/6599cbca.log +0 -22
  311. package/examples/saucedemo/.waygraph-auto/6706ead4.log +0 -0
  312. package/examples/saucedemo/.waygraph-auto/67aaca30.log +0 -0
  313. package/examples/saucedemo/.waygraph-auto/685714af.log +0 -0
  314. package/examples/saucedemo/.waygraph-auto/68b10298.log +0 -0
  315. package/examples/saucedemo/.waygraph-auto/68be5e12.log +0 -0
  316. package/examples/saucedemo/.waygraph-auto/68df05a6.log +0 -22
  317. package/examples/saucedemo/.waygraph-auto/68fa0682.log +0 -0
  318. package/examples/saucedemo/.waygraph-auto/693f67c4.log +0 -20
  319. package/examples/saucedemo/.waygraph-auto/69ae030a.log +0 -6
  320. package/examples/saucedemo/.waygraph-auto/69e73f35.log +0 -6
  321. package/examples/saucedemo/.waygraph-auto/6b2333b0.log +0 -5
  322. package/examples/saucedemo/.waygraph-auto/6c4c3817.log +0 -0
  323. package/examples/saucedemo/.waygraph-auto/6c954911.log +0 -0
  324. package/examples/saucedemo/.waygraph-auto/6d65a439.log +0 -5
  325. package/examples/saucedemo/.waygraph-auto/6d700055.log +0 -0
  326. package/examples/saucedemo/.waygraph-auto/6ead848f.log +0 -0
  327. package/examples/saucedemo/.waygraph-auto/6f05bdc1.log +0 -0
  328. package/examples/saucedemo/.waygraph-auto/70279fc3.log +0 -0
  329. package/examples/saucedemo/.waygraph-auto/70c97639.log +0 -0
  330. package/examples/saucedemo/.waygraph-auto/72675b2d.log +0 -6
  331. package/examples/saucedemo/.waygraph-auto/731a14bd.log +0 -0
  332. package/examples/saucedemo/.waygraph-auto/733dd260.log +0 -5
  333. package/examples/saucedemo/.waygraph-auto/73a41843.log +0 -0
  334. package/examples/saucedemo/.waygraph-auto/75016486.log +0 -0
  335. package/examples/saucedemo/.waygraph-auto/752b01c6.log +0 -22
  336. package/examples/saucedemo/.waygraph-auto/75675227.log +0 -6
  337. package/examples/saucedemo/.waygraph-auto/756fd326.log +0 -20
  338. package/examples/saucedemo/.waygraph-auto/75e2e658.log +0 -0
  339. package/examples/saucedemo/.waygraph-auto/76128a2d.log +0 -0
  340. package/examples/saucedemo/.waygraph-auto/76ac1a86.log +0 -0
  341. package/examples/saucedemo/.waygraph-auto/77605295.log +0 -0
  342. package/examples/saucedemo/.waygraph-auto/7773a809.log +0 -0
  343. package/examples/saucedemo/.waygraph-auto/78043767.log +0 -20
  344. package/examples/saucedemo/.waygraph-auto/792671f4.log +0 -22
  345. package/examples/saucedemo/.waygraph-auto/796ab578.log +0 -0
  346. package/examples/saucedemo/.waygraph-auto/79915adb.log +0 -20
  347. package/examples/saucedemo/.waygraph-auto/7a398774.log +0 -6
  348. package/examples/saucedemo/.waygraph-auto/7a72f66e.log +0 -6
  349. package/examples/saucedemo/.waygraph-auto/7a984334.log +0 -4
  350. package/examples/saucedemo/.waygraph-auto/7b226350.log +0 -5
  351. package/examples/saucedemo/.waygraph-auto/7c6ee793.log +0 -20
  352. package/examples/saucedemo/.waygraph-auto/7c726dc4.log +0 -22
  353. package/examples/saucedemo/.waygraph-auto/7c72e8a5.log +0 -4
  354. package/examples/saucedemo/.waygraph-auto/7c99674f.log +0 -0
  355. package/examples/saucedemo/.waygraph-auto/7dbee625.log +0 -22
  356. package/examples/saucedemo/.waygraph-auto/7df66956.log +0 -0
  357. package/examples/saucedemo/.waygraph-auto/7e053160.log +0 -0
  358. package/examples/saucedemo/.waygraph-auto/7e8a6b62.log +0 -0
  359. package/examples/saucedemo/.waygraph-auto/7effd5b2.log +0 -20
  360. package/examples/saucedemo/.waygraph-auto/7f1b4864.log +0 -0
  361. package/examples/saucedemo/.waygraph-auto/7f94fd02.log +0 -0
  362. package/examples/saucedemo/.waygraph-auto/7fcb512f.log +0 -22
  363. package/examples/saucedemo/.waygraph-auto/7fdd47ee.log +0 -2
  364. package/examples/saucedemo/.waygraph-auto/802a0b5b.log +0 -0
  365. package/examples/saucedemo/.waygraph-auto/80322e0b.log +0 -0
  366. package/examples/saucedemo/.waygraph-auto/80a4978e.log +0 -6
  367. package/examples/saucedemo/.waygraph-auto/81257bf0.log +0 -0
  368. package/examples/saucedemo/.waygraph-auto/81cfe480.log +0 -22
  369. package/examples/saucedemo/.waygraph-auto/832f5add.log +0 -0
  370. package/examples/saucedemo/.waygraph-auto/8337b6ad.log +0 -0
  371. package/examples/saucedemo/.waygraph-auto/8481aa1c.log +0 -0
  372. package/examples/saucedemo/.waygraph-auto/8493928e.log +0 -0
  373. package/examples/saucedemo/.waygraph-auto/849ed45d.log +0 -0
  374. package/examples/saucedemo/.waygraph-auto/84dc6480.log +0 -6
  375. package/examples/saucedemo/.waygraph-auto/853bde43.log +0 -0
  376. package/examples/saucedemo/.waygraph-auto/8598b4c0.log +0 -0
  377. package/examples/saucedemo/.waygraph-auto/859a261d.log +0 -0
  378. package/examples/saucedemo/.waygraph-auto/86350ea6.log +0 -22
  379. package/examples/saucedemo/.waygraph-auto/86bb598a.log +0 -0
  380. package/examples/saucedemo/.waygraph-auto/86d09876.log +0 -22
  381. package/examples/saucedemo/.waygraph-auto/878ad01b.log +0 -4
  382. package/examples/saucedemo/.waygraph-auto/87c88ba5.log +0 -0
  383. package/examples/saucedemo/.waygraph-auto/87cb80ff.log +0 -0
  384. package/examples/saucedemo/.waygraph-auto/880b2e78.log +0 -6
  385. package/examples/saucedemo/.waygraph-auto/88527936.log +0 -5
  386. package/examples/saucedemo/.waygraph-auto/88eda676.log +0 -0
  387. package/examples/saucedemo/.waygraph-auto/893023ea.log +0 -5
  388. package/examples/saucedemo/.waygraph-auto/89416718.log +0 -0
  389. package/examples/saucedemo/.waygraph-auto/8996a857.log +0 -6
  390. package/examples/saucedemo/.waygraph-auto/8a08b68d.log +0 -6
  391. package/examples/saucedemo/.waygraph-auto/8a64ba0f.log +0 -6
  392. package/examples/saucedemo/.waygraph-auto/8b1cc2aa.log +0 -6
  393. package/examples/saucedemo/.waygraph-auto/8b73d13e.log +0 -6
  394. package/examples/saucedemo/.waygraph-auto/8be93021.log +0 -0
  395. package/examples/saucedemo/.waygraph-auto/8d960d31.log +0 -1
  396. package/examples/saucedemo/.waygraph-auto/8d9e5cd2.log +0 -21
  397. package/examples/saucedemo/.waygraph-auto/8e12e34f.log +0 -22
  398. package/examples/saucedemo/.waygraph-auto/8ec7d260.log +0 -0
  399. package/examples/saucedemo/.waygraph-auto/8ed43279.log +0 -0
  400. package/examples/saucedemo/.waygraph-auto/93acae32.log +0 -5
  401. package/examples/saucedemo/.waygraph-auto/94221b2b.log +0 -0
  402. package/examples/saucedemo/.waygraph-auto/96321a08.log +0 -0
  403. package/examples/saucedemo/.waygraph-auto/9742b6c2.log +0 -6
  404. package/examples/saucedemo/.waygraph-auto/9761c4c4.log +0 -6
  405. package/examples/saucedemo/.waygraph-auto/976394cd.log +0 -20
  406. package/examples/saucedemo/.waygraph-auto/982138cf.log +0 -0
  407. package/examples/saucedemo/.waygraph-auto/99cc93eb.log +0 -6
  408. package/examples/saucedemo/.waygraph-auto/9a26134c.log +0 -20
  409. package/examples/saucedemo/.waygraph-auto/9cbfbedc.log +0 -0
  410. package/examples/saucedemo/.waygraph-auto/9d827954.log +0 -20
  411. package/examples/saucedemo/.waygraph-auto/9dc147d2.log +0 -22
  412. package/examples/saucedemo/.waygraph-auto/9dd78c5e.log +0 -0
  413. package/examples/saucedemo/.waygraph-auto/a1ab5d29.log +0 -0
  414. package/examples/saucedemo/.waygraph-auto/a215a395.log +0 -22
  415. package/examples/saucedemo/.waygraph-auto/a23b7086.log +0 -4
  416. package/examples/saucedemo/.waygraph-auto/a35bd5ec.log +0 -0
  417. package/examples/saucedemo/.waygraph-auto/a4b36275.log +0 -0
  418. package/examples/saucedemo/.waygraph-auto/a4f8d355.log +0 -20
  419. package/examples/saucedemo/.waygraph-auto/a68995e9.log +0 -22
  420. package/examples/saucedemo/.waygraph-auto/a6e4f936.log +0 -22
  421. package/examples/saucedemo/.waygraph-auto/a7da862b.log +0 -0
  422. package/examples/saucedemo/.waygraph-auto/a82e2a48.log +0 -0
  423. package/examples/saucedemo/.waygraph-auto/a8645294.log +0 -0
  424. package/examples/saucedemo/.waygraph-auto/a94738b7.log +0 -0
  425. package/examples/saucedemo/.waygraph-auto/a952eb91.log +0 -0
  426. package/examples/saucedemo/.waygraph-auto/a9559653.log +0 -5
  427. package/examples/saucedemo/.waygraph-auto/aa1beafb.log +0 -0
  428. package/examples/saucedemo/.waygraph-auto/aa226dd0.log +0 -22
  429. package/examples/saucedemo/.waygraph-auto/aa478de2.log +0 -0
  430. package/examples/saucedemo/.waygraph-auto/aa7323f8.log +0 -20
  431. package/examples/saucedemo/.waygraph-auto/aaae4fb0.log +0 -20
  432. package/examples/saucedemo/.waygraph-auto/ac350fc7.log +0 -20
  433. package/examples/saucedemo/.waygraph-auto/ac5dde3d.log +0 -0
  434. package/examples/saucedemo/.waygraph-auto/acc1b63a.log +0 -0
  435. package/examples/saucedemo/.waygraph-auto/ad0bfad9.log +0 -5
  436. package/examples/saucedemo/.waygraph-auto/ad12d191.log +0 -0
  437. package/examples/saucedemo/.waygraph-auto/ae3a9b06.log +0 -0
  438. package/examples/saucedemo/.waygraph-auto/af2fae12.log +0 -0
  439. package/examples/saucedemo/.waygraph-auto/b04638f4.log +0 -6
  440. package/examples/saucedemo/.waygraph-auto/b0752c49.log +0 -0
  441. package/examples/saucedemo/.waygraph-auto/b14811d7.log +0 -6
  442. package/examples/saucedemo/.waygraph-auto/b2d2dbb2.log +0 -22
  443. package/examples/saucedemo/.waygraph-auto/b3d172f3.log +0 -0
  444. package/examples/saucedemo/.waygraph-auto/b48863e5.log +0 -22
  445. package/examples/saucedemo/.waygraph-auto/b5569336.log +0 -0
  446. package/examples/saucedemo/.waygraph-auto/b56968e1.log +0 -6
  447. package/examples/saucedemo/.waygraph-auto/b57921c5.log +0 -0
  448. package/examples/saucedemo/.waygraph-auto/b64e0620.log +0 -20
  449. package/examples/saucedemo/.waygraph-auto/b75168f7.log +0 -1
  450. package/examples/saucedemo/.waygraph-auto/b86a6218.log +0 -6
  451. package/examples/saucedemo/.waygraph-auto/b8e9e956.log +0 -22
  452. package/examples/saucedemo/.waygraph-auto/b9ab0983.log +0 -0
  453. package/examples/saucedemo/.waygraph-auto/b9b310ff.log +0 -21
  454. package/examples/saucedemo/.waygraph-auto/bb0e0e46.log +0 -0
  455. package/examples/saucedemo/.waygraph-auto/bc111745.log +0 -22
  456. package/examples/saucedemo/.waygraph-auto/bf7a77a2.log +0 -0
  457. package/examples/saucedemo/.waygraph-auto/bf85a598.log +0 -0
  458. package/examples/saucedemo/.waygraph-auto/bf8693e7.log +0 -0
  459. package/examples/saucedemo/.waygraph-auto/c0d6f353.log +0 -21
  460. package/examples/saucedemo/.waygraph-auto/c0febcf2.log +0 -20
  461. package/examples/saucedemo/.waygraph-auto/c4c52998.log +0 -6
  462. package/examples/saucedemo/.waygraph-auto/c52bac6d.log +0 -0
  463. package/examples/saucedemo/.waygraph-auto/c60cc55e.log +0 -0
  464. package/examples/saucedemo/.waygraph-auto/c809ceb4.log +0 -22
  465. package/examples/saucedemo/.waygraph-auto/c851cc53.log +0 -6
  466. package/examples/saucedemo/.waygraph-auto/c8987b67.log +0 -0
  467. package/examples/saucedemo/.waygraph-auto/c9d76e32.log +0 -0
  468. package/examples/saucedemo/.waygraph-auto/ca6de7e7.log +0 -0
  469. package/examples/saucedemo/.waygraph-auto/ca8561bc.log +0 -0
  470. package/examples/saucedemo/.waygraph-auto/cae91469.log +0 -0
  471. package/examples/saucedemo/.waygraph-auto/cb05d223.log +0 -0
  472. package/examples/saucedemo/.waygraph-auto/cb86d45b.log +0 -0
  473. package/examples/saucedemo/.waygraph-auto/cb9a1978.log +0 -6
  474. package/examples/saucedemo/.waygraph-auto/cbbc689c.log +0 -6
  475. package/examples/saucedemo/.waygraph-auto/cc989184.log +0 -20
  476. package/examples/saucedemo/.waygraph-auto/cd88364b.log +0 -0
  477. package/examples/saucedemo/.waygraph-auto/cd919e1d.log +0 -0
  478. package/examples/saucedemo/.waygraph-auto/ce584949.log +0 -5
  479. package/examples/saucedemo/.waygraph-auto/cf34b895.log +0 -2
  480. package/examples/saucedemo/.waygraph-auto/cfff9eef.log +0 -20
  481. package/examples/saucedemo/.waygraph-auto/d0f59b21.log +0 -4
  482. package/examples/saucedemo/.waygraph-auto/d1195079.log +0 -20
  483. package/examples/saucedemo/.waygraph-auto/d2ef067a.log +0 -5
  484. package/examples/saucedemo/.waygraph-auto/d37719a6.log +0 -0
  485. package/examples/saucedemo/.waygraph-auto/d425471f.log +0 -6
  486. package/examples/saucedemo/.waygraph-auto/d4afe93f.log +0 -5
  487. package/examples/saucedemo/.waygraph-auto/d50e58f0.log +0 -0
  488. package/examples/saucedemo/.waygraph-auto/d5293921.log +0 -0
  489. package/examples/saucedemo/.waygraph-auto/d62a22c2.log +0 -21
  490. package/examples/saucedemo/.waygraph-auto/d6d1761f.log +0 -22
  491. package/examples/saucedemo/.waygraph-auto/d6d5f411.log +0 -22
  492. package/examples/saucedemo/.waygraph-auto/d6df2771.log +0 -6
  493. package/examples/saucedemo/.waygraph-auto/d7075012.log +0 -21
  494. package/examples/saucedemo/.waygraph-auto/d846cd78.log +0 -0
  495. package/examples/saucedemo/.waygraph-auto/d934da78.log +0 -0
  496. package/examples/saucedemo/.waygraph-auto/d9ddc297.log +0 -0
  497. package/examples/saucedemo/.waygraph-auto/da0a06bf.log +0 -0
  498. package/examples/saucedemo/.waygraph-auto/da6ebb31.log +0 -0
  499. package/examples/saucedemo/.waygraph-auto/db4ac845.log +0 -0
  500. package/examples/saucedemo/.waygraph-auto/db6d7774.log +0 -0
  501. package/examples/saucedemo/.waygraph-auto/db81ba7d.log +0 -0
  502. package/examples/saucedemo/.waygraph-auto/db839827.log +0 -5
  503. package/examples/saucedemo/.waygraph-auto/dc58eb72.log +0 -0
  504. package/examples/saucedemo/.waygraph-auto/dddd057c.log +0 -20
  505. package/examples/saucedemo/.waygraph-auto/dde5e859.log +0 -22
  506. package/examples/saucedemo/.waygraph-auto/ddf975e6.log +0 -0
  507. package/examples/saucedemo/.waygraph-auto/de8cac58.log +0 -0
  508. package/examples/saucedemo/.waygraph-auto/de8cb83d.log +0 -6
  509. package/examples/saucedemo/.waygraph-auto/ded5511a.log +0 -6
  510. package/examples/saucedemo/.waygraph-auto/dedfcb18.log +0 -0
  511. package/examples/saucedemo/.waygraph-auto/def4d9b1.log +0 -0
  512. package/examples/saucedemo/.waygraph-auto/e03cfd8e.log +0 -0
  513. package/examples/saucedemo/.waygraph-auto/e1549e40.log +0 -0
  514. package/examples/saucedemo/.waygraph-auto/e1b0676d.log +0 -21
  515. package/examples/saucedemo/.waygraph-auto/e230f24e.log +0 -0
  516. package/examples/saucedemo/.waygraph-auto/e5111463.log +0 -0
  517. package/examples/saucedemo/.waygraph-auto/e5127c03.log +0 -22
  518. package/examples/saucedemo/.waygraph-auto/e5fc1d7c.log +0 -5
  519. package/examples/saucedemo/.waygraph-auto/e6fd2202.log +0 -0
  520. package/examples/saucedemo/.waygraph-auto/eb38d92e.log +0 -22
  521. package/examples/saucedemo/.waygraph-auto/edaa806d.log +0 -0
  522. package/examples/saucedemo/.waygraph-auto/edaf33de.log +0 -0
  523. package/examples/saucedemo/.waygraph-auto/edd40cbb.log +0 -20
  524. package/examples/saucedemo/.waygraph-auto/eddfbffc.log +0 -6
  525. package/examples/saucedemo/.waygraph-auto/ee86203e.log +0 -0
  526. package/examples/saucedemo/.waygraph-auto/ee9fa1ad.log +0 -5
  527. package/examples/saucedemo/.waygraph-auto/ef319474.log +0 -22
  528. package/examples/saucedemo/.waygraph-auto/f1f38eeb.log +0 -22
  529. package/examples/saucedemo/.waygraph-auto/f24b2915.log +0 -0
  530. package/examples/saucedemo/.waygraph-auto/f28eee8d.log +0 -0
  531. package/examples/saucedemo/.waygraph-auto/f2943898.log +0 -0
  532. package/examples/saucedemo/.waygraph-auto/f33bde90.log +0 -0
  533. package/examples/saucedemo/.waygraph-auto/f43de83c.log +0 -0
  534. package/examples/saucedemo/.waygraph-auto/f6ba7cb4.log +0 -6
  535. package/examples/saucedemo/.waygraph-auto/f7ac4d62.log +0 -20
  536. package/examples/saucedemo/.waygraph-auto/f86224c6.log +0 -0
  537. package/examples/saucedemo/.waygraph-auto/f929bb79.log +0 -0
  538. package/examples/saucedemo/.waygraph-auto/f92d4c6c.log +0 -22
  539. package/examples/saucedemo/.waygraph-auto/f92faf40.log +0 -5
  540. package/examples/saucedemo/.waygraph-auto/fa784369.log +0 -21
  541. package/examples/saucedemo/.waygraph-auto/fb55f723.log +0 -20
  542. package/examples/saucedemo/.waygraph-auto/fba3b738.log +0 -0
  543. package/examples/saucedemo/.waygraph-auto/fc917c18.log +0 -0
  544. package/examples/saucedemo/.waygraph-auto/fdf66b74.log +0 -0
  545. package/examples/saucedemo/.waygraph-auto/fe83305d.log +0 -0
  546. package/examples/saucedemo/.waygraph-auto/ff616932.log +0 -0
  547. package/examples/saucedemo/.waygraph-auto/ffdf2854.log +0 -6
  548. package/examples/saucedemo/scripts/capture-auto-headful.mjs +0 -120
  549. package/examples/saucedemo/scripts/capture-wrong-login.mjs +0 -141
  550. package/examples/saucedemo/scripts/demo-device-presets.mjs +0 -188
  551. package/examples/saucedemo/scripts/demo-orientation-gestures-video.mjs +0 -262
  552. package/examples/saucedemo/scripts/show-add-to-cart-menu.mjs +0 -123
  553. package/examples/saucedemo/scripts/show-auto-menu.mjs +0 -72
  554. package/templates/scaffold/playwright.config.ts +0 -28
  555. package/templates/scaffold/scripts/README.md +0 -13
  556. package/templates/scaffold/scripts/fixture-server.mjs +0 -50
  557. package/templates/scaffold/scripts/with-fixture.mjs +0 -69
  558. package/templates/scaffold/test-results/.last-run.json +0 -4
  559. /package/templates/scaffold/src/map/(app_base)/home/{home.html → index.html} +0 -0
@@ -0,0 +1,107 @@
1
+ import { basename, join, relative, resolve, dirname } from "node:path";
2
+ import { tmpdir } from "node:os";
3
+ import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
4
+ import { spawnSync } from "node:child_process";
5
+ import { packageRoot } from "../cli/util.js";
6
+ import { agentSkillFiles } from "./agent-dive-scaffold.js";
7
+ // Filled in per project at init, so they never compare equal to the template.
8
+ const SKIP = new Set(["package.json", join("config", "waygraph.config.ts")]);
9
+ function walk(dir, base = dir) {
10
+ return readdirSync(dir).flatMap((name) => {
11
+ const full = join(dir, name);
12
+ return statSync(full).isDirectory() ? walk(full, base) : [relative(base, full)];
13
+ });
14
+ }
15
+ const targetName = (rel) => (rel === "gitignore" ? ".gitignore" : rel);
16
+ const major = (v) => v.replace(/^[^\d]*/, "").split(".").map((n) => parseInt(n, 10) || 0);
17
+ const isOlder = (a, b) => {
18
+ for (let i = 0; i < 3; i++)
19
+ if ((a[i] ?? 0) !== (b[i] ?? 0))
20
+ return (a[i] ?? 0) < (b[i] ?? 0);
21
+ return false;
22
+ };
23
+ /**
24
+ * `waygraph upgrade [project] [paths...] [--apply] [--overwrite] [--diff]`
25
+ * Compares the project with the scaffold shipped in this waygraph. Dry run by default.
26
+ * Only the paths you name are copied, because a real project deliberately drops parts of the demo.
27
+ */
28
+ export async function upgradeCase(args) {
29
+ const flags = new Set(args.filter((a) => a.startsWith("--")));
30
+ const positional = args.slice(1).filter((a) => !a.startsWith("--"));
31
+ const first = positional[0];
32
+ const hasProject = first !== undefined && existsSync(join(resolve(first), "package.json"));
33
+ const proj = resolve(hasProject ? first : process.cwd());
34
+ const paths = hasProject ? positional.slice(1) : positional;
35
+ const templateDir = join(packageRoot(), "templates", "scaffold");
36
+ const ownVersion = JSON.parse(readFileSync(join(packageRoot(), "package.json"), "utf-8")).version;
37
+ const pkgPath = join(proj, "package.json");
38
+ if (!existsSync(pkgPath)) {
39
+ console.error(`waygraph upgrade: no package.json in ${proj}`);
40
+ process.exit(1);
41
+ }
42
+ const added = [];
43
+ const differing = [];
44
+ // Every shipped file as [path in the project, content]: the scaffold tree plus the agent skills.
45
+ const shipped = new Map();
46
+ for (const rel of walk(templateDir))
47
+ if (!SKIP.has(rel))
48
+ shipped.set(rel, readFileSync(join(templateDir, rel)));
49
+ for (const { rel, text } of agentSkillFiles())
50
+ shipped.set(rel, Buffer.from(text));
51
+ for (const [rel, content] of shipped) {
52
+ const dest = join(proj, targetName(rel));
53
+ if (!existsSync(dest))
54
+ added.push(rel);
55
+ else if (!readFileSync(dest).equals(content))
56
+ differing.push(rel);
57
+ }
58
+ const selected = (rel) => paths.some((p) => rel === p || rel.startsWith(p.replace(/\/?$/, "/")));
59
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
60
+ const current = pkg.dependencies?.waygraph;
61
+ const depStale = current !== undefined && !current.startsWith("file:") && isOlder(major(current), major(ownVersion));
62
+ console.log(`waygraph upgrade: ${proj} (waygraph ${current ?? "not a dependency"} -> ${ownVersion})`);
63
+ if (depStale)
64
+ console.log(` dependency waygraph ${current} -> ^${ownVersion}`);
65
+ for (const rel of added)
66
+ console.log(` new ${rel}`);
67
+ for (const rel of differing)
68
+ console.log(` differs ${rel}`);
69
+ if (!depStale && added.length === 0 && differing.length === 0)
70
+ console.log(" up to date");
71
+ const legacy = ["ts", "mts", "js", "mjs", "cjs"].find((e) => existsSync(join(proj, `playwright.config.${e}`)));
72
+ if (legacy) {
73
+ console.log(` deprecated playwright.config.${legacy} - move its settings into config/waygraph.config.ts (testDir, webServer, playwright: { ... })`);
74
+ }
75
+ if (flags.has("--diff")) {
76
+ for (const rel of differing.filter((r) => paths.length === 0 || selected(r))) {
77
+ const shippedCopy = join(tmpdir(), `waygraph-upgrade-${process.pid}-${basename(rel)}`);
78
+ writeFileSync(shippedCopy, shipped.get(rel));
79
+ spawnSync("diff", ["-u", join(proj, targetName(rel)), shippedCopy], { stdio: "inherit" });
80
+ rmSync(shippedCopy, { force: true });
81
+ }
82
+ }
83
+ if (!flags.has("--apply")) {
84
+ if (added.length + differing.length > 0) {
85
+ console.log("\nDry run. Copy files with: waygraph upgrade <paths...> --apply (add --overwrite to replace differing files)");
86
+ }
87
+ return;
88
+ }
89
+ if (depStale) {
90
+ pkg.dependencies.waygraph = `^${ownVersion}`;
91
+ writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
92
+ console.log("updated package.json - run npm install");
93
+ }
94
+ if (paths.length === 0 && added.length + differing.length > 0) {
95
+ console.log("no paths given, so no files were copied (e.g. waygraph upgrade \"src/map/(external)/hoppscotch\" --apply)");
96
+ return;
97
+ }
98
+ const copy = [...added, ...(flags.has("--overwrite") ? differing : [])].filter(selected);
99
+ for (const rel of copy) {
100
+ const dest = join(proj, targetName(rel));
101
+ mkdirSync(dirname(dest), { recursive: true });
102
+ writeFileSync(dest, shipped.get(rel));
103
+ console.log(` wrote ${rel}`);
104
+ }
105
+ if (copy.length === 0 && paths.length > 0)
106
+ console.log("nothing matched those paths");
107
+ }
package/dist/config.d.ts CHANGED
@@ -1,10 +1,47 @@
1
+ import type { PlaywrightTestConfig } from "@playwright/test";
2
+ import type { ExtensionSpec } from "./extensions.js";
3
+ import type { WebServerConfig } from "./webserver.js";
1
4
  export interface WaygraphConfig {
2
5
  /** Same value `resolveBaseUrl` would otherwise read from package.json's `waygraph.baseUrl`. */
3
6
  baseUrl?: string;
7
+ /** Chromium extensions to load in every run: `"hoppscotch"`, a Chrome Web Store id, or `{ path }` to an unpacked one. */
8
+ extensions?: ExtensionSpec[];
9
+ /** Recording with `--video` (`waygraph run` / `demo`). */
10
+ video?: {
11
+ /** Where recordings are saved: absolute, `~/…`, or relative to the project. Default `~/Downloads/waygraph-videos/<project>` (the project's `.waygraph-videos/` where there is no Downloads folder, and on CI). */
12
+ dir?: string;
13
+ /** Recording size, e.g. `"1920x1080"` (demo default) or `"1280x720"` (run default). */
14
+ viewport?: string;
15
+ };
16
+ /** Milliseconds to pause before each browser action in `run` / `demo`, to make it watchable. */
17
+ slowMo?: number;
18
+ /** Show the browser window. Default: `demo` and `auto` are headed, `run` is headless. */
19
+ headed?: boolean;
20
+ /** `waygraph demo` defaults. */
21
+ demo?: {
22
+ /** Advance steps automatically instead of waiting for Next. */
23
+ autoNext?: boolean;
24
+ /** Blitz through fast-forward steps. */
25
+ fast?: boolean;
26
+ };
27
+ /** Folder of test files, relative to the project. Default `"tests"`. */
28
+ testDir?: string;
29
+ /** App to start around `waygraph test`, `run`, `demo` and `auto` (same fields as Playwright's `webServer`). */
30
+ webServer?: WebServerConfig | WebServerConfig[];
31
+ /** Anything else for the test runner, e.g. `workers`, `timeout`, `reporter`, `use: { video: "on" }`. Merged over waygraph's defaults. */
32
+ playwright?: PlaywrightTestConfig;
4
33
  }
5
- /** Identity helper, purely for editor type-checking/autocomplete - same role `defineConfig` plays
6
- * in a `playwright.config.ts` or `vite.config.ts`. `export default defineConfig({ ... })`. */
7
- export declare function defineConfig(config: WaygraphConfig): WaygraphConfig;
34
+ /** What a config function receives: the env mode and the environment with `.env` files already loaded. */
35
+ export interface ConfigContext {
36
+ mode: string;
37
+ env: Record<string, string | undefined>;
38
+ }
39
+ /**
40
+ * Typed identity helper, like `defineConfig` in `vite.config.ts`. Pass an object, or a function when values come
41
+ * from `.env` files (`.env`, `.env.local`, `.env.<mode>`; pick the mode with `--env <mode>`):
42
+ * @example export default defineConfig(({ env }) => ({ baseUrl: env.BASE_URL }))
43
+ */
44
+ export declare function defineConfig(config: WaygraphConfig | ((context: ConfigContext) => WaygraphConfig)): WaygraphConfig;
8
45
  /**
9
46
  * Looks for the first `waygraph.config.*` in `projectDir` and imports it - `.ts` works
10
47
  * unmodified because `bin/waygraph` already registers `tsx/esm` before `dist/cli.js` ever runs
@@ -32,3 +69,10 @@ export declare function loadWaygraphConfig(projectDir: string): Promise<Waygraph
32
69
  * as a side effect, which resolving a URL string has no business doing).
33
70
  */
34
71
  export declare function resolveBaseUrl(projectDir: string): Promise<string | undefined>;
72
+ /** Unpacked extension directories for a run: `WAYGRAPH_EXTENSIONS` if set, else the config file's `extensions` (fetched on first use). */
73
+ export declare function configuredExtensions(projectDir: string): Promise<string[]>;
74
+ /**
75
+ * Applies the config's run settings as the `WAYGRAPH_*` variables the runner reads. A flag, a shell variable or a `.env`
76
+ * value that is already set always wins, so the config only supplies defaults.
77
+ */
78
+ export declare function applyConfigEnv(config: WaygraphConfig | undefined): void;
package/dist/config.js CHANGED
@@ -5,19 +5,23 @@
5
5
  import { existsSync, readFileSync } from "node:fs";
6
6
  import { join } from "node:path";
7
7
  import { pathToFileURL } from "node:url";
8
- import { loadEnvFiles } from "./env-file.js";
9
- /** Identity helper, purely for editor type-checking/autocomplete - same role `defineConfig` plays
10
- * in a `playwright.config.ts` or `vite.config.ts`. `export default defineConfig({ ... })`. */
8
+ import { extensionPathsFromEnv } from "./browser.js";
9
+ import { envMode, loadEnvFiles } from "./env-file.js";
10
+ import { resolveExtensions } from "./extensions.js";
11
+ /**
12
+ * Typed identity helper, like `defineConfig` in `vite.config.ts`. Pass an object, or a function when values come
13
+ * from `.env` files (`.env`, `.env.local`, `.env.<mode>`; pick the mode with `--env <mode>`):
14
+ * @example export default defineConfig(({ env }) => ({ baseUrl: env.BASE_URL }))
15
+ */
11
16
  export function defineConfig(config) {
12
- return config;
17
+ if (typeof config !== "function")
18
+ return config;
19
+ loadEnvFiles(process.cwd());
20
+ return config({ mode: envMode(), env: process.env });
13
21
  }
14
- const CONFIG_FILENAMES = [
15
- "waygraph.config.ts",
16
- "waygraph.config.mts",
17
- "waygraph.config.mjs",
18
- "waygraph.config.js",
19
- "waygraph.config.cjs",
20
- ];
22
+ const CONFIG_NAMES = ["waygraph.config.ts", "waygraph.config.mts", "waygraph.config.mjs", "waygraph.config.js", "waygraph.config.cjs"];
23
+ /** `config/` first, then the project root. */
24
+ const CONFIG_FILENAMES = [...CONFIG_NAMES.map((n) => join("config", n)), ...CONFIG_NAMES];
21
25
  /**
22
26
  * Looks for the first `waygraph.config.*` in `projectDir` and imports it - `.ts` works
23
27
  * unmodified because `bin/waygraph` already registers `tsx/esm` before `dist/cli.js` ever runs
@@ -27,6 +31,7 @@ const CONFIG_FILENAMES = [
27
31
  * anything" instead of "your config file has a bug."
28
32
  */
29
33
  export async function loadWaygraphConfig(projectDir) {
34
+ loadEnvFiles(projectDir);
30
35
  for (const name of CONFIG_FILENAMES) {
31
36
  const p = join(projectDir, name);
32
37
  if (!existsSync(p))
@@ -38,7 +43,9 @@ export async function loadWaygraphConfig(projectDir) {
38
43
  catch (err) {
39
44
  throw new Error(`waygraph: failed to load ${name}: ${err instanceof Error ? err.message : String(err)}`);
40
45
  }
41
- return mod.default ?? mod;
46
+ const loaded = mod.default ?? mod;
47
+ applyConfigEnv(loaded);
48
+ return loaded;
42
49
  }
43
50
  return undefined;
44
51
  }
@@ -92,3 +99,29 @@ export async function resolveBaseUrl(projectDir) {
92
99
  }
93
100
  return undefined;
94
101
  }
102
+ /** Unpacked extension directories for a run: `WAYGRAPH_EXTENSIONS` if set, else the config file's `extensions` (fetched on first use). */
103
+ export async function configuredExtensions(projectDir) {
104
+ const fromEnv = extensionPathsFromEnv();
105
+ if (fromEnv.length > 0)
106
+ return fromEnv;
107
+ loadEnvFiles(projectDir);
108
+ return resolveExtensions((await loadWaygraphConfig(projectDir))?.extensions, projectDir);
109
+ }
110
+ /**
111
+ * Applies the config's run settings as the `WAYGRAPH_*` variables the runner reads. A flag, a shell variable or a `.env`
112
+ * value that is already set always wins, so the config only supplies defaults.
113
+ */
114
+ export function applyConfigEnv(config) {
115
+ if (!config)
116
+ return;
117
+ const set = (name, value) => {
118
+ if (value !== undefined && process.env[name] === undefined)
119
+ process.env[name] = value;
120
+ };
121
+ set("WAYGRAPH_VIDEO_DIR", config.video?.dir);
122
+ set("WAYGRAPH_VIDEO_VIEWPORT", config.video?.viewport);
123
+ set("WAYGRAPH_SLOWMO", config.slowMo === undefined ? undefined : String(config.slowMo));
124
+ set("WAYGRAPH_HEADED", config.headed === undefined ? undefined : config.headed ? "1" : "0");
125
+ set("WAYGRAPH_AUTOPLAY", config.demo?.autoNext === undefined ? undefined : config.demo.autoNext ? "1" : "0");
126
+ set("WAYGRAPH_DEMO_FAST", config.demo?.fast ? "1" : undefined);
127
+ }
@@ -1,5 +1,6 @@
1
1
  import type { ActionPage, Block, Checkpoint, DefinedBlock, Instruction } from "../types.js";
2
2
  import { MemPage } from "../mem-page.js";
3
+ import type { MemKey } from "../mem-page.js";
3
4
  import type { Trait } from "../trait.js";
4
5
  export declare function findBlockIndex(middle: readonly Block<any, any>[], block: Block<any, any> | string | number): number;
5
6
  /**
@@ -65,6 +66,17 @@ export declare function withStubBefore<B extends Block<any, any>>(block: B, stub
65
66
  export declare function withStubAfter<B extends Block<any, any>>(block: B, stub: StubPhaseFn<any>): B;
66
67
  /** @see {@link withStubBefore} */
67
68
  export declare function withStubOnError<B extends Block<any, any>>(block: B, stub: StubPhaseFn<any>): B;
69
+ /**
70
+ * Answers the browser's own dialog (`confirm`, `alert`, `prompt`, `beforeunload`) that this Block's action
71
+ * triggers. A dialog freezes the page until it is answered, so the answer has to be armed before the click -
72
+ * this does that without folding it into the Block's own `act`. The dialog's text can be kept in mem.
73
+ * @example withDialog(CancelBlock, { accept: true, into: LeaveWarning })
74
+ */
75
+ export declare function withDialog<B extends Block<any, any>>(block: B, options?: {
76
+ accept?: boolean;
77
+ into?: MemKey<string>;
78
+ promptText?: string;
79
+ }): B;
68
80
  /**
69
81
  * Replaces one Trait inside `block`'s verify list, leaving every other check
70
82
  * untouched - the v1/v2/legacy-variant case, where one check needs a different
@@ -213,6 +213,42 @@ export function withStubAfter(block, stub) {
213
213
  export function withStubOnError(block, stub) {
214
214
  return withStubPhase(block, "stubOnError", stub);
215
215
  }
216
+ /**
217
+ * Answers the browser's own dialog (`confirm`, `alert`, `prompt`, `beforeunload`) that this Block's action
218
+ * triggers. A dialog freezes the page until it is answered, so the answer has to be armed before the click -
219
+ * this does that without folding it into the Block's own `act`. The dialog's text can be kept in mem.
220
+ * @example withDialog(CancelBlock, { accept: true, into: LeaveWarning })
221
+ */
222
+ export function withDialog(block, options = {}) {
223
+ const base = stripMethods(block);
224
+ const act = base.instruction.act.bind(base.instruction);
225
+ const next = defineBlock({
226
+ ...base,
227
+ instruction: {
228
+ ...base.instruction,
229
+ async act(page, input, mem) {
230
+ const answer = async (dialog) => {
231
+ if (options.into)
232
+ mem.set(options.into, dialog.message());
233
+ if (options.accept === false)
234
+ await dialog.dismiss();
235
+ else
236
+ await dialog.accept(options.promptText);
237
+ };
238
+ const raw = page;
239
+ raw.once("dialog", answer);
240
+ try {
241
+ await act(page, input, mem);
242
+ }
243
+ finally {
244
+ raw.off("dialog", answer);
245
+ }
246
+ },
247
+ },
248
+ });
249
+ copyWaygraphRuntime(block, next);
250
+ return next;
251
+ }
216
252
  /**
217
253
  * Replaces one Trait inside `block`'s verify list, leaving every other check
218
254
  * untouched - the v1/v2/legacy-variant case, where one check needs a different
@@ -17,13 +17,10 @@ export type EffectBlock<In extends Checkpoint<string>, Out extends Checkpoint<st
17
17
  modVerifyAll(patches: Record<string, Trait["check"] | Trait>): EffectBlock<In, Out>;
18
18
  stubBefore(stub: import("../../highlights.js").HighlightStubPhase): EffectBlock<In, Out>;
19
19
  stubBefore(stub: import("../../highlights.js").StubLifecycleFn<Out>): EffectBlock<In, Out>;
20
- stubBefore(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): EffectBlock<In, Out>;
21
20
  stubAfter(stub: import("../../highlights.js").HighlightStubPhase): EffectBlock<In, Out>;
22
21
  stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): EffectBlock<In, Out>;
23
- stubAfter(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): EffectBlock<In, Out>;
24
22
  stubOnError(stub: import("../../highlights.js").HighlightStubPhase): EffectBlock<In, Out>;
25
23
  stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): EffectBlock<In, Out>;
26
- stubOnError(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): EffectBlock<In, Out>;
27
24
  };
28
25
  /** @deprecated Prefer {@link EffectBlock} - same type; Mem* was an early name. */
29
26
  export type MemEffectBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>> = EffectBlock<In, Out>;
@@ -17,13 +17,10 @@ export type MethodBlock<In extends Checkpoint<string>, Out extends Checkpoint<st
17
17
  modVerifyAll(patches: Record<string, Trait["check"] | Trait>): MethodBlock<In, Out>;
18
18
  stubBefore(stub: import("../../highlights.js").HighlightStubPhase): MethodBlock<In, Out>;
19
19
  stubBefore(stub: import("../../highlights.js").StubLifecycleFn<Out>): MethodBlock<In, Out>;
20
- stubBefore(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): MethodBlock<In, Out>;
21
20
  stubAfter(stub: import("../../highlights.js").HighlightStubPhase): MethodBlock<In, Out>;
22
21
  stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): MethodBlock<In, Out>;
23
- stubAfter(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): MethodBlock<In, Out>;
24
22
  stubOnError(stub: import("../../highlights.js").HighlightStubPhase): MethodBlock<In, Out>;
25
23
  stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): MethodBlock<In, Out>;
26
- stubOnError(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): MethodBlock<In, Out>;
27
24
  };
28
25
  /** @deprecated Prefer {@link MethodBlock} - same type; Action was the 0.7 name. */
29
26
  export type ActionBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>> = MethodBlock<In, Out>;
@@ -80,11 +77,8 @@ export type AssertBlock<Out extends Checkpoint<string>> = Omit<DefinedBlock<Out,
80
77
  modVerifyAll(patches: Record<string, Trait["check"] | Trait>): AssertBlock<Out>;
81
78
  stubBefore(stub: import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
82
79
  stubBefore(stub: import("../../highlights.js").StubLifecycleFn<Out>): AssertBlock<Out>;
83
- stubBefore(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
84
80
  stubAfter(stub: import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
85
81
  stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): AssertBlock<Out>;
86
- stubAfter(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
87
82
  stubOnError(stub: import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
88
83
  stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): AssertBlock<Out>;
89
- stubOnError(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
90
84
  };
@@ -22,13 +22,10 @@ export type NavBlock<Out extends Checkpoint<string>> = Omit<DefinedBlock<Checkpo
22
22
  modVerifyAll(patches: Record<string, Trait["check"] | Trait>): NavBlock<Out>;
23
23
  stubBefore(stub: import("../../highlights.js").HighlightStubPhase): NavBlock<Out>;
24
24
  stubBefore(stub: import("../../highlights.js").StubLifecycleFn<Out>): NavBlock<Out>;
25
- stubBefore(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): NavBlock<Out>;
26
25
  stubAfter(stub: import("../../highlights.js").HighlightStubPhase): NavBlock<Out>;
27
26
  stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): NavBlock<Out>;
28
- stubAfter(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): NavBlock<Out>;
29
27
  stubOnError(stub: import("../../highlights.js").HighlightStubPhase): NavBlock<Out>;
30
28
  stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): NavBlock<Out>;
31
- stubOnError(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): NavBlock<Out>;
32
29
  };
33
30
  /**
34
31
  * `defineNavBlock`'s own options - exactly one of `url`/`click` required,
@@ -42,6 +39,15 @@ export type NavBlockOptions<Out extends Checkpoint<string>> = {
42
39
  name: string;
43
40
  description?: string;
44
41
  checkpoint: Out["__state"];
42
+ /**
43
+ * Checkpoint tags this Nav can run from. Omit (the default) = reachable from anywhere. Set it for
44
+ * a page that only exists after something else - e.g. every in-app page after sign-in - so route
45
+ * finding (`auto --blocks`, `pilot reach`, `traverse`) goes through the sign-in steps instead of
46
+ * jumping straight there from the login page.
47
+ * @example const SIGNED_IN = ["Dashboard", "CommandCenter"] as const; // src/states/
48
+ * defineNavBlock({ ..., from: SIGNED_IN })
49
+ */
50
+ from?: readonly string[];
45
51
  requires?: readonly MemKey<any>[];
46
52
  verify?: Trait[] | ((out: Out) => Trait[]);
47
53
  stubBefore?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
@@ -106,6 +112,8 @@ export type NavClickBlockOptions<Out extends Checkpoint<string>> = {
106
112
  description?: string;
107
113
  checkpoint: Out["__state"];
108
114
  click: string | ((mem: MemPage) => string);
115
+ /** See {@link NavBlockOptions.from}. */
116
+ from?: readonly string[];
109
117
  requires?: readonly MemKey<any>[];
110
118
  verify?: Trait[] | ((out: Out) => Trait[]);
111
119
  stubBefore?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
@@ -54,6 +54,13 @@ export function defineNavBlock(options) {
54
54
  });
55
55
  // Demo/step tooling: remember the click selector (or factory) so
56
56
  // overlays can label "nav click" without re-parsing source.
57
+ if (options.from && options.from.length > 0) {
58
+ Object.defineProperty(built, "__waygraphNavFrom", {
59
+ value: [...options.from],
60
+ enumerable: false,
61
+ configurable: false,
62
+ });
63
+ }
57
64
  if (options.click !== undefined) {
58
65
  Object.defineProperty(built, "__waygraphNavClick", {
59
66
  value: options.click,
@@ -83,6 +90,7 @@ export function defineNavClickBlock(options) {
83
90
  name: options.name,
84
91
  checkpoint: options.checkpoint,
85
92
  click: options.click,
93
+ ...(options.from ? { from: options.from } : {}),
86
94
  ...(options.description ? { description: options.description } : {}),
87
95
  ...(options.requires ? { requires: options.requires } : {}),
88
96
  ...(options.verify ? { verify: options.verify } : {}),
@@ -47,13 +47,10 @@ export type PageBlock<Out extends Checkpoint<string>> = Omit<DefinedBlock<Checkp
47
47
  modVerifyAll(patches: Record<string, Trait["check"] | Trait>): PageBlock<Out>;
48
48
  stubBefore(stub: import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
49
49
  stubBefore(stub: import("../../highlights.js").StubLifecycleFn<Out>): PageBlock<Out>;
50
- stubBefore(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
51
50
  stubAfter(stub: import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
52
51
  stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): PageBlock<Out>;
53
- stubAfter(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
54
52
  stubOnError(stub: import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
55
53
  stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): PageBlock<Out>;
56
- stubOnError(stub: (out: Out) => import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
57
54
  };
58
55
  /** @see {@link PageBlockOptions} */
59
56
  export declare function definePageBlock<Out extends Checkpoint<string>>(options: PageBlockOptions<Out>): PageBlock<Out>;
@@ -1,5 +1,6 @@
1
1
  import type { BrowserType } from "@playwright/test";
2
2
  import type { Layout } from "./run-graph.js";
3
+ import type { ExtensionSpec } from "../extensions.js";
3
4
  /**
4
5
  * Resolves which `BrowserType` actually launches for a `mem`-only run (no
5
6
  * caller-supplied context) - `config.browsers[browserName]` if given,
@@ -52,4 +53,8 @@ export interface EngineConfig {
52
53
  * @example new Engine({ layouts: [AppShellLayout] })
53
54
  */
54
55
  layouts?: readonly Layout[];
56
+ /** Chromium extensions to load: names, store ids or paths (see `extensions` in `waygraph.config.ts`). Default `WAYGRAPH_EXTENSIONS`. */
57
+ extensions?: readonly ExtensionSpec[];
58
+ /** Resolves relative `url`s in Nav Blocks when the Engine launches its own browser. Default `WAYGRAPH_BASE_URL`. */
59
+ baseUrl?: string;
55
60
  }
@@ -1,7 +1,7 @@
1
1
  import type { Block, Checkpoint } from "../types.js";
2
2
  import type { EngineConfig } from "./config.js";
3
3
  import type { EndMarker, StartMarker } from "./run-graph.js";
4
- import type { Flow } from "./flow.js";
4
+ import type { Flow, FlowOptions } from "./flow.js";
5
5
  import { MapBuilder } from "./map-builder.js";
6
6
  import type { MapBuilderOptions } from "./map-builder.js";
7
7
  type S = Checkpoint<"__start__">;
@@ -22,12 +22,13 @@ export declare class Engine {
22
22
  * calls. Overloaded for 2-9 array slots (1-8 real Blocks between `start`/`end`)
23
23
  * rather than one fully-generic recursive tuple type, so each arity is as
24
24
  * reliably checked as `connect<A,B,C>` itself.
25
- * @example engine.defineFlow([start, LoginBlock, AddToCartBlock, end])
25
+ * Options go in the second argument instead of wrapping the result in `withTitle(withMemStub(...))`.
26
+ * @example engine.defineFlow([start, LoginBlock, AddToCartBlock, end], { title: "Login", memStub: true })
26
27
  */
27
- defineFlow<B extends Checkpoint<string>>(blocks: readonly [StartMarker, Block<S, B>, EndMarker]): Flow<B>;
28
- defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>>(blocks: readonly [StartMarker, Block<S, B>, Block<B, C>, EndMarker]): Flow<C>;
29
- defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>>(blocks: readonly [StartMarker, Block<S, B>, Block<B, C>, Block<C, D>, EndMarker]): Flow<D>;
30
- defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>>(blocks: readonly [StartMarker, Block<S, B>, Block<B, C>, Block<C, D>, Block<D, E>, EndMarker]): Flow<E>;
28
+ defineFlow<B extends Checkpoint<string>>(blocks: readonly [StartMarker, Block<S, B>, EndMarker], options?: FlowOptions): Flow<B>;
29
+ defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>>(blocks: readonly [StartMarker, Block<S, B>, Block<B, C>, EndMarker], options?: FlowOptions): Flow<C>;
30
+ defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>>(blocks: readonly [StartMarker, Block<S, B>, Block<B, C>, Block<C, D>, EndMarker], options?: FlowOptions): Flow<D>;
31
+ defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>>(blocks: readonly [StartMarker, Block<S, B>, Block<B, C>, Block<C, D>, Block<D, E>, EndMarker], options?: FlowOptions): Flow<E>;
31
32
  defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>>(blocks: readonly [
32
33
  StartMarker,
33
34
  Block<S, B>,
@@ -36,7 +37,7 @@ export declare class Engine {
36
37
  Block<D, E>,
37
38
  Block<E, F>,
38
39
  EndMarker
39
- ]): Flow<F>;
40
+ ], options?: FlowOptions): Flow<F>;
40
41
  defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>>(blocks: readonly [
41
42
  StartMarker,
42
43
  Block<S, B>,
@@ -46,7 +47,7 @@ export declare class Engine {
46
47
  Block<E, F>,
47
48
  Block<F, G>,
48
49
  EndMarker
49
- ]): Flow<G>;
50
+ ], options?: FlowOptions): Flow<G>;
50
51
  defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>, H extends Checkpoint<string>>(blocks: readonly [
51
52
  StartMarker,
52
53
  Block<S, B>,
@@ -57,7 +58,7 @@ export declare class Engine {
57
58
  Block<F, G>,
58
59
  Block<G, H>,
59
60
  EndMarker
60
- ]): Flow<H>;
61
+ ], options?: FlowOptions): Flow<H>;
61
62
  defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>, H extends Checkpoint<string>, I extends Checkpoint<string>>(blocks: readonly [
62
63
  StartMarker,
63
64
  Block<S, B>,
@@ -69,7 +70,7 @@ export declare class Engine {
69
70
  Block<G, H>,
70
71
  Block<H, I>,
71
72
  EndMarker
72
- ]): Flow<I>;
73
+ ], options?: FlowOptions): Flow<I>;
73
74
  defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>, H extends Checkpoint<string>, I extends Checkpoint<string>, J extends Checkpoint<string>>(blocks: readonly [
74
75
  StartMarker,
75
76
  Block<S, B>,
@@ -82,7 +83,7 @@ export declare class Engine {
82
83
  Block<H, I>,
83
84
  Block<I, J>,
84
85
  EndMarker
85
- ]): Flow<J>;
86
+ ], options?: FlowOptions): Flow<J>;
86
87
  defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>, H extends Checkpoint<string>, I extends Checkpoint<string>, J extends Checkpoint<string>, K extends Checkpoint<string>>(blocks: readonly [
87
88
  StartMarker,
88
89
  Block<S, B>,
@@ -96,7 +97,7 @@ export declare class Engine {
96
97
  Block<I, J>,
97
98
  Block<J, K>,
98
99
  EndMarker
99
- ]): Flow<K>;
100
+ ], options?: FlowOptions): Flow<K>;
100
101
  defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>, H extends Checkpoint<string>, I extends Checkpoint<string>, J extends Checkpoint<string>, K extends Checkpoint<string>, L extends Checkpoint<string>>(blocks: readonly [
101
102
  StartMarker,
102
103
  Block<S, B>,
@@ -111,7 +112,7 @@ export declare class Engine {
111
112
  Block<J, K>,
112
113
  Block<K, L>,
113
114
  EndMarker
114
- ]): Flow<L>;
115
+ ], options?: FlowOptions): Flow<L>;
115
116
  defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>, H extends Checkpoint<string>, I extends Checkpoint<string>, J extends Checkpoint<string>, K extends Checkpoint<string>, L extends Checkpoint<string>, M extends Checkpoint<string>>(blocks: readonly [
116
117
  StartMarker,
117
118
  Block<S, B>,
@@ -127,7 +128,7 @@ export declare class Engine {
127
128
  Block<K, L>,
128
129
  Block<L, M>,
129
130
  EndMarker
130
- ]): Flow<M>;
131
+ ], options?: FlowOptions): Flow<M>;
131
132
  defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>, H extends Checkpoint<string>, I extends Checkpoint<string>, J extends Checkpoint<string>, K extends Checkpoint<string>, L extends Checkpoint<string>, M extends Checkpoint<string>, N extends Checkpoint<string>>(blocks: readonly [
132
133
  StartMarker,
133
134
  Block<S, B>,
@@ -144,7 +145,7 @@ export declare class Engine {
144
145
  Block<L, M>,
145
146
  Block<M, N>,
146
147
  EndMarker
147
- ]): Flow<N>;
148
+ ], options?: FlowOptions): Flow<N>;
148
149
  defineFlow<B extends Checkpoint<string>, C extends Checkpoint<string>, D extends Checkpoint<string>, E extends Checkpoint<string>, F extends Checkpoint<string>, G extends Checkpoint<string>, H extends Checkpoint<string>, I extends Checkpoint<string>, J extends Checkpoint<string>, K extends Checkpoint<string>, L extends Checkpoint<string>, M extends Checkpoint<string>, N extends Checkpoint<string>, O extends Checkpoint<string>>(blocks: readonly [
149
150
  StartMarker,
150
151
  Block<S, B>,
@@ -162,7 +163,7 @@ export declare class Engine {
162
163
  Block<M, N>,
163
164
  Block<N, O>,
164
165
  EndMarker
165
- ]): Flow<O>;
166
+ ], options?: FlowOptions): Flow<O>;
166
167
  /**
167
168
  * Fluent, kind-checked alternative to `defineFlow([start, ...blocks, end])` -
168
169
  * see {@link MapBuilder}. Real, direct request this responds to: pia/zsign's
@@ -1,4 +1,4 @@
1
- import { buildFlow } from "./flow.js";
1
+ import { applyFlowOptions, buildFlow } from "./flow.js";
2
2
  import { MapBuilder } from "./map-builder.js";
3
3
  /**
4
4
  * Holds engine-level configuration shared across every flow defined from it -
@@ -12,8 +12,8 @@ export class Engine {
12
12
  constructor(config = {}) {
13
13
  this.config = config;
14
14
  }
15
- defineFlow(blocks) {
16
- return buildFlow(blocks.slice(1, -1), this.config);
15
+ defineFlow(blocks, options) {
16
+ return applyFlowOptions(buildFlow(blocks.slice(1, -1), this.config), options);
17
17
  }
18
18
  /**
19
19
  * Fluent, kind-checked alternative to `defineFlow([start, ...blocks, end])` -
@@ -245,6 +245,23 @@ export declare function withExpectedFailure<Out extends Checkpoint<string>>(flow
245
245
  * @example withHighlightFixtures(issueFlow, { "submit-login": { stubBefore: { email: { label: "AC-1" } } } })
246
246
  */
247
247
  export declare function withHighlightFixtures<Out extends Checkpoint<string>>(flow: Flow<Out>, fixtures: import("../highlights.js").HighlightFixtureMap): Flow<Out>;
248
+ /** Everything a `with*` wrapper can set, given up front: `engine.defineFlow([...], { title, memStub, ... })`. */
249
+ export interface FlowOptions {
250
+ /** Shown as the banner while the Flow runs (`withTitle`). */
251
+ title?: string;
252
+ /** Fill missing `requires` keys from `registerMemStub` (`withMemStub`). */
253
+ memStub?: boolean;
254
+ /** Clear cookies and storage before this Flow's first Block when chained after another (`withSessionReset`). */
255
+ sessionReset?: boolean;
256
+ /** `withDemoPace`. */
257
+ demoPace?: DemoPace;
258
+ /** `withHighlightStyle`. */
259
+ highlightStyle?: HighlightStyleDefaults;
260
+ /** Marks a Flow that is supposed to throw, with the reason (`withExpectedFailure`). */
261
+ expectedFailure?: string;
262
+ }
263
+ /** Applies each set option through its `with*` wrapper, so both spellings produce the same Flow. */
264
+ export declare function applyFlowOptions<Out extends Checkpoint<string>>(flow: Flow<Out>, options: FlowOptions | undefined): Flow<Out>;
248
265
  /**
249
266
  * Runs several complete, independent Flows one after another, reusing the
250
267
  * same page/context/mem in order - each remains its own validated