waygraph 0.15.53 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. package/README.md +8 -3
  2. package/bin/waygraph +2 -2
  3. package/dist/analysis/check.d.ts +38 -0
  4. package/dist/analysis/check.js +87 -0
  5. package/dist/analysis/coverage-gap.d.ts +1 -1
  6. package/dist/analysis/coverage-gap.js +14 -37
  7. package/dist/analysis/flow-source.d.ts +9 -0
  8. package/dist/analysis/flow-source.js +25 -0
  9. package/dist/analysis/graph.d.ts +13 -14
  10. package/dist/analysis/graph.js +48 -371
  11. package/dist/analysis/map-check.js +4 -39
  12. package/dist/analysis/practices-check.d.ts +1 -1
  13. package/dist/analysis/practices-check.js +24 -45
  14. package/dist/cli/args.d.ts +23 -0
  15. package/dist/cli/args.js +20 -0
  16. package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
  17. package/dist/{cli.js → cli/cli.js} +10 -9
  18. package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
  19. package/dist/cli/commands/agent-dive.js +42 -0
  20. package/dist/{commands → cli/commands}/check.d.ts +0 -1
  21. package/dist/cli/commands/check.js +104 -0
  22. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  23. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  24. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  25. package/dist/cli/commands/codemod-flows.js +284 -0
  26. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  27. package/dist/cli/commands/codemod-stubs.js +187 -0
  28. package/dist/{commands → cli/commands}/extensions.js +5 -4
  29. package/dist/{commands → cli/commands}/init.js +1 -2
  30. package/dist/{commands → cli/commands}/list.js +9 -7
  31. package/dist/cli/commands/manifest.d.ts +2 -0
  32. package/dist/cli/commands/manifest.js +20 -0
  33. package/dist/cli/commands/map.js +57 -0
  34. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  35. package/dist/cli/commands/run.js +64 -0
  36. package/dist/{commands → cli/commands}/session.js +61 -88
  37. package/dist/{commands → cli/commands}/test.js +11 -14
  38. package/dist/cli/commands/traverse.js +105 -0
  39. package/dist/{commands → cli/commands}/try.js +29 -25
  40. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  41. package/dist/cli/flags.d.ts +193 -16
  42. package/dist/cli/flags.js +179 -234
  43. package/dist/cli/run-chain.d.ts +1 -0
  44. package/dist/cli/run-chain.js +42 -7
  45. package/dist/cli/usage.d.ts +1 -1
  46. package/dist/cli/usage.js +21 -53
  47. package/dist/cli/util.d.ts +2 -2
  48. package/dist/cli/util.js +2 -3
  49. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  50. package/dist/{highlights → demo/narration}/css.js +2 -3
  51. package/dist/{highlights → demo/narration}/demo-pace.d.ts +7 -11
  52. package/dist/{highlights → demo/narration}/demo-pace.js +9 -11
  53. package/dist/{highlights → demo/narration}/device.d.ts +4 -2
  54. package/dist/{highlights → demo/narration}/device.js +3 -1
  55. package/dist/demo/narration/merge.d.ts +8 -0
  56. package/dist/demo/narration/merge.js +71 -0
  57. package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
  58. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  59. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  60. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  61. package/dist/demo/narration/stub-ctx.js +164 -0
  62. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  63. package/dist/{highlights → demo/narration}/style.js +1 -41
  64. package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
  65. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  66. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  67. package/dist/demo/overlay/auto-chrome.js +97 -0
  68. package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +7 -0
  69. package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +5 -0
  70. package/dist/demo/overlay/cursor.d.ts +12 -0
  71. package/dist/demo/overlay/cursor.js +142 -0
  72. package/dist/demo/overlay/device-stage.d.ts +13 -0
  73. package/dist/demo/overlay/device-stage.js +396 -0
  74. package/dist/demo/overlay/inpage/banner.d.ts +1 -0
  75. package/dist/demo/overlay/inpage/banner.js +160 -0
  76. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  77. package/dist/demo/overlay/inpage/caption.js +24 -0
  78. package/dist/demo/overlay/inpage/core.d.ts +1 -0
  79. package/dist/demo/overlay/inpage/core.js +345 -0
  80. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  81. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  82. package/dist/demo/overlay/inpage/network.d.ts +9 -0
  83. package/dist/demo/overlay/inpage/network.js +200 -0
  84. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  86. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  87. package/dist/demo/overlay/inpage/stamp.js +46 -0
  88. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  90. package/dist/demo/overlay/inpage/todos.d.ts +1 -0
  91. package/dist/demo/overlay/inpage/todos.js +294 -0
  92. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  93. package/dist/demo/overlay/locator-theater.js +76 -0
  94. package/dist/demo/overlay/network-capture.d.ts +22 -0
  95. package/dist/demo/overlay/network-capture.js +127 -0
  96. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  97. package/dist/demo/overlay/overlay-css.js +369 -0
  98. package/dist/demo/overlay/overlay-stage.d.ts +23 -0
  99. package/dist/demo/overlay/overlay-stage.js +106 -0
  100. package/dist/demo/overlay/overlay.d.ts +10 -0
  101. package/dist/demo/overlay/overlay.js +89 -0
  102. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  103. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  104. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  105. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  106. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  107. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  108. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  109. package/dist/demo/overlay/reattach.d.ts +7 -0
  110. package/dist/demo/overlay/reattach.js +23 -0
  111. package/dist/demo/overlay/rings.d.ts +33 -0
  112. package/dist/demo/overlay/rings.js +448 -0
  113. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  114. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  115. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  116. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  117. package/dist/demo/stepper/after.d.ts +3 -0
  118. package/dist/demo/stepper/after.js +113 -0
  119. package/dist/demo/stepper/banner-log.d.ts +37 -0
  120. package/dist/demo/stepper/banner-log.js +63 -0
  121. package/dist/demo/stepper/before.d.ts +4 -0
  122. package/dist/demo/stepper/before.js +110 -0
  123. package/dist/demo/stepper/demo-log.d.ts +31 -0
  124. package/dist/demo/stepper/demo-log.js +309 -0
  125. package/dist/demo/stepper/gate.d.ts +11 -0
  126. package/dist/demo/stepper/gate.js +78 -0
  127. package/dist/demo/stepper/interaction-patch.d.ts +3 -0
  128. package/dist/demo/stepper/interaction-patch.js +323 -0
  129. package/dist/demo/stepper/pacing.d.ts +21 -0
  130. package/dist/demo/stepper/pacing.js +23 -0
  131. package/dist/demo/stepper/slides.d.ts +11 -0
  132. package/dist/demo/stepper/slides.js +233 -0
  133. package/dist/demo/stepper/step-panels.d.ts +21 -0
  134. package/dist/demo/stepper/step-panels.js +589 -0
  135. package/dist/demo/stepper/stepper.d.ts +24 -0
  136. package/dist/demo/stepper/stepper.js +122 -0
  137. package/dist/demo/stepper/teardown.d.ts +48 -0
  138. package/dist/demo/stepper/teardown.js +179 -0
  139. package/dist/demo/stepper/todo-advance.d.ts +14 -0
  140. package/dist/demo/stepper/todo-advance.js +110 -0
  141. package/dist/demo/stepper/view.d.ts +68 -0
  142. package/dist/demo/stepper/view.js +31 -0
  143. package/dist/demo/types.d.ts +17 -0
  144. package/dist/demo/verbose-log.js +15 -0
  145. package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
  146. package/dist/{core → engine/block}/block.js +10 -53
  147. package/dist/{core → engine/block}/compose.d.ts +10 -7
  148. package/dist/{core → engine/block}/compose.js +1 -1
  149. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +17 -12
  150. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  151. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  152. package/dist/engine/block/kinds/effect.js +17 -0
  153. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +19 -29
  154. package/dist/{core/blocks → engine/block/kinds}/method.js +7 -21
  155. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +22 -31
  156. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  157. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +15 -20
  158. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  159. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  160. package/dist/engine/checkpoint/checkpoint.js +8 -0
  161. package/dist/engine/checkpoint/route.d.ts +28 -0
  162. package/dist/engine/checkpoint/route.js +28 -0
  163. package/dist/{core → engine}/config.d.ts +7 -2
  164. package/dist/engine/config.js +6 -0
  165. package/dist/engine/engine.d.ts +45 -0
  166. package/dist/{core → engine}/engine.js +6 -10
  167. package/dist/engine/env.d.ts +59 -0
  168. package/dist/engine/env.js +83 -0
  169. package/dist/{errors.d.ts → engine/errors.d.ts} +23 -22
  170. package/dist/{errors.js → engine/errors.js} +22 -22
  171. package/dist/{core → engine/flow}/branch-regression.d.ts +8 -7
  172. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  173. package/dist/engine/flow/flow.d.ts +162 -0
  174. package/dist/engine/flow/flow.js +244 -0
  175. package/dist/{core → engine/flow}/map-builder.d.ts +42 -40
  176. package/dist/{core → engine/flow}/map-builder.js +46 -48
  177. package/dist/{core → engine}/locate.d.ts +1 -1
  178. package/dist/{core → engine}/locate.js +1 -2
  179. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  180. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  181. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  182. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  183. package/dist/engine/page-gone.d.ts +5 -0
  184. package/dist/engine/page-gone.js +20 -0
  185. package/dist/engine/run/connect.d.ts +28 -0
  186. package/dist/{types.js → engine/run/connect.js} +11 -10
  187. package/dist/engine/run/events.d.ts +67 -0
  188. package/dist/engine/run/events.js +90 -0
  189. package/dist/engine/run/hooks.d.ts +16 -0
  190. package/dist/engine/run/hooks.js +8 -0
  191. package/dist/engine/run/launch.d.ts +13 -0
  192. package/dist/engine/run/launch.js +27 -0
  193. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +9 -11
  194. package/dist/{core/run-graph.js → engine/run/run.js} +22 -11
  195. package/dist/engine/stub/pace.d.ts +12 -0
  196. package/dist/engine/stub/pace.js +2 -0
  197. package/dist/engine/stub/ring.d.ts +130 -0
  198. package/dist/engine/stub/ring.js +41 -0
  199. package/dist/engine/stub/stub.d.ts +268 -0
  200. package/dist/engine/stub/stub.js +1 -0
  201. package/dist/engine/stub/todos.d.ts +104 -0
  202. package/dist/engine/stub/todos.js +2 -0
  203. package/dist/engine/stub/viewport.d.ts +26 -0
  204. package/dist/engine/stub/viewport.js +2 -0
  205. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  206. package/dist/index.d.ts +84 -36
  207. package/dist/index.js +44 -19
  208. package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
  209. package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -248
  210. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  211. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  212. package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
  213. package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
  214. package/dist/{auto-session → live/auto-session}/helpers.d.ts +16 -5
  215. package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
  216. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
  217. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
  218. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  219. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  220. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  221. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  222. package/dist/{session → live/pilot}/pilot.d.ts +4 -3
  223. package/dist/{session → live/pilot}/pilot.js +4 -4
  224. package/dist/{traverse → live/traverse}/coverage.d.ts +4 -0
  225. package/dist/{traverse → live/traverse}/coverage.js +3 -0
  226. package/dist/{traverse → live/traverse}/lease.d.ts +1 -0
  227. package/dist/{traverse → live/traverse}/lease.js +1 -0
  228. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +4 -1
  229. package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
  230. package/dist/manifest/manifest.d.ts +52 -0
  231. package/dist/manifest/manifest.js +93 -0
  232. package/dist/manifest/map-imports.d.ts +7 -0
  233. package/dist/manifest/map-imports.js +22 -0
  234. package/dist/manifest/maps.d.ts +33 -0
  235. package/dist/manifest/maps.js +62 -0
  236. package/dist/manifest/pack.d.ts +21 -0
  237. package/dist/manifest/pack.js +109 -0
  238. package/dist/manifest/project.d.ts +60 -0
  239. package/dist/manifest/project.js +101 -0
  240. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  241. package/dist/manifest/scan.d.ts +19 -0
  242. package/dist/manifest/scan.js +57 -0
  243. package/dist/{blocks-select.d.ts → manifest/select.d.ts} +3 -0
  244. package/dist/{blocks-select.js → manifest/select.js} +2 -0
  245. package/dist/manifest/source.d.ts +23 -0
  246. package/dist/manifest/source.js +86 -0
  247. package/dist/runner/mode.d.ts +71 -0
  248. package/dist/runner/mode.js +1 -0
  249. package/dist/runner/modes/branches.d.ts +5 -0
  250. package/dist/runner/modes/branches.js +37 -0
  251. package/dist/runner/modes/demo.d.ts +3 -0
  252. package/dist/runner/modes/demo.js +13 -0
  253. package/dist/runner/modes/report.d.ts +2 -0
  254. package/dist/runner/modes/report.js +54 -0
  255. package/dist/runner/modes/run.d.ts +2 -0
  256. package/dist/runner/modes/run.js +3 -0
  257. package/dist/runner/options.d.ts +31 -0
  258. package/dist/runner/options.js +42 -0
  259. package/dist/runner/plan/find.d.ts +18 -0
  260. package/dist/runner/plan/find.js +65 -0
  261. package/dist/runner/plan/plan.d.ts +11 -0
  262. package/dist/runner/plan/plan.js +97 -0
  263. package/dist/runner/plan/seed-mem.d.ts +12 -0
  264. package/dist/runner/plan/seed-mem.js +98 -0
  265. package/dist/runner/plan/spec.d.ts +5 -0
  266. package/dist/runner/plan/spec.js +17 -0
  267. package/dist/runner/play-steps.d.ts +2 -0
  268. package/dist/runner/play-steps.js +59 -0
  269. package/dist/runner/runner.d.ts +4 -0
  270. package/dist/runner/runner.js +64 -0
  271. package/dist/runner/session.d.ts +9 -0
  272. package/dist/runner/session.js +87 -0
  273. package/dist/{browser.js → runtime/browser.js} +4 -2
  274. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  275. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +2 -5
  276. package/dist/{extensions.js → runtime/extensions.js} +3 -1
  277. package/dist/runtime/full-launch.d.ts +1 -0
  278. package/dist/runtime/full-launch.js +34 -0
  279. package/dist/runtime/global-flag.d.ts +5 -0
  280. package/dist/runtime/global-flag.js +18 -0
  281. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  282. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  283. package/dist/runtime/run-log.d.ts +2 -0
  284. package/dist/runtime/run-log.js +17 -0
  285. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  286. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +8 -9
  287. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  288. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  289. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  290. package/examples/routed-demo/package.json +1 -4
  291. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  292. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  293. package/examples/routed-demo/src/flows/routed-demo.flow.ts +2 -3
  294. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  295. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  296. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  297. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  298. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  299. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  300. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  301. package/examples/routed-demo/tsconfig.json +1 -1
  302. package/examples/saucedemo/README.md +11 -12
  303. package/examples/saucedemo/config/waygraph.config.ts +17 -0
  304. package/examples/saucedemo/docs/CONVENTION.md +5 -7
  305. package/examples/saucedemo/docs/HELPERS.md +12 -12
  306. package/examples/saucedemo/package-lock.json +10 -3
  307. package/examples/saucedemo/package.json +12 -29
  308. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  309. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  310. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  311. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  312. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  313. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  314. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  315. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  316. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  317. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  318. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  319. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  320. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  321. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  322. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  323. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  324. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  325. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  326. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  327. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  328. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  329. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  330. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  331. package/examples/saucedemo/src/flows/api-demo.flow.ts +26 -18
  332. package/examples/saucedemo/src/flows/cart-bulk.flow.ts +19 -14
  333. package/examples/saucedemo/src/flows/cart-continue.flow.ts +10 -8
  334. package/examples/saucedemo/src/flows/cart-mem.flow.ts +7 -7
  335. package/examples/saucedemo/src/flows/catalog-logout.flow.ts +13 -8
  336. package/examples/saucedemo/src/flows/checkout-then-browse-again.flow.ts +26 -48
  337. package/examples/saucedemo/src/flows/checkout.flow.ts +70 -86
  338. package/examples/saucedemo/src/flows/device-showcase.flow.ts +24 -25
  339. package/examples/saucedemo/src/flows/login.flow.ts +11 -18
  340. package/examples/saucedemo/src/flows/mem-stub-demo.flow.ts +9 -20
  341. package/examples/saucedemo/src/flows/shop.flow.ts +15 -20
  342. package/examples/saucedemo/src/flows/smoke.flow.ts +12 -27
  343. package/examples/saucedemo/src/flows/stub-on-error.flow.ts +24 -43
  344. package/examples/saucedemo/src/flows/viewer-blocked.flow.ts +26 -34
  345. package/examples/saucedemo/src/states/checkout.mem-stubs.ts +11 -0
  346. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  347. package/examples/saucedemo/src/stubs/device-showcase.ts +191 -0
  348. package/examples/saucedemo/src/stubs/login.ts +37 -0
  349. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  350. package/examples/saucedemo/tests/chain-flow-episodes.spec.ts +7 -9
  351. package/examples/saucedemo/tests/submit-login-branch.spec.ts +18 -5
  352. package/package.json +12 -7
  353. package/templates/agents/waygraph-planner.agent.md +2 -2
  354. package/templates/quickstart/README.md +4 -7
  355. package/templates/quickstart/config/waygraph.config.ts +17 -0
  356. package/templates/quickstart/docs/CONVENTION.md +5 -6
  357. package/templates/quickstart/docs/HELPERS.md +11 -9
  358. package/templates/quickstart/package.json +14 -17
  359. package/templates/quickstart/src/blocks/SITE-MAP.md +13 -3
  360. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  361. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  362. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  363. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  364. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  365. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  366. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  367. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  368. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  369. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  370. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  371. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  372. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  373. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  374. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  375. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  376. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  377. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  378. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  379. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  380. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  381. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  382. package/templates/quickstart/src/flows/api-demo.flow.ts +45 -0
  383. package/templates/quickstart/src/flows/cart-bulk.flow.ts +19 -14
  384. package/templates/quickstart/src/flows/cart-continue.flow.ts +10 -8
  385. package/templates/quickstart/src/flows/cart-mem.flow.ts +7 -7
  386. package/templates/quickstart/src/flows/catalog-logout.flow.ts +13 -8
  387. package/templates/quickstart/src/flows/checkout-then-browse-again.flow.ts +26 -48
  388. package/templates/quickstart/src/flows/checkout.flow.ts +70 -63
  389. package/templates/quickstart/src/flows/device-showcase.flow.ts +24 -25
  390. package/templates/quickstart/src/flows/login.flow.ts +11 -18
  391. package/templates/quickstart/src/flows/mem-stub-demo.flow.ts +12 -0
  392. package/templates/quickstart/src/flows/shop.flow.ts +15 -20
  393. package/templates/quickstart/src/flows/smoke.flow.ts +12 -27
  394. package/templates/quickstart/src/flows/stub-on-error.flow.ts +31 -0
  395. package/templates/quickstart/src/flows/viewer-blocked.flow.ts +26 -34
  396. package/templates/quickstart/src/states/checkout.mem-stubs.ts +11 -0
  397. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  398. package/templates/quickstart/src/stubs/device-showcase.ts +191 -0
  399. package/templates/quickstart/src/stubs/login.ts +37 -0
  400. package/templates/quickstart/tests/chain-flow.spec.ts +7 -10
  401. package/templates/scaffold/README.md +2 -1
  402. package/templates/scaffold/STRUCTURE.md +5 -4
  403. package/templates/scaffold/config/waygraph.config.ts +1 -0
  404. package/templates/scaffold/gitignore +1 -0
  405. package/templates/scaffold/src/flows/README.md +2 -2
  406. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  407. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  408. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  409. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  410. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  411. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  412. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  413. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  414. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  415. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  416. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  417. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  418. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  419. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  420. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  421. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  422. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  423. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  424. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  425. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  426. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  427. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  428. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  429. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  430. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  431. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  432. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  433. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  434. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  435. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  436. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  437. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  438. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  439. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  440. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  441. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  442. package/templates/scaffold/src/map/README.md +7 -0
  443. package/templates/scaffold/src/states/README.md +4 -1
  444. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  445. package/templates/scaffold/src/states/demo.states.ts +14 -20
  446. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  447. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  448. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  449. package/templates/skills/waygraph-convention.skill.md +23 -14
  450. package/templates/skills/waygraph-pilot.skill.md +7 -4
  451. package/dist/auto-session/verbose-log.js +0 -16
  452. package/dist/auto-session.d.ts +0 -2
  453. package/dist/auto-session.js +0 -3
  454. package/dist/cli/discover.d.ts +0 -40
  455. package/dist/cli/discover.js +0 -148
  456. package/dist/commands/agent-dive.js +0 -52
  457. package/dist/commands/check.js +0 -192
  458. package/dist/commands/map.js +0 -29
  459. package/dist/commands/run.js +0 -104
  460. package/dist/commands/traverse.js +0 -177
  461. package/dist/core/block.d.ts +0 -109
  462. package/dist/core/blocks/effect.js +0 -23
  463. package/dist/core/config.js +0 -17
  464. package/dist/core/engine.d.ts +0 -198
  465. package/dist/core/flow.d.ts +0 -293
  466. package/dist/core/flow.js +0 -432
  467. package/dist/core.d.ts +0 -14
  468. package/dist/core.js +0 -15
  469. package/dist/highlights/merge.d.ts +0 -8
  470. package/dist/highlights/merge.js +0 -173
  471. package/dist/highlights/stub-ctx.d.ts +0 -10
  472. package/dist/highlights/stub-ctx.js +0 -331
  473. package/dist/highlights/types.d.ts +0 -607
  474. package/dist/highlights.d.ts +0 -9
  475. package/dist/highlights.js +0 -10
  476. package/dist/pilot-overlay.d.ts +0 -5
  477. package/dist/pilot-overlay.js +0 -6
  478. package/dist/runner/banner-log.js +0 -63
  479. package/dist/runner/chain-run.js +0 -102
  480. package/dist/runner/cursor.js +0 -140
  481. package/dist/runner/demo-log.js +0 -316
  482. package/dist/runner/device-stage.d.ts +0 -9
  483. package/dist/runner/device-stage.js +0 -420
  484. package/dist/runner/discovery.js +0 -105
  485. package/dist/runner/index.js +0 -2
  486. package/dist/runner/inpage/banner.d.ts +0 -21
  487. package/dist/runner/inpage/banner.js +0 -156
  488. package/dist/runner/inpage/caption.d.ts +0 -3
  489. package/dist/runner/inpage/caption.js +0 -23
  490. package/dist/runner/inpage/core.d.ts +0 -4
  491. package/dist/runner/inpage/core.js +0 -316
  492. package/dist/runner/inpage/device.d.ts +0 -3
  493. package/dist/runner/inpage/device.js +0 -211
  494. package/dist/runner/inpage/network.d.ts +0 -15
  495. package/dist/runner/inpage/network.js +0 -217
  496. package/dist/runner/inpage/panel-chrome.js +0 -192
  497. package/dist/runner/inpage/stamp.js +0 -46
  498. package/dist/runner/inpage/swipe-zoom.js +0 -220
  499. package/dist/runner/inpage/todos.js +0 -337
  500. package/dist/runner/interaction-patch.js +0 -384
  501. package/dist/runner/main.js +0 -469
  502. package/dist/runner/network-capture.d.ts +0 -9
  503. package/dist/runner/network-capture.js +0 -126
  504. package/dist/runner/overlay-css.d.ts +0 -3
  505. package/dist/runner/overlay-css.js +0 -377
  506. package/dist/runner/overlay-install.js +0 -90
  507. package/dist/runner/overlay-stage.js +0 -110
  508. package/dist/runner/rings.js +0 -514
  509. package/dist/runner/seed-mem.js +0 -110
  510. package/dist/runner/slides.js +0 -278
  511. package/dist/runner/step-mode.js +0 -703
  512. package/dist/runner/step-panels.js +0 -729
  513. package/dist/runner/teardown.js +0 -202
  514. package/dist/runner/todo-dock.js +0 -142
  515. package/dist/session/step-overlay.d.ts +0 -37
  516. package/dist/session/step-overlay.js +0 -244
  517. package/examples/routed-demo/playwright.config.ts +0 -21
  518. package/examples/saucedemo/playwright.config.ts +0 -19
  519. package/examples/saucedemo/scripts/drive-auto-cli.mjs +0 -93
  520. package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +0 -126
  521. package/examples/saucedemo/scripts/prove-auto-graph.mjs +0 -92
  522. package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +0 -63
  523. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  524. package/templates/quickstart/playwright.config.ts +0 -14
  525. package/templates/quickstart/scripts/drive-auto-cli.mjs +0 -93
  526. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  527. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  528. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  529. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  530. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  531. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  532. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  533. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  534. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  535. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  536. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  537. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  538. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  539. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  540. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  541. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  542. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  543. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  544. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  545. /package/dist/{highlights → demo}/types.js +0 -0
  546. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  547. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  548. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  549. /package/dist/{trait.js → engine/trait/trait.js} +0 -0
  550. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  551. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  552. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  553. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  554. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  555. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  556. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -74,13 +74,12 @@ edges (including cycles via logout / continue-shopping / back-to-products).
74
74
  Prefer flags (or npm scripts) over a pile of `WAYGRAPH_*` env vars:
75
75
 
76
76
  ```bash
77
- npm run demo # waygraph demo shopFlow (STEP+headed; BASE_URL from package.json / playwright)
78
- npm run demo:autoplay # --autoplay --title "Shop demo"
77
+ npm run demo # waygraph demo --blocks "loginFlow then shopFlow" (headed; baseUrl from config/waygraph.config.ts)
78
+ npm run demo:auto-next # the same, advancing on its own
79
79
  waygraph demo shopFlow --base-url https://www.saucedemo.com --title "Shop"
80
- waygraph chain "loginFlow" --step --no-autoplay
80
+ waygraph demo loginFlow --no-auto-next
81
81
  ```
82
82
 
83
- Flags beat env: `--step` / `--no-step`, `--autoplay` / `--no-autoplay`,
83
+ Flags beat env: `--auto-next` / `--no-auto-next`,
84
84
  `--base-url <url>`, `--title <text>`. Default BASE_URL resolution order for
85
- `demo`: `--base-url` > `WAYGRAPH_BASE_URL` > `package.json` `waygraph.baseUrl`
86
- > `playwright.config` `baseURL`.
85
+ `demo`: `--base-url` > `WAYGRAPH_BASE_URL` > `baseUrl` in `config/waygraph.config.ts`.
@@ -11,9 +11,8 @@ Runtime is always a `Block`. Helpers are TypeScript salt + clear intent.
11
11
  | `defineMethodBlock` | One-shot non-nav app step | `*.method.block.ts` under `methods/` |
12
12
  | `defineEffectBlock` | Instance mutate + auto menu rows | `*.effect.block.ts` under `methods/` |
13
13
  | `defineBlock` | Escape hatch: tests, unsure, probes | any |
14
- | `defineActionBlock` | **Deprecated** alias of `defineMethodBlock` | — |
15
14
 
16
- `defineNavBlock({ click })` still works (compat) - prefer `defineNavClickBlock` in app code.
15
+ `defineNavBlock({ click })` and `defineNavClickBlock` build the same Block; app code reads better with `defineNavClickBlock`.
17
16
 
18
17
  ---
19
18
 
@@ -30,7 +29,7 @@ export const InventorySel = {
30
29
 
31
30
  export const InventoryPageBlock = definePageBlock({
32
31
  name: "page-inventory",
33
- checkpoint: "LoggedIn",
32
+ checkpoint: LoggedIn,
34
33
  verify: [Trait.url({ pathname: "/inventory.html" }), Trait.visible(InventorySel.list)],
35
34
  methods: {
36
35
  addToCart: () => AddToCartBlock,
@@ -73,8 +72,10 @@ Checkpoint = place on the map. `branch()` = which road to take from that place.
73
72
  Conditional Out (no `branch()` needed for auto/graph):
74
73
 
75
74
  ```ts
76
- defineMethodBlock<LoginPage, LoggedIn | LoginPage>({
75
+ defineMethodBlock({
77
76
  name: "submit-login",
77
+ from: LoginPage,
78
+ to: [LoggedIn, LoginPage],
78
79
  instruction: {
79
80
  async act(page, _in, mem) { /* fill + click */ },
80
81
  async observe(page) {
@@ -93,13 +94,13 @@ defineMethodBlock<LoginPage, LoggedIn | LoginPage>({
93
94
  Optional routing for `runGraph`:
94
95
 
95
96
  ```ts
96
- branch(SubmitLoginActionBlock, {
97
+ branch(SubmitLoginBlock, {
97
98
  LoggedIn: AddToCartBlock,
98
99
  LoginPage: null, // stop
99
100
  });
100
101
  ```
101
102
 
102
- Linear `defineFlow([start, …, end])` usually skips `branch()` (one happy path).
103
+ A linear `map()` chain usually skips `branch()` (one happy path).
103
104
 
104
105
  ---
105
106
 
@@ -112,8 +113,9 @@ then run the Block (act reads mem as usual).
112
113
  ### Effect - spawn Method-like rows (Add / Remove)
113
114
 
114
115
  ```ts
115
- defineEffectBlock<Checkpoint<string>, ItemInCart>({
116
+ defineEffectBlock({
116
117
  name: "add-to-cart",
118
+ to: ItemInCart, // no `from`: runs from anywhere
117
119
  requires: [SelectedItem.key],
118
120
  instruction: {
119
121
  async act(page, _in, mem) {
@@ -140,9 +142,9 @@ Auto shows: `Add "Sauce Labs Backpack" to cart`, `Add "Bike Light"…`, …
140
142
  ### MemNav - spawn Nav rows (Open details)
141
143
 
142
144
  ```ts
143
- defineMemNavBlock<ItemDetailPage>({
145
+ defineMemNavBlock({
144
146
  name: "nav-item-detail",
145
- checkpoint: "ItemDetailPage",
147
+ checkpoint: ItemDetailPage,
146
148
  requires: [SelectedItem.key],
147
149
  click: (mem) => InventorySel.title(mem.get(SelectedItem.key).id),
148
150
  verify: [Trait.url({ pathname: "/inventory-item.html" })],
@@ -4,30 +4,27 @@
4
4
  "type": "module",
5
5
  "description": "Self-contained saucedemo quickstart (copied into a temp dir by `waygraph try demo`).",
6
6
  "scripts": {
7
+ "typecheck": "tsc --noEmit",
7
8
  "test": "waygraph test",
8
9
  "test:ui": "waygraph test ui",
9
- "typecheck": "tsc --noEmit",
10
+ "flows": "waygraph list",
10
11
  "check": "waygraph check",
11
- "auto": "waygraph auto",
12
- "auto:cli": "waygraph auto --cli --data \"{\\\"saucedemo.credentials\\\":{\\\"username\\\":\\\"standard_user\\\",\\\"password\\\":\\\"secret_sauce\\\"}}\"",
13
- "traverse": "waygraph traverse --data \"{\\\"saucedemo.credentials\\\":{\\\"username\\\":\\\"standard_user\\\",\\\"password\\\":\\\"secret_sauce\\\"}}\" --max-steps 40",
14
- "traverse:parallel": "waygraph traverse --parallel 2 --session clone --data \"{\\\"saucedemo.credentials\\\":{\\\"username\\\":\\\"standard_user\\\",\\\"password\\\":\\\"secret_sauce\\\"}}\" --max-steps 30",
15
- "traverse:coverage": "waygraph traverse --min-edge-coverage 10% --data \"{\\\"saucedemo.credentials\\\":{\\\"username\\\":\\\"standard_user\\\",\\\"password\\\":\\\"secret_sauce\\\"}}\" --max-steps 40",
16
12
  "graph": "waygraph graph",
17
13
  "graph:mermaid": "waygraph graph --mermaid",
18
- "demo": "waygraph demo --blocks \"loginFlow then shopFlow({\\\"saucedemo.selectedItem\\\":{\\\"id\\\":\\\"sauce-labs-backpack\\\",\\\"name\\\":\\\"Sauce Labs Backpack\\\"}}) then viewerBlockedFlow({\\\"saucedemo.credentials\\\":{\\\"username\\\":\\\"locked_out_user\\\",\\\"password\\\":\\\"secret_sauce\\\"}})\" --data \"{\\\"saucedemo.credentials\\\":{\\\"username\\\":\\\"standard_user\\\",\\\"password\\\":\\\"secret_sauce\\\"}}\"",
19
- "demo:auto-next": "waygraph demo --blocks \"loginFlow then shopFlow({\\\"saucedemo.selectedItem\\\":{\\\"id\\\":\\\"sauce-labs-backpack\\\",\\\"name\\\":\\\"Sauce Labs Backpack\\\"}}) then viewerBlockedFlow({\\\"saucedemo.credentials\\\":{\\\"username\\\":\\\"locked_out_user\\\",\\\"password\\\":\\\"secret_sauce\\\"}})\" --data \"{\\\"saucedemo.credentials\\\":{\\\"username\\\":\\\"standard_user\\\",\\\"password\\\":\\\"secret_sauce\\\"}}\" --auto-next",
20
- "record": "waygraph run --blocks \"loginFlow then shopFlow({\\\"saucedemo.selectedItem\\\":{\\\"id\\\":\\\"sauce-labs-backpack\\\",\\\"name\\\":\\\"Sauce Labs Backpack\\\"}}) then viewerBlockedFlow({\\\"saucedemo.credentials\\\":{\\\"username\\\":\\\"locked_out_user\\\",\\\"password\\\":\\\"secret_sauce\\\"}})\" --data \"{\\\"saucedemo.credentials\\\":{\\\"username\\\":\\\"standard_user\\\",\\\"password\\\":\\\"secret_sauce\\\"}}\" --video --no-step",
21
- "demo:bulk": "waygraph demo --blocks cartBulkFlow --data \"{\\\"saucedemo.credentials\\\":{\\\"username\\\":\\\"standard_user\\\",\\\"password\\\":\\\"secret_sauce\\\"}}\"",
22
- "demo:bulk:auto-next": "waygraph demo --blocks cartBulkFlow --data \"{\\\"saucedemo.credentials\\\":{\\\"username\\\":\\\"standard_user\\\",\\\"password\\\":\\\"secret_sauce\\\"}}\" --auto-next --title \"Cart bulk demo\"",
23
- "demo:bulk:video": "waygraph demo --blocks cartBulkFlow --data \"{\\\"saucedemo.credentials\\\":{\\\"username\\\":\\\"standard_user\\\",\\\"password\\\":\\\"secret_sauce\\\"}}\" --auto-play-video --title \"Cart bulk demo\"",
24
- "run:bulk": "waygraph run --blocks \"loginFlow then add-all-to-cart then remove-all-from-cart\" --data \"{\\\"saucedemo.credentials\\\":{\\\"username\\\":\\\"standard_user\\\",\\\"password\\\":\\\"secret_sauce\\\"}}\""
25
- },
26
- "waygraph": {
27
- "baseUrl": "https://www.saucedemo.com"
14
+ "auto": "waygraph auto",
15
+ "auto:cli": "waygraph auto --cli",
16
+ "demo": "waygraph demo --blocks \"loginFlow then shopFlow\"",
17
+ "demo:auto-next": "waygraph demo --blocks \"loginFlow then shopFlow\" --auto-next",
18
+ "demo:checkout": "waygraph demo --blocks checkoutFlow --auto-next",
19
+ "demo:device": "waygraph demo --blocks deviceShowcaseFlow --auto-next",
20
+ "demo:bulk": "waygraph demo --blocks cartBulkFlow --auto-next",
21
+ "demo:api": "waygraph demo --blocks apiDemoFlow --auto-next",
22
+ "demo:video": "waygraph demo --blocks deviceShowcaseFlow --auto-play-video",
23
+ "record": "waygraph run --blocks \"loginFlow then shopFlow\" --video --no-step",
24
+ "traverse": "waygraph traverse --max-steps 40"
28
25
  },
29
26
  "dependencies": {
30
- "waygraph": "^0.12.20"
27
+ "waygraph": "latest"
31
28
  },
32
29
  "devDependencies": {
33
30
  "@playwright/test": "^1.55.0",
@@ -8,11 +8,14 @@ src/blocks/
8
8
  SITE-MAP.md
9
9
  saucedemo-web/ # URL /
10
10
  NAV.md
11
- nav-login.block.ts # Nav defineNavBlock url:/
11
+ nav-login.block.ts # Page definePageBlock url:/
12
12
  methods/
13
- submit-login.method.block.ts # Method defineMethodBlock
13
+ fill-username.method.block.ts # Method defineMethodBlock (self-loop on LoginPage)
14
+ fill-password.method.block.ts # Method defineMethodBlock (self-loop on LoginPage)
15
+ submit-login.method.block.ts # Method defineMethodBlock (click only; branches)
14
16
  submit-login-for-flow.ts # helper (not a discoverable *.block.ts alone)
15
17
  submit-logout.method.block.ts # Method defineMethodBlock
18
+ login.sel.ts # LoginSel (not a Block)
16
19
  inventory/ # URL /inventory.html
17
20
  inventory.page.block.ts # Page definePageBlock
18
21
  NAV.md
@@ -25,20 +28,27 @@ src/blocks/
25
28
  remove-from-cart.effect.block.ts
26
29
  inventory-item/ # URL /inventory-item.html
27
30
  NAV.md
31
+ item-detail.sel.ts # ItemDetailSel (not a Block)
28
32
  nav-continue-shopping.block.ts
29
33
  nav-back-to-products.block.ts
30
34
  nav-back-to-inventory.block.ts
31
35
  cart/ # URL /cart.html
32
36
  NAV.md
37
+ cart.sel.ts # CartSel (not a Block)
33
38
  nav-cart.block.ts # Nav click header cart
34
39
  nav-checkout-info.block.ts
35
40
  checkout-step-one/ # URL /checkout-step-one.html
36
41
  NAV.md
37
42
  methods/
38
- submit-checkout-info.method.block.ts
43
+ checkout-info.sel.ts # CheckoutInfoSel (not a Block)
44
+ fill-first-name.method.block.ts # Method defineMethodBlock (self-loop on CheckoutInfoPage)
45
+ fill-last-name.method.block.ts # Method defineMethodBlock (self-loop on CheckoutInfoPage)
46
+ fill-postal-code.method.block.ts # Method defineMethodBlock (self-loop on CheckoutInfoPage)
47
+ submit-checkout-info.method.block.ts # Method defineMethodBlock (click only)
39
48
  checkout-step-two/ # URL /checkout-step-two.html
40
49
  NAV.md
41
50
  methods/
51
+ checkout-overview.sel.ts # CheckoutOverviewSel (not a Block)
42
52
  finish-order.method.block.ts
43
53
  ```
44
54
 
@@ -27,11 +27,7 @@ Fill and submit are three separate Blocks (not one that fills both fields and
27
27
  clicks Login) so the graph/demo show each as its own step - no Block does
28
28
  more than one distinct action.
29
29
 
30
- ## Other
31
-
32
- | File | Kind | Notes |
33
- |------|------|-------|
34
- | `ff-owner-auth.block.ts` | FFCompose | Collapses nav-login + fill-username + fill-password + submit-login into one opaque demo/run step (`--ff-expand` shows all 4 again) |
30
+ A flow that wants to skip watching auth marks those steps `{ ff: true }` (see `src/flows/checkout.flow.ts`).
35
31
 
36
32
  ## Related mem keys / checkpoints
37
33
 
@@ -1,7 +1,5 @@
1
1
  import { defineNavClickBlock, Trait } from "waygraph";
2
- import type { StubCtx } from "waygraph";
3
- import type { CartPage } from "../../../states/checkout.states.js";
4
- import { InventorySel } from "../inventory/methods/inventory-items.js";
2
+ import { CartPage } from "../../../states/checkout.states.js";
5
3
  import { CartSel } from "./cart.sel.js";
6
4
 
7
5
  /**
@@ -11,57 +9,10 @@ import { CartSel } from "./cart.sel.js";
11
9
  *
12
10
  * click, not url - header cart link from inventory-adjacent pages.
13
11
  */
14
- export const NavCartBlock = defineNavClickBlock<CartPage>({
12
+ export const NavCartBlock = defineNavClickBlock({
15
13
  name: "nav-cart",
16
14
  description: "Clicks the cart link in the header.",
17
- checkpoint: "CartPage",
15
+ checkpoint: CartPage,
18
16
  click: CartSel.cartLink,
19
17
  verify: [Trait.url({ pathname: "/cart.html" })],
20
- stubBefore: (ctx: StubCtx) => {
21
- ctx.title("Open cart · landscape");
22
- ctx.landscape();
23
- ctx.todos(
24
- "saucedemo",
25
- [
26
- { id: "login-user", text: "Enter username", done: true },
27
- { id: "login-pass", text: "Enter password", done: true },
28
- { id: "login-submit", text: "Tap Login", done: true },
29
- { id: "cart-find", text: "Find the product", done: true },
30
- { id: "cart-add", text: "Add to cart", done: true },
31
- { id: "cart-open", text: "Open cart" },
32
- ],
33
- { title: "Device showcase", index: 5 },
34
- );
35
- ctx.zoom(1.4);
36
- ctx.zoomOut(false);
37
- ctx.highlights({
38
- cart: {
39
- selector: CartSel.cartLink,
40
- label: "Cart",
41
- detail: "tone: planned (purple) - open cart",
42
- tone: "planned",
43
- focus: true,
44
- zoomOut: false,
45
- followMouse: false,
46
- weight: "bold",
47
- gesture: "tap",
48
- },
49
- });
50
- },
51
- stubAfter: (ctx: StubCtx) => {
52
- ctx.banner("Your cart · desktop");
53
- ctx.clearDevice();
54
- ctx.hideTodos();
55
- ctx.zoomOut(true);
56
- ctx.ring("items", {
57
- selector: InventorySel.cartItem,
58
- label: "Cart items",
59
- detail: "tone: success (green) - product in cart",
60
- tone: "success",
61
- focus: true,
62
- zoomOut: true,
63
- followMouse: false,
64
- duration: true,
65
- });
66
- },
67
18
  });
@@ -1,5 +1,5 @@
1
1
  import { defineNavClickBlock, Trait } from "waygraph";
2
- import type { CheckoutInfoPage } from "../../../states/checkout.states.js";
2
+ import { CheckoutInfoPage } from "../../../states/checkout.states.js";
3
3
  import { CartSel } from "./cart.sel.js";
4
4
 
5
5
  /**
@@ -9,10 +9,10 @@ import { CartSel } from "./cart.sel.js";
9
9
  *
10
10
  * Cart page "Checkout" button - owns the nav into step one.
11
11
  */
12
- export const NavCheckoutInfoBlock = defineNavClickBlock<CheckoutInfoPage>({
12
+ export const NavCheckoutInfoBlock = defineNavClickBlock({
13
13
  name: "nav-checkout-info",
14
14
  description: "Clicks 'Checkout' on the cart page.",
15
- checkpoint: "CheckoutInfoPage",
15
+ checkpoint: CheckoutInfoPage,
16
16
  click: CartSel.checkoutBtn,
17
17
  verify: [Trait.url({ pathname: "/checkout-step-one.html" })],
18
18
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { CheckoutInfoPage } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { CheckoutInfoPage } from "../../../../states/checkout.states.js";
3
3
  import { CheckoutInfoSel } from "./checkout-info.sel.js";
4
4
 
5
5
  /**
@@ -10,13 +10,14 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
10
10
  * Fills the first name field only - self-loop on CheckoutInfoPage. Continue
11
11
  * is its own Block (submit-checkout-info.method.block.ts).
12
12
  */
13
- export const FillFirstNameBlock = defineMethodBlock<CheckoutInfoPage, CheckoutInfoPage>({
13
+ export const FillFirstNameBlock = defineMethodBlock({
14
14
  name: "fill-first-name",
15
15
  description: "Fills the first name field on the shipping info form.",
16
+ from: CheckoutInfoPage,
17
+ to: CheckoutInfoPage,
16
18
  instruction: {
17
19
  async act(page) {
18
20
  await page.locator(CheckoutInfoSel.firstName).fill("Ada");
19
21
  },
20
- resolve: () => checkpoint("CheckoutInfoPage"),
21
22
  },
22
23
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { CheckoutInfoPage } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { CheckoutInfoPage } from "../../../../states/checkout.states.js";
3
3
  import { CheckoutInfoSel } from "./checkout-info.sel.js";
4
4
 
5
5
  /**
@@ -9,13 +9,14 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
9
9
  *
10
10
  * Fills the last name field only - self-loop on CheckoutInfoPage.
11
11
  */
12
- export const FillLastNameBlock = defineMethodBlock<CheckoutInfoPage, CheckoutInfoPage>({
12
+ export const FillLastNameBlock = defineMethodBlock({
13
13
  name: "fill-last-name",
14
14
  description: "Fills the last name field on the shipping info form.",
15
+ from: CheckoutInfoPage,
16
+ to: CheckoutInfoPage,
15
17
  instruction: {
16
18
  async act(page) {
17
19
  await page.locator(CheckoutInfoSel.lastName).fill("Lovelace");
18
20
  },
19
- resolve: () => checkpoint("CheckoutInfoPage"),
20
21
  },
21
22
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { CheckoutInfoPage } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { CheckoutInfoPage } from "../../../../states/checkout.states.js";
3
3
  import { CheckoutInfoSel } from "./checkout-info.sel.js";
4
4
 
5
5
  /**
@@ -9,13 +9,14 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
9
9
  *
10
10
  * Fills the postal code field only - self-loop on CheckoutInfoPage.
11
11
  */
12
- export const FillPostalCodeBlock = defineMethodBlock<CheckoutInfoPage, CheckoutInfoPage>({
12
+ export const FillPostalCodeBlock = defineMethodBlock({
13
13
  name: "fill-postal-code",
14
14
  description: "Fills the postal code field on the shipping info form.",
15
+ from: CheckoutInfoPage,
16
+ to: CheckoutInfoPage,
15
17
  instruction: {
16
18
  async act(page) {
17
19
  await page.locator(CheckoutInfoSel.postalCode).fill("1000");
18
20
  },
19
- resolve: () => checkpoint("CheckoutInfoPage"),
20
21
  },
21
22
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint, Trait } from "waygraph";
2
- import type { CheckoutInfoPage, CheckoutOverviewPage } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock, Trait } from "waygraph";
2
+ import { CheckoutInfoPage, CheckoutOverviewPage } from "../../../../states/checkout.states.js";
3
3
  import { CheckoutInfoSel } from "./checkout-info.sel.js";
4
4
 
5
5
  /**
@@ -11,14 +11,15 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
11
11
  * fill-last-name / fill-postal-code (each its own Block). One Block, one
12
12
  * action: submit.
13
13
  */
14
- export const SubmitCheckoutInfoBlock = defineMethodBlock<CheckoutInfoPage, CheckoutOverviewPage>({
14
+ export const SubmitCheckoutInfoBlock = defineMethodBlock({
15
15
  name: "submit-checkout-info",
16
16
  description: "Continues from the shipping info form to the order overview.",
17
+ from: CheckoutInfoPage,
18
+ to: CheckoutOverviewPage,
17
19
  instruction: {
18
20
  async act(page) {
19
21
  await page.locator(CheckoutInfoSel.continueBtn).click();
20
22
  },
21
- resolve: () => checkpoint("CheckoutOverviewPage"),
22
23
  verify: [Trait.url({ pathname: "/checkout-step-two.html" })],
23
24
  },
24
25
  });
@@ -1,5 +1,8 @@
1
- import { defineMethodBlock, checkpoint, Trait, narrate, type StubCtx } from "waygraph";
2
- import type { CheckoutOverviewPage, OrderComplete } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock, Trait, narrate } from "waygraph";
2
+ import {
3
+ CheckoutOverviewPage,
4
+ OrderComplete,
5
+ } from "../../../../states/checkout.states.js";
3
6
  import { CheckoutOverviewSel } from "./checkout-overview.sel.js";
4
7
 
5
8
  /**
@@ -8,36 +11,26 @@ import { CheckoutOverviewSel } from "./checkout-overview.sel.js";
8
11
  * Route: saucedemo-web/checkout-step-two/methods/ (= /checkout-step-two.html)
9
12
  *
10
13
  * Places the order on the overview page - form/finish click, not a NavBlock.
11
- * Stubs use open ctx lifecycles (preferred) - not static slot maps.
12
14
  */
13
- export const FinishOrderBlock = defineMethodBlock<CheckoutOverviewPage, OrderComplete>({
15
+ export const FinishOrderBlock = defineMethodBlock({
14
16
  name: "finish-order",
15
- description: "Places the order and confirms the 'Thank you for your order!' completion page.",
17
+ description:
18
+ "Places the order and confirms the 'Thank you for your order!' completion page.",
19
+ from: CheckoutOverviewPage,
20
+ to: OrderComplete,
16
21
  instruction: {
17
22
  async act(page) {
18
23
  const finishButton = page.locator(CheckoutOverviewSel.finishBtn);
19
- await narrate(finishButton, "Placing the order", () => finishButton.click());
20
- },
21
- resolve: () => checkpoint("OrderComplete"),
22
- verify: [Trait.text(CheckoutOverviewSel.completeHeader, "Thank you for your order!")],
23
- stubBefore: (ctx: StubCtx) => {
24
- ctx.ring("finish", {
25
- selector: CheckoutOverviewSel.finishBtn,
26
- label: "Finish",
27
- detail: "tone: warning (yellow) - place order",
28
- tone: "warning",
29
- weight: "bold",
30
- });
31
- },
32
- stubAfter: (ctx: StubCtx) => {
33
- ctx.ring("thanks", {
34
- selector: CheckoutOverviewSel.completeHeader,
35
- label: "Order confirmed",
36
- detail: "tone: success (green) - thank you!",
37
- tone: "success",
38
- duration: true,
39
- });
24
+ await narrate(finishButton, "Placing the order", () =>
25
+ finishButton.click(),
26
+ );
40
27
  },
28
+ verify: [
29
+ Trait.text(
30
+ CheckoutOverviewSel.completeHeader,
31
+ "Thank you for your order!",
32
+ ),
33
+ ],
41
34
  // Shown AFTER act (order already placed) - selectors must match the
42
35
  // completion page, not #finish on the overview.
43
36
  slides: [
@@ -50,7 +43,8 @@ export const FinishOrderBlock = defineMethodBlock<CheckoutOverviewPage, OrderCom
50
43
  },
51
44
  {
52
45
  caption: "Completion page is the durable proof",
53
- detail: "tone: success - the thank-you header is what verify asserts on.",
46
+ detail:
47
+ "tone: success - the thank-you header is what verify asserts on.",
54
48
  tag: "YAP",
55
49
  tone: "success",
56
50
  selector: CheckoutOverviewSel.completeHeader,
@@ -1,6 +1,5 @@
1
1
  import { definePageBlock, Trait } from "waygraph";
2
- import type { StubCtx } from "waygraph";
3
- import type { LoggedIn } from "../../../states/checkout.states.js";
2
+ import { LoggedIn } from "../../../states/checkout.states.js";
4
3
  import { AddToCartBlock } from "./methods/add-to-cart.effect.block.js";
5
4
  import { RemoveFromCartBlock } from "./methods/remove-from-cart.effect.block.js";
6
5
  import { AddAllToCartBlock } from "./methods/add-all-to-cart.method.block.js";
@@ -19,20 +18,15 @@ import { InventorySel } from "./methods/inventory-items.js";
19
18
  * to LoggedIn. Cart Effects/Methods use In Checkpoint<string> (from: "*") so
20
19
  * auto still offers them after leave/return - menu follows live DOM buttons.
21
20
  */
22
- export const InventoryPageBlock = definePageBlock<LoggedIn>({
21
+ export const InventoryPageBlock = definePageBlock({
23
22
  name: "page-inventory",
24
23
  description:
25
24
  "Inventory catalog hub - per-item and bulk add/remove, open item detail.",
26
- checkpoint: "LoggedIn",
25
+ checkpoint: LoggedIn,
27
26
  verify: [
28
27
  Trait.url({ pathname: "/inventory.html" }),
29
28
  Trait.visible(InventorySel.list),
30
29
  ],
31
- // Showcase responsive dashboard: tablet after mobile login (toast + lerp).
32
- stubBefore: (ctx: StubCtx) => {
33
- ctx.title("Inventory · tablet");
34
- ctx.device("tablet");
35
- },
36
30
  methods: {
37
31
  addToCart: () => AddToCartBlock,
38
32
  removeFromCart: () => RemoveFromCartBlock,
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint, type Checkpoint } from "waygraph";
2
- import type { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock, checkpoint } from "waygraph";
2
+ import { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
3
3
  import { collectAddableItems, InventorySel } from "./inventory-items.js";
4
4
 
5
5
  type BulkObserve = "added" | "nothing";
@@ -14,12 +14,10 @@ type BulkObserve = "added" | "nothing";
14
14
  * leave inventory and return, collectors re-read Add buttons from the DOM.
15
15
  * Out: ItemInCart if the cart has items after; LoggedIn if still empty.
16
16
  */
17
- export const AddAllToCartBlock = defineMethodBlock<
18
- Checkpoint<string>,
19
- RemoveFromCartOutcome
20
- >({
17
+ export const AddAllToCartBlock = defineMethodBlock({
21
18
  name: "add-all-to-cart",
22
19
  description: "Adds every product still showing Add to cart on this page.",
20
+ to: RemoveFromCartOutcome,
23
21
  instruction: {
24
22
  async act(page) {
25
23
  const items = await collectAddableItems(page);
@@ -1,12 +1,8 @@
1
- import { defineEffectBlock, checkpoint, type Checkpoint, type WaygraphInstanceOption } from "waygraph";
2
- import type { StubCtx } from "waygraph";
3
- import type { ItemInCart } from "../../../../states/checkout.states.js";
1
+ import { defineEffectBlock, type WaygraphInstanceOption } from "waygraph";
2
+ import { ItemInCart } from "../../../../states/checkout.states.js";
4
3
  import { SelectedItem } from "../../../../states/checkout.mem-keys.js";
5
4
  import { collectAddableItems, InventorySel } from "./inventory-items.js";
6
5
 
7
- /** Showcase product for headed demos (matches shopFlow --data selectedItem). */
8
- const DEMO_PRODUCT_ID = "sauce-labs-backpack";
9
-
10
6
  /**
11
7
  * Kind: Effect
12
8
  * Helper: defineEffectBlock
@@ -15,91 +11,29 @@ const DEMO_PRODUCT_ID = "sauce-labs-backpack";
15
11
  * Mutates cart for the mem-picked product. waygraph auto lists one
16
12
  * "Add ..." row per live Add button via instanceOptions.
17
13
  */
18
- export const AddToCartBlock = defineEffectBlock<Checkpoint<string>, ItemInCart>({
14
+ export const AddToCartBlock = defineEffectBlock({
19
15
  name: "add-to-cart",
20
- description: "Adds the item named by mem (saucedemo.selectedItem) to the cart.",
16
+ description:
17
+ "Adds the item named by mem (saucedemo.selectedItem) to the cart.",
18
+ to: ItemInCart,
21
19
  requires: [SelectedItem.key],
22
20
  instruction: {
23
21
  async act(page, _input, mem) {
24
22
  const { id } = mem.get(SelectedItem.key);
25
23
  await page.locator(InventorySel.addBtn(id)).click();
26
24
  },
27
- resolve: () => checkpoint("ItemInCart"),
28
25
  verify: [
29
26
  {
30
27
  name: "item-added-to-cart",
31
28
  async check(page, mem) {
32
29
  const { id } = mem.get(SelectedItem.key);
33
- return await page.locator(InventorySel.removeBtn(id)).first().isVisible();
30
+ return await page
31
+ .locator(InventorySel.removeBtn(id))
32
+ .first()
33
+ .isVisible();
34
34
  },
35
35
  },
36
36
  ],
37
- // Demo: zoom product -> add (stay zoomed), then badge after act.
38
- stubBefore: (ctx: StubCtx) => {
39
- ctx.title("Pick a product · tablet");
40
- ctx.device("tablet");
41
- ctx.portrait();
42
- ctx.todos(
43
- "saucedemo",
44
- [
45
- { id: "login-user", text: "Enter username", done: true },
46
- { id: "login-pass", text: "Enter password", done: true },
47
- { id: "login-submit", text: "Tap Login", done: true },
48
- { id: "cart-find", text: "Find the product" },
49
- { id: "cart-add", text: "Add to cart" },
50
- { id: "cart-open", text: "Open cart" },
51
- ],
52
- { title: "Device showcase", index: 3 },
53
- );
54
- ctx.zoom(1.35);
55
- ctx.zoomOut(false);
56
- ctx.highlights({
57
- product: {
58
- selector: InventorySel.title(DEMO_PRODUCT_ID),
59
- label: "Sauce Labs Backpack",
60
- detail: "tone: info (blue)",
61
- tone: "info",
62
- focus: true,
63
- zoom: 1.45,
64
- zoomOut: false,
65
- },
66
- add: {
67
- selector: InventorySel.addBtn(DEMO_PRODUCT_ID),
68
- label: "Add to cart",
69
- detail: "tone: success (green)",
70
- tone: "success",
71
- focus: true,
72
- zoom: 1.5,
73
- zoomOut: false,
74
- weight: "bold",
75
- },
76
- });
77
- },
78
- stubAfter: (ctx: StubCtx) => {
79
- ctx.banner("In the cart");
80
- ctx.todos(
81
- "saucedemo",
82
- [
83
- { id: "login-user", text: "Enter username", done: true },
84
- { id: "login-pass", text: "Enter password", done: true },
85
- { id: "login-submit", text: "Tap Login", done: true },
86
- { id: "cart-find", text: "Find the product", done: true },
87
- { id: "cart-add", text: "Add to cart" },
88
- { id: "cart-open", text: "Open cart" },
89
- ],
90
- { title: "Device showcase", index: 4 },
91
- );
92
- ctx.zoomOut(false);
93
- ctx.ring("badge", {
94
- selector: InventorySel.cartBadge,
95
- label: "Cart badge",
96
- detail: "tone: success (green) - count updated",
97
- tone: "success",
98
- focus: true,
99
- zoomOut: false,
100
- duration: true,
101
- });
102
- },
103
37
  },
104
38
  async instanceOptions(page): Promise<readonly WaygraphInstanceOption[]> {
105
39
  const items = await collectAddableItems(page);